{"id":13620729,"url":"https://github.com/pcaversaccio/xdeployer","last_synced_at":"2026-02-12T12:23:26.216Z","repository":{"id":37103306,"uuid":"419485990","full_name":"pcaversaccio/xdeployer","owner":"pcaversaccio","description":"Hardhat plugin to deploy your smart contracts across multiple EVM chains with the same deterministic address.","archived":false,"fork":false,"pushed_at":"2025-05-13T13:52:09.000Z","size":2547,"stargazers_count":444,"open_issues_count":0,"forks_count":42,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-05-13T14:57:40.398Z","etag":null,"topics":["create2","deployment","ethereum","hardhat","hardhat-plugin"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/xdeployer","language":"Solidity","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pcaversaccio.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"custom":"https://etherscan.io/address/0x07bF3CDA34aA78d92949bbDce31520714AB5b228"}},"created_at":"2021-10-20T20:51:21.000Z","updated_at":"2025-05-13T13:51:03.000Z","dependencies_parsed_at":"2024-05-28T14:19:20.853Z","dependency_job_id":"09e7a3e3-0ec2-40f9-9441-a912d259e611","html_url":"https://github.com/pcaversaccio/xdeployer","commit_stats":{"total_commits":734,"total_committers":9,"mean_commits":81.55555555555556,"dds":0.114441416893733,"last_synced_commit":"0180f38b7a852f2b74934bf9d8345b44276ed42c"},"previous_names":[],"tags_count":101,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pcaversaccio%2Fxdeployer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pcaversaccio%2Fxdeployer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pcaversaccio%2Fxdeployer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pcaversaccio%2Fxdeployer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pcaversaccio","download_url":"https://codeload.github.com/pcaversaccio/xdeployer/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253969782,"owners_count":21992344,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["create2","deployment","ethereum","hardhat","hardhat-plugin"],"created_at":"2024-08-01T21:00:58.868Z","updated_at":"2026-02-12T12:23:26.210Z","avatar_url":"https://github.com/pcaversaccio.png","language":"Solidity","readme":"# xdeployer 💥\n\n[![Test xdeploy](https://github.com/pcaversaccio/xdeployer/actions/workflows/test.yml/badge.svg)](https://github.com/pcaversaccio/xdeployer/actions/workflows/test.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/license/mit)\n[![npm package](https://img.shields.io/npm/v/xdeployer.svg)](https://www.npmjs.com/package/xdeployer)\n\n[Hardhat](https://hardhat.org) plugin to deploy your smart contracts across multiple Ethereum Virtual Machine (EVM) chains with the same deterministic address.\n\n\u003e [!TIP]\n\u003e It is pronounced _cross_-deployer.\n\n\u003e [!IMPORTANT]\n\u003e This plugin currently targets Hardhat 2 and is not compatible with Hardhat 3.\n\n## What\n\nThis plugin will help you make easier and safer usage of the [`CREATE2`](https://eips.ethereum.org/EIPS/eip-1014) EVM opcode. [`CREATE2`](https://eips.ethereum.org/EIPS/eip-1014) can be used to compute in advance the address where a smart contract will be deployed, which allows for interesting new mechanisms known as _counterfactual interactions_.\n\n## Installation\n\nWith `npm` versions `\u003e=7`:\n\n```console\n# based on ethers v6\nnpm install --save-dev xdeployer\n```\n\nWith `npm` version `6`:\n\n```console\n# based on ethers v6\nnpm install --save-dev xdeployer '@nomicfoundation/hardhat-ethers@^3.1.3' ethers\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e Using \u003ccode\u003eethers\u003c/code\u003e version \u003ccode\u003e5\u003c/code\u003e \u003c/summary\u003e\n\nWith `npm` versions `\u003e=7`:\n\n```console\n# based on ethers v5\nnpm install --save-dev 'xdeployer@^1.2.7'\n```\n\nWith `npm` version `6`:\n\n```console\n# based on ethers v5\nnpm install --save-dev 'xdeployer@^1.2.7' @nomiclabs/hardhat-ethers 'ethers@^5.7.2' '@openzeppelin/contracts@^4.9.0'\n```\n\n\u003c/details\u003e\n\nOr if you are using [Yarn](https://classic.yarnpkg.com):\n\n```console\n# based on ethers v6\nyarn add --dev xdeployer '@nomicfoundation/hardhat-ethers@^3.1.3' ethers\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e Using \u003ccode\u003eethers\u003c/code\u003e version \u003ccode\u003e5\u003c/code\u003e \u003c/summary\u003e\n\n```console\n# based on ethers v5\nyarn add --dev 'xdeployer@^1.2.7' @nomiclabs/hardhat-ethers 'ethers@^5.7.2' '@openzeppelin/contracts@^4.9.0'\n```\n\n\u003c/details\u003e\n\nIn case you are using [pnpm](https://pnpm.io), invoke:\n\n```console\n# based on ethers v6\npnpm add --save-dev xdeployer\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e Using \u003ccode\u003eethers\u003c/code\u003e version \u003ccode\u003e5\u003c/code\u003e \u003c/summary\u003e\n\n```console\n# based on ethers v5\npnpm add --save-dev 'xdeployer@^1.2.7'\n```\n\n\u003c/details\u003e\n\nIf you are a [Bun](https://bun.sh) user, run:\n\n```console\n# based on ethers v6\nbun add --dev xdeployer\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e Using \u003ccode\u003eethers\u003c/code\u003e version \u003ccode\u003e5\u003c/code\u003e \u003c/summary\u003e\n\n```console\n# based on ethers v5\nbun add --dev 'xdeployer@^1.2.7'\n```\n\n\u003c/details\u003e\n\n\u003e [!NOTE]\n\u003e This plugin uses the optional chaining operator (`?.`). Optional chaining is _not_ supported in [Node.js](https://nodejs.org/en) `v13` and below.\n\nImport the plugin in your `hardhat.config.js`:\n\n```js\nrequire(\"xdeployer\");\n```\n\nOr if you are using TypeScript, in your `hardhat.config.ts`:\n\n```ts\nimport \"xdeployer\";\n```\n\n## Required Plugins\n\n- [`@nomicfoundation/hardhat-ethers@3`](https://www.npmjs.com/package/@nomicfoundation/hardhat-ethers)\n- [`ethers`](https://www.npmjs.com/package/ethers)\n\n## Tasks\n\nThis plugin provides the `xdeploy` task, which allows you to deploy your smart contracts across multiple EVM chains with the same deterministic address:\n\n```console\nnpx hardhat xdeploy\n```\n\n## Environment Extensions\n\nThis plugin does not extend the environment.\n\n## Configuration\n\nYou need to add the following configurations to your `hardhat.config.js` file:\n\n```js\nmodule.exports = {\n  networks: {\n    mainnet: { ... }\n  },\n  xdeploy: {\n    contract: \"YOUR_CONTRACT_NAME_TO_BE_DEPLOYED\",\n    constructorArgsPath: \"PATH_TO_CONSTRUCTOR_ARGS\", // optional; default value is `undefined`\n    salt: \"YOUR_SALT_MESSAGE\",\n    signer: \"SIGNER_PRIVATE_KEY\",\n    networks: [\"LIST_OF_NETWORKS\"],\n    rpcUrls: [\"LIST_OF_RPCURLS\"],\n    gasLimit: 1_500_000, // optional; default value is `1.5e6`\n  },\n};\n```\n\nOr if you are using TypeScript, in your `hardhat.config.ts`:\n\n```ts\nconst config: HardhatUserConfig = {\n  networks: {\n    mainnet: { ... }\n  },\n  xdeploy: {\n    contract: \"YOUR_CONTRACT_NAME_TO_BE_DEPLOYED\",\n    constructorArgsPath: \"PATH_TO_CONSTRUCTOR_ARGS\", // optional; default value is `undefined`\n    salt: \"YOUR_SALT_MESSAGE\",\n    signer: \"SIGNER_PRIVATE_KEY\",\n    networks: [\"LIST_OF_NETWORKS\"],\n    rpcUrls: [\"LIST_OF_RPCURLS\"],\n    gasLimit: 1_500_000, // optional; default value is `1.5e6`\n  },\n};\n```\n\nThe parameters `constructorArgsPath` and `gasLimit` are _optional_. The `salt` parameter is a random string value used to create the contract address. If you have previously deployed the same contract with the identical `salt`, the contract creation transaction will fail due to [EIP-684](https://eips.ethereum.org/EIPS/eip-684). For more details, see also [here](#a-note-on-selfdestruct).\n\n\u003e [!IMPORTANT]\n\u003e Please note that `xdeployer` computes the UTF-8 byte representation of the specified `salt` and calculates the `keccak256` hash, which represents the 32-byte `salt` value that is passed to [`CREATE2`](https://eips.ethereum.org/EIPS/eip-1014).\n\n_Example:_\n\n```ts\nxdeploy: {\n    contract: \"ERC20Mock\",\n    constructorArgsPath: \"./deploy-args.ts\",\n    salt: \"WAGMI\",\n    signer: vars.get(\"PRIVATE_KEY\", \"\"),\n    networks: [\"hardhat\", \"sepolia\", \"hoodi\"],\n    rpcUrls: [\n      \"hardhat\",\n      vars.get(\"ETH_SEPOLIA_TESTNET_URL\", \"https://rpc.sepolia.org\"),\n      vars.get(\"ETH_HOODI_TESTNET_URL\", \"https://0xrpc.io/hoodi\"),\n    ],\n    gasLimit: 1.2 * 10 ** 6,\n},\n```\n\n\u003e [!NOTE]\n\u003e We recommend using [Hardhat configuration variables](https://v2.hardhat.org/hardhat-runner/docs/guides/configuration-variables) introduced in Hardhat version [`2.19.0`](https://github.com/NomicFoundation/hardhat/releases/tag/hardhat%402.19.0) to set the private key of your signer.\n\nThe current available networks are:\n\n\u003e [!TIP]\n\u003e To display the complete list of supported networks with the corresponding block explorer links and chain IDs, run `npx hardhat xdeploy --list-networks`.\n\n- **Local:**\n  - `localhost`\n  - `hardhat`\n- **EVM-Based Test Networks:**\n  - `sepolia`\n  - `hoodi`\n  - `bscTestnet`\n  - `opbnbTestnet`\n  - `optimismSepolia`\n  - `arbitrumSepolia`\n  - `amoy`\n  - `polygonZkEVMTestnet`\n  - `fantomTestnet`\n  - `fuji`\n  - `chiado`\n  - `moonbaseAlpha`\n  - `celoTestnet`\n  - `auroraTestnet`\n  - `harmonyTestnet`\n  - `spark`\n  - `cronosTestnet`\n  - `evmosTestnet`\n  - `bobaTestnet`\n  - `cantoTestnet`\n  - `baseSepolia`\n  - `mantleTestnet`\n  - `filecoinTestnet`\n  - `scrollSepolia`\n  - `lineaTestnet`\n  - `zoraSepolia`\n  - `luksoTestnet`\n  - `mantaTestnet`\n  - `blastTestnet`\n  - `dosTestnet`\n  - `fraxtalTestnet`\n  - `metisTestnet`\n  - `modeTestnet`\n  - `seiArcticDevnet`\n  - `seiAtlanticTestnet`\n  - `xlayerTestnet`\n  - `bobTestnet`\n  - `coreTestnet`\n  - `telosTestnet`\n  - `rootstockTestnet`\n  - `chilizTestnet`\n  - `taraxaTestnet`\n  - `taikoTestnet`\n  - `zetaChainTestnet`\n  - `5ireChainTestnet`\n  - `sapphireTestnet`\n  - `worldChainTestnet`\n  - `plumeTestnet`\n  - `unichainTestnet`\n  - `xdcTestnet`\n  - `sxTestnet`\n  - `liskTestnet`\n  - `metalL2Testnet`\n  - `superseedTestnet`\n  - `storyTestnet`\n  - `sonicTestnet`\n  - `flowTestnet`\n  - `inkTestnet`\n  - `morphTestnet`\n  - `shapeTestnet`\n  - `etherlinkTestnet`\n  - `soneiumTestnet`\n  - `swellTestnet`\n  - `hemiTestnet`\n  - `berachainTestnet`\n  - `monadTestnet`\n  - `cornTestnet`\n  - `arenazTestnet`\n  - `iotexTestnet`\n  - `hychainTestnet`\n  - `zircuitTestnet`\n  - `megaETHTestnet`\n  - `bitlayerTestnet`\n  - `roninTestnet`\n  - `zkSyncTestnet`\n  - `immutableZkEVMTestnet`\n  - `abstractTestnet`\n  - `hyperevmTestnet`\n  - `apeChainTestnet`\n  - `botanixTestnet`\n  - `tacTestnet`\n  - `katanaTestnet`\n  - `plasmaTestnet`\n  - `sophonTestnet`\n  - `jovayTestnet`\n  - `intuitionTestnet`\n  - `memecoreTestnet`\n  - `lightlinkTestnet`\n  - `xrplEVMTestnet`\n  - `arcTestnet`\n  - `dmdTestnet`\n  - `citreaTestnet`\n  - `tempoTestnet`\n- **EVM-Based Production Networks:**\n  - `ethMain`\n  - `bscMain`\n  - `opbnbMain`\n  - `optimismMain`\n  - `arbitrumOne`\n  - `arbitrumNova`\n  - `polygon`\n  - `polygonZkEVMMain`\n  - `fantomMain`\n  - `avalanche`\n  - `gnosis`\n  - `moonriver`\n  - `moonbeam`\n  - `celo`\n  - `auroraMain`\n  - `harmonyMain`\n  - `fuse`\n  - `cronosMain`\n  - `evmosMain`\n  - `bobaMain`\n  - `cantoMain`\n  - `baseMain`\n  - `mantleMain`\n  - `filecoinMain`\n  - `scrollMain`\n  - `lineaMain`\n  - `zoraMain`\n  - `luksoMain`\n  - `mantaMain`\n  - `blastMain`\n  - `dosMain`\n  - `fraxtalMain`\n  - `enduranceMain`\n  - `kavaMain`\n  - `metisMain`\n  - `modeMain`\n  - `seiMain`\n  - `xlayerMain`\n  - `bobMain`\n  - `coreMain`\n  - `telosMain`\n  - `rootstockMain`\n  - `chilizMain`\n  - `taraxaMain`\n  - `gravityAlphaMain`\n  - `taikoMain`\n  - `zetaChainMain`\n  - `5ireChainMain`\n  - `sapphireMain`\n  - `worldChainMain`\n  - `plumeMain`\n  - `unichainMain`\n  - `xdcMain`\n  - `sxMain`\n  - `liskMain`\n  - `metalL2Main`\n  - `superseedMain`\n  - `storyMain`\n  - `sonicMain`\n  - `flowMain`\n  - `inkMain`\n  - `morphMain`\n  - `shapeMain`\n  - `etherlinkMain`\n  - `soneiumMain`\n  - `swellMain`\n  - `hemiMain`\n  - `berachainMain`\n  - `monadMain`\n  - `cornMain`\n  - `arenazMain`\n  - `iotexMain`\n  - `hychainMain`\n  - `zircuitMain`\n  - `megaETHMain`\n  - `bitlayerMain`\n  - `roninMain`\n  - `zkSyncMain`\n  - `immutableZkEVMMain`\n  - `abstractMain`\n  - `hyperevmMain`\n  - `kaiaMain`\n  - `apeChainMain`\n  - `botanixMain`\n  - `tacMain`\n  - `katanaMain`\n  - `plasmaMain`\n  - `sophonMain`\n  - `jovayMain`\n  - `intuitionMain`\n  - `memecoreMain`\n  - `lightlinkMain`\n  - `xrplEVMMain`\n  - `dmdMain`\n  - `citreaMain`\n\n\u003e [!IMPORTANT]\n\u003e Note that you must ensure that your deployment account has sufficient funds on **all** target networks.\n\n### Local Deployment\n\nIf you also want to test deploy your smart contracts on `\"hardhat\"` or `\"localhost\"`, you must first add the following Solidity file called `Create2DeployerLocal.sol` to your `contracts/` folder:\n\n```solidity\n// SPDX-License-Identifier: MIT\npragma solidity ^0.8.23;\n\nimport { CreateX } from \"xdeployer/src/contracts/CreateX.sol\";\n\ncontract Create2DeployerLocal is CreateX {}\n```\n\n\u003e For this kind of deployment, you must set the Solidity version in the `hardhat.config.js` or `hardhat.config.ts` file to `0.8.23` or higher.\n\nThe RPC URL for `hardhat` is simply `hardhat`, while for `localhost` you must first run `npx hardhat node`, which defaults to `http://127.0.0.1:8545`. It is important to note that the local deployment does _not_ generate the same deterministic address as on all live test/production networks, since the address of the smart contract that calls the opcode [`CREATE2`](https://eips.ethereum.org/EIPS/eip-1014) differs locally from the live test/production networks. I recommend using local deployments for general testing, for example to understand the correct `gasLimit` target size.\n\n### Further Considerations\n\nThe constructor arguments file must have an _exportable_ field called `data` in case you are using TypeScript:\n\n```ts\nconst data = [\n  \"arg1\",\n  \"arg2\",\n  ...\n];\nexport { data };\n```\n\n\u003e BigInt literals (e.g. `100_000_000_000_000_000_000n`) can be used for the constructor arguments if you set `target: ES2020` or higher in your `tsconfig.json` file. See also [here](./tsconfig.json) for an example.\n\nIf you are using common JavaScript:\n\n```js\nmodule.exports = [\n  \"arg1\",\n  \"arg2\",\n  ...\n];\n```\n\nThe `gasLimit` field is set to **1'500'000** by default because the [`CREATE2`](https://eips.ethereum.org/EIPS/eip-1014) operations are a complex sequence of opcode executions. Usually the providers do not manage to estimate the `gasLimit` for these calls, so a predefined value is set.\n\nThe contract creation transaction is displayed on Etherscan (or any other block explorer) as a so-called _internal transaction_. An internal transaction is an action that is occurring within, or between, one or multiple smart contracts. In other words, it is initiated inside the code itself, rather than externally, from a wallet address controlled by a human. For more details on why it works this way, see [here](#how-it-works).\n\n\u003e [!WARNING]\n\u003e Solidity version [`0.8.20`](https://github.com/argotorg/solidity/releases/tag/v0.8.20) introduced support for the new opcode [`PUSH0`](https://eips.ethereum.org/EIPS/eip-3855), which was added as part of the [Shanghai hard fork](https://github.com/ethereum/execution-specs/blob/forks/osaka/src/ethereum/forks/shanghai/__init__.py). Prior to running a deployment with a `\u003e=0.8.20`-compiled bytecode (using the EVM version `shanghai`), please verify that _all_ targeted EVM networks support the `PUSH0` opcode. Otherwise, a deployment attempt on an EVM chain without `PUSH0` support may result in deployment or runtime failure(s).\n\n\u003e [!WARNING]\n\u003e Solidity version [`0.8.25`](https://github.com/argotorg/solidity/releases/tag/v0.8.25) defaults to EVM version [`cancun`](https://github.com/ethereum/execution-specs/blob/forks/osaka/src/ethereum/forks/cancun/__init__.py), which features a number of new opcodes. Prior to running a deployment with a `\u003e=0.8.25`-compiled bytecode (using the EVM version `cancun`), please verify that _all_ targeted EVM networks support the new `cancun` opcodes. Otherwise, a deployment attempt on an EVM chain without `cancun` support may result in deployment or runtime failure(s).\n\n\u003e [!WARNING]\n\u003e Solidity version [`0.8.30`](https://github.com/argotorg/solidity/releases/tag/v0.8.30) defaults to EVM version [`prague`](https://github.com/ethereum/execution-specs/blob/forks/osaka/src/ethereum/forks/prague/__init__.py), which introduces _no new opcodes_ but includes a few new precompiled contracts (see [EIP-2537](https://eips.ethereum.org/EIPS/eip-2537)). If your contract(s) make use of these new precompiled contracts, ensure that _all_ targeted EVM networks support the `prague` precompiled contracts. Otherwise, deployed contracts may encounter runtime failure(s).\n\n\u003e [!WARNING]\n\u003e Solidity version [`0.8.31`](https://github.com/argotorg/solidity/releases/tag/v0.8.31) defaults to EVM version [`osaka`](https://github.com/ethereum/execution-specs/blob/forks/osaka/src/ethereum/forks/osaka/__init__.py), which features a new opcode [`CLZ`](https://eips.ethereum.org/EIPS/eip-7939) and precompiled contract [`P256VERIFY`](https://eips.ethereum.org/EIPS/eip-7951). Prior to running a deployment with a `\u003e=0.8.31`-compiled bytecode (using the EVM version `osaka`), please verify that _all_ targeted EVM networks support support the `CLZ` opcode. Otherwise, a deployment attempt on an EVM chain without `osaka` support may result in deployment or runtime failure(s).\n\n## Usage\n\n```console\nnpx hardhat xdeploy\n```\n\n### Usage With Truffle\n\n[Truffle](https://archive.trufflesuite.com) suite users can leverage the Hardhat plugin [`hardhat-truffle5`](https://v2.hardhat.org/hardhat-runner/plugins/nomiclabs-hardhat-truffle5) (or if you use Truffle `v4` [`hardhat-truffle4`](https://v2.hardhat.org/hardhat-runner/plugins/nomiclabs-hardhat-truffle4)) to integrate with `TruffleContract` from Truffle `v5`. This plugin allows tests and scripts written for Truffle to work with Hardhat.\n\n## How It Works\n\nEVM opcodes can only be called via a smart contract. I have deployed a helper smart contract [`CreateX`](https://github.com/pcaversaccio/createx) with the same address across all the available networks to make easier and safer usage of the [`CREATE2`](https://eips.ethereum.org/EIPS/eip-1014) EVM opcode. During your deployment, the plugin will call this contract.\n\n### A Note on [`SELFDESTRUCT`](https://www.evm.codes/?fork=cancun#ff)\n\nUsing the [`CREATE2`](https://eips.ethereum.org/EIPS/eip-1014) EVM opcode always allows to redeploy a new smart contract to a previously selfdestructed contract address.[^1] However, if a contract creation is attempted, due to either a creation transaction or the [`CREATE`](https://www.evm.codes/#f0?fork=cancun)/[`CREATE2`](https://eips.ethereum.org/EIPS/eip-1014) EVM opcode, and the destination address already has either nonzero nonce, or non-empty code, then the creation throws immediately, with exactly the same behavior as would arise if the first byte in the init code were an invalid opcode. This applies retroactively starting from genesis.\n\n### A Note on the Contract Creation Transaction\n\nIt is important to note that the `msg.sender` of the contract creation transaction is the helper smart contract [`CreateX`](https://github.com/pcaversaccio/createx) with address `0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed`. If you are relying on common smart contract libraries such as [OpenZeppelin Contracts](https://github.com/OpenZeppelin/openzeppelin-contracts)[^2] for your smart contract, which set certain constructor arguments to `msg.sender` (e.g. `owner`), you will need to change these arguments to `tx.origin` so that they are set to your deployer's EOA address. For another workaround, see [here](https://github.com/pcaversaccio/xdeployer/discussions/18).\n\n\u003e [!CAUTION]\n\u003e Please familiarise yourself with the security considerations concerning `tx.origin`. You can find more information about it, e.g. [here](https://docs.soliditylang.org/en/latest/security-considerations.html#tx-origin).\n\n## Donation\n\nI am a strong advocate of the open-source and free software paradigm. However, if you feel my work deserves a donation, you can send it to this address: [`0x07bF3CDA34aA78d92949bbDce31520714AB5b228`](https://etherscan.io/address/0x07bF3CDA34aA78d92949bbDce31520714AB5b228). I can pledge that I will use this money to help fix more existing challenges in the Ethereum ecosystem 🤝.\n\n[^1]: The `cancun` hard fork introduced [EIP-6780](https://eips.ethereum.org/EIPS/eip-6780), which redefines the behaviour of [`SELFDESTRUCT`](https://www.evm.codes/?fork=cancun#ff). It now only transfers the contract's balance to the target address without deleting the contract's state or code. The contract is only removed if [`SELFDESTRUCT`](https://www.evm.codes/?fork=cancun#ff) is called in the same transaction in which it was created.\n\n[^2]: Please note that [OpenZeppelin Contracts version `5.0.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/releases/tag/v5.0.0) has made the initial `owner` explicit (see PR [#4267](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4267)).\n","funding_links":["https://etherscan.io/address/0x07bF3CDA34aA78d92949bbDce31520714AB5b228"],"categories":["Libraries","By Language","Solidity"],"sub_categories":["Solidity"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpcaversaccio%2Fxdeployer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpcaversaccio%2Fxdeployer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpcaversaccio%2Fxdeployer/lists"}