diff --git a/.gitmodules b/.gitmodules index 36cd8db5..590b3c1e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -52,3 +52,6 @@ [submodule "lib/openzeppelin-contracts"] path = lib/openzeppelin-contracts url = https://github.com/Openzeppelin/openzeppelin-contracts +[submodule "src/pkgs/ERC20-eth"] + path = src/pkgs/ERC20-eth + url = https://github.com/Uniswap/ERC20-eth diff --git a/foundry.toml b/foundry.toml index e05a3205..ff4145bd 100644 --- a/foundry.toml +++ b/foundry.toml @@ -36,6 +36,7 @@ additional_compiler_profiles = [ { name = "v3-periphery-default", optimizer_runs = 1000000, evm_version = "istanbul", via_ir = false }, { name = "permit2", optimizer_runs = 1000000, via_ir = true }, { name = "uniswapx", optimizer_runs = 1000000, via_ir = false }, + { name = "ERC20-eth", optimizer_runs = 200, via_ir = false, version = "^0.8.29" }, ] compilation_restrictions = [ @@ -72,6 +73,7 @@ compilation_restrictions = [ { paths = "src/briefcase/protocols/v4-periphery/libraries/Locker.sol", evm_version = "cancun" }, { paths = "src/briefcase/protocols/swap-router-contracts/libraries/**", version = "<0.8.0" }, { paths = "src/briefcase/protocols/v3-periphery/libraries/**", version = "<0.8.0" }, + { paths = "src/pkgs/ERC20-eth/src/ERC20ETH.sol", version = "0.8.29", optimizer_runs = 200 }, ] [fmt] diff --git a/remappings.txt b/remappings.txt index d5a43722..9a77d55a 100644 --- a/remappings.txt +++ b/remappings.txt @@ -26,4 +26,8 @@ permit2=src/pkgs/permit2 @uniswap/lib=lib/solidity-lib @uniswap/v2-core=src/pkgs/v2-core @uniswap/v3-core=src/pkgs/v3-core -@uniswap/v4-core=src/pkgs/v4-core \ No newline at end of file +@uniswap/v4-core=src/pkgs/v4-core +ERC20-eth/=src/pkgs/ERC20-eth/ +src/pkgs/ERC20-eth:solady=src/pkgs/ERC20-eth/lib/solady/src +src/pkgs/ERC20-eth:solmate=src/pkgs/ERC20-eth/lib/solmate/src +src/pkgs/ERC20-eth:forge-std=src/pkgs/ERC20-eth/lib/forge-std/src \ No newline at end of file diff --git a/script/deploy/Deploy-all.s.sol b/script/deploy/Deploy-all.s.sol index fcb5277b..42357d74 100644 --- a/script/deploy/Deploy-all.s.sol +++ b/script/deploy/Deploy-all.s.sol @@ -39,6 +39,7 @@ import {StateViewDeployer} from '../../src/briefcase/deployers/v4-periphery/Stat import {V4QuoterDeployer} from '../../src/briefcase/deployers/v4-periphery/V4QuoterDeployer.sol'; import {WETHHookDeployer} from '../../src/briefcase/deployers/v4-periphery/WETHHookDeployer.sol'; import {WstETHHookDeployer} from '../../src/briefcase/deployers/v4-periphery/WstETHHookDeployer.sol'; +import {ERC20ETHDeployer} from '../../src/briefcase/deployers/ERC20-eth/ERC20ETHDeployer.sol'; import {Script, console2 as console, stdJson} from 'forge-std/Script.sol'; import {VmSafe} from 'forge-std/Vm.sol'; @@ -80,6 +81,8 @@ contract Deploy is Script { deployUtilsContracts(); + deployERC20ETH(); + vm.stopBroadcast(); if (vm.isContext(VmSafe.ForgeContext.ScriptBroadcast) && config.readBool('.rename')) { @@ -390,6 +393,15 @@ contract Deploy is Script { } } + function deployERC20ETH() private { + if (!config.readBoolOr('.protocols.ERC20-eth.deploy', false)) return; + bool deployERC20ETH_ = config.readBoolOr('.protocols.ERC20-eth.contracts.ERC20ETH.deploy', false); + if (deployERC20ETH_) { + console.log('deploying ERC20ETH'); + ERC20ETHDeployer.deploy(); + } + } + function deployUniversalRouter() private { if (!config.readBoolOr('.protocols.universal-router.deploy', false)) return; diff --git a/script/deploy/tasks/task_template.json b/script/deploy/tasks/task_template.json index c92951d1..debb14a2 100644 --- a/script/deploy/tasks/task_template.json +++ b/script/deploy/tasks/task_template.json @@ -398,6 +398,16 @@ } } } + }, + "ERC20-eth": { + "name": "ERC20 ETH", + "deploy": true, + "contracts": { + "ERC20ETH": { + "deploy": true, + "address": null + } + } } }, "dependencies": { diff --git a/src/briefcase/deployers/ERC20-eth/ERC20ETHDeployer.sol b/src/briefcase/deployers/ERC20-eth/ERC20ETHDeployer.sol new file mode 100644 index 00000000..85571001 --- /dev/null +++ b/src/briefcase/deployers/ERC20-eth/ERC20ETHDeployer.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: MIT +pragma solidity >= 0.8.0; + +library ERC20ETHDeployer { + function deploy() internal returns (address erc20ETH) { + bytes memory args = abi.encode(); + bytes memory initcode_ = abi.encodePacked(originalInitcode(), args); + bytes32 salt = 0x0000000000000000000000000000000000000000ab7ce6e7e994b50181ca4e2e; + assembly { + erc20ETH := create2(0, add(initcode_, 32), mload(initcode_), salt) + } + } + + /// @dev this is the init code that we used to mine the vanity address + /// Unfortunately forge doesn't let you disable the optimizer for just this project + function originalInitcode() internal pure returns (bytes memory) { + return + hex'6080604052348015600e575f5ffd5b50610ee68061001c5f395ff3fe6080604052600436106100aa575f3560e01c806370a082311161006357806370a08231146101d55780637ecebe001461021157806395d89b411461024d578063a9059cbb14610277578063d505accf146102b3578063dd62ed3e146102db576100b1565b806306fdde03146100b5578063095ea7b3146100df57806318160ddd1461011b57806323b872dd14610145578063313ce567146101815780633644e515146101ab576100b1565b366100b157005b5f5ffd5b3480156100c0575f5ffd5b506100c9610317565b6040516100d69190610a7d565b60405180910390f35b3480156100ea575f5ffd5b5061010560048036038101906101009190610b2e565b610354565b6040516101129190610b86565b60405180910390f35b348015610126575f5ffd5b5061012f6103df565b60405161013c9190610bae565b60405180910390f35b348015610150575f5ffd5b5061016b60048036038101906101669190610bc7565b6103e6565b6040516101789190610b86565b60405180910390f35b34801561018c575f5ffd5b50610195610408565b6040516101a29190610c32565b60405180910390f35b3480156101b6575f5ffd5b506101bf610410565b6040516101cc9190610c63565b60405180910390f35b3480156101e0575f5ffd5b506101fb60048036038101906101f69190610c7c565b61048c565b6040516102089190610bae565b60405180910390f35b34801561021c575f5ffd5b5061023760048036038101906102329190610c7c565b6104bf565b6040516102449190610bae565b60405180910390f35b348015610258575f5ffd5b506102616104d8565b60405161026e9190610a7d565b60405180910390f35b348015610282575f5ffd5b5061029d60048036038101906102989190610b2e565b610515565b6040516102aa9190610b86565b60405180910390f35b3480156102be575f5ffd5b506102d960048036038101906102d49190610cfb565b61052b565b005b3480156102e6575f5ffd5b5061030160048036038101906102fc9190610d98565b6106ee565b60405161030e9190610bae565b60405180910390f35b60606040518060400160405280600981526020017f4552433230204554480000000000000000000000000000000000000000000000815250905090565b5f61035d610785565b15610390578119156e22d473030f116ddee9f6b43ac78ba38460601b60601c181761038f57633f68539a5f526004601cfd5b5b82602052637f5e9f20600c52335f52816034600c2055815f52602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560205fa36001905092915050565b5f5f905090565b5f6103f284338461078d565b6103fd84848461081e565b600190509392505050565b5f6012905090565b5f5f61041a6109e0565b90505f5f1b81036104375761042d610317565b8051906020012090505b5f6104406109e4565b90506040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815282602082015281604082015246606082015230608082015260a08120935050505090565b5f6040517ff79e1d0d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6338377508600c52815f526020600c20549050919050565b60606040518060400160405280600381526020017f4554480000000000000000000000000000000000000000000000000000000000815250905090565b5f61052133848461081e565b6001905092915050565b610533610785565b15610566578419156e22d473030f116ddee9f6b43ac78ba38760601b60601c181761056557633f68539a5f526004601cfd5b5b5f61056f6109e0565b90505f5f1b810361058c57610582610317565b8051906020012090505b5f6105956109e4565b9050854211156105ac57631a15a3cc5f526004601cfd5b6040518960601b60601c99508860601b60601c985065383775081901600e52895f526020600c2080547f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835284602084015283604084015246606084015230608084015260a08320602e527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c983528b60208401528a60408401528960608401528060808401528860a084015260c08320604e526042602c205f528760ff16602052866040528560605260208060805f60015afa8c3d51146106945763ddafbaef5f526004601cfd5b80820183558b637f5e9f2060a01b176040528a6034602c20558b8d7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602060608801a3836040525f60605250505050505050505050505050565b5f6106f7610785565b15610767576e22d473030f116ddee9f6b43ac78ba373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610766577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff905061077f565b5b81602052637f5e9f20600c52825f526034600c205490505b92915050565b5f6001905090565b610795610785565b156107de576e22d473030f116ddee9f6b43ac78ba373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160315610819575b81602052637f5e9f20600c52825f526034600c2080548019156108165780831115610810576313be252b5f526004601cfd5b82810382555b50505b505050565b8273ffffffffffffffffffffffffffffffffffffffff1663789ff7018430846040518463ffffffff1660e01b815260040161085b93929190610de5565b6020604051808303815f875af1158015610877573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061089b9190610e44565b50804710156108d6576040517ffedc6d5800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff16826040516108fb90610e9c565b5f6040518083038185875af1925050503d805f8114610935576040519150601f19603f3d011682016040523d82523d5f602084013e61093a565b606091505b5050905080610975576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109d29190610bae565b60405180910390a350505050565b5f90565b5f7fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc65f1b905090565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f610a4f82610a0d565b610a598185610a17565b9350610a69818560208601610a27565b610a7281610a35565b840191505092915050565b5f6020820190508181035f830152610a958184610a45565b905092915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610aca82610aa1565b9050919050565b610ada81610ac0565b8114610ae4575f5ffd5b50565b5f81359050610af581610ad1565b92915050565b5f819050919050565b610b0d81610afb565b8114610b17575f5ffd5b50565b5f81359050610b2881610b04565b92915050565b5f5f60408385031215610b4457610b43610a9d565b5b5f610b5185828601610ae7565b9250506020610b6285828601610b1a565b9150509250929050565b5f8115159050919050565b610b8081610b6c565b82525050565b5f602082019050610b995f830184610b77565b92915050565b610ba881610afb565b82525050565b5f602082019050610bc15f830184610b9f565b92915050565b5f5f5f60608486031215610bde57610bdd610a9d565b5b5f610beb86828701610ae7565b9350506020610bfc86828701610ae7565b9250506040610c0d86828701610b1a565b9150509250925092565b5f60ff82169050919050565b610c2c81610c17565b82525050565b5f602082019050610c455f830184610c23565b92915050565b5f819050919050565b610c5d81610c4b565b82525050565b5f602082019050610c765f830184610c54565b92915050565b5f60208284031215610c9157610c90610a9d565b5b5f610c9e84828501610ae7565b91505092915050565b610cb081610c17565b8114610cba575f5ffd5b50565b5f81359050610ccb81610ca7565b92915050565b610cda81610c4b565b8114610ce4575f5ffd5b50565b5f81359050610cf581610cd1565b92915050565b5f5f5f5f5f5f5f60e0888a031215610d1657610d15610a9d565b5b5f610d238a828b01610ae7565b9750506020610d348a828b01610ae7565b9650506040610d458a828b01610b1a565b9550506060610d568a828b01610b1a565b9450506080610d678a828b01610cbd565b93505060a0610d788a828b01610ce7565b92505060c0610d898a828b01610ce7565b91505092959891949750929550565b5f5f60408385031215610dae57610dad610a9d565b5b5f610dbb85828601610ae7565b9250506020610dcc85828601610ae7565b9150509250929050565b610ddf81610ac0565b82525050565b5f606082019050610df85f830186610dd6565b610e056020830185610dd6565b610e126040830184610b9f565b949350505050565b610e2381610b6c565b8114610e2d575f5ffd5b50565b5f81519050610e3e81610e1a565b92915050565b5f60208284031215610e5957610e58610a9d565b5b5f610e6684828501610e30565b91505092915050565b5f81905092915050565b50565b5f610e875f83610e6f565b9150610e9282610e79565b5f82019050919050565b5f610ea682610e7c565b915081905091905056fea264697066735822122041eca6bb3e66e19f83ce868fe32a4033d6f4f711f409bf7bbcb2ed662161ec8464736f6c634300081d0033'; + } + + /** + * @dev autogenerated - run `./script/util/create_briefcase.sh` to generate current initcode + * + * @notice This initcode is generated from the following contract: + * - Source Contract: src/pkgs/ERC20-eth/src/ERC20ETH.sol + */ + function initcode() internal pure returns (bytes memory) { + return + hex'6080604052348015600e575f5ffd5b506109118061001c5f395ff3fe6080604052600436106100a8575f3560e01c806370a082311161006257806370a08231146101765780637ecebe001461019557806395d89b41146101c6578063a9059cbb146101f1578063d505accf14610210578063dd62ed3e14610231575f5ffd5b806306fdde03146100b3578063095ea7b3146100dd57806318160ddd1461010c57806323b872dd14610128578063313ce567146101475780633644e51514610162575f5ffd5b366100af57005b5f5ffd5b3480156100be575f5ffd5b506100c7610250565b6040516100d49190610775565b60405180910390f35b3480156100e8575f5ffd5b506100fc6100f73660046107c5565b610273565b60405190151581526020016100d4565b348015610117575f5ffd5b505f5b6040519081526020016100d4565b348015610133575f5ffd5b506100fc6101423660046107ed565b6102f3565b348015610152575f5ffd5b50604051601281526020016100d4565b34801561016d575f5ffd5b5061011a610314565b348015610181575f5ffd5b5061011a610190366004610827565b610390565b3480156101a0575f5ffd5b5061011a6101af366004610827565b6338377508600c9081525f91909152602090205490565b3480156101d1575f5ffd5b5060408051808201909152600381526208aa8960eb1b60208201526100c7565b3480156101fc575f5ffd5b506100fc61020b3660046107c5565b6103aa565b34801561021b575f5ffd5b5061022f61022a366004610847565b6103bf565b005b34801561023c575f5ffd5b5061011a61024b3660046108b4565b610573565b60408051808201909152600981526808aa4866460408aa8960bb1b602082015290565b5f6001600160a01b0383166e22d473030f116ddee9f6b43ac78ba318821915176102a457633f68539a5f526004601cfd5b82602052637f5e9f20600c52335f52816034600c2055815f52602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560205fa35060015b92915050565b5f6102ff8433846105b7565b61030a84848461061b565b5060019392505050565b5f8061031e610250565b805190602001209050604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815260208101929092527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc69082015246606082015230608082015260a09020919050565b5f60405163f79e1d0d60e01b815260040160405180910390fd5b5f6103b633848461061b565b50600192915050565b6001600160a01b0386166e22d473030f116ddee9f6b43ac78ba318851915176103ef57633f68539a5f526004601cfd5b5f6103f8610250565b8051906020012090507fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc64286101561043757631a15a3cc5f526004601cfd5b6040518960601b60601c99508860601b60601c985065383775081901600e52895f526020600c2080547f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835284602084015283604084015246606084015230608084015260a08320602e527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c983528b60208401528a60408401528960608401528060808401528860a084015260c08320604e526042602c205f528760ff16602052866040528560605260208060805f60015afa8c3d511461051f5763ddafbaef5f526004601cfd5b0190556303faf4f960a51b89176040526034602c20889055888a7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602060608501a360405250505f60605250505050505050565b5f6e22d473030f116ddee9f6b43ac78ba2196001600160a01b0383160161059c57505f196102ed565b50602052637f5e9f20600c9081525f91909152603490205490565b6e22d473030f116ddee9f6b43ac78ba2196001600160a01b038316016105dc57505050565b81602052637f5e9f20600c52825f526034600c208054801915610614578083111561060e576313be252b5f526004601cfd5b82810382555b5050505050565b60405163789ff70160e01b81526001600160a01b03841660048201819052306024830152604482018390529063789ff701906064016020604051808303815f875af115801561066c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061069091906108e5565b50804710156106b257604051631fdb8dab60e31b815260040160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146106fb576040519150601f19603f3d011682016040523d82523d5f602084013e610700565b606091505b5050905080610722576040516312171d8360e31b815260040160405180910390fd5b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161076791815260200190565b60405180910390a350505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b03811681146107c0575f5ffd5b919050565b5f5f604083850312156107d6575f5ffd5b6107df836107aa565b946020939093013593505050565b5f5f5f606084860312156107ff575f5ffd5b610808846107aa565b9250610816602085016107aa565b929592945050506040919091013590565b5f60208284031215610837575f5ffd5b610840826107aa565b9392505050565b5f5f5f5f5f5f5f60e0888a03121561085d575f5ffd5b610866886107aa565b9650610874602089016107aa565b95506040880135945060608801359350608088013560ff81168114610897575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156108c5575f5ffd5b6108ce836107aa565b91506108dc602084016107aa565b90509250929050565b5f602082840312156108f5575f5ffd5b81518015158114610840575f5ffdfea164736f6c634300081d000a'; + } +} diff --git a/src/briefcase/protocols/ERC20-eth/interfaces/IERC7914.sol b/src/briefcase/protocols/ERC20-eth/interfaces/IERC7914.sol new file mode 100644 index 00000000..1ce569c2 --- /dev/null +++ b/src/briefcase/protocols/ERC20-eth/interfaces/IERC7914.sol @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >=0.6.2; + +interface IERC7914 { + function transferFromNative(address from, address recipient, uint256 amount) external returns (bool); + function approveNative(address spender, uint256 amount) external returns (bool); +} diff --git a/src/pkgs/ERC20-eth b/src/pkgs/ERC20-eth new file mode 160000 index 00000000..455edd8a --- /dev/null +++ b/src/pkgs/ERC20-eth @@ -0,0 +1 @@ +Subproject commit 455edd8a39d928be8514a8c02e1e4fea4355b404