NOTE: The address that a contract will get at deployment is computed as H($ACCOUNT_ADDRESS + $ACCOUNT_NONCE + $CONTRACT_BYTECODE) where H is a universal hash function (keccak256)
Nonces start at 0 for a fresh account. So a deployment wallet needs the same nonce on each network. The nonce will match the amount of contracts deployed from that wallet. In other words, deploying the contract will increment the wallets nonce by +1
Run npx hardhat wallet --address 0x0123ABC
i.e, here is an example, you wish to have the nonces equal on all networks you wish to deploy on
[
[ ' |NETWORK| |NONCE| |BALANCE| ' ],
[ 'Ethereum Goerli:', 1, '1.47ETH' ],
[ 'Polygon Mumbai:', 1, '9.99ETH' ],
[ 'Arbitrum Rinkby:', 1, '1.49ETH' ],
[ 'Optimism Goerli:', 1, '2.26ETH' ]
]
With our nonces set equally as above, deploying the SAME contract, to MULTIPLE networks from the SAME wallet will result in EQUAL contract addresses on each network using CREATE
opcode through an EOA
NOTE: CREATE2
opcode is used here to deploy multiple contracts from the same factory address, which was deployed on multiple chains with the same address in Step 1 using CREATE
opcode
CREATE2
can be called only from smart contracts (EOA can't use CREATE2)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
contract DeterministicDeployFactory {
event Deploy(address addr);
//I'm a public function, in production you will want to protect me with access controls to prevent attackers frontrunning your deployments
function deploy(bytes memory bytecode, uint256 _salt) external {
address addr;
assembly {
addr := create2(0, add(bytecode, 0x20), mload(bytecode), _salt)
if iszero(extcodesize(addr)) {
revert(0, 0)
}
}
emit Deploy(addr);
}
}
NOTE: The address that a contract will get at deployment is computed as H($FACTORY_ADDRESS + $SALT_VALUE + $CONTRACT_BYTECODE) where H is a universal hash function (keccak256)
Here we will use DeterministicDeployFactory.deploy()
function to deploy our contracts under that address.
Includes deployment configurations, testing framework, contract upgrades pattern, gas usage report, security analysys audit, test coverage report.. did I also mention it's blazingly fast 😏
This project uses a task runner called just, for convenience
Available recipes:
default
install *PACKAGES
update
compile
deploy-localhost
deploy-testnet
verify-testnet
test
lint
start
format
audit
print-audit
print-gas-usage
print-deployments
clean
- Run the unit tests with
just test
- Statically analyse code for vulnerabilities with
just audit
- Clean the workspace (to start a new project, removing example code and scripts) using
just clean
- Create your solidity code in
/contracts
, tests in/test
and deploy/verify scripts in/scripts
Error HH12: Trying to use a non-local installation of Hardhat, which is not supported. Please install Hardhat locally using npm or Yarn, and try again.
Run npm i
to fix this error which will install hardhat
For faster runs of your tests and scripts, consider skipping ts-node's type checking by setting the environment variable TS_NODE_TRANSPILE_ONLY to 1 in hardhat's environment. For more details see the documentation.
ERROR ON COMMIT -> husky > pre-commit hook failed (add --no-verify to bypass)
RESOLUTION -> Remove errors from your smart contracts, found running npm run lint
, or commit using --no-amend flag to temporarily bypass.
Ensure Slither is installed and in your $PATH
- Fix prettier plugin sol hint not working nvim (Remove prettier plugin from sol hint.son to fix)