Skip to content

Commit d11d250

Browse files
Merge pull request #13 from StartaleLabs/feat/deploy-ready
feat: init with things required for deployment
2 parents 85e659f + b7adc04 commit d11d250

21 files changed

+838
-17
lines changed

.env.example

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,30 @@ SEPOLIA_DEPLOYER_NAME=
77
ETHERSCAN_API_KEY=
88

99
MINATO_RPC_URL=
10-
PRIVATE_KEY=
10+
PRIVATE_KEY=
11+
12+
DEPLOYER_CONTRACT_DEPLOYER_PRIVATE_KEY=
13+
FUNDING_ACCOUNT_PRIVATE_KEY=
14+
15+
DEPLOYER_CONTRACT_ADDRESS=0x3C02c039a7f38699bC548D0f324c92bD7FeA7800
16+
DEPLOYER_DEPLOYER_EOA=0xd3F344fd7461f55Bb4A78B37b622DBf4112263F4
17+
18+
STARTALE_ACCOUNT_IMPLEMENTATION=0x000000fca5d013e9e1d1c9f9f65ebc0c74f41d9b
19+
OWNER=0x2cf491602ad22944D9047282aBC00D3e52F56B37
20+
DEFAULT_ECDSA_VALIDATOR=0x0000008aacebdc3df787f9833ec06aca409ad688
21+
22+
#Salts
23+
DEFAULT_ECDSA_VALIDATOR_SALT=ECDSA_VALIDATOR_V_1_0_0_Default_200525_Nz93x9G
24+
# 0x0000008aacebdc3df787f9833ec06aca409ad688
25+
26+
ECDSA_VALIDATOR_SALT=ECDSA_VALIDATOR_V_1_0_0_200525_EYfpsE2
27+
# 0x000000df48487fc571f8fae18b6f6577900ae52b
28+
29+
STARTALE_SMART_ACCOUNT_FACTORY_SALT=STARTALE_SMART_ACCOUNT_FACTORY_V_1_0_0_200525_pEa0f9h
30+
# 0x0000003cc24a4678ac636ab1327c592d84898a46
31+
32+
STARTALE_SMART_ACCOUNT_IMPLEMENTATION_SALT=STARTALE_SMART_ACCOUNT_IMPLEMENTATION_V_1_0_0_200525_z2znQA2
33+
# 0x000000fca5d013e9e1d1c9f9f65ebc0c74f41d9b
34+
35+
STARTALE_SMART_ACCOUNT_BOOTSTRAP_SALT=STARTALE_SMART_ACCOUNT_BOOTSTRAP_V_1_0_0_200525_143MCFX
36+
# 0x000000faa917a0609c30df288b1dea4f1f7096a9

foundry.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ solc_version = '0.8.29'
1616
optimizer = true
1717
via_ir = true
1818
evm_version = "prague" # See https://www.evmdiff.com/features?name=PUSH0&kind=opcode
19-
optimizer_runs = 10_000
19+
optimizer_runs = 999
2020
bytecode_hash = "none"
2121
cbor_metadata = false
2222

hardhat.config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ const config: HardhatUserConfig = {
1515
viaIR: true,
1616
optimizer: {
1717
enabled: true,
18-
runs: 1000,
18+
runs: 499,
1919
},
2020
},
2121
},
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
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

Comments
 (0)