|
| 1 | +// SPDX-License-Identifier: UNLICENSED |
| 2 | +pragma solidity ^0.8.29; |
| 3 | + |
| 4 | +import '../src/deployer/Deployer.sol'; |
| 5 | +import {Script, console} from 'forge-std/Script.sol'; |
| 6 | + |
| 7 | +contract DeployDefaultECDSAValidatorCreate3 is Script { |
| 8 | + Deployer deployerInstance; |
| 9 | + address entryPoint; |
| 10 | + mapping(uint256 => uint256) public DEPLOYMENT_CHAIN_GAS_PRICES; |
| 11 | + |
| 12 | + error NoGasPriceSet(); |
| 13 | + error ContractDeploymentFailed(); |
| 14 | + |
| 15 | + function setUp() public { |
| 16 | + deployerInstance = Deployer(vm.envAddress('DEPLOYER_CONTRACT_ADDRESS')); // Set Deployer contract |
| 17 | + // EntryPoint v0.7 address |
| 18 | + entryPoint = vm.parseAddress('0x0000000071727De22E5E9d8BAf0edAc6f37da032'); |
| 19 | + DEPLOYMENT_CHAIN_GAS_PRICES[1946] = 0.002 gwei; |
| 20 | + DEPLOYMENT_CHAIN_GAS_PRICES[1868] = 0.001 gwei; |
| 21 | + } |
| 22 | + |
| 23 | + function run() public { |
| 24 | + uint256 deployerPrivateKey = vm.envUint('PRIVATE_KEY'); |
| 25 | + |
| 26 | + string memory contractName = 'ECDSAValidator'; |
| 27 | + string memory saltString = vm.envString('DEFAULT_ECDSA_VALIDATOR_SALT'); |
| 28 | + |
| 29 | + bytes memory deployedBytecode = |
| 30 | + hex'6080806040523460155761163c908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c806306fdde03146101045780630807dbc1146100ff57806354fd4d50146100fa5780635c81ca68146100f55780636d61fe70146100f05780638a91b0e3146100eb578063940d3840146100e657806397003203146100e1578063d60b347f146100dc578063d620c85a146100d7578063e824b568146100d2578063ecd05961146100cd578063f2fde38b146100c8578063f551e2ee146100c35763fa544161146100be575f80fd5b6108da565b610827565b61079b565b61077b565b61074c565b610712565b6106c4565b610613565b610562565b61045f565b6102eb565b61025d565b610206565b6101a3565b610133565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b3461018e575f36600319011261018e5761018a604051610154604082610921565b600e81527f454344534156616c696461746f72000000000000000000000000000000000000602082015260405191829182610109565b0390f35b5f80fd5b6001600160a01b0381160361018e57565b3461018e57604036600319011261018e5760206101fb6004356101c581610192565b6001600160a01b03602435916101da83610192565b165f526002835260405f20906001600160a01b03165f5260205260405f2090565b541515604051908152f35b3461018e575f36600319011261018e5761018a604051610227604082610921565b600581527f312e302e30000000000000000000000000000000000000000000000000000000602082015260405191829182610109565b3461018e57602036600319011261018e5761028c6001600160a01b0360043561028581610192565b1633610cb7565b005b9181601f8401121561018e5782359167ffffffffffffffff831161018e576020838186019501011161018e57565b602060031982011261018e576004359067ffffffffffffffff821161018e576102e79160040161028e565b9091565b3461018e576102f9366102bc565b90811561043757610326336001600160a01b03165f525f6020526001600160a01b0360405f205416151590565b61040f578160141161018e5761034d81356bffffffffffffffffffffffff19165b60601c90565b6001600160a01b0381169081156103e7576103a49061037c336001600160a01b03165f525f60205260405f2090565b906001600160a01b031673ffffffffffffffffffffffffffffffffffffffff19825416179055565b337fa5e1f8b4009110f5525798d04ae2125421a12d0590aa52c13682ff1bd3c492ca5f80a3601482116103d357005b8161028c926103e192610948565b90610a29565b7fc81abf60000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fe72ce85e000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f1f2a381c000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461018e5761046d366102bc565b5050610495336001600160a01b03165f525f6020526001600160a01b0360405f205416151590565b1561053657335f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff198154169055337f58619076adf5bb0943d100ef88d52d7c3fd691b19d3a9071b555b651fbf418da5f80a2335f52600160205260405f205460015b818111156104ff57005b80820382811161053157610518610520913360016115a7565b336001610e75565b505f198114610531576001016104f5565b610a04565b7ff91bd6f1000000000000000000000000000000000000000000000000000000005f523360045260245ffd5b3461018e57606036600319011261018e5760043560243567ffffffffffffffff811161018e5761059690369060040161028e565b60443567ffffffffffffffff811161018e576105b690369060040161028e565b601481949294036105eb5760141161018e5761018a936105d9933560601c610ab8565b60405190151581529081906020820190565b7fdfe93090000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461018e57604036600319011261018e5760043567ffffffffffffffff811161018e5780360361012060031982011261018e5760243590610660836004013561065b81610192565b6109bd565b92610104810135916022190182121561018e57019060048201359167ffffffffffffffff831161018e5760240190823603821361018e576106a093610ab8565b156106ba5761018a5f5b6040519081529081906020820190565b61018a60016106aa565b3461018e57602036600319011261018e5760206107086004356106e681610192565b6001600160a01b03165f525f6020526001600160a01b0360405f205416151590565b6040519015158152f35b3461018e575f36600319011261018e5760206040517fd620c85a000000000000000000000000000000000000000000000000000000008152f35b3461018e57602036600319011261018e5761028c6001600160a01b0360043561077481610192565b1633610dc5565b3461018e57602036600319011261018e5760206040516001600435148152f35b3461018e57602036600319011261018e576004356107b881610192565b6001600160a01b0381169081156103e75761080090335f525f60205260405f20906001600160a01b031673ffffffffffffffffffffffffffffffffffffffff19825416179055565b337fa5e1f8b4009110f5525798d04ae2125421a12d0590aa52c13682ff1bd3c492ca5f80a3005b3461018e57606036600319011261018e5760043561084481610192565b60443560243567ffffffffffffffff821161018e5761018a9261086e61089293369060040161028e565b92909182808501601f19013561649261ffff30801c190402146108c5575b50610b29565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681529081906020820190565b6040810135018035945060200192505f61088c565b3461018e57602036600319011261018e5760206108fc60043561065b81610192565b6001600160a01b0360405191168152f35b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff82111761094357604052565b61090d565b909291928360141161018e57831161018e57601401916013190190565b9093929384831161018e57841161018e578101920390565b356bffffffffffffffffffffffff1981169291906014821061099d575050565b6bffffffffffffffffffffffff1960149290920360031b82901b16169150565b6001600160a01b0381165f525f6020526001600160a01b0360405f20541680155f146109e7575090565b905090565b6001600160a01b03610a019216906001610d5e565b90565b634e487b7160e01b5f52601160045260245ffd5b908160140291601483040361053157565b60148206610a90575f5b601483048110610a4257505050565b806014029060148204810361053157600181019182821161053157610a83610347610a7d610a8993610a75600197610a18565b908989610965565b9061097d565b336109ec565b5001610a33565b7f7c148cd9000000000000000000000000000000000000000000000000000000005f5260045ffd5b926001600160a01b039384610ace83868661144b565b911694168414610b20576001600160a01b0392610b11926020527b19457468657265756d205369676e6564204d6573736167653a0a33325f52603c60042061144b565b1614610b1b575f90565b600190565b50505050600190565b9291908215610c52575b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0602083013511610c2a576001600160a01b035f94166dd9ecebf3c23529de49815dac1c4c8114908115610c20575b8115610bf0575b50610bd4575b8315610bc1575b8315610baf575b505050155f03631626ba7e1760e01b90565b610bb993506113a7565b5f8080610b9d565b9250610bce8282856110c6565b92610b96565b9250610bea828285610be5336109bd565b610ab8565b92610b8f565b90505f526002602052610c173360405f20906001600160a01b03165f5260205260405f2090565b5415155f610b89565b3381149150610b82565b7f8baa579f000000000000000000000000000000000000000000000000000000005f5260045ffd5b61773961ffff841904028103610b3357505050507f773900010000000000000000000000000000000000000000000000000000000090565b600190610cb1935f520160205260405f20906001600160a01b03165f5260205260405f2090565b54151590565b610cc382826001610c8a565b610d5857805f52600160205260405f2054607f811015610d2d57505f8181526001602081815260408084208054909301600581901b84018790559283905594835260029052929020610d2791905b906001600160a01b03165f5260205260405f2090565b55600190565b7f90eb3be4000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b50505f90565b91610d6a818385610c8a565b610dbe57815f528260205260405f2054607f811015610d2d57505f8281526020848152604080832080546001908101600581901b83018790559182905594845293909501905292909220610d279190610d11565b5050505f90565b90805f526002602052610dec8260405f20906001600160a01b03165f5260205260405f2090565b54918215610dbe575f19830191838311610531575f828152600160205260409020545f19810191908211610531575f94848484610d1195610d279803610e4b575b509050610e3c915060016115f4565b6002905f5260205260405f2090565b610e6b92610e3c610e61610d11938560016115a7565b80928560016115d6565b555f808481610e2d565b906001820192805f5283602052610ea08260405f20906001600160a01b03165f5260205260405f2090565b54908115610f37575f1982019482861161053157610ec78486905f5260205260405f205490565b5f198101969087116105315784610d2796610d119583838b5f9c610ef49703610f01575b505050506115f4565b905f5260205260405f2090565b610f2d92610f1f610f16610d119385896115a7565b809285896115d6565b88905f5260205260405f2090565b555f808381610eeb565b50505050505f90565b81601f8201121561018e5780519067ffffffffffffffff82116109435760405192610f75601f8401601f191660200185610921565b8284526020838301011161018e57815f9260208093018386015e8301015290565b5190610fa182610192565b565b9080601f8301121561018e5781519167ffffffffffffffff8311610943578260051b9060405193610fd76020840186610921565b845260208085019282010192831161018e57602001905b828210610ffb5750505090565b8151815260209182019101610fee565b9060e08282031261018e5781517fff000000000000000000000000000000000000000000000000000000000000008116810361018e5792602083015167ffffffffffffffff811161018e5782611062918501610f40565b92604081015167ffffffffffffffff811161018e5783611083918301610f40565b9260608201519261109660808401610f96565b9260a08101519260c082015167ffffffffffffffff811161018e57610a019201610fa3565b6040513d5f823e3d90fd5b90923093306112fa575b60405190600119858201013560f01c94600e830196869187810384016041198101976119015f5260408960203789158a604201841017816042601e2018176112ba57507f5479706564446174615369676e2800000000000000000000000000000000000086526001198101999889818c82378188016028600e8201526029600d8201515f1a03611264575b506f07fffffe000000000000010000000000919250999899515f1a1c5b88515f1a602881146111995790651201000000016001921c17980197611178565b50929496999086986040610a019b83605c96989a957f20636f6e74656e74732c737472696e67206e616d652c737472696e670000000085527f2076657273696f6e2c75696e7432353620636861696e49642c61646472657373601c8601527f20766572696679696e67436f6e74726163742c627974657333322073616c7429603c8601528785013788370103018620835260e08320604052600116604201601e2092604119910301935b60405215611255575b610be5336109bd565b61125f90336114e4565b61124c565b60015f5b016029600d82840301515f1a14848210111561128657600190611268565b6028915080806040600e936f07fffffe000000000000010000000000970397886041199101010185378a010153829161115b565b949699505095505050610a0194505f907f983e65e5148e570cd828ead231ee759a8d7958721a768f93bc4483ba005c32de5f5260205260405f2091611243565b6040516342580cb760e11b815294505f85600481335afa80156113a2575f955f5f905f925f94611369575b50906001600160a01b039291604051996020815191012060408b01526020815191012060608a015260808901521660a087015260c086015260e085016040526110d0565b925050506001600160a01b03965061139391503d805f833e61138b8183610921565b81019061100b565b50939993945092909190611325565b6110bb565b9092915f933a156113b757505050565b90919293503a3a5260203a3a386d378edcd5b5b0a24f5342d8c1048561fffffa503a51156113ed575b610a0192610be5336109bd565b60405192631626ba7e3a526d378edcd5b5b0a24f5342d8c1048560205260408052454561ffff011793845a106d378edcd5b5b0a24f5342d8c1048583141761144957610a01943a906064601c3a923090fa5060405292506113e0565bfe5b9092919260405193806040146114a45760411461147457505050505b638baa579f5f526004601cfd5b806040809201355f1a60205281375b5f526020600160805f825afa51915f6060526040523d610fa1575050611467565b508060207f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92013590601b8260ff1c016020523560405216606052611483565b5f6001600160a01b03916004604051809481936342580cb760e11b8352165afa9081156113a25760a0915f915f5f915f93611582575b50604051937f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f855260208151910120602085015260208151910120604084015260608301526080820152206719010000000000005f52601a52603a526042601820905f603a52565b9250505061159a91503d805f833e61138b8183610921565b509394509250905f61151a565b905f5260205260405f209081548110156115c65760010160051b015490565b638277484f5f526020526024601cfd5b905f5260205260405f209081548110156115c65760010160051b0155565b905f5260205260405f208054908115611638575f19820191808311610531578154831015611627575f9060051b82015555565b82638277484f5f526020526024601cfd5b505056'; |
| 31 | + |
| 32 | + // Load environment variables |
| 33 | + |
| 34 | + // Concatenate bytecode + constructor arguments if any |
| 35 | + bytes memory finalBytecode = abi.encodePacked(deployedBytecode); |
| 36 | + |
| 37 | + // Deploy contract if needed |
| 38 | + deployGeneric(deployerPrivateKey, saltString, finalBytecode, contractName); |
| 39 | + } |
| 40 | + |
| 41 | + function deployGeneric( |
| 42 | + uint256 deployerPrivateKey, |
| 43 | + string memory saltString, |
| 44 | + bytes memory finalBytecode, |
| 45 | + string memory contractName |
| 46 | + ) public { |
| 47 | + // Compute derived salt |
| 48 | + bytes32 derivedSalt = keccak256(abi.encodePacked(saltString)); |
| 49 | + |
| 50 | + // Compute contract address before deployment |
| 51 | + address computedAddress = deployerInstance.addressOf(derivedSalt); |
| 52 | + |
| 53 | + console.log(string(abi.encodePacked(contractName, ' Computed Address:')), computedAddress); |
| 54 | + |
| 55 | + // Check if contract is already deployed |
| 56 | + uint256 codeSize; |
| 57 | + assembly { |
| 58 | + codeSize := extcodesize(computedAddress) |
| 59 | + } |
| 60 | + |
| 61 | + if (codeSize == 0) { |
| 62 | + console.log(string(abi.encodePacked(contractName, ' not deployed, deploying now...'))); |
| 63 | + deployContract(deployerPrivateKey, derivedSalt, finalBytecode, contractName, computedAddress); |
| 64 | + } else { |
| 65 | + console.log(string(abi.encodePacked(contractName, ' already deployed at:')), computedAddress); |
| 66 | + } |
| 67 | + } |
| 68 | + |
| 69 | + function deployContract( |
| 70 | + uint256 deployerPrivateKey, |
| 71 | + bytes32 derivedSalt, |
| 72 | + bytes memory finalBytecode, |
| 73 | + string memory contractName, |
| 74 | + address computedAddress |
| 75 | + ) internal { |
| 76 | + uint256 chainId = block.chainid; |
| 77 | + |
| 78 | + uint256 gasPrice = DEPLOYMENT_CHAIN_GAS_PRICES[chainId]; |
| 79 | + require(gasPrice > 0, NoGasPriceSet()); |
| 80 | + |
| 81 | + console.log('Using gas price:', gasPrice); |
| 82 | + |
| 83 | + // Deploy contract using deployer's private key |
| 84 | + vm.startBroadcast(deployerPrivateKey); |
| 85 | + (bool success,) = address(deployerInstance).call{gas: 5_000_000}( |
| 86 | + abi.encodeWithSignature('deploy(bytes32,bytes)', derivedSalt, finalBytecode) |
| 87 | + ); |
| 88 | + vm.stopBroadcast(); |
| 89 | + |
| 90 | + require(success, ContractDeploymentFailed()); |
| 91 | + |
| 92 | + console.log(string(abi.encodePacked('Transaction success: ', contractName))); |
| 93 | + |
| 94 | + // Verify deployment by checking contract existence |
| 95 | + uint256 codeSize; |
| 96 | + assembly { |
| 97 | + codeSize := extcodesize(computedAddress) |
| 98 | + } |
| 99 | + |
| 100 | + if (codeSize == 0) { |
| 101 | + console.log(string(abi.encodePacked('Invalid deployment of ', contractName))); |
| 102 | + } else { |
| 103 | + console.log(string(abi.encodePacked(contractName, ' Deployed Successfully at:')), computedAddress); |
| 104 | + } |
| 105 | + } |
| 106 | +} |
0 commit comments