diff --git a/.gitignore b/.gitignore index f41d393fe..a9dfd2784 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,16 @@ artifacts cache-zk artifacts-zk +# Broadcast files +/broadcast/* +!/broadcast/*/run-latest.json +!/broadcast/deployed-addresses.md +!/broadcast/deployed-addresses.json +!/broadcast/DeployedAddresses.sol + +# Foundry files +out + # Upgradeability files .openzeppelin diff --git a/broadcast/DeployHubPool.s.sol/11155111/run-latest.json b/broadcast/DeployHubPool.s.sol/11155111/run-latest.json new file mode 100644 index 000000000..59aabb066 --- /dev/null +++ b/broadcast/DeployHubPool.s.sol/11155111/run-latest.json @@ -0,0 +1,102 @@ +{ + "transactions": [ + { + "hash": "0x68e3f7e15e4a2756c8c8573e6fc06f394a9956fd3d776fc42ffbea4835c01b04", + "transactionType": "CREATE", + "contractName": "LpTokenFactory", + "contractAddress": "0x01f4b025f4a12873bbed3e531dd5aae6b0b6445a", + "function": null, + "arguments": null, + "transaction": { + "from": "0x3d21dbc8b1c7add9c312b00b63d8b2177af1546c", + "gas": "0x1d9795", + "value": "0x0", + "input": "0x6080806040523461001657611a09908161001b8239f35b5f80fdfe608060408181526004908136101562000016575f80fd5b5f803560e01c63fc2f1b6e146200002b575f80fd5b34620002fc5760209384600319360112620002fc57833573ffffffffffffffffffffffffffffffffffffffff91828216809203620002fc576306fdde0360e01b81525f818781855afa908115620003ac5790620000ff915f916200038e575b508551906200009982620003df565b600a82527f4163726f7373205632200000000000000000000000000000000000000000000089830152865191620000d083620003df565b600983527f204c5020546f6b656e00000000000000000000000000000000000000000000008a840152620004de565b84516395d89b4160e01b81525f818881865afa9081156200035d576200016c8893928a925f9162000367575b508851906200013a82620003df565b858252634176322d60e01b848301528951916200015783620003df565b600383526202d4c560ec1b85840152620004de565b9387519384809263313ce56760e01b82525afa9182156200035d575f926200031d575b5085519261149b918285019285841067ffffffffffffffff8511176200030a57620001e386959493620001d58b9460ff94620005398a39606087526060870190620004b7565b858103868f015290620004b7565b931691015203905ff0801562000300571692833b15620002fc578251634c1d96ab60e11b815233828201525f8160248183895af18015620002f257620002dc575b50833b15620002b6578251637a231bdd60e11b81523382820152828160248183895af18015620002d257908391620002ba575b5050833b15620002b6578251906339e6401560e11b82523390820152818160248183885af18015620002ac5762000291575b505051908152f35b6200029d8291620003b6565b620002a9578062000289565b80fd5b83513d84823e3d90fd5b5080fd5b620002c590620003b6565b620002b657815f62000257565b84513d85823e3d90fd5b620002e9919250620003b6565b5f905f62000224565b84513d5f823e3d90fd5b5f80fd5b83513d5f823e3d90fd5b60418a634e487b7160e01b5f525260245ffd5b9091508781813d831162000355575b620003388183620003fc565b81010312620002fc575160ff81168103620002fc57905f6200018f565b503d6200032c565b86513d5f823e3d90fd5b6200038791503d805f833e6200037e8183620003fc565b81019062000442565b5f6200012b565b620003a591503d805f833e6200037e8183620003fc565b5f6200008a565b85513d5f823e3d90fd5b67ffffffffffffffff8111620003cb57604052565b634e487b7160e01b5f52604160045260245ffd5b6040810190811067ffffffffffffffff821117620003cb57604052565b90601f8019910116810190811067ffffffffffffffff821117620003cb57604052565b5f5b838110620004315750505f910152565b818101518382015260200162000421565b602081830312620002fc57805167ffffffffffffffff91828211620002fc57019082601f83011215620002fc578151908111620003cb576040519262000493601f8301601f191660200185620003fc565b81845260208284010111620002fc57620004b491602080850191016200041f565b90565b90602091620004d2815180928185528580860191016200041f565b601f01601f1916010190565b620004b49160405193849160209362000500815180928780880191016200041f565b830162000516825180938780850191016200041f565b016200052b825180938680850191016200041f565b01038084520182620003fc56fe604060808152346200028a576200149b803803806200001e816200050d565b92833981016060828203126200028a5781516001600160401b03908181116200028a57826200004f91850162000533565b91602090818501518381116200028a5786916200006e91870162000533565b9401519160ff948584168094036200028a57845191808311620003f8576003928354906001978883811c93168015620004e2575b87841014620004ce578190601f938481116200047b575b50879084831160011462000418575f926200040c575b50505f1982871b1c191690881b1784555b8251918211620003f85760049283548881811c91168015620003ed575b87821014620003da579081838594931162000385575b508691831160011462000322575f9262000316575b50505f1982851b1c191690861b1790555b60ff19928360065416176006555f80526005928383528585885f200154166200016281620005a3565b6200028a575f80528383526002875f2086810187848254161790555f81550133156200028a5780546001600160a01b03191633179055620001a2620004ed565b5f8152855f528484528686895f20015416620001be81620005a3565b6200028a578590815f5285855283895f208381016002868254161790555f815501905f925b620002d2575b5050505f80528383528585885f200154166200020581620005a3565b156200028a5762000215620004ed565b5f815260025f528484528686895f200154166200023281620005a3565b6200028a57859260025f52858552885f208481016002858254161790555f815501905f935b6200028e575b505050505f805252825f200154166200027681620005a3565b156200028a5751610ed89081620005c38239f35b5f80fd5b8051841015620002cc5783861b81018501516001600160a01b031680156200028a57879485915f528387528a5f208286825416179055019362000257565b6200025d565b8051831015620003105782871b81018601516001600160a01b031680156200028a57889384915f528388528b5f2082878254161790550192620001e3565b620001e9565b015190505f8062000128565b90889350601f19831691855f52875f20925f5b898282106200036e575050841162000356575b505050811b01905562000139565b01515f1983871b60f8161c191690555f808062000348565b8385015186558c9790950194938401930162000335565b90919250845f52865f208380860160051c820192898710620003d0575b9186958c929594930160051c01915b828110620003c157505062000113565b5f81558695508b9101620003b1565b92508192620003a2565b602285634e487b7160e01b5f525260245ffd5b90607f1690620000fd565b634e487b7160e01b5f52604160045260245ffd5b015190505f80620000cf565b908a9350601f19831691885f52895f20925f5b8b8282106200046457505084116200044c575b505050811b018455620000e0565b01515f1983891b60f8161c191690555f80806200043e565b8385015186558e979095019493840193016200042b565b909150865f52875f208480850160051c8201928a8610620004c4575b918c91869594930160051c01915b828110620004b5575050620000b9565b5f81558594508c9101620004a5565b9250819262000497565b634e487b7160e01b5f52602260045260245ffd5b92607f1692620000a2565b60405190602082016001600160401b03811183821017620003f857604052565b6040519190601f01601f191682016001600160401b03811183821017620003f857604052565b919080601f840112156200028a5782516001600160401b038111620003f85760209062000569601f8201601f191683016200050d565b928184528282870101116200028a575f5b8181106200058f5750825f9394955001015290565b85810183015184820184015282016200057a565b60031115620005ae57565b634e487b7160e01b5f52602160045260245ffdfe6080604090808252600480361015610015575f80fd5b5f3560e01c91826306fdde0314610acf57508163095ea7b314610aa657816318160ddd14610a8857816323b872dd14610a07578163313ce567146109e6578163395093511461099957816340c10f191461090d57816342966c68146108e15781636be7658b1461082757816370a08231146107f157816373cc802a1461073557816374d0a6761461068157816379cc67901461064a5781637cdc1cb91461061b57816395d89b41146104fc578163983b2d561461044a578163a457c2d7146103f7578163a9059cbb146103c7578163aaa14ca314610334578163ab3545e5146102de578163d97c05be1461022157508063dd62ed3e146101d75763f44637ba1461011d575f80fd5b346101d35760203660031901126101d357610136610bee565b9060025f526005602052600260ff6001835f2001541661015581610c3b565b036101d35760025f526005602052610171815f20543390610d5b565b156101d35760025f5260056020526001600160a01b036003825f200192169182156101d357825f526020525f20600160ff19825416179055339060027f63502af7324ff6db91ab38f8236a648727d9385ea6c782073dd4882d8a61a48f5f80a4005b5f80fd5b50346101d357806003193601126101d3576020906101f3610bee565b6101fb610c04565b906001600160a01b038091165f5260018452825f2091165f528252805f20549051908152f35b9050346101d357816003193601126101d357359061023d610c04565b90825f526005602052600160ff81835f2001541661025a81610c3b565b036101d357825f526005602052610275815f20543390610d5b565b156101d35760026001600160a01b0391845f5260056020525f200191169081156101d3578173ffffffffffffffffffffffffffffffffffffffff1982541617905533917f3b855c56b409b671c7112789d022675eb639d0bcb8896f1b6197c132f799e7465f80a4005b9050346101d35760203660031901126101d3573590815f526005602052600160ff81835f2001541661030f81610c3b565b036101d3576020915f52600582526001600160a01b036002825f200154169051908152f35b9050346101d35760203660031901126101d3573590815f526005602052600260ff6001835f2001541661036681610c3b565b036101d3576103753383610d5b565b156101d3575f8281526005602090815291812033825260030190915260409020805460ff19169055339033907feb3e33034c392e69263b04ec0fa376dc12784a41b6676c7f31b936cbc0fbb5af5f80a4005b82346101d357806003193601126101d3576020906103f06103e6610bee565b6024359033610dd4565b5160018152f35b82346101d357806003193601126101d357610410610bee565b9060243591335f526001602052815f206001600160a01b0382165f52602052815f2054908382106101d3576020936103f092039033610d77565b82346101d35760203660031901126101d357610464610bee565b600191825f526005602052600260ff84835f2001541661048381610c3b565b036101d357825f52600560205261049e815f20543390610d5b565b156101d357825f5260056020526001600160a01b036003825f200192169182156101d357825f526020525f208260ff1982541617905533917f63502af7324ff6db91ab38f8236a648727d9385ea6c782073dd4882d8a61a48f5f80a4005b82346101d3575f3660031901126101d3578051905f835460018160011c9060018316928315610611575b60209384841081146105fe578388529081156105e2575060011461058e575b505050829003601f01601f191682019267ffffffffffffffff84118385101761057b5750829182610577925282610ba7565b0390f35b604190634e487b7160e01b5f525260245ffd5b5f878152929350837f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b8385106105ce5750505050830101848080610545565b8054888601830152930192849082016105b8565b60ff1916878501525050151560051b8401019050848080610545565b602289634e487b7160e01b5f525260245ffd5b91607f1691610526565b82346101d357806003193601126101d35761064160209261063a610c04565b9035610d5b565b90519015158152f35b82346101d357806003193601126101d357610663610bee565b9061066d33610d02565b156101d3576103f060209260243590610e43565b9050346101d357816003193601126101d357359061069d610c04565b90825f526005602052600260ff6001835f200154166106bb81610c3b565b036101d357825f5260056020526106d6815f20543390610d5b565b156101d357825f5260056020526001600160a01b036003825f200192169182156101d357825f526020525f20600160ff1982541617905533917f63502af7324ff6db91ab38f8236a648727d9385ea6c782073dd4882d8a61a48f5f80a4005b82346101d35760203660031901126101d35761074f610bee565b905f80526005602052600160ff81835f2001541661076c81610c3b565b036101d3575f80526005602052610787815f20543390610d5b565b156101d35760026001600160a01b03915f805260056020525f200191169081156101d3578173ffffffffffffffffffffffffffffffffffffffff1982541617905533905f7f3b855c56b409b671c7112789d022675eb639d0bcb8896f1b6197c132f799e7468180a4005b82346101d35760203660031901126101d3576020906001600160a01b03610816610bee565b165f525f8252805f20549051908152f35b9050346101d357816003193601126101d35735610842610c04565b91815f526005602052600260ff6001835f2001541661086081610c3b565b036101d357815f52600560205261087b815f20543390610d5b565b156101d3578260036108af92845f5260056020525f2001906001600160a01b03165f5260205260405f2060ff198154169055565b6001600160a01b03339216907feb3e33034c392e69263b04ec0fa376dc12784a41b6676c7f31b936cbc0fbb5af5f80a4005b346101d35760203660031901126101d3576108fb33610d02565b156101d35761090b903533610e43565b005b82346101d357806003193601126101d357610926610bee565b906024359161093433610c59565b156101d3576001600160a01b031680156101d3575f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60208561097a8297600254610c1a565b6002558484528382528584208181540190558551908152a35160018152f35b82346101d357806003193601126101d3576020906103f06109b8610bee565b335f5260018452825f206001600160a01b0382165f5284526109df602435845f2054610c1a565b9033610d77565b82346101d3575f3660031901126101d35760209060ff600654169051908152f35b82346101d35760603660031901126101d357610a21610bee565b90610a2a610c04565b604435906001600160a01b0384165f526001602052825f20335f52602052825f20545f198103610a63575b50906103f091602094610dd4565b91908183106101d357602094610a7f836103f095033383610d77565b94509091610a55565b82346101d3575f3660031901126101d3576020906002549051908152f35b82346101d357806003193601126101d3576020906103f0610ac5610bee565b6024359033610d77565b83346101d3575f3660031901126101d3575f60035460018160011c9060018316928315610b9d575b60209384841081146105fe578388529081156105e25750600114610b4757505050829003601f01601f191682019267ffffffffffffffff84118385101761057b5750829182610577925282610ba7565b60035f908152929350837fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b838510610b895750505050830101848080610545565b805488860183015293019284908201610b73565b91607f1691610af7565b602080825282518183018190529093925f5b828110610bda57505060409293505f838284010152601f8019910116010190565b818101860151848201604001528501610bb9565b600435906001600160a01b03821682036101d357565b602435906001600160a01b03821682036101d357565b91908201809211610c2757565b634e487b7160e01b5f52601160045260245ffd5b60031115610c4557565b634e487b7160e01b5f52602160045260245ffd5b60015f5260056020527f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017c547f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b9060ff16610cb281610c3b565b60018103610cd05750600201546001600160a01b0391821691161490565b80610cdc600292610c3b565b14610ce5575f80fd5b6001600160a01b03600392165f520160205260ff60405f20541690565b60025f5260056020527f89832631fb3c3307a103ba2c84ab569c64d6182a18893dcd163f0f1c2090733b547f89832631fb3c3307a103ba2c84ab569c64d6182a18893dcd163f0f1c2090733a9060ff16610cb281610c3b565b5f52600560205260405f2060ff600182015416610cb281610c3b565b6001600160a01b038091169182156101d357169182156101d35760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591835f526001825260405f20855f5282528060405f2055604051908152a3565b6001600160a01b038091169182156101d357169182156101d357815f525f60205260405f20908154908082106101d3577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281602093039055845f5260405f20818154019055604051908152a3565b6001600160a01b031680156101d357805f525f60205260405f2080548381106101d357837fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef925f956020930390558060025403600255604051908152a356fea2646970667358221220bae62c57ac569508e8fe607464fc9d0c14c0b13f362dc3d95d9f1c28e607b8ee64736f6c63430008170033a26469706673582212200111d00fa0a93c9da17a8cc628b80f1f09eb16e2648b1594e7faa238781a6b3b64736f6c63430008170033", + "nonce": "0x7", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x6d1dd8b36b5470c5513b0e3f373aaaa49ac232bf52c46411a223d0aec2a18aef", + "transactionType": "CREATE", + "contractName": "HubPool", + "contractAddress": "0xfcf9bef0f97a3a94ad7e5f9e6c97a475da802016", + "function": null, + "arguments": [ + "0x01F4b025f4A12873bbEd3e531dd5aaE6b0B6445A", + "0xeF684C38F94F48775959ECf2012D7E864ffb9dd4", + "0x7b79995e5f793A07Bc00c21412e50Ecae098E7f9", + "0x0000000000000000000000000000000000000000" + ], + "transaction": { + "from": "0x3d21dbc8b1c7add9c312b00b63d8b2177af1546c", + "gas": "0x4403c6", + "value": "0x0", + "input": "0x60e034620001a357601f62003c3b38819003918201601f19168301916001600160401b03831184841017620001a757808492608094604052833981010312620001a35780516001600160a01b03918282168203620001a35760208101518381168103620001a3576040820151918483168303620001a35760600151848116809103620001a3575f80546001600160a81b031916909117600160a01b178155600180546001600160a01b031981163390811792839055604051979296939092909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3600c805463ffffffff60a01b191660e160a51b1790556820a1a927a9a996ab1960b91b600d5565015d3ef79800600e5560a05260c052608052600b8054610100600160a81b03191660089290921b610100600160a81b0316919091179055613a7f9081620001bc823960805181818161074d01528181610f250152818161104101526137b8015260a0518181816115080152611ce1015260c05181818161048e01528181610df601528181611e030152818161302b01526131400152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610026575b361561001e5761001c6137a0565b005b61001c6137a0565b5f3560e01c8062660b5314610313578062c992061461030e578063084d05131461030957806309474ae2146103045780630c501af9146102ff5780630ee28a88146102fa57806310b99527146102f557806311cfc159146102f057806316c38b3c146102eb5780631c39c38d146102e657806322395aaa146102e157806322f8e566146102dc578063240f475f146102d757806326205d80146102d257806329cb924d146102cd5780632d0f6f84146102c85780632d32d557146102c357806333dc09ca146102be5780633fc8cef3146102b95780634144fd61146102b45780634f7473ff146102af57806356688700146102aa57806356864f38146102a55780635c975abb146102a0578063625997c01461029b57806369b62502146102965780636ad0690a14610291578063715018a61461028c57806376ec08dd146102875780637998a1c41461028257806380c09a821461027d57806380f323a7146102785780638bda0c00146102735780638da5cb5b1461026e578063a16fd6e914610269578063a584119414610264578063ac9650d81461025f578063b60c2d7d1461025a578063b9a3c84c14610255578063c28f439214610250578063cd9499951461024b578063dd70e5e814610246578063e0f339e314610241578063e40064d71461023c578063e460e35c14610237578063f0056a7d146102325763f2fde38b0361000e57612190565b612113565b612026565b611fea565b611fb0565b611f3b565b611e4d565b611e27565b611de4565b611bbb565b611af7565b611a16565b6119dc565b6119b6565b611833565b611816565b61176b565b61152c565b6114e9565b611490565b61146a565b61145d565b6112fd565b6112db565b61120b565b610fc9565b610fac565b610f49565b610f06565b610d5b565b610d13565b610c79565b610c5f565b610beb565b610bc2565b610b60565b610aff565b610ada565b610a57565b610a3a565b610988565b6106f8565b61065a565b61060f565b6105b3565b61040c565b61032d565b6001600160a01b0381160361032957565b5f80fd5b346103295760403660031901126103295760043561034a81610318565b60243590610356612cc3565b61035e612cd7565b5f5460ff60a01b19165f55670de0b6b3a76400008211610329576001600160a01b038116908115610329577fffffffffffffffffffffff0000000000000000000000000000000000000000ff74ffffffffffffffffffffffffffffffffffffffff00600b549260081b16911617600b5581600f557fc1993b89fd79a19ece7beb067ddc8534ca26d29c0ff94ea2f53b4a508d1eedc95f80a361001c600160a01b60ff60a01b195f5416175f55565b346103295760208060031936011261032957600435610429612cc3565b60ff60065460a01c166103295761043e612cd7565b5f805460ff60a01b191690556040516302abf57960e61b81527f4964656e74696669657257686974656c6973740000000000000000000000000060048201526001600160a01b03919083816024817f000000000000000000000000000000000000000000000000000000000000000087165afa92831561057f5784915f94610584575b506040516390978d1b60e01b8152600481018490529384916024918391165afa92831561057f577ff45367c278fcceff23d601ce4bdd191e5bd61687ff9f29dc7276a08fe54c0c5d9361053993610520925f92610552575b5050612201565b61052981600d55565b6040519081529081906020820190565b0390a161001c600160a01b60ff60a01b195f5416175f55565b6105719250803d10610578575b61056981836115e6565b810190612228565b5f80610519565b503d61055f565b61221d565b6105a5919450823d84116105ac575b61059d81836115e6565b810190612208565b925f6104c1565b503d610593565b346103295760403660031901126103295760206105f16004356105d581610318565b6105dd612cd7565b60ff60a01b195f54165f5560243590612da9565b610607600160a01b60ff60a01b195f5416175f55565b604051908152f35b34610329576020366003190112610329576004355f90815260096020908152604091829020805460019091015483516001600160a01b039283168152911691810191909152f35b0390f35b34610329576020366003190112610329577fac111b3b527b307393c94d98f26140effb71411054466818be97912d2d65f77660043561069881610318565b6106a0612cc3565b6106a8612cd7565b5f805460ff60a01b1990811682556001600160a01b0392831680835260076020908152604093849020805493841690558351918252919093169083015281908101610539565b8015150361032957565b346103295760603660031901126103295760043561071581610318565b604435602435610724826106ee565b61072c612cd7565b5f5460ff60a01b19165f5560ff600b5416610329576001600160a01b0390817f000000000000000000000000000000000000000000000000000000000000000016918416928383148015610954575b61078490612201565b6107a761079961079387612e6f565b84612273565b670de0b6b3a7640000900490565b946107e56107d96107d96107cc846001600160a01b03165f52600760205260405f2090565b546001600160a01b031690565b6001600160a01b031690565b60405163079cc67960e41b8152336004820152602481018590529190602090839060449082905f905af190811561057f5760029261083a92610935575b506001600160a01b03165f52600760205260405f2090565b016108468682546122a4565b9055156108fe57813b1561032957604051632e1a7d4d60e01b815260048101859052915f908390602490829084905af190811561057f577fcda1185f28599e6bd14ab8a68b3c30a11e1dce4256b5e67e94dd3fd846a6c589926108cc926108e5575b506108b38533612f85565b6040805195865260208601919091523394918291820190565b0390a361001c600160a01b60ff60a01b195f5416175f55565b806108f26108f89261155d565b80610a30565b5f6108a8565b7fcda1185f28599e6bd14ab8a68b3c30a11e1dce4256b5e67e94dd3fd846a6c58991506108cc90610930853386612f3d565b6108b3565b61094d9060203d6020116105785761056981836115e6565b505f610822565b50801561077b565b6060906003190112610329576004359060243561097881610318565b9060443561098581610318565b90565b34610329576109963661095c565b6109a1929192612cc3565b6109a9612cd7565b60ff60a01b195f54165f556109be8284612fad565b5f5260086020526109e88160405f20906001600160a01b03166001600160a01b0319825416179055565b6001600160a01b038091169216907f234e7af08f77827792cc909447f27d2e6a3e2d839b04e26b50b71704a131c8a85f80a461001c600160a01b60ff60a01b195f5416175f55565b5f91031261032957565b34610329575f366003190112610329576020600e54604051908152f35b3461032957602036600319011261032957600435610a74816106ee565b610a7c612cc3565b610a84612cd7565b60ff60a01b195f54165f55151560ff19600b541660ff821617600b557f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd25f80a261001c600160a01b60ff60a01b195f5416175f55565b34610329575f3660031901126103295760206001600160a01b035f5416604051908152f35b34610329575f36600319011261032957610b17612cd7565b60ff60a01b195f54165f55610b2a6123c1565b610b4a6001600160a01b0380600c541690610b43612fe7565b169061307d565b61001c600160a01b60ff60a01b195f5416175f55565b34610329575f6020366003190112610329576001600160a01b035f5416801561032957803b15610329575f809160246040518094819363117c72b360e11b835260043560048401525af1801561057f57610bb8575080f35b61001c915061155d565b34610329575f3660031901126103295760206001600160a01b03600b5460081c16604051908152f35b34610329576040366003190112610329576001600160a01b03600435610c1081610318565b610c18612cc3565b610c20612cd7565b60ff60a01b195f54165f55165f526007602052600160405f2001610c4760243582546126dc565b905561001c600160a01b60ff60a01b195f5416175f55565b34610329575f3660031901126103295760206106076126f4565b34610329576020366003190112610329575f600435610c9781610318565b610c9f612cd7565b60ff60a01b198254168255610cd96001600160a01b0380921691828452600a6020526040842090815494859255600b5460081c1683612f3d565b7f74740239d7d696c84422b720e125e1f47c4138c66d1f4d2a48e99f4197cdb79c5f80a361001c600160a01b60ff60a01b195f5416175f55565b3461032957604036600319011261032957610d3c602435610d3381610318565b60043590612fad565b5f52600860205260206001600160a01b0360405f205416604051908152f35b3461032957604036600319011261032957600435610d7881610318565b60243590610d84612cc3565b60ff60065460a01c1661032957610d99612cd7565b5f5460ff60a01b19165f55610daf821515612201565b6040516302abf57960e61b81527f436f6c6c61746572616c57686974656c6973740000000000000000000000000060048201526001600160a01b03926020919082826024817f000000000000000000000000000000000000000000000000000000000000000089165afa91821561057f575f92610ee7575b50604051631d1d5b3960e11b81528585166001600160a01b0381166004830152959092849184916024918391165afa91821561057f577fbfa9a96010167e98ce8c004f718932cbbfd33a58d681c752e693be7d457a1b3b94610e9b610ec594610eb793610ece975f92610552575050612201565b6001600160a01b03166001600160a01b0319600c541617600c55565b610ebf6130fa565b9061274c565b61052981601055565b0390a261001c600160a01b60ff60a01b195f5416175f55565b610eff919250833d85116105ac5761059d81836115e6565b905f610e27565b34610329575f3660031901126103295760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610329575f3660031901126103295760e060025463ffffffff60035460045460055490600654926040519586526020860152604085015260608401526001600160a01b038116608084015260ff8160a01c1660a084015260a81c1660c0820152f35b34610329575f366003190112610329576020600f54604051908152f35b604036600319011261032957600435610fe181610318565b60243590610fed612cd7565b5f5460ff60a01b19165f5560ff600b54166103295761103261102d611023836001600160a01b03165f52600760205260405f2090565b5460a01c60ff1690565b612201565b6001600160a01b0381811691907f00000000000000000000000000000000000000000000000000000000000000001682148080611202575b80156111fa575b61107a90612201565b6110e46107d96107d96107cc6110a161109289612251565b61109b88612e6f565b90612286565b9560026110bf826001600160a01b03165f52600760205260405f2090565b016110cb8a825461274c565b90556001600160a01b03165f52600760205260405f2090565b6040516340c10f1960e01b81523360048201526024810184905290602090829060449082905f905af1801561057f576111db575b50806111d2575b156111a157813b1561032957604051630d0e30db60e41b8152905f8260048134875af190811561057f577f3c69701a61c79a92ef9692903aaa0068bce8771361ecb09547391e4fb4df8537926108cc9261118e575b506040805195865260208601919091523394918291820190565b806108f261119b9261155d565b5f611174565b6108cc7f3c69701a61c79a92ef9692903aaa0068bce8771361ecb09547391e4fb4df85379161093085303387613381565b5034151561111f565b6111f39060203d6020116105785761056981836115e6565b505f611118565b503415611071565b5083341461106a565b346103295760803660031901126103295760443560243560043561122e83610318565b7fb7d00a563842efb2c121a0eb02b7bb7ba1a34625bbc3d65057f1f0dbec0ec2a160206064359461125e866106ee565b611266612cd7565b5f5460ff60a01b19165f55611279612cc3565b6112be6001600160a01b036040519263272751c760e01b858501521696876024840152866044840152151591826064820152606481526112b8816115ca565b856133c0565b604051908152a461001c600160a01b60ff60a01b195f5416175f55565b34610329575f36600319011261032957602060ff600b54166040519015158152f35b34610329575f36600319011261032957611315612cc3565b61131d612cd7565b5f5460ff60a01b19165f5560405161133481611576565b600254815260035460208201908152600454906040830191825260055460608401527f993cba33f9b140c9ce20ba10d7eda92128d5beb6df856f064916108a11647a73611416600654946114046001600160a01b039160ff6113eb60808301998581168b526113cb63ffffffff60a08601926113b8868260a01c16859060ff169052565b60a81c1660c086019063ffffffff169052565b6113e45f6002555f6003555f6004555f6005555f600655565b5160ff1690565b1661142f575b519451955196516001600160a01b031690565b60405196875216949081906020820190565b0390a461001c600160a01b60ff60a01b195f5416175f55565b611458611444600c546001600160a01b031690565b89516001600160a01b031660105491612f3d565b6113f1565b5f36600319011261032957005b34610329575f36600319011261032957602063ffffffff600c5460a01c16604051908152f35b34610329575f366003190112610329576114a8612cc3565b5f6001600160a01b036001546001600160a01b03198116600155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b34610329575f3660031901126103295760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610329575f366003190112610329576020600d54604051908152f35b634e487b7160e01b5f52604160045260245ffd5b67ffffffffffffffff811161157157604052565b611549565b60e0810190811067ffffffffffffffff82111761157157604052565b6040810190811067ffffffffffffffff82111761157157604052565b60c0810190811067ffffffffffffffff82111761157157604052565b60a0810190811067ffffffffffffffff82111761157157604052565b90601f8019910116810190811067ffffffffffffffff82111761157157604052565b60405190610160820182811067ffffffffffffffff82111761157157604052565b6040519061163682611576565b565b67ffffffffffffffff81116115715760051b60200190565b9080601f8301121561032957602090823561166a81611638565b9361167860405195866115e6565b81855260208086019260051b82010192831161032957602001905b8282106116a1575050505090565b81358152908301908301611693565b60a4359060ff8216820361032957565b6024359060ff8216820361032957565b9080601f830112156103295760209082356116ea81611638565b936116f860405195866115e6565b81855260208086019260051b82010192831161032957602001905b828210611721575050505090565b838091833561172f81610318565b815201910190611713565b9181601f840112156103295782359167ffffffffffffffff8311610329576020808501948460051b01011161032957565b34610329576101003660031901126103295767ffffffffffffffff60046044358281116103295761179f9036908301611650565b90606435838111610329576117b79036908301611650565b608435848111610329576117ce9036908401611650565b6117d66116b0565b9060c435868111610329576117ee90369086016116d0565b9260e4359687116103295761180961001c973690870161173a565b9690956024359035612759565b34610329575f366003190112610329576020601054604051908152f35b346103295760a03660031901126103295760043567ffffffffffffffff81116103295761186490369060040161173a565b9061186d6116c0565b604435906064359260843591611881612cd7565b5f5460ff60a01b19165f5560ff60065460a01c166103295760ff600b54166103295760ff811615610329576114167f3185fa6fac8e91dc65e7424a8081c73353151d2715bddb71db0982c1fe4c0fd4936118fb63ffffffff6118e16126f4565b166118f5600c5463ffffffff9060a01c1690565b906122c0565b976119155f6002555f6003555f6004555f6005555f600655565b61193a8963ffffffff60a81b1963ffffffff60a81b6006549260a81b16911617600655565b6119598460ff60a01b1960ff60a01b6006549260a01b16911617600655565b61196287600255565b61196b88600355565b61197482600455565b600680546001600160a01b031916331790556119a861199b600c546001600160a01b031690565b6010549030903390613381565b604051948594339a86612b04565b34610329575f3660031901126103295760206001600160a01b0360015416604051908152f35b346103295760203660031901126103295760206105f16004356119fe81610318565b611a06612cd7565b60ff60a01b195f54165f55612ce6565b3461032957602036600319011261032957610b4a600435611a3681610318565b611a3e612cd7565b60ff60a01b195f54165f5561367e565b5f5b838110611a5f5750505f910152565b8181015183820152602001611a50565b90602091611a8881518092818552858086019101611a4e565b601f01601f1916010190565b6020808201906020835283518092526040830192602060408460051b8301019501935f915b848310611ac95750505050505090565b9091929394958480611ae7600193603f198682030187528a51611a6f565b9801930193019194939290611ab9565b34610329576020366003190112610329576004803567ffffffffffffffff811161032957611b2990369060040161173a565b91611b3383612b64565b925f5b818110611b4b57604051806106568782611a94565b5f80611b58838588612bc1565b90611b6860405180938193612c08565b0390305af4611b75612a17565b9015611b9b5790600191611b898288612c74565b52611b948187612c74565b5001611b36565b806044859251106103295761032991810151602480918301019101612c15565b3461032957602036600319011261032957600435611bd881610318565b611be0612cc3565b611be8612cd7565b5f5460ff60a01b19165f556001600160a01b039081611c1b6107cc836001600160a01b03165f52600760205260405f2090565b1615611cb6575b80611c75611c627f04e291c80180d65a57b5bf1bed775777ec0d6f283ef34bcf130712714d8bb7f7936001600160a01b03165f52600760205260405f2090565b600160a01b60ff60a01b19825416179055565b611c936107cc826001600160a01b03165f52600760205260405f2090565b604080516001600160a01b03938416815292909116602083015281908101610539565b604051637e178db760e11b81526001600160a01b038216600482015291602090839060249082905f907f0000000000000000000000000000000000000000000000000000000000000000165af191821561057f577f04e291c80180d65a57b5bf1bed775777ec0d6f283ef34bcf130712714d8bb7f792611d6e915f91611dc5575b50611d53836001600160a01b03165f52600760205260405f2090565b906001600160a01b03166001600160a01b0319825416179055565b611dc0611d85611d7c6126f4565b63ffffffff1690565b611da0836001600160a01b03165f52600760205260405f2090565b9063ffffffff60a81b1963ffffffff60a81b83549260a81b169116179055565b611c22565b611dde915060203d6020116105ac5761059d81836115e6565b5f611d37565b34610329575f3660031901126103295760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610329575f3660031901126103295760206001600160a01b03600c5416604051908152f35b346103295760203660031901126103295760043563ffffffff81169081810361032957611e78612cc3565b611e80612cd7565b5f5460ff60a01b19165f55610258821115610329577f04dd1d84d387f404568a7954b5e398518bdd716e1a8f4a790be9a1a225ad9347916020917fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff77ffffffff0000000000000000000000000000000000000000600c549260a01b16911617600c55604051908152a161001c600160a01b60ff60a01b195f5416175f55565b67ffffffffffffffff811161157157601f01601f191660200190565b346103295760403660031901126103295760243567ffffffffffffffff81116103295736602382011215610329578060040135611f7781611f1f565b90611f8560405192836115e6565b8082523660248285010111610329576020815f92602461001c96018386013783010152600435612c88565b346103295760203660031901126103295760206105f1600435611fd281610318565b611fda612cd7565b60ff60a01b195f54165f55612e6f565b34610329576020366003190112610329576001600160a01b0360043561200f81610318565b165f52600a602052602060405f2054604051908152f35b34610329577f36050d958750e6ac3aa674ac7bbe8d0ae6a2f7d4b808e8c2c42c1f22fc9fc4bb60606120573661095c565b90612060612cc3565b612068612cd7565b60ff60a01b195f54165f556120ec60405161208281611592565b60016001600160a01b03809416938483528060208401961695868152875f5260096020526120cd8260405f2095511685906001600160a01b03166001600160a01b0319825416179055565b51169101906001600160a01b03166001600160a01b0319825416179055565b60405192835260208301526040820152a161001c600160a01b60ff60a01b195f5416175f55565b346103295760203660031901126103295760c060043561213281610318565b6001600160a01b038091165f52600760205260405f20805490600181015463ffffffff6003600284015493015493604051958116865260ff8160a01c161515602087015260a81c1660408501526060840152608083015260a0820152f35b34610329576020366003190112610329576004356121ad81610318565b6121b5612cc3565b6001600160a01b0380911690811561032957600154826001600160a01b0319821617600155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b1561032957565b90816020910312610329575161098581610318565b6040513d5f823e3d90fd5b908160209103126103295751610985816106ee565b634e487b7160e01b5f52601160045260245ffd5b90670de0b6b3a76400009182810292818404149015171561226e57565b61223d565b8181029291811591840414171561226e57565b8115612290570490565b634e487b7160e01b5f52601260045260245ffd5b9190820391821161226e57565b90816020910312610329575190565b91909163ffffffff8080941691160191821161226e57565b90611636945f6123b29263ffffffff6101e0969a99979a6102009287521660208601528060408601528401526102208301976123206060850182516001600160a01b03169052565b60208101516001600160a01b0316608085015260408101516001600160a01b031660a08501526060810151151560c0850152608081015160e085015260a081015190610100918286015260c0810151610120908187015260e082015192610140938488015282015161016087015281015161018086015201516101a08401526101c08301906001600160a01b03169052565b01906001600160a01b03169052565b6123cc611d7c6126f4565b6006546123e19060a81c63ffffffff16611d7c565b6123f463ffffffff918284161115612201565b6123fc6130fa565b9060109182548110156126d057612411612fe7565b91600c938454612427906001600160a01b031690565b936001600160a01b038091169485835490612441926132d4565b600d54958054968886855490612456916122a4565b9860065461246a906001600160a01b031690565b60405163579aae8f60e11b8152600481019490945263ffffffff928316602485015261012060448501525f61012485018190526001600160a01b0387841681166064870152608486019190915260a485019b909b5260a09190911c871690911660c483015290971660e4880152670de0b6b3a76400006101048801526020968781610144818a5a905f91f190816126b3575b5061251157505050505050505061163661321c565b87869288966125308561252b86546001600160a01b031690565b61307d565b6006546001600160a01b031696845492818460a01c169485612551916122c0565b908389549061255f916122a4565b94612568611608565b6001600160a01b03909b168b525f8c8c0152166001600160a01b031660408a0152606089015f905260808901670de0b6b3a7640000905260a089015f90521660c088015260e087015f90526101008701526101208601526101408501526125de5f6002555f6003555f6004555f6005555f600655565b80546001600160a01b0316835430336125f693613381565b546001600160a01b031691549061260c926132d4565b600d5492604051808095819463139c641960e31b8352309033908b6004860194612635956122d8565b03915a905f91f1801561057f57612685575b505060405163ffffffff909116815233907f15951cb2ef6993bc23a55912e7d0bcac13e4797c432aaa334816aed6914a7a909080602081015b0390a2565b816126a492903d106126ac575b61269c81836115e6565b8101906122b1565b505f80612647565b503d612692565b6126c990893d8b116126ac5761269c81836115e6565b505f6124fc565b5050505061163661321c565b81810392915f13801582851316918412161761226e57565b5f546001600160a01b03168015612747576020600491604051928380926329cb924d60e01b82525afa90811561057f575f9161272e575090565b610985915060203d6020116126ac5761269c81836115e6565b504290565b9190820180921161226e57565b96979592949193909761276a612cd7565b5f5460ff60a01b19165f5560ff600b5416610329576127876126f4565b60065460a81c63ffffffff1663ffffffff16106127a390612201565b600554966127bb600160ff86161b808a161415612201565b600254916127c7611629565b918a83528760208401528860408401528460608401528b60808401528560a08401906127f5919060ff169052565b8660c084015236906128069261299a565b906128109261343a565b61281990612201565b612822876134da565b95909260ff16966001881b1761283790600555565b60065460a01c60ff16612849906129e8565b6128689060ff60a01b1960ff60a01b6006549260a01b16911617600655565b6128768582868b8a88613508565b7ff652dd63b1aedbf9e740f3152fb67b0d94d069cf1182811ebd88921850d93567956128c4938a1561290c575b505060065460ff8160a01c16156128dd575b50604051948594339a86612ab5565b0390a4611636600160a01b60ff60a01b195f5416175f55565b612906906128f3600c546001600160a01b031690565b6001600160a01b03601054921690612f3d565b5f6128b5565b60035460045460405163124e93e160e21b602082015260248101929092526044808301919091528152612993925f9283929091906129759061298190601f19906129576064826115e6565b6040519384916020830196637375c56f60e11b8852602484016129f7565b039081018352826115e6565b51915af461298d612a17565b50612201565b5f806128a3565b92916129a582611638565b916129b360405193846115e6565b829481845260208094019160051b810192831161032957905b8282106129d95750505050565b813581529083019083016129cc565b60ff16801561226e575f190190565b6040906001600160a01b0361098594931681528160208201520190611a6f565b3d15612a41573d90612a2882611f1f565b91612a3660405193846115e6565b82523d5f602084013e565b606090565b9081518082526020808093019301915f5b828110612a65575050505090565b83516001600160a01b031685529381019392810192600101612a57565b9081518082526020808093019301915f5b828110612aa1575050505090565b835185529381019392810192600101612a93565b93906109859593612ada612af694612ae893885260a0602089015260a0880190612a46565b908682036040880152612a82565b908482036060860152612a82565b916080818403910152612a82565b9594939163ffffffff60ff92168752166020860152608060408601528060808601527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81116103295760609160a09160051b809183880137850101930152565b90612b6e82611638565b612b7b60405191826115e6565b8281528092612b8c601f1991611638565b01905f5b828110612b9c57505050565b806060602080938501015201612b90565b634e487b7160e01b5f52603260045260245ffd5b9190811015612c035760051b81013590601e198136030182121561032957019081359167ffffffffffffffff8311610329576020018236038113610329579190565b612bad565b908092918237015f815290565b6020818303126103295780519067ffffffffffffffff8211610329570181601f82011215610329578051612c4881611f1f565b92612c5660405194856115e6565b81845260208284010111610329576109859160208085019101611a4e565b8051821015612c035760209160051b010190565b90612cad91612c95612cc3565b612c9d612cd7565b60ff60a01b195f54165f556133c0565b611636600160a01b60ff60a01b195f5416175f55565b6001600160a01b0360015416330361032957565b60ff5f5460a01c161561032957565b612cef8161367e565b6001600160a01b038091165f52600760205260405f2090612d4363ffffffff60405192612d1b846115ae565b8454908116845260ff8160a01c161515602085015260a81c16604083019063ffffffff169052565b60018201549081606082015260a0600360028501549485608085015201549101525f81135f14612d9d57612d7890809261274c565b8015612d8f57612d8a61098592612251565b612286565b5050670de0b6b3a764000090565b50612d785f809261274c565b90612d7890612db78361367e565b6001600160a01b038093165f52600760205260405f2092612e0b63ffffffff60405192612de3846115ae565b8654908116845260ff8160a01c161515602085015260a81c16604083019063ffffffff169052565b60018401549081606082015260a060036002870154966080840197885201549101525f81135f14612e4857612e4190809261274c565b925161274c565b50612e415f809261274c565b9190915f838201938412911290801582169115161761226e57565b6004612e8c826001600160a01b03165f52600760205260405f2090565b6020612ea56107d96107d984546001600160a01b031690565b6040516318160ddd60e01b815293849182905afa91821561057f575f92612f1c575b508115612f0d57612f0881612eea61098595612ee5612d8a9561380e565b61367e565b6003612eff6002830154600184015490612e54565b910154906126dc565b612251565b505050670de0b6b3a764000090565b612f3691925060203d6020116126ac5761269c81836115e6565b905f612ec7565b60405163a9059cbb60e01b60208201526001600160a01b039092166024830152604482019290925261163691612f8082606481015b03601f1981018452836115e6565b613898565b814710610329575f8080936001600160a01b038294165af1612fa5612a17565b501561032957565b604080516001600160a01b039092166020830190815290820192909252612fe181606081015b03601f1981018352826115e6565b51902090565b6040516302abf57960e61b81527f536b696e6e794f7074696d69737469634f7261636c650000000000000000000060048201526001600160a01b03906020816024817f000000000000000000000000000000000000000000000000000000000000000086165afa90811561057f575f9161306057501690565b613079915060203d6020116105ac5761059d81836115e6565b1690565b906001600160a01b036040519163095ea7b360e01b60208401521660248201525f604482015260448152608081019181831067ffffffffffffffff8411176115715761163692604052613898565b9081602091031261032957604051906020820182811067ffffffffffffffff8211176115715760405251815290565b6040516302abf57960e61b81527f53746f726500000000000000000000000000000000000000000000000000000060048201526020906001600160a01b039082816024817f000000000000000000000000000000000000000000000000000000000000000086165afa90811561057f5783916131b9915f916131ff575b5061318d6107d9600c546001600160a01b031690565b604051635b97aadd60e01b81526001600160a01b03909116600482015293849283919082906024820190565b0392165afa91821561057f575f926131d2575b50505190565b6131f19250803d106131f8575b6131e981836115e6565b8101906130cb565b5f806131cc565b503d6131df565b6132169150833d85116105ac5761059d81836115e6565b5f613177565b600c5460065460105460405163a9059cbb60e01b81526001600160a01b039283166004820152602481019190915291602091839160449183915f91165af1801561057f576132b5575b5061327f5f6002555f6003555f6004555f6005555f600655565b6132876126f4565b6040519081527f0cfbbf45ab7f5225663454de7117b1b0ed5a7c133b61f54ccf367dcf8b6d4d5960203392a2565b6132cd9060203d6020116105785761056981836115e6565b505f613265565b604051636eb1769f60e11b81523060048201526001600160a01b03831660248201529192602083806044810103816001600160a01b0386165afa92831561057f575f93613360575b50820180921161226e5760405163095ea7b360e01b60208201526001600160a01b03909316602484015260448301919091526116369190612f808260648101612f72565b61337a91935060203d6020116126ac5761269c81836115e6565b915f61331c565b909261163693604051936323b872dd60e01b60208601526001600160a01b038092166024860152166044840152606483015260648252612f80826115ca565b905f806133cc846134da565b6040516133ef81612fd3886020830195637375c56f60e11b8752602484016129f7565b51915af46133fb612a17565b5015610329576126807f218987b934c2f6bc596136829fbf43a5fef4d6fafce41f3f6254d9a870c2deec91604051918291602083526020830190611a6f565b61098592916040516134d181612fd360208201946020865280516040840152613473602082015160e06060860152610120850190612a82565b60c06134a8613494604085015193603f1994858983030160808a0152612a82565b6060850151848883030160a0890152612a82565b9260808101518287015260ff60a08201511660e087015201519084830301610100850152612a46565b51902091613925565b5f52600960205260405f20906001600160a01b036001818454169301541690811561032957823b1561032957565b92949391908551955f5b878110613523575050505050505050565b8061359e61354361353660019486612c74565b516001600160a01b031690565b8583896135646107cc6135568c87612fad565b5f52600860205260405f2090565b6135786001600160a01b0382161515612201565b5f6135838484612c74565b51136135a4575b505061359791508b612c74565b5190613976565b01613512565b61360a936135fd6135b75f958695612c74565b516040516314b231d760e21b602082019081526001600160a01b038a81166024840152958616604483015260648201929092529290931660848301528160a48101612fd3565b51908d5af461298d612a17565b6136148389612c74565b5161363d85613634846001600160a01b03165f52600760205260405f2090565b01918254612e54565b90556136498389612c74565b51613673600261366a846001600160a01b03165f52600760205260405f2090565b019182546122a4565b90558583895f61358a565b6040516370a0823160e01b81523060048201526001600160a01b038216602082602481845afa91821561057f575f9261377f575b506136cb6107d96107d9600c546001600160a01b031690565b148061376e575b15613768576010546136e3916122a4565b905b6002613702826001600160a01b03165f52600760205260405f2090565b0154821161370e575050565b6137648161373b600261373381956001600160a01b03165f52600760205260405f2090565b0154856122a4565b6110cb600161375b846001600160a01b03165f52600760205260405f2090565b019182546126dc565b0155565b906136e5565b5060ff60065460a01c1615156136d2565b61379991925060203d6020116126ac5761269c81836115e6565b905f6136b2565b60ff5f5460a01c166137ae57565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016803b15610329575f60049160405192838092630d0e30db60e41b825234905af1801561057f576138055750565b6116369061155d565b6003810190815463ffffffff9081835460a81c1661382a6126f4565b90810390811161226e57613852670de0b6b3a76400009161384d600e5485612273565b612273565b0481811015613891575b810390811161226e5761163693556138726126f4565b825463ffffffff60a81b1916911660a81b63ffffffff60a81b16179055565b508061385c565b905f806001600160a01b036138f59416927f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656460206040516138d881611592565b818152015260208151910182855af16138ef612a17565b91613a20565b805190811591821561390b575b50501561032957565b61391e9250602080918301019101612228565b5f80613902565b929091905f915b845183101561396e5761393f8386612c74565b51908181101561395d575f52602052600160405f205b92019161392c565b905f52602052600160405f20613955565b915092501490565b670de0b6b3a764000061398b600f5484612273565b04918281039080821161226e5783036139cc575b50816139a9575050565b6001600160a01b03165f52600a60205260405f20805491820180921161226e5755565b60036139e9836001600160a01b03165f52600760205260405f2090565b0180549082820180921161226e5755613a186001613634846001600160a01b03165f52600760205260405f2090565b90555f61399f565b9015613a3a57815115613a31575090565b3b156103295790565b50805190811561032957602001fdfea2646970667358221220bda1bc582e33cbddbba2e36c2ee62fc71a504e4e1809d045aa2e687a443d64c864736f6c6343000817003300000000000000000000000001f4b025f4a12873bbed3e531dd5aae6b0b6445a000000000000000000000000ef684c38f94f48775959ecf2012d7e864ffb9dd40000000000000000000000007b79995e5f793a07bc00c21412e50ecae098e7f90000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x8", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0xf13bd4", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x68e3f7e15e4a2756c8c8573e6fc06f394a9956fd3d776fc42ffbea4835c01b04", + "transactionIndex": "0xa1", + "blockHash": "0xcf069c20e23dfdad19dcae158831f27a74e25d5499a1fb1554ed06afa566212e", + "blockNumber": "0x82e164", + "gasUsed": "0x16c35f", + "effectiveGasPrice": "0x104f97", + "from": "0x3d21dbc8b1c7add9c312b00b63d8b2177af1546c", + "to": null, + "contractAddress": "0x01f4b025f4a12873bbed3e531dd5aae6b0b6445a" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1258d80", + "logs": [ + { + "address": "0xfcf9bef0f97a3a94ad7e5f9e6c97a475da802016", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000003d21dbc8b1c7add9c312b00b63d8b2177af1546c" + ], + "data": "0x", + "blockHash": "0xcf069c20e23dfdad19dcae158831f27a74e25d5499a1fb1554ed06afa566212e", + "blockNumber": "0x82e164", + "blockTimestamp": "0x685302b4", + "transactionHash": "0x6d1dd8b36b5470c5513b0e3f373aaaa49ac232bf52c46411a223d0aec2a18aef", + "transactionIndex": "0xa2", + "logIndex": "0xb5", + "removed": false + } + ], + "logsBloom": "0x00000000000000000004000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000001000000000000000000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000020000000000080000000000000000000000000000000000000000040000000000000", + "type": "0x2", + "transactionHash": "0x6d1dd8b36b5470c5513b0e3f373aaaa49ac232bf52c46411a223d0aec2a18aef", + "transactionIndex": "0xa2", + "blockHash": "0xcf069c20e23dfdad19dcae158831f27a74e25d5499a1fb1554ed06afa566212e", + "blockNumber": "0x82e164", + "gasUsed": "0x3451ac", + "effectiveGasPrice": "0x104f97", + "from": "0x3d21dbc8b1c7add9c312b00b63d8b2177af1546c", + "to": null, + "contractAddress": "0xfcf9bef0f97a3a94ad7e5f9e6c97a475da802016" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1750270695, + "chain": 11155111, + "commit": "7ebdaf8" +} diff --git a/broadcast/DeployPermissionSplitterProxy.s.sol/1/dry-run/run-1706197795.json b/broadcast/DeployPermissionSplitterProxy.s.sol/1/dry-run/run-1706197795.json deleted file mode 100644 index 29e1a76ec..000000000 --- a/broadcast/DeployPermissionSplitterProxy.s.sol/1/dry-run/run-1706197795.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "transactions": [ - { - "hash": null, - "transactionType": "CREATE", - "contractName": "PermissionSplitterProxy", - "contractAddress": "0x0Bf07B2e415F02711fFBB32491f8ec9e5489B2e7", - "function": null, - "arguments": ["0xc186fA914353c44b2E33eBE05f21846F1048bEda"], - "transaction": { - "type": "0x02", - "from": "0x9a8f92a830a5cb89a3816e3d267cb7791c16b04d", - "gas": "0x117c51", - "value": "0x0", - "data": "0x60806040818152346200041c578162001290803803809162000022828562000421565b83396020938491810103126200041c57516001600160a01b03811691908290036200041c57600092838052838152818420338552815260ff828520541615620003d3575b838052838152818420338552815260ff828520541615620000c75750600280546001600160a01b0319168317905551917f814250a3b8c79fcbe2ead2c131c952a278491c8f4322a79fe84b5040a810373e9080a2610dc79081620004a98239f35b81519390925033906001600160401b036060860181811187821017620003bf578452602a86528486019284368537865115620002cf5760308453865190600191821015620003ab576078602189015360295b8281116200033c57506200030b578290855192608084019084821090821117620002f757865260428352868301936060368637835115620002e357603085538351821015620002e35790607860218501536041915b81831162000270575050506200023f57926200020c6048620001fc979462000231946044989785519a8b93620001d28b86019a7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008c5251809260378801906200045b565b8401917001034b99036b4b9b9b4b733903937b6329607d1b6037840152518093868401906200045b565b0103602881018952018762000421565b5194859362461bcd60e51b85526004850152518092816024860152858501906200045b565b601f01601f19168101030190fd5b60648585519062461bcd60e51b82528060048301526024820152600080516020620012708339815191526044820152fd5b909192600f81166010811015620002cf576f181899199a1a9b1b9c1cb0b131b232b360811b901a620002a3858762000480565b5360041c928015620002bb576000190191906200016e565b634e487b7160e01b82526011600452602482fd5b634e487b7160e01b83526032600452602483fd5b634e487b7160e01b81526032600452602490fd5b634e487b7160e01b85526041600452602485fd5b60648686519062461bcd60e51b82528060048301526024820152600080516020620012708339815191526044820152fd5b90600f8116601081101562000397576f181899199a1a9b1b9c1cb0b131b232b360811b901a6200036d838b62000480565b5360041c90801562000383576000190162000119565b634e487b7160e01b85526011600452602485fd5b634e487b7160e01b86526032600452602486fd5b634e487b7160e01b84526032600452602484fd5b634e487b7160e01b83526041600452602483fd5b8380528381528184203385528152818420600160ff198254161790553333857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8180a462000066565b600080fd5b601f909101601f19168101906001600160401b038211908210176200044557604052565b634e487b7160e01b600052604160045260246000fd5b60005b8381106200046f5750506000910152565b81810151838201526020016200045e565b90815181101562000492570160200190565b634e487b7160e01b600052603260045260246000fdfe60806040526004361015610018575b3661062057610620565b60003560e01c806301ffc9a7146100d85780631dbcb538146100d3578063248a9ca3146100ce5780632f2ff15d146100c957806336568abe146100c457806377da6060146100bf57806382127da1146100ba57806391d14854146100b5578063a217fddf146100b0578063ac9650d8146100ab578063d4b83992146100a65763d547741f0361000e5761059f565b610576565b61050c565b610446565b6103f4565b6103b9565b610350565b6102bc565b6101f8565b6101c9565b610162565b6100f9565b600435906001600160e01b0319821682036100f457565b600080fd5b346100f45760203660031901126100f45760206001600160e01b031961011d6100dd565b16637965db0b60e01b811490811561013b575b506040519015158152f35b6301ffc9a760e01b14905038610130565b602435906001600160a01b03821682036100f457565b346100f45760203660031901126100f4576004356001600160a01b038116908190036100f4576101906106f8565b600280546001600160a01b031916821790557f814250a3b8c79fcbe2ead2c131c952a278491c8f4322a79fe84b5040a810373e600080a2005b346100f45760203660031901126100f45760043560005260006020526020600160406000200154604051908152f35b346100f45760403660031901126100f45760043561021461014c565b6000918083528260205261022e6001604085200154610854565b808352602083815260408085206001600160a01b0385166000908152925290205460ff161561025b578280f35b808352602083815260408085206001600160a01b038516600090815292529020805460ff1916600117905533916001600160a01b0316907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8480a438808280f35b346100f45760403660031901126100f4576102d561014c565b336001600160a01b038216036102f3576102f190600435610963565b005b60405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608490fd5b346100f45760403660031901126100f4576103696100dd565b602435906103756106f8565b6001600160e01b031916600081815260016020526040812083905591907f9aecde1887c209ac367c4ded12201517685403a74b8924f233cc372ccb5f71a58380a380f35b346100f45760203660031901126100f4576001600160e01b03196103db6100dd565b1660005260016020526020604060002054604051908152f35b346100f45760403660031901126100f457602060ff61043a61041461014c565b6004356000526000845260406000209060018060a01b0316600052602052604060002090565b54166040519015158152f35b346100f45760003660031901126100f457602060405160008152f35b60005b8381106104755750506000910152565b8181015183820152602001610465565b9060209161049e81518092818552858086019101610462565b601f01601f1916010190565b602080820190808352835180925260408301928160408460051b8301019501936000915b8483106104de5750505050505090565b90919293949584806104fc600193603f198682030187528a51610485565b98019301930191949392906104ce565b346100f45760203660031901126100f45767ffffffffffffffff6004358181116100f457366023820112156100f45780600401359182116100f4573660248360051b830101116100f4576105729160246105669201610ce1565b604051918291826104aa565b0390f35b346100f45760003660031901126100f4576002546040516001600160a01b039091168152602090f35b346100f45760403660031901126100f4576102f16004356105be61014c565b908060005260006020526105d9600160406000200154610854565b610963565b156105e557565b60405162461bcd60e51b8152602060048201526013602482015272139bdd08185b1b1bddd959081d1bc818d85b1b606a1b6044820152606490fd5b600060043610156106bc575060005b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff168015610682575b610671906105de565b6002546001600160a01b03166106d7565b506001600160e01b03191660009081526001602090815260408083205483528282528083203384529091529020546106719060ff16610668565b366004116106d457356001600160e01b03191661062f565b80fd5b60008080923682803781369134905af13d82803e156106f4573d90f35b3d90fd5b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff161561073157565b61073a33610aec565b600090610745610a1f565b91603061075184610a61565b53607861075d84610a6e565b5360415b6001811161080d5761080960486107f1856107e3886107808815610aa1565b6040519485937f416363657373436f6e74726f6c3a206163636f756e742000000000000000000060208601526107c0815180926020603789019101610462565b84017001034b99036b4b9b9b4b733903937b6329607d1b603782015201906108fb565b03601f198101835282610928565b60405162461bcd60e51b81529182916004830161094f565b0390fd5b90600f811690601082101561084f5761084a916f181899199a1a9b1b9c1cb0b131b232b360811b901a6108408487610a7e565b5360041c91610a8f565b610761565b610a4b565b60008181526020818152604080832033845290915290205460ff16156108775750565b61088033610aec565b610888610a1f565b91603061089484610a61565b5360786108a084610a6e565b5360415b600181116108c35761080960486107f1856107e3886107808815610aa1565b90600f811690601082101561084f576108f6916f181899199a1a9b1b9c1cb0b131b232b360811b901a6108408487610a7e565b6108a4565b9061090e60209282815194859201610462565b0190565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff82111761094a57604052565b610912565b906020610960928181520190610485565b90565b6000818152602081815260408083206001600160a01b038616845290915281205490919060ff1661099357505050565b808252602082815260408084206001600160a01b038616600090815292529020805460ff1916905533926001600160a01b0316917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4565b634e487b7160e01b600052601160045260246000fd5b67ffffffffffffffff811161094a57601f01601f191660200190565b604051906080820182811067ffffffffffffffff82111761094a57604052604282526060366020840137565b634e487b7160e01b600052603260045260246000fd5b80511561084f5760200190565b80516001101561084f5760210190565b90815181101561084f570160200190565b8015610a9c576000190190565b6109ed565b15610aa857565b606460405162461bcd60e51b815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b604051906060820182811067ffffffffffffffff82111761094a57604052602a825260403660208401376030610b2183610a61565b536078610b2d83610a6e565b536029905b60018211610b4557610960915015610aa1565b600f811690601082101561084f57610b77916f181899199a1a9b1b9c1cb0b131b232b360811b901a6108408486610a7e565b90610b32565b67ffffffffffffffff811161094a5760051b60200190565b90610b9f82610b7d565b610bac6040519182610928565b8281528092610bbd601f1991610b7d565b019060005b828110610bce57505050565b806060602080938501015201610bc2565b6000198114610a9c5760010190565b919081101561084f5760051b81013590601e19813603018212156100f457019081359167ffffffffffffffff83116100f45760200182360381136100f4579190565b908092918237016000815290565b3d15610c69573d90610c4f82610a03565b91610c5d6040519384610928565b82523d6000602084013e565b606090565b6020818303126100f45780519067ffffffffffffffff82116100f4570181601f820112156100f4578051610ca181610a03565b92610caf6040519485610928565b818452602082840101116100f4576109609160208085019101610462565b805182101561084f5760209160051b010190565b919091610ced83610b95565b9260005b818110610cfd57505050565b600080610d0b838587610bee565b60409391610d1d855180938193610c30565b0390305af490610d2b610c3e565b9115610d57575090610d5291610d418288610ccd565b52610d4c8187610ccd565b50610bdf565b610cf1565b9060448151106100f457610809610d7c60249260049380858301518301019101610c6e565b925162461bcd60e51b8152928392830161094f56fea2646970667358221220db9dd0d8273246aeab33facf6d83548653a0c9c9998ef7e3853dc6522eee100d64736f6c63430008140033537472696e67733a20686578206c656e67746820696e73756666696369656e74000000000000000000000000c186fa914353c44b2e33ebe05f21846f1048beda", - "nonce": "0x15e3", - "accessList": [] - }, - "additionalContracts": [], - "isFixedGasLimit": false - }, - { - "hash": null, - "transactionType": "CALL", - "contractName": "PermissionSplitterProxy", - "contractAddress": "0x0Bf07B2e415F02711fFBB32491f8ec9e5489B2e7", - "function": "grantRole(bytes32,address)", - "arguments": [ - "0x139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d", - "0xB524735356985D2f267FA010D681f061DfF03715" - ], - "transaction": { - "type": "0x02", - "from": "0x9a8f92a830a5cb89a3816e3d267cb7791c16b04d", - "to": "0x0bf07b2e415f02711ffbb32491f8ec9e5489b2e7", - "gas": "0x1140d", - "value": "0x0", - "data": "0x2f2ff15d139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d000000000000000000000000b524735356985d2f267fa010d681f061dff03715", - "nonce": "0x15e4", - "accessList": [] - }, - "additionalContracts": [], - "isFixedGasLimit": false - }, - { - "hash": null, - "transactionType": "CALL", - "contractName": "PermissionSplitterProxy", - "contractAddress": "0x0Bf07B2e415F02711fFBB32491f8ec9e5489B2e7", - "function": "__setRoleForSelector(bytes4,bytes32)", - "arguments": ["0x16c38b3c", "0x139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d"], - "transaction": { - "type": "0x02", - "from": "0x9a8f92a830a5cb89a3816e3d267cb7791c16b04d", - "to": "0x0bf07b2e415f02711ffbb32491f8ec9e5489b2e7", - "gas": "0x1030c", - "value": "0x0", - "data": "0x77da606016c38b3c00000000000000000000000000000000000000000000000000000000139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d", - "nonce": "0x15e5", - "accessList": [] - }, - "additionalContracts": [], - "isFixedGasLimit": false - }, - { - "hash": null, - "transactionType": "CALL", - "contractName": "PermissionSplitterProxy", - "contractAddress": "0x0Bf07B2e415F02711fFBB32491f8ec9e5489B2e7", - "function": "renounceRole(bytes32,address)", - "arguments": [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x9A8f92a830A5cB89a3816e3D267CB7791c16b04D" - ], - "transaction": { - "type": "0x02", - "from": "0x9a8f92a830a5cb89a3816e3d267cb7791c16b04d", - "to": "0x0bf07b2e415f02711ffbb32491f8ec9e5489b2e7", - "gas": "0x8427", - "value": "0x0", - "data": "0x36568abe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a8f92a830a5cb89a3816e3d267cb7791c16b04d", - "nonce": "0x15e6", - "accessList": [] - }, - "additionalContracts": [], - "isFixedGasLimit": false - } - ], - "receipts": [], - "libraries": [], - "pending": [], - "returns": {}, - "timestamp": 1706197795, - "chain": 1, - "multi": false, - "commit": "70c36e1" -} diff --git a/broadcast/DeployPermissionSplitterProxy.s.sol/1/dry-run/run-1706198336.json b/broadcast/DeployPermissionSplitterProxy.s.sol/1/dry-run/run-1706198336.json deleted file mode 100644 index 191772902..000000000 --- a/broadcast/DeployPermissionSplitterProxy.s.sol/1/dry-run/run-1706198336.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "transactions": [ - { - "hash": null, - "transactionType": "CREATE", - "contractName": "PermissionSplitterProxy", - "contractAddress": "0x0Bf07B2e415F02711fFBB32491f8ec9e5489B2e7", - "function": null, - "arguments": ["0xc186fA914353c44b2E33eBE05f21846F1048bEda"], - "transaction": { - "type": "0x02", - "from": "0x9a8f92a830a5cb89a3816e3d267cb7791c16b04d", - "gas": "0x1180b4", - "value": "0x0", - "data": "0x60806040818152346200041c578162001294803803809162000022828562000421565b83396020938491810103126200041c57516001600160a01b03811691908290036200041c57600092838052838152818420338552815260ff828520541615620003d3575b838052838152818420338552815260ff828520541615620000c75750600280546001600160a01b0319168317905551917f814250a3b8c79fcbe2ead2c131c952a278491c8f4322a79fe84b5040a810373e9080a2610dcb9081620004a98239f35b81519390925033906001600160401b036060860181811187821017620003bf578452602a86528486019284368537865115620002cf5760308453865190600191821015620003ab576078602189015360295b8281116200033c57506200030b578290855192608084019084821090821117620002f757865260428352868301936060368637835115620002e357603085538351821015620002e35790607860218501536041915b81831162000270575050506200023f57926200020c6048620001fc979462000231946044989785519a8b93620001d28b86019a7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008c5251809260378801906200045b565b8401917001034b99036b4b9b9b4b733903937b6329607d1b6037840152518093868401906200045b565b0103602881018952018762000421565b5194859362461bcd60e51b85526004850152518092816024860152858501906200045b565b601f01601f19168101030190fd5b60648585519062461bcd60e51b82528060048301526024820152600080516020620012748339815191526044820152fd5b909192600f81166010811015620002cf576f181899199a1a9b1b9c1cb0b131b232b360811b901a620002a3858762000480565b5360041c928015620002bb576000190191906200016e565b634e487b7160e01b82526011600452602482fd5b634e487b7160e01b83526032600452602483fd5b634e487b7160e01b81526032600452602490fd5b634e487b7160e01b85526041600452602485fd5b60648686519062461bcd60e51b82528060048301526024820152600080516020620012748339815191526044820152fd5b90600f8116601081101562000397576f181899199a1a9b1b9c1cb0b131b232b360811b901a6200036d838b62000480565b5360041c90801562000383576000190162000119565b634e487b7160e01b85526011600452602485fd5b634e487b7160e01b86526032600452602486fd5b634e487b7160e01b84526032600452602484fd5b634e487b7160e01b83526041600452602483fd5b8380528381528184203385528152818420600160ff198254161790553333857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8180a462000066565b600080fd5b601f909101601f19168101906001600160401b038211908210176200044557604052565b634e487b7160e01b600052604160045260246000fd5b60005b8381106200046f5750506000910152565b81810151838201526020016200045e565b90815181101562000492570160200190565b634e487b7160e01b600052603260045260246000fdfe60806040526004361015610018575b3661062057610620565b60003560e01c806301ffc9a7146100d85780631dbcb538146100d3578063248a9ca3146100ce5780632f2ff15d146100c957806336568abe146100c457806377da6060146100bf57806382127da1146100ba57806391d14854146100b5578063a217fddf146100b0578063ac9650d8146100ab578063d4b83992146100a65763d547741f0361000e5761059f565b610576565b61050c565b610446565b6103f4565b6103b9565b610350565b6102bc565b6101f8565b6101c9565b610162565b6100f9565b600435906001600160e01b0319821682036100f457565b600080fd5b346100f45760203660031901126100f45760206001600160e01b031961011d6100dd565b16637965db0b60e01b811490811561013b575b506040519015158152f35b6301ffc9a760e01b14905038610130565b602435906001600160a01b03821682036100f457565b346100f45760203660031901126100f4576004356001600160a01b038116908190036100f4576101906106f8565b600280546001600160a01b031916821790557f814250a3b8c79fcbe2ead2c131c952a278491c8f4322a79fe84b5040a810373e600080a2005b346100f45760203660031901126100f45760043560005260006020526020600160406000200154604051908152f35b346100f45760403660031901126100f45760043561021461014c565b6000918083528260205261022e6001604085200154610854565b808352602083815260408085206001600160a01b0385166000908152925290205460ff161561025b578280f35b808352602083815260408085206001600160a01b038516600090815292529020805460ff1916600117905533916001600160a01b0316907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8480a438808280f35b346100f45760403660031901126100f4576102d561014c565b336001600160a01b038216036102f3576102f190600435610963565b005b60405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608490fd5b346100f45760403660031901126100f4576103696100dd565b602435906103756106f8565b6001600160e01b031916600081815260016020526040812083905591907f9aecde1887c209ac367c4ded12201517685403a74b8924f233cc372ccb5f71a58380a380f35b346100f45760203660031901126100f4576001600160e01b03196103db6100dd565b1660005260016020526020604060002054604051908152f35b346100f45760403660031901126100f457602060ff61043a61041461014c565b6004356000526000845260406000209060018060a01b0316600052602052604060002090565b54166040519015158152f35b346100f45760003660031901126100f457602060405160008152f35b60005b8381106104755750506000910152565b8181015183820152602001610465565b9060209161049e81518092818552858086019101610462565b601f01601f1916010190565b602080820190808352835180925260408301928160408460051b8301019501936000915b8483106104de5750505050505090565b90919293949584806104fc600193603f198682030187528a51610485565b98019301930191949392906104ce565b346100f45760203660031901126100f45767ffffffffffffffff6004358181116100f457366023820112156100f45780600401359182116100f4573660248360051b830101116100f4576105729160246105669201610ce1565b604051918291826104aa565b0390f35b346100f45760003660031901126100f4576002546040516001600160a01b039091168152602090f35b346100f45760403660031901126100f4576102f16004356105be61014c565b908060005260006020526105d9600160406000200154610854565b610963565b156105e557565b60405162461bcd60e51b8152602060048201526013602482015272139bdd08185b1b1bddd959081d1bc818d85b1b606a1b6044820152606490fd5b600060043610156106bc575060005b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff168015610682575b610671906105de565b6002546001600160a01b03166106d7565b506001600160e01b03191660009081526001602090815260408083205483528282528083203384529091529020546106719060ff16610668565b366004116106d457356001600160e01b03191661062f565b80fd5b60008080923682803781369134905af13d82803e156106f4573d90f35b3d90fd5b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff161561073157565b61073a33610aec565b600090610745610a1f565b91603061075184610a61565b53607861075d84610a6e565b5360415b6001811161080d5761080960486107f1856107e3886107808815610aa1565b6040519485937f416363657373436f6e74726f6c3a206163636f756e742000000000000000000060208601526107c0815180926020603789019101610462565b84017001034b99036b4b9b9b4b733903937b6329607d1b603782015201906108fb565b03601f198101835282610928565b60405162461bcd60e51b81529182916004830161094f565b0390fd5b90600f811690601082101561084f5761084a916f181899199a1a9b1b9c1cb0b131b232b360811b901a6108408487610a7e565b5360041c91610a8f565b610761565b610a4b565b60008181526020818152604080832033845290915290205460ff16156108775750565b61088033610aec565b610888610a1f565b91603061089484610a61565b5360786108a084610a6e565b5360415b600181116108c35761080960486107f1856107e3886107808815610aa1565b90600f811690601082101561084f576108f6916f181899199a1a9b1b9c1cb0b131b232b360811b901a6108408487610a7e565b6108a4565b9061090e60209282815194859201610462565b0190565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff82111761094a57604052565b610912565b906020610960928181520190610485565b90565b6000818152602081815260408083206001600160a01b038616845290915281205490919060ff1661099357505050565b808252602082815260408084206001600160a01b038616600090815292529020805460ff1916905533926001600160a01b0316917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4565b634e487b7160e01b600052601160045260246000fd5b67ffffffffffffffff811161094a57601f01601f191660200190565b604051906080820182811067ffffffffffffffff82111761094a57604052604282526060366020840137565b634e487b7160e01b600052603260045260246000fd5b80511561084f5760200190565b80516001101561084f5760210190565b90815181101561084f570160200190565b8015610a9c576000190190565b6109ed565b15610aa857565b606460405162461bcd60e51b815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b604051906060820182811067ffffffffffffffff82111761094a57604052602a825260403660208401376030610b2183610a61565b536078610b2d83610a6e565b536029905b60018211610b4557610960915015610aa1565b600f811690601082101561084f57610b77916f181899199a1a9b1b9c1cb0b131b232b360811b901a6108408486610a7e565b90610b32565b67ffffffffffffffff811161094a5760051b60200190565b90610b9f82610b7d565b610bac6040519182610928565b8281528092610bbd601f1991610b7d565b019060005b828110610bce57505050565b806060602080938501015201610bc2565b6000198114610a9c5760010190565b919081101561084f5760051b81013590601e19813603018212156100f457019081359167ffffffffffffffff83116100f45760200182360381136100f4579190565b908092918237016000815290565b3d15610c69573d90610c4f82610a03565b91610c5d6040519384610928565b82523d6000602084013e565b606090565b6020818303126100f45780519067ffffffffffffffff82116100f4570181601f820112156100f4578051610ca181610a03565b92610caf6040519485610928565b818452602082840101116100f4576109609160208085019101610462565b805182101561084f5760209160051b010190565b919091610ced83610b95565b9260005b818110610cfd57505050565b600080610d0b838587610bee565b60409391610d1d855180938193610c30565b0390305af490610d2b610c3e565b91829015610d5a57505090610d5591610d448288610ccd565b52610d4f8187610ccd565b50610bdf565b610cf1565b604483929351106100f457610d8061080991600480940160248091518301019101610c6e565b925162461bcd60e51b8152928392830161094f56fea26469706673582212202137fa0bc03c545e8841c38313475f6c6b065e7638575892143de71726069a2864736f6c63430008130033537472696e67733a20686578206c656e67746820696e73756666696369656e74000000000000000000000000c186fa914353c44b2e33ebe05f21846f1048beda", - "nonce": "0x15e3", - "accessList": [] - }, - "additionalContracts": [], - "isFixedGasLimit": false - }, - { - "hash": null, - "transactionType": "CALL", - "contractName": "PermissionSplitterProxy", - "contractAddress": "0x0Bf07B2e415F02711fFBB32491f8ec9e5489B2e7", - "function": "grantRole(bytes32,address)", - "arguments": [ - "0x139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d", - "0xB524735356985D2f267FA010D681f061DfF03715" - ], - "transaction": { - "type": "0x02", - "from": "0x9a8f92a830a5cb89a3816e3d267cb7791c16b04d", - "to": "0x0bf07b2e415f02711ffbb32491f8ec9e5489b2e7", - "gas": "0x1140d", - "value": "0x0", - "data": "0x2f2ff15d139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d000000000000000000000000b524735356985d2f267fa010d681f061dff03715", - "nonce": "0x15e4", - "accessList": [] - }, - "additionalContracts": [], - "isFixedGasLimit": false - }, - { - "hash": null, - "transactionType": "CALL", - "contractName": "PermissionSplitterProxy", - "contractAddress": "0x0Bf07B2e415F02711fFBB32491f8ec9e5489B2e7", - "function": "__setRoleForSelector(bytes4,bytes32)", - "arguments": ["0x16c38b3c", "0x139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d"], - "transaction": { - "type": "0x02", - "from": "0x9a8f92a830a5cb89a3816e3d267cb7791c16b04d", - "to": "0x0bf07b2e415f02711ffbb32491f8ec9e5489b2e7", - "gas": "0x1030c", - "value": "0x0", - "data": "0x77da606016c38b3c00000000000000000000000000000000000000000000000000000000139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d", - "nonce": "0x15e5", - "accessList": [] - }, - "additionalContracts": [], - "isFixedGasLimit": false - }, - { - "hash": null, - "transactionType": "CALL", - "contractName": "PermissionSplitterProxy", - "contractAddress": "0x0Bf07B2e415F02711fFBB32491f8ec9e5489B2e7", - "function": "renounceRole(bytes32,address)", - "arguments": [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x9A8f92a830A5cB89a3816e3D267CB7791c16b04D" - ], - "transaction": { - "type": "0x02", - "from": "0x9a8f92a830a5cb89a3816e3d267cb7791c16b04d", - "to": "0x0bf07b2e415f02711ffbb32491f8ec9e5489b2e7", - "gas": "0x8427", - "value": "0x0", - "data": "0x36568abe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a8f92a830a5cb89a3816e3d267cb7791c16b04d", - "nonce": "0x15e6", - "accessList": [] - }, - "additionalContracts": [], - "isFixedGasLimit": false - } - ], - "receipts": [], - "libraries": [], - "pending": [], - "returns": {}, - "timestamp": 1706198336, - "chain": 1, - "multi": false, - "commit": "31d12dc" -} diff --git a/broadcast/DeployPermissionSplitterProxy.s.sol/1/dry-run/run-latest.json b/broadcast/DeployPermissionSplitterProxy.s.sol/1/dry-run/run-latest.json deleted file mode 100644 index 191772902..000000000 --- a/broadcast/DeployPermissionSplitterProxy.s.sol/1/dry-run/run-latest.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "transactions": [ - { - "hash": null, - "transactionType": "CREATE", - "contractName": "PermissionSplitterProxy", - "contractAddress": "0x0Bf07B2e415F02711fFBB32491f8ec9e5489B2e7", - "function": null, - "arguments": ["0xc186fA914353c44b2E33eBE05f21846F1048bEda"], - "transaction": { - "type": "0x02", - "from": "0x9a8f92a830a5cb89a3816e3d267cb7791c16b04d", - "gas": "0x1180b4", - "value": "0x0", - "data": "0x60806040818152346200041c578162001294803803809162000022828562000421565b83396020938491810103126200041c57516001600160a01b03811691908290036200041c57600092838052838152818420338552815260ff828520541615620003d3575b838052838152818420338552815260ff828520541615620000c75750600280546001600160a01b0319168317905551917f814250a3b8c79fcbe2ead2c131c952a278491c8f4322a79fe84b5040a810373e9080a2610dcb9081620004a98239f35b81519390925033906001600160401b036060860181811187821017620003bf578452602a86528486019284368537865115620002cf5760308453865190600191821015620003ab576078602189015360295b8281116200033c57506200030b578290855192608084019084821090821117620002f757865260428352868301936060368637835115620002e357603085538351821015620002e35790607860218501536041915b81831162000270575050506200023f57926200020c6048620001fc979462000231946044989785519a8b93620001d28b86019a7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008c5251809260378801906200045b565b8401917001034b99036b4b9b9b4b733903937b6329607d1b6037840152518093868401906200045b565b0103602881018952018762000421565b5194859362461bcd60e51b85526004850152518092816024860152858501906200045b565b601f01601f19168101030190fd5b60648585519062461bcd60e51b82528060048301526024820152600080516020620012748339815191526044820152fd5b909192600f81166010811015620002cf576f181899199a1a9b1b9c1cb0b131b232b360811b901a620002a3858762000480565b5360041c928015620002bb576000190191906200016e565b634e487b7160e01b82526011600452602482fd5b634e487b7160e01b83526032600452602483fd5b634e487b7160e01b81526032600452602490fd5b634e487b7160e01b85526041600452602485fd5b60648686519062461bcd60e51b82528060048301526024820152600080516020620012748339815191526044820152fd5b90600f8116601081101562000397576f181899199a1a9b1b9c1cb0b131b232b360811b901a6200036d838b62000480565b5360041c90801562000383576000190162000119565b634e487b7160e01b85526011600452602485fd5b634e487b7160e01b86526032600452602486fd5b634e487b7160e01b84526032600452602484fd5b634e487b7160e01b83526041600452602483fd5b8380528381528184203385528152818420600160ff198254161790553333857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8180a462000066565b600080fd5b601f909101601f19168101906001600160401b038211908210176200044557604052565b634e487b7160e01b600052604160045260246000fd5b60005b8381106200046f5750506000910152565b81810151838201526020016200045e565b90815181101562000492570160200190565b634e487b7160e01b600052603260045260246000fdfe60806040526004361015610018575b3661062057610620565b60003560e01c806301ffc9a7146100d85780631dbcb538146100d3578063248a9ca3146100ce5780632f2ff15d146100c957806336568abe146100c457806377da6060146100bf57806382127da1146100ba57806391d14854146100b5578063a217fddf146100b0578063ac9650d8146100ab578063d4b83992146100a65763d547741f0361000e5761059f565b610576565b61050c565b610446565b6103f4565b6103b9565b610350565b6102bc565b6101f8565b6101c9565b610162565b6100f9565b600435906001600160e01b0319821682036100f457565b600080fd5b346100f45760203660031901126100f45760206001600160e01b031961011d6100dd565b16637965db0b60e01b811490811561013b575b506040519015158152f35b6301ffc9a760e01b14905038610130565b602435906001600160a01b03821682036100f457565b346100f45760203660031901126100f4576004356001600160a01b038116908190036100f4576101906106f8565b600280546001600160a01b031916821790557f814250a3b8c79fcbe2ead2c131c952a278491c8f4322a79fe84b5040a810373e600080a2005b346100f45760203660031901126100f45760043560005260006020526020600160406000200154604051908152f35b346100f45760403660031901126100f45760043561021461014c565b6000918083528260205261022e6001604085200154610854565b808352602083815260408085206001600160a01b0385166000908152925290205460ff161561025b578280f35b808352602083815260408085206001600160a01b038516600090815292529020805460ff1916600117905533916001600160a01b0316907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8480a438808280f35b346100f45760403660031901126100f4576102d561014c565b336001600160a01b038216036102f3576102f190600435610963565b005b60405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608490fd5b346100f45760403660031901126100f4576103696100dd565b602435906103756106f8565b6001600160e01b031916600081815260016020526040812083905591907f9aecde1887c209ac367c4ded12201517685403a74b8924f233cc372ccb5f71a58380a380f35b346100f45760203660031901126100f4576001600160e01b03196103db6100dd565b1660005260016020526020604060002054604051908152f35b346100f45760403660031901126100f457602060ff61043a61041461014c565b6004356000526000845260406000209060018060a01b0316600052602052604060002090565b54166040519015158152f35b346100f45760003660031901126100f457602060405160008152f35b60005b8381106104755750506000910152565b8181015183820152602001610465565b9060209161049e81518092818552858086019101610462565b601f01601f1916010190565b602080820190808352835180925260408301928160408460051b8301019501936000915b8483106104de5750505050505090565b90919293949584806104fc600193603f198682030187528a51610485565b98019301930191949392906104ce565b346100f45760203660031901126100f45767ffffffffffffffff6004358181116100f457366023820112156100f45780600401359182116100f4573660248360051b830101116100f4576105729160246105669201610ce1565b604051918291826104aa565b0390f35b346100f45760003660031901126100f4576002546040516001600160a01b039091168152602090f35b346100f45760403660031901126100f4576102f16004356105be61014c565b908060005260006020526105d9600160406000200154610854565b610963565b156105e557565b60405162461bcd60e51b8152602060048201526013602482015272139bdd08185b1b1bddd959081d1bc818d85b1b606a1b6044820152606490fd5b600060043610156106bc575060005b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff168015610682575b610671906105de565b6002546001600160a01b03166106d7565b506001600160e01b03191660009081526001602090815260408083205483528282528083203384529091529020546106719060ff16610668565b366004116106d457356001600160e01b03191661062f565b80fd5b60008080923682803781369134905af13d82803e156106f4573d90f35b3d90fd5b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff161561073157565b61073a33610aec565b600090610745610a1f565b91603061075184610a61565b53607861075d84610a6e565b5360415b6001811161080d5761080960486107f1856107e3886107808815610aa1565b6040519485937f416363657373436f6e74726f6c3a206163636f756e742000000000000000000060208601526107c0815180926020603789019101610462565b84017001034b99036b4b9b9b4b733903937b6329607d1b603782015201906108fb565b03601f198101835282610928565b60405162461bcd60e51b81529182916004830161094f565b0390fd5b90600f811690601082101561084f5761084a916f181899199a1a9b1b9c1cb0b131b232b360811b901a6108408487610a7e565b5360041c91610a8f565b610761565b610a4b565b60008181526020818152604080832033845290915290205460ff16156108775750565b61088033610aec565b610888610a1f565b91603061089484610a61565b5360786108a084610a6e565b5360415b600181116108c35761080960486107f1856107e3886107808815610aa1565b90600f811690601082101561084f576108f6916f181899199a1a9b1b9c1cb0b131b232b360811b901a6108408487610a7e565b6108a4565b9061090e60209282815194859201610462565b0190565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff82111761094a57604052565b610912565b906020610960928181520190610485565b90565b6000818152602081815260408083206001600160a01b038616845290915281205490919060ff1661099357505050565b808252602082815260408084206001600160a01b038616600090815292529020805460ff1916905533926001600160a01b0316917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4565b634e487b7160e01b600052601160045260246000fd5b67ffffffffffffffff811161094a57601f01601f191660200190565b604051906080820182811067ffffffffffffffff82111761094a57604052604282526060366020840137565b634e487b7160e01b600052603260045260246000fd5b80511561084f5760200190565b80516001101561084f5760210190565b90815181101561084f570160200190565b8015610a9c576000190190565b6109ed565b15610aa857565b606460405162461bcd60e51b815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b604051906060820182811067ffffffffffffffff82111761094a57604052602a825260403660208401376030610b2183610a61565b536078610b2d83610a6e565b536029905b60018211610b4557610960915015610aa1565b600f811690601082101561084f57610b77916f181899199a1a9b1b9c1cb0b131b232b360811b901a6108408486610a7e565b90610b32565b67ffffffffffffffff811161094a5760051b60200190565b90610b9f82610b7d565b610bac6040519182610928565b8281528092610bbd601f1991610b7d565b019060005b828110610bce57505050565b806060602080938501015201610bc2565b6000198114610a9c5760010190565b919081101561084f5760051b81013590601e19813603018212156100f457019081359167ffffffffffffffff83116100f45760200182360381136100f4579190565b908092918237016000815290565b3d15610c69573d90610c4f82610a03565b91610c5d6040519384610928565b82523d6000602084013e565b606090565b6020818303126100f45780519067ffffffffffffffff82116100f4570181601f820112156100f4578051610ca181610a03565b92610caf6040519485610928565b818452602082840101116100f4576109609160208085019101610462565b805182101561084f5760209160051b010190565b919091610ced83610b95565b9260005b818110610cfd57505050565b600080610d0b838587610bee565b60409391610d1d855180938193610c30565b0390305af490610d2b610c3e565b91829015610d5a57505090610d5591610d448288610ccd565b52610d4f8187610ccd565b50610bdf565b610cf1565b604483929351106100f457610d8061080991600480940160248091518301019101610c6e565b925162461bcd60e51b8152928392830161094f56fea26469706673582212202137fa0bc03c545e8841c38313475f6c6b065e7638575892143de71726069a2864736f6c63430008130033537472696e67733a20686578206c656e67746820696e73756666696369656e74000000000000000000000000c186fa914353c44b2e33ebe05f21846f1048beda", - "nonce": "0x15e3", - "accessList": [] - }, - "additionalContracts": [], - "isFixedGasLimit": false - }, - { - "hash": null, - "transactionType": "CALL", - "contractName": "PermissionSplitterProxy", - "contractAddress": "0x0Bf07B2e415F02711fFBB32491f8ec9e5489B2e7", - "function": "grantRole(bytes32,address)", - "arguments": [ - "0x139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d", - "0xB524735356985D2f267FA010D681f061DfF03715" - ], - "transaction": { - "type": "0x02", - "from": "0x9a8f92a830a5cb89a3816e3d267cb7791c16b04d", - "to": "0x0bf07b2e415f02711ffbb32491f8ec9e5489b2e7", - "gas": "0x1140d", - "value": "0x0", - "data": "0x2f2ff15d139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d000000000000000000000000b524735356985d2f267fa010d681f061dff03715", - "nonce": "0x15e4", - "accessList": [] - }, - "additionalContracts": [], - "isFixedGasLimit": false - }, - { - "hash": null, - "transactionType": "CALL", - "contractName": "PermissionSplitterProxy", - "contractAddress": "0x0Bf07B2e415F02711fFBB32491f8ec9e5489B2e7", - "function": "__setRoleForSelector(bytes4,bytes32)", - "arguments": ["0x16c38b3c", "0x139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d"], - "transaction": { - "type": "0x02", - "from": "0x9a8f92a830a5cb89a3816e3d267cb7791c16b04d", - "to": "0x0bf07b2e415f02711ffbb32491f8ec9e5489b2e7", - "gas": "0x1030c", - "value": "0x0", - "data": "0x77da606016c38b3c00000000000000000000000000000000000000000000000000000000139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d", - "nonce": "0x15e5", - "accessList": [] - }, - "additionalContracts": [], - "isFixedGasLimit": false - }, - { - "hash": null, - "transactionType": "CALL", - "contractName": "PermissionSplitterProxy", - "contractAddress": "0x0Bf07B2e415F02711fFBB32491f8ec9e5489B2e7", - "function": "renounceRole(bytes32,address)", - "arguments": [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x9A8f92a830A5cB89a3816e3D267CB7791c16b04D" - ], - "transaction": { - "type": "0x02", - "from": "0x9a8f92a830a5cb89a3816e3d267cb7791c16b04d", - "to": "0x0bf07b2e415f02711ffbb32491f8ec9e5489b2e7", - "gas": "0x8427", - "value": "0x0", - "data": "0x36568abe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a8f92a830a5cb89a3816e3d267cb7791c16b04d", - "nonce": "0x15e6", - "accessList": [] - }, - "additionalContracts": [], - "isFixedGasLimit": false - } - ], - "receipts": [], - "libraries": [], - "pending": [], - "returns": {}, - "timestamp": 1706198336, - "chain": 1, - "multi": false, - "commit": "31d12dc" -} diff --git a/broadcast/deployed-addresses.json b/broadcast/deployed-addresses.json new file mode 100644 index 000000000..7f33178ee --- /dev/null +++ b/broadcast/deployed-addresses.json @@ -0,0 +1,930 @@ +{ + "generated_at": "2025-06-24T15:04:31.366Z", + "chains": { + "1": { + "chain_name": "Mainnet", + "contracts": { + "PermissionSplitterProxy": { + "address": "0x0Bf07B2e415F02711fFBB32491f8ec9e5489B2e7", + "transaction_hash": "0xa2a7b2c6812fb8ae34539fb04cd5f2a9112da1c7f6ffce0ddcf1fee7e43acf48", + "block_number": 19084679 + }, + "AcrossConfigStore": { + "address": "0x3B03509645713718B78951126E0A6de6f10043f5", + "transaction_hash": "Unknown", + "block_number": 14717196 + }, + "AcrossMerkleDistributor": { + "address": "0xE50b2cEAC4f60E840Ae513924033E753e2366487", + "transaction_hash": "Unknown", + "block_number": 15976846 + }, + "Arbitrum_Adapter": { + "address": "0x5473CBD30bEd1Bf97C0c9d7c59d268CD620dA426", + "transaction_hash": "Unknown", + "block_number": 19915048 + }, + "Arbitrum_RescueAdapter": { + "address": "0xC6fA0a4EBd802c01157d6E7fB1bbd2ae196ae375", + "transaction_hash": "Unknown", + "block_number": 16233939 + }, + "Arbitrum_SendTokensAdapter": { + "address": "0xC06A68DF12376271817FcEBfb45Be996B0e1593E", + "transaction_hash": "Unknown", + "block_number": 16691987 + }, + "Boba_Adapter": { + "address": "0x33B0Ec794c15D6Cc705818E70d4CaCe7bCfB5Af3", + "transaction_hash": "Unknown", + "block_number": 14716798 + }, + "Ethereum_Adapter": { + "address": "0x527E872a5c3f0C7c24Fe33F2593cFB890a285084", + "transaction_hash": "Unknown", + "block_number": 14704381 + }, + "SpokePool": { + "address": "0x5c7BCd6E7De5423a257D81B442095A1a6ced35C5", + "transaction_hash": "Unknown", + "block_number": 17117454 + }, + "HubPool": { + "address": "0xc186fA914353c44b2E33eBE05f21846F1048bEda", + "transaction_hash": "Unknown", + "block_number": 14819537 + }, + "HubPoolStore": { + "address": "0x1Ace3BbD69b63063F859514Eca29C9BDd8310E61", + "transaction_hash": "Unknown", + "block_number": 22368469 + }, + "LpTokenFactory": { + "address": "0x7dB69eb9F52eD773E9b03f5068A1ea0275b2fD9d", + "transaction_hash": "Unknown", + "block_number": 14704307 + }, + "Optimism_Adapter": { + "address": "0xE1e74B3D6A8E2A479B62958D4E4E6eEaea5B612b", + "transaction_hash": "Unknown", + "block_number": 19915034 + }, + "PolygonTokenBridger": { + "address": "0x0330E9b4D0325cCfF515E81DFbc7754F2a02ac57", + "transaction_hash": "Unknown", + "block_number": 14819539 + }, + "Polygon_Adapter": { + "address": "0xb4AeF0178f5725392A26eE18684C2aB62adc912e", + "transaction_hash": "Unknown", + "block_number": 19915066 + }, + "ZkSync_Adapter": { + "address": "0xA374585E6062517Ee367ee5044946A6fBe17724f", + "transaction_hash": "Unknown", + "block_number": 22167105 + }, + "Base_Adapter": { + "address": "0xE1421233BF7158A19f89F17c9735F9cbd3D9529c", + "transaction_hash": "Unknown", + "block_number": 19915087 + }, + "Linea_Adapter": { + "address": "0x5A44A32c13e2C43416bFDE5dDF5DCb3880c42787", + "transaction_hash": "Unknown", + "block_number": 22169879 + }, + "BondToken": { + "address": "0xee1dc6bcf1ee967a350e9ac6caaaa236109002ea", + "transaction_hash": "Unknown", + "block_number": 17980554 + }, + "SpokePoolVerifier": { + "address": "0x3Fb9cED51E968594C87963a371Ed90c39519f65A", + "transaction_hash": "Unknown", + "block_number": 22420136 + }, + "Mode_Adapter": { + "address": "0xf1B59868697f3925b72889ede818B9E7ba0316d0", + "transaction_hash": "Unknown", + "block_number": 19914094 + }, + "MulticallHandler": { + "address": "0x924a9f036260DdD5808007E1AA95f08eD08aA569", + "transaction_hash": "Unknown", + "block_number": 20277013 + }, + "Lisk_Adapter": { + "address": "0xF039AdCC74936F90fE175e8b3FE0FdC8b8E0c73b", + "transaction_hash": "Unknown", + "block_number": 22474211 + }, + "Universal_Adapter": { + "address": "0x22001f37B586792F25Ef9d19d99537C6446e0833", + "transaction_hash": "Unknown", + "block_number": 22368546 + }, + "Blast_Adapter": { + "address": "0xF2bEf5E905AAE0295003ab14872F811E914EdD81", + "transaction_hash": "Unknown", + "block_number": 20221494 + }, + "Scroll_Adapter": { + "address": "0x2DA799c2223c6ffB595e578903AE6b95839160d8", + "transaction_hash": "Unknown", + "block_number": 22325451 + }, + "Blast_DaiRetriever": { + "address": "0x98Dd57048d7d5337e92D9102743528ea4Fea64aB", + "transaction_hash": "Unknown", + "block_number": 20378862 + }, + "Blast_RescueAdapter": { + "address": "0xE5Dea263511F5caC27b15cBd58Ff103F4Ce90957", + "transaction_hash": "Unknown", + "block_number": 20378872 + }, + "Redstone_Adapter": { + "address": "0x188F8C95B7cfB7993B53a4F643efa687916f73fA", + "transaction_hash": "Unknown", + "block_number": 20432774 + }, + "Zora_Adapter": { + "address": "0x024f2fc31cbdd8de17194b1892c834f98ef5169b", + "transaction_hash": "Unknown", + "block_number": 20512287 + }, + "WorldChain_Adapter": { + "address": "0xA8399e221a583A57F54Abb5bA22f31b5D6C09f32", + "transaction_hash": "Unknown", + "block_number": 20963234 + }, + "AlephZero_Adapter": { + "address": "0x6F4083304C2cA99B077ACE06a5DcF670615915Af", + "transaction_hash": "Unknown", + "block_number": 21131132 + }, + "Ink_Adapter": { + "address": "0x7e90a40c7519b041a7df6498fbf5662e8cfc61d2", + "transaction_hash": "Unknown", + "block_number": 21438590 + }, + "Cher_Adapter": { + "address": "0x0c9d064523177dBB55CFE52b9D0c485FBFc35FD2", + "transaction_hash": "Unknown", + "block_number": 21597341 + }, + "Lens_Adapter": { + "address": "0x63AC22131eD457aeCbD63e6c4C7eeC7BBC74fF1F", + "transaction_hash": "Unknown", + "block_number": 22167069 + }, + "DoctorWho_Adapter": { + "address": "0xFADcC43096756e1527306FD92982FEbBe3c629Fa", + "transaction_hash": "Unknown", + "block_number": 21773451 + }, + "Solana_Adapter": { + "address": "0x1E22A3146439C68A2d247448372AcAEe9E201AB1", + "transaction_hash": "Unknown", + "block_number": 22566473 + } + } + }, + "10": { + "chain_name": "Optimism", + "contracts": { + "SpokePool": { + "address": "0x6f26Bf09B1C792e3228e5467807a900A503c0281", + "transaction_hash": "Unknown", + "block_number": 93903076 + }, + "1inch_SwapAndBridge": { + "address": "0x3E7448657409278C9d6E192b92F2b69B234FCc42", + "transaction_hash": "Unknown", + "block_number": 120044846 + }, + "UniswapV3_SwapAndBridge": { + "address": "0x6f4A733c7889f038D77D4f540182Dda17423CcbF", + "transaction_hash": "Unknown", + "block_number": 120044742 + }, + "AcrossMerkleDistributor": { + "address": "0xc8b31410340d57417bE62672f6B53dfB9de30aC2", + "transaction_hash": "Unknown", + "block_number": 114652330 + }, + "SpokePoolVerifier": { + "address": "0x3Fb9cED51E968594C87963a371Ed90c39519f65A", + "transaction_hash": "Unknown", + "block_number": 135440379 + }, + "MulticallHandler": { + "address": "0x924a9f036260DdD5808007E1AA95f08eD08aA569", + "transaction_hash": "Unknown", + "block_number": 122513129 + } + } + }, + "56": { + "chain_name": "BSC", + "contracts": { + "SpokePool": { + "address": "0x4e8E101924eDE233C13e2D8622DC8aED2872d505", + "transaction_hash": "Unknown", + "block_number": 48762335 + }, + "SpokePoolVerifier": { + "address": "0x3Fb9cED51E968594C87963a371Ed90c39519f65A", + "transaction_hash": "Unknown", + "block_number": 49157612 + }, + "MulticallHandler": { + "address": "0xAC537C12fE8f544D712d71ED4376a502EEa944d7", + "transaction_hash": "Unknown", + "block_number": 48762440 + } + } + }, + "130": { + "chain_name": "Chain 130", + "contracts": { + "SpokePool": { + "address": "0x09aea4b2242abC8bb4BB78D537A67a245A7bEC64", + "transaction_hash": "Unknown", + "block_number": 7915488 + }, + "SpokePoolVerifier": { + "address": "0x3Fb9cED51E968594C87963a371Ed90c39519f65A", + "transaction_hash": "Unknown", + "block_number": 15730595 + }, + "MulticallHandler": { + "address": "0x924a9f036260DdD5808007E1AA95f08eD08aA569", + "transaction_hash": "Unknown", + "block_number": 7930191 + } + } + }, + "137": { + "chain_name": "Polygon", + "contracts": { + "MintableERC1155": { + "address": "0xA15a90E7936A2F8B70E181E955760860D133e56B", + "transaction_hash": "Unknown", + "block_number": 40600414 + }, + "PolygonTokenBridger": { + "address": "0x0330E9b4D0325cCfF515E81DFbc7754F2a02ac57", + "transaction_hash": "Unknown", + "block_number": 28604258 + }, + "SpokePool": { + "address": "0x9295ee1d8C5b022Be115A2AD3c30C72E34e7F096", + "transaction_hash": "Unknown", + "block_number": 41908657 + }, + "SpokePoolVerifier": { + "address": "0x3Fb9cED51E968594C87963a371Ed90c39519f65A", + "transaction_hash": "Unknown", + "block_number": 71155996 + }, + "1inch_UniversalSwapAndBridge": { + "address": "0xf9735e425a36d22636ef4cb75c7a6c63378290ca", + "transaction_hash": "Unknown", + "block_number": 56529707 + }, + "1inch_SwapAndBridge": { + "address": "0xaBa0F11D55C5dDC52cD0Cb2cd052B621d45159d5", + "transaction_hash": "Unknown", + "block_number": 56675429 + }, + "UniswapV3_UniversalSwapAndBridge": { + "address": "0xc2dcb88873e00c9d401de2cbba4c6a28f8a6e2c2", + "transaction_hash": "Unknown", + "block_number": 56529578 + }, + "UniswapV3_SwapAndBridge": { + "address": "0x9220fa27ae680e4e8d9733932128fa73362e0393", + "transaction_hash": "Unknown", + "block_number": 56675837 + }, + "MulticallHandler": { + "address": "0x924a9f036260DdD5808007E1AA95f08eD08aA569", + "transaction_hash": "Unknown", + "block_number": 59194129 + } + } + }, + "232": { + "chain_name": "Chain 232", + "contracts": { + "SpokePool": { + "address": "0xe7cb3e167e7475dE1331Cf6E0CEb187654619E12", + "transaction_hash": "Unknown", + "block_number": 193290 + }, + "MulticallHandler": { + "address": "0xc5939F59b3c9662377DdA53A08D5085b2d52b719", + "transaction_hash": "Unknown", + "block_number": 193291 + } + } + }, + "288": { + "chain_name": "Chain 288", + "contracts": { + "SpokePool": { + "address": "0xBbc6009fEfFc27ce705322832Cb2068F8C1e0A58", + "transaction_hash": "Unknown", + "block_number": 619993 + } + } + }, + "324": { + "chain_name": "zkSync Era", + "contracts": { + "SpokePool": { + "address": "0xE0B015E54d54fc84a6cB9B666099c46adE9335FF", + "transaction_hash": "Unknown", + "block_number": 10352565 + }, + "MulticallHandler": { + "address": "0x863859ef502F0Ee9676626ED5B418037252eFeb2", + "transaction_hash": "Unknown", + "block_number": 36906393 + } + } + }, + "480": { + "chain_name": "Chain 480", + "contracts": { + "SpokePool": { + "address": "0x09aea4b2242abC8bb4BB78D537A67a245A7bEC64", + "transaction_hash": "Unknown", + "block_number": 4524742 + }, + "SpokePoolVerifier": { + "address": "0x3Fb9cED51E968594C87963a371Ed90c39519f65A", + "transaction_hash": "Unknown", + "block_number": 13571842 + }, + "MulticallHandler": { + "address": "0x924a9f036260DdD5808007E1AA95f08eD08aA569", + "transaction_hash": "Unknown", + "block_number": 4528295 + } + } + }, + "690": { + "chain_name": "Chain 690", + "contracts": { + "SpokePool": { + "address": "0x13fDac9F9b4777705db45291bbFF3c972c6d1d97", + "transaction_hash": "Unknown", + "block_number": 5512122 + }, + "SpokePoolVerifier": { + "address": "0x3Fb9cED51E968594C87963a371Ed90c39519f65A", + "transaction_hash": "Unknown", + "block_number": 17147100 + }, + "MulticallHandler": { + "address": "0x924a9f036260DdD5808007E1AA95f08eD08aA569", + "transaction_hash": "Unknown", + "block_number": 5159031 + } + } + }, + "919": { + "chain_name": "Chain 919", + "contracts": { + "SpokePool": { + "address": "0xbd886FC0725Cc459b55BbFEb3E4278610331f83b", + "transaction_hash": "Unknown", + "block_number": 13999465 + }, + "MulticallHandler": { + "address": "0x924a9f036260DdD5808007E1AA95f08eD08aA569", + "transaction_hash": "Unknown", + "block_number": 15826581 + } + } + }, + "1135": { + "chain_name": "Chain 1135", + "contracts": { + "SpokePool": { + "address": "0x9552a0a6624A23B848060AE5901659CDDa1f83f8", + "transaction_hash": "Unknown", + "block_number": 2602337 + }, + "SpokePoolVerifier": { + "address": "0x3Fb9cED51E968594C87963a371Ed90c39519f65A", + "transaction_hash": "Unknown", + "block_number": 15875239 + }, + "MulticallHandler": { + "address": "0x924a9f036260DdD5808007E1AA95f08eD08aA569", + "transaction_hash": "Unknown", + "block_number": 2948231 + } + } + }, + "1301": { + "chain_name": "Chain 1301", + "contracts": { + "SpokePool": { + "address": "0x6999526e507Cc3b03b180BbE05E1Ff938259A874", + "transaction_hash": "Unknown", + "block_number": 12593713 + }, + "MulticallHandler": { + "address": "0x924a9f036260DdD5808007E1AA95f08eD08aA569", + "transaction_hash": "Unknown", + "block_number": 12594561 + } + } + }, + "1868": { + "chain_name": "Chain 1868", + "contracts": { + "SpokePool": { + "address": "0x3baD7AD0728f9917d1Bf08af5782dCbD516cDd96", + "transaction_hash": "Unknown", + "block_number": 1709997 + }, + "SpokePoolVerifier": { + "address": "0x3Fb9cED51E968594C87963a371Ed90c39519f65A", + "transaction_hash": "Unknown", + "block_number": 6672118 + }, + "MulticallHandler": { + "address": "0x924a9f036260DdD5808007E1AA95f08eD08aA569", + "transaction_hash": "Unknown", + "block_number": 1711482 + } + } + }, + "4202": { + "chain_name": "Chain 4202", + "contracts": { + "SpokePool": { + "address": "0xeF684C38F94F48775959ECf2012D7E864ffb9dd4", + "transaction_hash": "Unknown", + "block_number": 7267988 + }, + "MulticallHandler": { + "address": "0x924a9f036260DdD5808007E1AA95f08eD08aA569", + "transaction_hash": "Unknown", + "block_number": 7660205 + } + } + }, + "8453": { + "chain_name": "Base", + "contracts": { + "SpokePool": { + "address": "0x09aea4b2242abC8bb4BB78D537A67a245A7bEC64", + "transaction_hash": "Unknown", + "block_number": 2164878 + }, + "SpokePoolVerifier": { + "address": "0x3Fb9cED51E968594C87963a371Ed90c39519f65A", + "transaction_hash": "Unknown", + "block_number": 29844942 + }, + "1inch_SwapAndBridge": { + "address": "0x7CFaBF2eA327009B39f40078011B0Fb714b65926", + "transaction_hash": "Unknown", + "block_number": 14450808 + }, + "UniswapV3_SwapAndBridge": { + "address": "0xbcfbCE9D92A516e3e7b0762AE218B4194adE34b4", + "transaction_hash": "Unknown", + "block_number": 14450714 + }, + "MulticallHandler": { + "address": "0x924a9f036260DdD5808007E1AA95f08eD08aA569", + "transaction_hash": "Unknown", + "block_number": 16917922 + } + } + }, + "34443": { + "chain_name": "Chain 34443", + "contracts": { + "SpokePool": { + "address": "0x3baD7AD0728f9917d1Bf08af5782dCbD516cDd96", + "transaction_hash": "Unknown", + "block_number": 8043187 + }, + "SpokePoolVerifier": { + "address": "0x3Fb9cED51E968594C87963a371Ed90c39519f65A", + "transaction_hash": "Unknown", + "block_number": 23155816 + }, + "MulticallHandler": { + "address": "0x924a9f036260DdD5808007E1AA95f08eD08aA569", + "transaction_hash": "Unknown", + "block_number": 10228826 + } + } + }, + "37111": { + "chain_name": "Chain 37111", + "contracts": { + "SpokePool": { + "address": "0x6A0a7f39530923911832Dd60667CE5da5449967B", + "transaction_hash": "Unknown", + "block_number": 156275 + }, + "MulticallHandler": { + "address": "0x02D2B95F631E0CF6c203E77f827381B0885F7822", + "transaction_hash": "Unknown", + "block_number": 145561 + } + } + }, + "41455": { + "chain_name": "Chain 41455", + "contracts": { + "SpokePool": { + "address": "0x13fDac9F9b4777705db45291bbFF3c972c6d1d97", + "transaction_hash": "Unknown", + "block_number": 4240318 + }, + "SpokePoolVerifier": { + "address": "0x3Fb9cED51E968594C87963a371Ed90c39519f65A", + "transaction_hash": "Unknown", + "block_number": 8669066 + }, + "MulticallHandler": { + "address": "0x924a9f036260DdD5808007E1AA95f08eD08aA569", + "transaction_hash": "Unknown", + "block_number": 4112529 + } + } + }, + "42161": { + "chain_name": "Arbitrum One", + "contracts": { + "SpokePool": { + "address": "0xe35e9842fceaCA96570B734083f4a58e8F7C5f2A", + "transaction_hash": "Unknown", + "block_number": 83868041 + }, + "SpokePoolVerifier": { + "address": "0x3Fb9cED51E968594C87963a371Ed90c39519f65A", + "transaction_hash": "Unknown", + "block_number": 333624754 + }, + "1inch_SwapAndBridge": { + "address": "0xC456398D5eE3B93828252e48beDEDbc39e03368E", + "transaction_hash": "Unknown", + "block_number": 211175795 + }, + "UniswapV3_SwapAndBridge": { + "address": "0xF633b72A4C2Fb73b77A379bf72864A825aD35b6D", + "transaction_hash": "Unknown", + "block_number": 211175481 + }, + "MulticallHandler": { + "address": "0x924a9f036260DdD5808007E1AA95f08eD08aA569", + "transaction_hash": "Unknown", + "block_number": 230779625 + } + } + }, + "57073": { + "chain_name": "Chain 57073", + "contracts": { + "SpokePool": { + "address": "0xeF684C38F94F48775959ECf2012D7E864ffb9dd4", + "transaction_hash": "Unknown", + "block_number": 1139240 + }, + "SpokePoolVerifier": { + "address": "0x3Fb9cED51E968594C87963a371Ed90c39519f65A", + "transaction_hash": "Unknown", + "block_number": 12980498 + }, + "MulticallHandler": { + "address": "0x924a9f036260DdD5808007E1AA95f08eD08aA569", + "transaction_hash": "Unknown", + "block_number": 1145284 + } + } + }, + "59144": { + "chain_name": "Linea", + "contracts": { + "SpokePool": { + "address": "0x7E63A5f1a8F0B4d0934B2f2327DAED3F6bb2ee75", + "transaction_hash": "Unknown", + "block_number": 2721169 + }, + "SpokePoolVerifier": { + "address": "0x3Fb9cED51E968594C87963a371Ed90c39519f65A", + "transaction_hash": "Unknown", + "block_number": 18705781 + }, + "MulticallHandler": { + "address": "0x1015c58894961F4F7Dd7D68ba033e28Ed3ee1cDB", + "transaction_hash": "Unknown", + "block_number": 5669220 + } + } + }, + "80002": { + "chain_name": "Polygon Amoy", + "contracts": { + "PolygonTokenBridger": { + "address": "0x4e3737679081c4D3029D88cA560918094f2e0284", + "transaction_hash": "Unknown", + "block_number": 7529773 + }, + "SpokePool": { + "address": "0xd08baaE74D6d2eAb1F3320B2E1a53eeb391ce8e5", + "transaction_hash": "Unknown", + "block_number": 7529960 + }, + "MulticallHandler": { + "address": "0x924a9f036260DdD5808007E1AA95f08eD08aA569", + "transaction_hash": "Unknown", + "block_number": 8797771 + } + } + }, + "81457": { + "chain_name": "Blast", + "contracts": { + "SpokePool": { + "address": "0x2D509190Ed0172ba588407D4c2df918F955Cc6E1", + "transaction_hash": "Unknown", + "block_number": 5574280 + }, + "SpokePoolVerifier": { + "address": "0x3Fb9cED51E968594C87963a371Ed90c39519f65A", + "transaction_hash": "Unknown", + "block_number": 18834642 + }, + "MulticallHandler": { + "address": "0x924a9f036260DdD5808007E1AA95f08eD08aA569", + "transaction_hash": "Unknown", + "block_number": 5876291 + } + } + }, + "84532": { + "chain_name": "Base Sepolia", + "contracts": { + "SpokePool": { + "address": "0x82B564983aE7274c86695917BBf8C99ECb6F0F8F", + "transaction_hash": "Unknown", + "block_number": 6082004 + }, + "MulticallHandler": { + "address": "0x924a9f036260DdD5808007E1AA95f08eD08aA569", + "transaction_hash": "Unknown", + "block_number": 12429513 + } + } + }, + "129399": { + "chain_name": "Chain 129399", + "contracts": { + "SpokePool": { + "address": "0x09aea4b2242abC8bb4BB78D537A67a245A7bEC64", + "transaction_hash": "Unknown", + "block_number": 2929205 + }, + "SpokePoolVerifier": { + "address": "0x630b76C7cA96164a5aCbC1105f8BA8B739C82570", + "transaction_hash": "Unknown", + "block_number": 3160019 + }, + "MulticallHandler": { + "address": "0xAC537C12fE8f544D712d71ED4376a502EEa944d7", + "transaction_hash": "Unknown", + "block_number": 3179705 + } + } + }, + "421614": { + "chain_name": "Arbitrum Sepolia", + "contracts": { + "SpokePool": { + "address": "0x7E63A5f1a8F0B4d0934B2f2327DAED3F6bb2ee75", + "transaction_hash": "Unknown", + "block_number": 12411026 + }, + "MulticallHandler": { + "address": "0x924a9f036260DdD5808007E1AA95f08eD08aA569", + "transaction_hash": "Unknown", + "block_number": 58993382 + } + } + }, + "534352": { + "chain_name": "Scroll", + "contracts": { + "SpokePool": { + "address": "0x3baD7AD0728f9917d1Bf08af5782dCbD516cDd96", + "transaction_hash": "Unknown", + "block_number": 7489705 + }, + "SpokePoolVerifier": { + "address": "0x3Fb9cED51E968594C87963a371Ed90c39519f65A", + "transaction_hash": "Unknown", + "block_number": 15223712 + }, + "MulticallHandler": { + "address": "0x924a9f036260DdD5808007E1AA95f08eD08aA569", + "transaction_hash": "Unknown", + "block_number": 7489978 + } + } + }, + "7777777": { + "chain_name": "Chain 7777777", + "contracts": { + "SpokePool": { + "address": "0x13fDac9F9b4777705db45291bbFF3c972c6d1d97", + "transaction_hash": "Unknown", + "block_number": 18382867 + }, + "SpokePoolVerifier": { + "address": "0x3Fb9cED51E968594C87963a371Ed90c39519f65A", + "transaction_hash": "Unknown", + "block_number": 29892606 + }, + "MulticallHandler": { + "address": "0x924a9f036260DdD5808007E1AA95f08eD08aA569", + "transaction_hash": "Unknown", + "block_number": 18119854 + } + } + }, + "11155111": { + "chain_name": "Sepolia", + "contracts": { + "Ethereum_SpokePool": { + "address": "0xf4883c2dc7fc45eba7baf91d2928055d4b14d21b", + "transaction_hash": "0x5cba50737d86ef9d146202c17a620479800501b226c057bac505128af8c4eccb", + "block_number": 8605919 + }, + "ERC1967Proxy": { + "address": "0x71f23002439dc6c2dc24f15d573922f8afd9455a", + "transaction_hash": "0x6cc66c10ff866a20d01e200304847f51b5a17311bd1d95c54efa51a0140179aa", + "block_number": 8605919 + }, + "LpTokenFactory": { + "address": "0x01f4b025f4a12873bbed3e531dd5aae6b0b6445a", + "transaction_hash": "0x68e3f7e15e4a2756c8c8573e6fc06f394a9956fd3d776fc42ffbea4835c01b04", + "block_number": 8577380 + }, + "HubPool": { + "address": "0x14224e63716aface30c9a417e0542281869f7d9e", + "transaction_hash": "Unknown", + "block_number": 4911835 + }, + "MulticallHandler": { + "address": "0x924a9f036260DdD5808007E1AA95f08eD08aA569", + "transaction_hash": "Unknown", + "block_number": 6284508 + }, + "AcrossConfigStore": { + "address": "0xB3De1e212B49e68f4a68b5993f31f63946FCA2a6", + "transaction_hash": "Unknown", + "block_number": 4968255 + }, + "LPTokenFactory": { + "address": "0xFB87Ac52Bac7ccF497b6053610A9c59B87a0cE7D", + "transaction_hash": "Unknown", + "block_number": 4911834 + }, + "SpokePool": { + "address": "0x5ef6C01E11889d86803e0B23e3cB3F9E9d97B662", + "transaction_hash": "Unknown", + "block_number": 5288470 + }, + "PolygonTokenBridger": { + "address": "0x4e3737679081c4D3029D88cA560918094f2e0284", + "transaction_hash": "Unknown", + "block_number": 5984560 + }, + "Polygon_Adapter": { + "address": "0x540029039E493b1B843653f93C3064A956931747", + "transaction_hash": "Unknown", + "block_number": 5984591 + }, + "Lisk_Adapter": { + "address": "0x13a8B1D6443016424e2b8Bac40dD884Ee679AFc4", + "transaction_hash": "Unknown", + "block_number": 6226289 + }, + "Lens_Adapter": { + "address": "0x8fac6F764ae0b4F632FE2E6c938ED5637E629ff2", + "transaction_hash": "Unknown", + "block_number": 7448085 + }, + "Blast_Adapter": { + "address": "0x09500Ffd743e01B4146a4BA795231Ca7Ca37819f", + "transaction_hash": "Unknown", + "block_number": 6233857 + }, + "DoctorWho_Adapter": { + "address": "0x2b482aFb675e1F231521d5E56770ce4aac592246", + "transaction_hash": "Unknown", + "block_number": 7698546 + }, + "Solana_Adapter": { + "address": "0x9b2c2f3fD98cF8468715Be31155cc053C56f822A", + "transaction_hash": "Unknown", + "block_number": 8409722 + } + } + }, + "11155420": { + "chain_name": "Optimism Sepolia", + "contracts": { + "SpokePool": { + "address": "0x4e8E101924eDE233C13e2D8622DC8aED2872d505", + "transaction_hash": "Unknown", + "block_number": 7762656 + }, + "MulticallHandler": { + "address": "0x924a9f036260DdD5808007E1AA95f08eD08aA569", + "transaction_hash": "Unknown", + "block_number": 14411096 + } + } + }, + "168587773": { + "chain_name": "Blast Sepolia", + "contracts": { + "SpokePool": { + "address": "0x5545092553Cf5Bf786e87a87192E902D50D8f022", + "transaction_hash": "Unknown", + "block_number": 7634204 + }, + "MulticallHandler": { + "address": "0x924a9f036260DdD5808007E1AA95f08eD08aA569", + "transaction_hash": "Unknown", + "block_number": 7973417 + } + } + }, + "133268194659241": { + "chain_name": "Chain 133268194659241", + "contracts": { + "SvmSpoke": { + "address": "JAZWcGrpSWNPTBj8QtJ9UyQqhJCDhG9GJkDeMf5NQBiq", + "transaction_hash": "Unknown", + "block_number": 356313770 + }, + "MulticallHandler": { + "address": "Fk1RpqsfeWt8KnFCTW9NQVdVxYvxuqjGn6iPB9wrmM8h", + "transaction_hash": "Unknown", + "block_number": 356321050 + }, + "MessageTransmitter": { + "address": "CCTPmbSD7gX1bxKPAmg77w8oFzNFpaQiQUWD43TKaecd", + "transaction_hash": "Unknown", + "block_number": 339604856 + }, + "TokenMessengerMinter": { + "address": "CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3", + "transaction_hash": "Unknown", + "block_number": 277864039 + } + } + }, + "34268394551451": { + "chain_name": "Chain 34268394551451", + "contracts": { + "SvmSpoke": { + "address": "JAZWcGrpSWNPTBj8QtJ9UyQqhJCDhG9GJkDeMf5NQBiq", + "transaction_hash": "Unknown", + "block_number": 317101505 + }, + "MulticallHandler": { + "address": "Fk1RpqsfeWt8KnFCTW9NQVdVxYvxuqjGn6iPB9wrmM8h", + "transaction_hash": "Unknown", + "block_number": 317112562 + }, + "MessageTransmitter": { + "address": "CCTPmbSD7gX1bxKPAmg77w8oFzNFpaQiQUWD43TKaecd", + "transaction_hash": "Unknown", + "block_number": 312515728 + }, + "TokenMessengerMinter": { + "address": "CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3", + "transaction_hash": "Unknown", + "block_number": 262177984 + } + } + } + } +} diff --git a/broadcast/deployed-addresses.md b/broadcast/deployed-addresses.md new file mode 100644 index 000000000..ebc489195 --- /dev/null +++ b/broadcast/deployed-addresses.md @@ -0,0 +1,983 @@ +# Deployed Contract Addresses + +Generated on: 2025-06-24T15:04:31.365Z + +This file contains the latest deployed smart contract addresses from the broadcast folder. + +## Mainnet (Chain ID: 1) + +### DeployPermissionSplitterProxy.s.sol + +- **PermissionSplitterProxy**: `0x0Bf07B2e415F02711fFBB32491f8ec9e5489B2e7` + - Transaction Hash: `0xa2a7b2c6812fb8ae34539fb04cd5f2a9112da1c7f6ffce0ddcf1fee7e43acf48` + - Block Number: `19084679` + +### AcrossConfigStore + +- **AcrossConfigStore**: `0x3B03509645713718B78951126E0A6de6f10043f5` + - Transaction Hash: `Unknown` + - Block Number: `14717196` + +### AcrossMerkleDistributor + +- **AcrossMerkleDistributor**: `0xE50b2cEAC4f60E840Ae513924033E753e2366487` + - Transaction Hash: `Unknown` + - Block Number: `15976846` + +### Arbitrum_Adapter + +- **Arbitrum_Adapter**: `0x5473CBD30bEd1Bf97C0c9d7c59d268CD620dA426` + - Transaction Hash: `Unknown` + - Block Number: `19915048` + +### Arbitrum_RescueAdapter + +- **Arbitrum_RescueAdapter**: `0xC6fA0a4EBd802c01157d6E7fB1bbd2ae196ae375` + - Transaction Hash: `Unknown` + - Block Number: `16233939` + +### Arbitrum_SendTokensAdapter + +- **Arbitrum_SendTokensAdapter**: `0xC06A68DF12376271817FcEBfb45Be996B0e1593E` + - Transaction Hash: `Unknown` + - Block Number: `16691987` + +### Boba_Adapter + +- **Boba_Adapter**: `0x33B0Ec794c15D6Cc705818E70d4CaCe7bCfB5Af3` + - Transaction Hash: `Unknown` + - Block Number: `14716798` + +### Ethereum_Adapter + +- **Ethereum_Adapter**: `0x527E872a5c3f0C7c24Fe33F2593cFB890a285084` + - Transaction Hash: `Unknown` + - Block Number: `14704381` + +### SpokePool + +- **SpokePool**: `0x5c7BCd6E7De5423a257D81B442095A1a6ced35C5` + - Transaction Hash: `Unknown` + - Block Number: `17117454` + +### HubPool + +- **HubPool**: `0xc186fA914353c44b2E33eBE05f21846F1048bEda` + - Transaction Hash: `Unknown` + - Block Number: `14819537` + +### HubPoolStore + +- **HubPoolStore**: `0x1Ace3BbD69b63063F859514Eca29C9BDd8310E61` + - Transaction Hash: `Unknown` + - Block Number: `22368469` + +### LpTokenFactory + +- **LpTokenFactory**: `0x7dB69eb9F52eD773E9b03f5068A1ea0275b2fD9d` + - Transaction Hash: `Unknown` + - Block Number: `14704307` + +### Optimism_Adapter + +- **Optimism_Adapter**: `0xE1e74B3D6A8E2A479B62958D4E4E6eEaea5B612b` + - Transaction Hash: `Unknown` + - Block Number: `19915034` + +### PolygonTokenBridger + +- **PolygonTokenBridger**: `0x0330E9b4D0325cCfF515E81DFbc7754F2a02ac57` + - Transaction Hash: `Unknown` + - Block Number: `14819539` + +### Polygon_Adapter + +- **Polygon_Adapter**: `0xb4AeF0178f5725392A26eE18684C2aB62adc912e` + - Transaction Hash: `Unknown` + - Block Number: `19915066` + +### ZkSync_Adapter + +- **ZkSync_Adapter**: `0xA374585E6062517Ee367ee5044946A6fBe17724f` + - Transaction Hash: `Unknown` + - Block Number: `22167105` + +### Base_Adapter + +- **Base_Adapter**: `0xE1421233BF7158A19f89F17c9735F9cbd3D9529c` + - Transaction Hash: `Unknown` + - Block Number: `19915087` + +### Linea_Adapter + +- **Linea_Adapter**: `0x5A44A32c13e2C43416bFDE5dDF5DCb3880c42787` + - Transaction Hash: `Unknown` + - Block Number: `22169879` + +### BondToken + +- **BondToken**: `0xee1dc6bcf1ee967a350e9ac6caaaa236109002ea` + - Transaction Hash: `Unknown` + - Block Number: `17980554` + +### SpokePoolVerifier + +- **SpokePoolVerifier**: `0x3Fb9cED51E968594C87963a371Ed90c39519f65A` + - Transaction Hash: `Unknown` + - Block Number: `22420136` + +### Mode_Adapter + +- **Mode_Adapter**: `0xf1B59868697f3925b72889ede818B9E7ba0316d0` + - Transaction Hash: `Unknown` + - Block Number: `19914094` + +### MulticallHandler + +- **MulticallHandler**: `0x924a9f036260DdD5808007E1AA95f08eD08aA569` + - Transaction Hash: `Unknown` + - Block Number: `20277013` + +### Lisk_Adapter + +- **Lisk_Adapter**: `0xF039AdCC74936F90fE175e8b3FE0FdC8b8E0c73b` + - Transaction Hash: `Unknown` + - Block Number: `22474211` + +### Universal_Adapter + +- **Universal_Adapter**: `0x22001f37B586792F25Ef9d19d99537C6446e0833` + - Transaction Hash: `Unknown` + - Block Number: `22368546` + +### Blast_Adapter + +- **Blast_Adapter**: `0xF2bEf5E905AAE0295003ab14872F811E914EdD81` + - Transaction Hash: `Unknown` + - Block Number: `20221494` + +### Scroll_Adapter + +- **Scroll_Adapter**: `0x2DA799c2223c6ffB595e578903AE6b95839160d8` + - Transaction Hash: `Unknown` + - Block Number: `22325451` + +### Blast_DaiRetriever + +- **Blast_DaiRetriever**: `0x98Dd57048d7d5337e92D9102743528ea4Fea64aB` + - Transaction Hash: `Unknown` + - Block Number: `20378862` + +### Blast_RescueAdapter + +- **Blast_RescueAdapter**: `0xE5Dea263511F5caC27b15cBd58Ff103F4Ce90957` + - Transaction Hash: `Unknown` + - Block Number: `20378872` + +### Redstone_Adapter + +- **Redstone_Adapter**: `0x188F8C95B7cfB7993B53a4F643efa687916f73fA` + - Transaction Hash: `Unknown` + - Block Number: `20432774` + +### Zora_Adapter + +- **Zora_Adapter**: `0x024f2fc31cbdd8de17194b1892c834f98ef5169b` + - Transaction Hash: `Unknown` + - Block Number: `20512287` + +### WorldChain_Adapter + +- **WorldChain_Adapter**: `0xA8399e221a583A57F54Abb5bA22f31b5D6C09f32` + - Transaction Hash: `Unknown` + - Block Number: `20963234` + +### AlephZero_Adapter + +- **AlephZero_Adapter**: `0x6F4083304C2cA99B077ACE06a5DcF670615915Af` + - Transaction Hash: `Unknown` + - Block Number: `21131132` + +### Ink_Adapter + +- **Ink_Adapter**: `0x7e90a40c7519b041a7df6498fbf5662e8cfc61d2` + - Transaction Hash: `Unknown` + - Block Number: `21438590` + +### Cher_Adapter + +- **Cher_Adapter**: `0x0c9d064523177dBB55CFE52b9D0c485FBFc35FD2` + - Transaction Hash: `Unknown` + - Block Number: `21597341` + +### Lens_Adapter + +- **Lens_Adapter**: `0x63AC22131eD457aeCbD63e6c4C7eeC7BBC74fF1F` + - Transaction Hash: `Unknown` + - Block Number: `22167069` + +### DoctorWho_Adapter + +- **DoctorWho_Adapter**: `0xFADcC43096756e1527306FD92982FEbBe3c629Fa` + - Transaction Hash: `Unknown` + - Block Number: `21773451` + +### Solana_Adapter + +- **Solana_Adapter**: `0x1E22A3146439C68A2d247448372AcAEe9E201AB1` + - Transaction Hash: `Unknown` + - Block Number: `22566473` + +## Optimism (Chain ID: 10) + +### SpokePool + +- **SpokePool**: `0x6f26Bf09B1C792e3228e5467807a900A503c0281` + - Transaction Hash: `Unknown` + - Block Number: `93903076` + +### 1inch_SwapAndBridge + +- **1inch_SwapAndBridge**: `0x3E7448657409278C9d6E192b92F2b69B234FCc42` + - Transaction Hash: `Unknown` + - Block Number: `120044846` + +### UniswapV3_SwapAndBridge + +- **UniswapV3_SwapAndBridge**: `0x6f4A733c7889f038D77D4f540182Dda17423CcbF` + - Transaction Hash: `Unknown` + - Block Number: `120044742` + +### AcrossMerkleDistributor + +- **AcrossMerkleDistributor**: `0xc8b31410340d57417bE62672f6B53dfB9de30aC2` + - Transaction Hash: `Unknown` + - Block Number: `114652330` + +### SpokePoolVerifier + +- **SpokePoolVerifier**: `0x3Fb9cED51E968594C87963a371Ed90c39519f65A` + - Transaction Hash: `Unknown` + - Block Number: `135440379` + +### MulticallHandler + +- **MulticallHandler**: `0x924a9f036260DdD5808007E1AA95f08eD08aA569` + - Transaction Hash: `Unknown` + - Block Number: `122513129` + +## BSC (Chain ID: 56) + +### SpokePool + +- **SpokePool**: `0x4e8E101924eDE233C13e2D8622DC8aED2872d505` + - Transaction Hash: `Unknown` + - Block Number: `48762335` + +### SpokePoolVerifier + +- **SpokePoolVerifier**: `0x3Fb9cED51E968594C87963a371Ed90c39519f65A` + - Transaction Hash: `Unknown` + - Block Number: `49157612` + +### MulticallHandler + +- **MulticallHandler**: `0xAC537C12fE8f544D712d71ED4376a502EEa944d7` + - Transaction Hash: `Unknown` + - Block Number: `48762440` + +## Chain 130 (Chain ID: 130) + +### SpokePool + +- **SpokePool**: `0x09aea4b2242abC8bb4BB78D537A67a245A7bEC64` + - Transaction Hash: `Unknown` + - Block Number: `7915488` + +### SpokePoolVerifier + +- **SpokePoolVerifier**: `0x3Fb9cED51E968594C87963a371Ed90c39519f65A` + - Transaction Hash: `Unknown` + - Block Number: `15730595` + +### MulticallHandler + +- **MulticallHandler**: `0x924a9f036260DdD5808007E1AA95f08eD08aA569` + - Transaction Hash: `Unknown` + - Block Number: `7930191` + +## Polygon (Chain ID: 137) + +### MintableERC1155 + +- **MintableERC1155**: `0xA15a90E7936A2F8B70E181E955760860D133e56B` + - Transaction Hash: `Unknown` + - Block Number: `40600414` + +### PolygonTokenBridger + +- **PolygonTokenBridger**: `0x0330E9b4D0325cCfF515E81DFbc7754F2a02ac57` + - Transaction Hash: `Unknown` + - Block Number: `28604258` + +### SpokePool + +- **SpokePool**: `0x9295ee1d8C5b022Be115A2AD3c30C72E34e7F096` + - Transaction Hash: `Unknown` + - Block Number: `41908657` + +### SpokePoolVerifier + +- **SpokePoolVerifier**: `0x3Fb9cED51E968594C87963a371Ed90c39519f65A` + - Transaction Hash: `Unknown` + - Block Number: `71155996` + +### 1inch_UniversalSwapAndBridge + +- **1inch_UniversalSwapAndBridge**: `0xf9735e425a36d22636ef4cb75c7a6c63378290ca` + - Transaction Hash: `Unknown` + - Block Number: `56529707` + +### 1inch_SwapAndBridge + +- **1inch_SwapAndBridge**: `0xaBa0F11D55C5dDC52cD0Cb2cd052B621d45159d5` + - Transaction Hash: `Unknown` + - Block Number: `56675429` + +### UniswapV3_UniversalSwapAndBridge + +- **UniswapV3_UniversalSwapAndBridge**: `0xc2dcb88873e00c9d401de2cbba4c6a28f8a6e2c2` + - Transaction Hash: `Unknown` + - Block Number: `56529578` + +### UniswapV3_SwapAndBridge + +- **UniswapV3_SwapAndBridge**: `0x9220fa27ae680e4e8d9733932128fa73362e0393` + - Transaction Hash: `Unknown` + - Block Number: `56675837` + +### MulticallHandler + +- **MulticallHandler**: `0x924a9f036260DdD5808007E1AA95f08eD08aA569` + - Transaction Hash: `Unknown` + - Block Number: `59194129` + +## Chain 232 (Chain ID: 232) + +### SpokePool + +- **SpokePool**: `0xe7cb3e167e7475dE1331Cf6E0CEb187654619E12` + - Transaction Hash: `Unknown` + - Block Number: `193290` + +### MulticallHandler + +- **MulticallHandler**: `0xc5939F59b3c9662377DdA53A08D5085b2d52b719` + - Transaction Hash: `Unknown` + - Block Number: `193291` + +## Chain 288 (Chain ID: 288) + +### SpokePool + +- **SpokePool**: `0xBbc6009fEfFc27ce705322832Cb2068F8C1e0A58` + - Transaction Hash: `Unknown` + - Block Number: `619993` + +## zkSync Era (Chain ID: 324) + +### SpokePool + +- **SpokePool**: `0xE0B015E54d54fc84a6cB9B666099c46adE9335FF` + - Transaction Hash: `Unknown` + - Block Number: `10352565` + +### MulticallHandler + +- **MulticallHandler**: `0x863859ef502F0Ee9676626ED5B418037252eFeb2` + - Transaction Hash: `Unknown` + - Block Number: `36906393` + +## Chain 480 (Chain ID: 480) + +### SpokePool + +- **SpokePool**: `0x09aea4b2242abC8bb4BB78D537A67a245A7bEC64` + - Transaction Hash: `Unknown` + - Block Number: `4524742` + +### SpokePoolVerifier + +- **SpokePoolVerifier**: `0x3Fb9cED51E968594C87963a371Ed90c39519f65A` + - Transaction Hash: `Unknown` + - Block Number: `13571842` + +### MulticallHandler + +- **MulticallHandler**: `0x924a9f036260DdD5808007E1AA95f08eD08aA569` + - Transaction Hash: `Unknown` + - Block Number: `4528295` + +## Chain 690 (Chain ID: 690) + +### SpokePool + +- **SpokePool**: `0x13fDac9F9b4777705db45291bbFF3c972c6d1d97` + - Transaction Hash: `Unknown` + - Block Number: `5512122` + +### SpokePoolVerifier + +- **SpokePoolVerifier**: `0x3Fb9cED51E968594C87963a371Ed90c39519f65A` + - Transaction Hash: `Unknown` + - Block Number: `17147100` + +### MulticallHandler + +- **MulticallHandler**: `0x924a9f036260DdD5808007E1AA95f08eD08aA569` + - Transaction Hash: `Unknown` + - Block Number: `5159031` + +## Chain 919 (Chain ID: 919) + +### SpokePool + +- **SpokePool**: `0xbd886FC0725Cc459b55BbFEb3E4278610331f83b` + - Transaction Hash: `Unknown` + - Block Number: `13999465` + +### MulticallHandler + +- **MulticallHandler**: `0x924a9f036260DdD5808007E1AA95f08eD08aA569` + - Transaction Hash: `Unknown` + - Block Number: `15826581` + +## Chain 1135 (Chain ID: 1135) + +### SpokePool + +- **SpokePool**: `0x9552a0a6624A23B848060AE5901659CDDa1f83f8` + - Transaction Hash: `Unknown` + - Block Number: `2602337` + +### SpokePoolVerifier + +- **SpokePoolVerifier**: `0x3Fb9cED51E968594C87963a371Ed90c39519f65A` + - Transaction Hash: `Unknown` + - Block Number: `15875239` + +### MulticallHandler + +- **MulticallHandler**: `0x924a9f036260DdD5808007E1AA95f08eD08aA569` + - Transaction Hash: `Unknown` + - Block Number: `2948231` + +## Chain 1301 (Chain ID: 1301) + +### SpokePool + +- **SpokePool**: `0x6999526e507Cc3b03b180BbE05E1Ff938259A874` + - Transaction Hash: `Unknown` + - Block Number: `12593713` + +### MulticallHandler + +- **MulticallHandler**: `0x924a9f036260DdD5808007E1AA95f08eD08aA569` + - Transaction Hash: `Unknown` + - Block Number: `12594561` + +## Chain 1868 (Chain ID: 1868) + +### SpokePool + +- **SpokePool**: `0x3baD7AD0728f9917d1Bf08af5782dCbD516cDd96` + - Transaction Hash: `Unknown` + - Block Number: `1709997` + +### SpokePoolVerifier + +- **SpokePoolVerifier**: `0x3Fb9cED51E968594C87963a371Ed90c39519f65A` + - Transaction Hash: `Unknown` + - Block Number: `6672118` + +### MulticallHandler + +- **MulticallHandler**: `0x924a9f036260DdD5808007E1AA95f08eD08aA569` + - Transaction Hash: `Unknown` + - Block Number: `1711482` + +## Chain 4202 (Chain ID: 4202) + +### SpokePool + +- **SpokePool**: `0xeF684C38F94F48775959ECf2012D7E864ffb9dd4` + - Transaction Hash: `Unknown` + - Block Number: `7267988` + +### MulticallHandler + +- **MulticallHandler**: `0x924a9f036260DdD5808007E1AA95f08eD08aA569` + - Transaction Hash: `Unknown` + - Block Number: `7660205` + +## Base (Chain ID: 8453) + +### SpokePool + +- **SpokePool**: `0x09aea4b2242abC8bb4BB78D537A67a245A7bEC64` + - Transaction Hash: `Unknown` + - Block Number: `2164878` + +### SpokePoolVerifier + +- **SpokePoolVerifier**: `0x3Fb9cED51E968594C87963a371Ed90c39519f65A` + - Transaction Hash: `Unknown` + - Block Number: `29844942` + +### 1inch_SwapAndBridge + +- **1inch_SwapAndBridge**: `0x7CFaBF2eA327009B39f40078011B0Fb714b65926` + - Transaction Hash: `Unknown` + - Block Number: `14450808` + +### UniswapV3_SwapAndBridge + +- **UniswapV3_SwapAndBridge**: `0xbcfbCE9D92A516e3e7b0762AE218B4194adE34b4` + - Transaction Hash: `Unknown` + - Block Number: `14450714` + +### MulticallHandler + +- **MulticallHandler**: `0x924a9f036260DdD5808007E1AA95f08eD08aA569` + - Transaction Hash: `Unknown` + - Block Number: `16917922` + +## Chain 34443 (Chain ID: 34443) + +### SpokePool + +- **SpokePool**: `0x3baD7AD0728f9917d1Bf08af5782dCbD516cDd96` + - Transaction Hash: `Unknown` + - Block Number: `8043187` + +### SpokePoolVerifier + +- **SpokePoolVerifier**: `0x3Fb9cED51E968594C87963a371Ed90c39519f65A` + - Transaction Hash: `Unknown` + - Block Number: `23155816` + +### MulticallHandler + +- **MulticallHandler**: `0x924a9f036260DdD5808007E1AA95f08eD08aA569` + - Transaction Hash: `Unknown` + - Block Number: `10228826` + +## Chain 37111 (Chain ID: 37111) + +### SpokePool + +- **SpokePool**: `0x6A0a7f39530923911832Dd60667CE5da5449967B` + - Transaction Hash: `Unknown` + - Block Number: `156275` + +### MulticallHandler + +- **MulticallHandler**: `0x02D2B95F631E0CF6c203E77f827381B0885F7822` + - Transaction Hash: `Unknown` + - Block Number: `145561` + +## Chain 41455 (Chain ID: 41455) + +### SpokePool + +- **SpokePool**: `0x13fDac9F9b4777705db45291bbFF3c972c6d1d97` + - Transaction Hash: `Unknown` + - Block Number: `4240318` + +### SpokePoolVerifier + +- **SpokePoolVerifier**: `0x3Fb9cED51E968594C87963a371Ed90c39519f65A` + - Transaction Hash: `Unknown` + - Block Number: `8669066` + +### MulticallHandler + +- **MulticallHandler**: `0x924a9f036260DdD5808007E1AA95f08eD08aA569` + - Transaction Hash: `Unknown` + - Block Number: `4112529` + +## Arbitrum One (Chain ID: 42161) + +### SpokePool + +- **SpokePool**: `0xe35e9842fceaCA96570B734083f4a58e8F7C5f2A` + - Transaction Hash: `Unknown` + - Block Number: `83868041` + +### SpokePoolVerifier + +- **SpokePoolVerifier**: `0x3Fb9cED51E968594C87963a371Ed90c39519f65A` + - Transaction Hash: `Unknown` + - Block Number: `333624754` + +### 1inch_SwapAndBridge + +- **1inch_SwapAndBridge**: `0xC456398D5eE3B93828252e48beDEDbc39e03368E` + - Transaction Hash: `Unknown` + - Block Number: `211175795` + +### UniswapV3_SwapAndBridge + +- **UniswapV3_SwapAndBridge**: `0xF633b72A4C2Fb73b77A379bf72864A825aD35b6D` + - Transaction Hash: `Unknown` + - Block Number: `211175481` + +### MulticallHandler + +- **MulticallHandler**: `0x924a9f036260DdD5808007E1AA95f08eD08aA569` + - Transaction Hash: `Unknown` + - Block Number: `230779625` + +## Chain 57073 (Chain ID: 57073) + +### SpokePool + +- **SpokePool**: `0xeF684C38F94F48775959ECf2012D7E864ffb9dd4` + - Transaction Hash: `Unknown` + - Block Number: `1139240` + +### SpokePoolVerifier + +- **SpokePoolVerifier**: `0x3Fb9cED51E968594C87963a371Ed90c39519f65A` + - Transaction Hash: `Unknown` + - Block Number: `12980498` + +### MulticallHandler + +- **MulticallHandler**: `0x924a9f036260DdD5808007E1AA95f08eD08aA569` + - Transaction Hash: `Unknown` + - Block Number: `1145284` + +## Linea (Chain ID: 59144) + +### SpokePool + +- **SpokePool**: `0x7E63A5f1a8F0B4d0934B2f2327DAED3F6bb2ee75` + - Transaction Hash: `Unknown` + - Block Number: `2721169` + +### SpokePoolVerifier + +- **SpokePoolVerifier**: `0x3Fb9cED51E968594C87963a371Ed90c39519f65A` + - Transaction Hash: `Unknown` + - Block Number: `18705781` + +### MulticallHandler + +- **MulticallHandler**: `0x1015c58894961F4F7Dd7D68ba033e28Ed3ee1cDB` + - Transaction Hash: `Unknown` + - Block Number: `5669220` + +## Polygon Amoy (Chain ID: 80002) + +### PolygonTokenBridger + +- **PolygonTokenBridger**: `0x4e3737679081c4D3029D88cA560918094f2e0284` + - Transaction Hash: `Unknown` + - Block Number: `7529773` + +### SpokePool + +- **SpokePool**: `0xd08baaE74D6d2eAb1F3320B2E1a53eeb391ce8e5` + - Transaction Hash: `Unknown` + - Block Number: `7529960` + +### MulticallHandler + +- **MulticallHandler**: `0x924a9f036260DdD5808007E1AA95f08eD08aA569` + - Transaction Hash: `Unknown` + - Block Number: `8797771` + +## Blast (Chain ID: 81457) + +### SpokePool + +- **SpokePool**: `0x2D509190Ed0172ba588407D4c2df918F955Cc6E1` + - Transaction Hash: `Unknown` + - Block Number: `5574280` + +### SpokePoolVerifier + +- **SpokePoolVerifier**: `0x3Fb9cED51E968594C87963a371Ed90c39519f65A` + - Transaction Hash: `Unknown` + - Block Number: `18834642` + +### MulticallHandler + +- **MulticallHandler**: `0x924a9f036260DdD5808007E1AA95f08eD08aA569` + - Transaction Hash: `Unknown` + - Block Number: `5876291` + +## Base Sepolia (Chain ID: 84532) + +### SpokePool + +- **SpokePool**: `0x82B564983aE7274c86695917BBf8C99ECb6F0F8F` + - Transaction Hash: `Unknown` + - Block Number: `6082004` + +### MulticallHandler + +- **MulticallHandler**: `0x924a9f036260DdD5808007E1AA95f08eD08aA569` + - Transaction Hash: `Unknown` + - Block Number: `12429513` + +## Chain 129399 (Chain ID: 129399) + +### SpokePool + +- **SpokePool**: `0x09aea4b2242abC8bb4BB78D537A67a245A7bEC64` + - Transaction Hash: `Unknown` + - Block Number: `2929205` + +### SpokePoolVerifier + +- **SpokePoolVerifier**: `0x630b76C7cA96164a5aCbC1105f8BA8B739C82570` + - Transaction Hash: `Unknown` + - Block Number: `3160019` + +### MulticallHandler + +- **MulticallHandler**: `0xAC537C12fE8f544D712d71ED4376a502EEa944d7` + - Transaction Hash: `Unknown` + - Block Number: `3179705` + +## Arbitrum Sepolia (Chain ID: 421614) + +### SpokePool + +- **SpokePool**: `0x7E63A5f1a8F0B4d0934B2f2327DAED3F6bb2ee75` + - Transaction Hash: `Unknown` + - Block Number: `12411026` + +### MulticallHandler + +- **MulticallHandler**: `0x924a9f036260DdD5808007E1AA95f08eD08aA569` + - Transaction Hash: `Unknown` + - Block Number: `58993382` + +## Scroll (Chain ID: 534352) + +### SpokePool + +- **SpokePool**: `0x3baD7AD0728f9917d1Bf08af5782dCbD516cDd96` + - Transaction Hash: `Unknown` + - Block Number: `7489705` + +### SpokePoolVerifier + +- **SpokePoolVerifier**: `0x3Fb9cED51E968594C87963a371Ed90c39519f65A` + - Transaction Hash: `Unknown` + - Block Number: `15223712` + +### MulticallHandler + +- **MulticallHandler**: `0x924a9f036260DdD5808007E1AA95f08eD08aA569` + - Transaction Hash: `Unknown` + - Block Number: `7489978` + +## Chain 7777777 (Chain ID: 7777777) + +### SpokePool + +- **SpokePool**: `0x13fDac9F9b4777705db45291bbFF3c972c6d1d97` + - Transaction Hash: `Unknown` + - Block Number: `18382867` + +### SpokePoolVerifier + +- **SpokePoolVerifier**: `0x3Fb9cED51E968594C87963a371Ed90c39519f65A` + - Transaction Hash: `Unknown` + - Block Number: `29892606` + +### MulticallHandler + +- **MulticallHandler**: `0x924a9f036260DdD5808007E1AA95f08eD08aA569` + - Transaction Hash: `Unknown` + - Block Number: `18119854` + +## Sepolia (Chain ID: 11155111) + +### DeployEthereumSpokePool.s.sol + +- **Ethereum_SpokePool**: `0xf4883c2dc7fc45eba7baf91d2928055d4b14d21b` + + - Transaction Hash: `0x5cba50737d86ef9d146202c17a620479800501b226c057bac505128af8c4eccb` + - Block Number: `8605919` + +- **ERC1967Proxy**: `0x71f23002439dc6c2dc24f15d573922f8afd9455a` + - Transaction Hash: `0x6cc66c10ff866a20d01e200304847f51b5a17311bd1d95c54efa51a0140179aa` + - Block Number: `8605919` + +### DeployHubPool.s.sol + +- **LpTokenFactory**: `0x01f4b025f4a12873bbed3e531dd5aae6b0b6445a` + + - Transaction Hash: `0x68e3f7e15e4a2756c8c8573e6fc06f394a9956fd3d776fc42ffbea4835c01b04` + - Block Number: `8577380` + +- **HubPool**: `0xfcf9bef0f97a3a94ad7e5f9e6c97a475da802016` + - Transaction Hash: `0x6d1dd8b36b5470c5513b0e3f373aaaa49ac232bf52c46411a223d0aec2a18aef` + - Block Number: `8577380` + +### MulticallHandler + +- **MulticallHandler**: `0x924a9f036260DdD5808007E1AA95f08eD08aA569` + - Transaction Hash: `Unknown` + - Block Number: `6284508` + +### AcrossConfigStore + +- **AcrossConfigStore**: `0xB3De1e212B49e68f4a68b5993f31f63946FCA2a6` + - Transaction Hash: `Unknown` + - Block Number: `4968255` + +### LPTokenFactory + +- **LPTokenFactory**: `0xFB87Ac52Bac7ccF497b6053610A9c59B87a0cE7D` + - Transaction Hash: `Unknown` + - Block Number: `4911834` + +### HubPool + +- **HubPool**: `0x14224e63716aface30c9a417e0542281869f7d9e` + - Transaction Hash: `Unknown` + - Block Number: `4911835` + +### SpokePool + +- **SpokePool**: `0x5ef6C01E11889d86803e0B23e3cB3F9E9d97B662` + - Transaction Hash: `Unknown` + - Block Number: `5288470` + +### PolygonTokenBridger + +- **PolygonTokenBridger**: `0x4e3737679081c4D3029D88cA560918094f2e0284` + - Transaction Hash: `Unknown` + - Block Number: `5984560` + +### Polygon_Adapter + +- **Polygon_Adapter**: `0x540029039E493b1B843653f93C3064A956931747` + - Transaction Hash: `Unknown` + - Block Number: `5984591` + +### Lisk_Adapter + +- **Lisk_Adapter**: `0x13a8B1D6443016424e2b8Bac40dD884Ee679AFc4` + - Transaction Hash: `Unknown` + - Block Number: `6226289` + +### Lens_Adapter + +- **Lens_Adapter**: `0x8fac6F764ae0b4F632FE2E6c938ED5637E629ff2` + - Transaction Hash: `Unknown` + - Block Number: `7448085` + +### Blast_Adapter + +- **Blast_Adapter**: `0x09500Ffd743e01B4146a4BA795231Ca7Ca37819f` + - Transaction Hash: `Unknown` + - Block Number: `6233857` + +### DoctorWho_Adapter + +- **DoctorWho_Adapter**: `0x2b482aFb675e1F231521d5E56770ce4aac592246` + - Transaction Hash: `Unknown` + - Block Number: `7698546` + +### Solana_Adapter + +- **Solana_Adapter**: `0x9b2c2f3fD98cF8468715Be31155cc053C56f822A` + - Transaction Hash: `Unknown` + - Block Number: `8409722` + +## Optimism Sepolia (Chain ID: 11155420) + +### SpokePool + +- **SpokePool**: `0x4e8E101924eDE233C13e2D8622DC8aED2872d505` + - Transaction Hash: `Unknown` + - Block Number: `7762656` + +### MulticallHandler + +- **MulticallHandler**: `0x924a9f036260DdD5808007E1AA95f08eD08aA569` + - Transaction Hash: `Unknown` + - Block Number: `14411096` + +## Blast Sepolia (Chain ID: 168587773) + +### SpokePool + +- **SpokePool**: `0x5545092553Cf5Bf786e87a87192E902D50D8f022` + - Transaction Hash: `Unknown` + - Block Number: `7634204` + +### MulticallHandler + +- **MulticallHandler**: `0x924a9f036260DdD5808007E1AA95f08eD08aA569` + - Transaction Hash: `Unknown` + - Block Number: `7973417` + +## Chain 34268394551451 (Chain ID: 34268394551451) + +### SvmSpoke + +- **SvmSpoke**: `JAZWcGrpSWNPTBj8QtJ9UyQqhJCDhG9GJkDeMf5NQBiq` + - Transaction Hash: `Unknown` + - Block Number: `317101505` + +### MulticallHandler + +- **MulticallHandler**: `Fk1RpqsfeWt8KnFCTW9NQVdVxYvxuqjGn6iPB9wrmM8h` + - Transaction Hash: `Unknown` + - Block Number: `317112562` + +### MessageTransmitter + +- **MessageTransmitter**: `CCTPmbSD7gX1bxKPAmg77w8oFzNFpaQiQUWD43TKaecd` + - Transaction Hash: `Unknown` + - Block Number: `312515728` + +### TokenMessengerMinter + +- **TokenMessengerMinter**: `CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3` + - Transaction Hash: `Unknown` + - Block Number: `262177984` + +## Chain 133268194659241 (Chain ID: 133268194659241) + +### SvmSpoke + +- **SvmSpoke**: `JAZWcGrpSWNPTBj8QtJ9UyQqhJCDhG9GJkDeMf5NQBiq` + - Transaction Hash: `Unknown` + - Block Number: `356313770` + +### MulticallHandler + +- **MulticallHandler**: `Fk1RpqsfeWt8KnFCTW9NQVdVxYvxuqjGn6iPB9wrmM8h` + - Transaction Hash: `Unknown` + - Block Number: `356321050` + +### MessageTransmitter + +- **MessageTransmitter**: `CCTPmbSD7gX1bxKPAmg77w8oFzNFpaQiQUWD43TKaecd` + - Transaction Hash: `Unknown` + - Block Number: `339604856` + +### TokenMessengerMinter + +- **TokenMessengerMinter**: `CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3` + - Transaction Hash: `Unknown` + - Block Number: `277864039` diff --git a/foundry.toml b/foundry.toml index 3b417d773..afb0630ad 100644 --- a/foundry.toml +++ b/foundry.toml @@ -1,6 +1,10 @@ [profile.default] +ffi = true +ast = true +build_info = true +extra_output = ["storageLayout"] src = "contracts" -out = "artifacts" +out = "out" test = "test/evm/foundry" libs = ["node_modules", "lib"] remappings = [ @@ -26,6 +30,7 @@ via_ir = true optimizer_runs = 800 solc_version = "0.8.23" revert_strings = "strip" +fs_permissions = [{ access = "read", path = "./"}] solc = "0.8.23" evm_version = "shanghai" diff --git a/lib/forge-std b/lib/forge-std index 52715a217..77041d2ce 160000 --- a/lib/forge-std +++ b/lib/forge-std @@ -1 +1 @@ -Subproject commit 52715a217dc51d0de15877878ab8213f6cbbbab5 +Subproject commit 77041d2ce690e692d6e03cc812b57d1ddaa4d505 diff --git a/package.json b/package.json index db6897370..6c08b87f9 100644 --- a/package.json +++ b/package.json @@ -24,8 +24,8 @@ "lint-js": "yarn prettier --list-different **/*.js **/*.ts", "lint-rust": "cargo +nightly fmt --all -- --check && cargo clippy", "lint-fix": "yarn prettier --write **/*.js **/*.ts ./programs/**/*.rs ./contracts**/*.sol && cargo +nightly fmt --all && cargo clippy", - "clean-fast": "for dir in node_modules cache cache-zk artifacts artifacts-zk dist typechain; do mv \"${dir}\" \"_${dir}\"; rm -rf \"_${dir}\" &; done", - "clean": "rm -rf node_modules cache cache-zk artifacts artifacts-zk dist typechain", + "clean-fast": "for dir in node_modules cache cache-zk artifacts artifacts-zk dist typechain out; do mv \"${dir}\" \"_${dir}\"; rm -rf \"_${dir}\" &; done", + "clean": "rm -rf node_modules cache cache-zk artifacts artifacts-zk dist typechain out", "generate-svm-artifacts": "bash ./scripts/svm/buildHelpers/buildIdl.sh && sh ./scripts/svm/buildHelpers/generateSvmAssets.sh && yarn generate-svm-clients", "generate-svm-clients": "yarn ts-node ./scripts/svm/buildHelpers/generateSvmClients.ts && yarn ts-node ./scripts/svm/buildHelpers/renameClientsImports.ts", "build-evm": "hardhat compile", @@ -43,7 +43,8 @@ "test:report-gas": "IS_TEST=true REPORT_GAS=true hardhat test", "generate-evm-artifacts": "rm -rf typechain && TYPECHAIN=ethers yarn hardhat typechain", "process-hardhat-export": "hardhat export --export-all ./cache/massExport.json && ts-node ./scripts/processHardhatExport.ts && prettier --write ./deployments/deployments.json", - "pre-commit-hook": "sh scripts/preCommitHook.sh" + "pre-commit-hook": "sh scripts/preCommitHook.sh", + "extract-addresses": "./script/extract_foundry_addresses.sh" }, "dependencies": { "@across-protocol/constants": "^3.1.66", @@ -55,6 +56,7 @@ "@ethersproject/bignumber": "5.7.0", "@openzeppelin/contracts": "4.9.6", "@openzeppelin/contracts-upgradeable": "4.9.6", + "@openzeppelin/foundry-upgrades": "^0.4.0", "@scroll-tech/contracts": "^0.1.0", "@solana-developers/helpers": "^2.4.0", "@solana-program/address-lookup-table": "^0.7.0", @@ -143,5 +145,6 @@ "resolutions": { "**/eccrypto/secp256k1": "3.8.1", "**/eth-crypto/secp256k1": "5.0.1" - } + }, + "packageManager": "yarn@1.22.22" } diff --git a/script/Constants.sol b/script/Constants.sol new file mode 100644 index 000000000..cf249c421 --- /dev/null +++ b/script/Constants.sol @@ -0,0 +1,538 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import { FinderInterface } from "@uma/core/contracts/data-verification-mechanism/interfaces/FinderInterface.sol"; +import { WETH9Interface } from "../contracts/external/interfaces/WETH9Interface.sol"; + +import { Script } from "forge-std/Script.sol"; +import { console } from "forge-std/console.sol"; + +/** + * @title Constants + * @notice Contains constants used in deployment scripts, loaded from constants.json + * @dev This contract uses Foundry's parseJson functions to load constants from constants.json + */ +contract Constants is Script { + // Chain IDs - loaded from JSON + function MAINNET() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.MAINNET"); + } + + function SEPOLIA() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.SEPOLIA"); + } + + function ARBITRUM() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.ARBITRUM"); + } + + function ARBITRUM_SEPOLIA() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.ARBITRUM_SEPOLIA"); + } + + function BSC() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.BSC"); + } + + function POLYGON() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.POLYGON"); + } + + function POLYGON_AMOY() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.POLYGON_AMOY"); + } + + function ZK_SYNC() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.ZK_SYNC"); + } + + function OPTIMISM() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.OPTIMISM"); + } + + function OPTIMISM_SEPOLIA() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.OPTIMISM_SEPOLIA"); + } + + function BASE() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.BASE"); + } + + function BASE_SEPOLIA() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.BASE_SEPOLIA"); + } + + function LENS() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.LENS"); + } + + function LENS_TESTNET() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.LENS_TESTNET"); + } + + function LINEA() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.LINEA"); + } + + function LINEA_SEPOLIA() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.LINEA_SEPOLIA"); + } + + function SCROLL() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.SCROLL"); + } + + function SCROLL_SEPOLIA() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.SCROLL_SEPOLIA"); + } + + function UNICHAIN() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.UNICHAIN"); + } + + function UNICHAIN_SEPOLIA() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.UNICHAIN_SEPOLIA"); + } + + function ALEPH_ZERO() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.ALEPH_ZERO"); + } + + function BLAST() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.BLAST"); + } + + function BLAST_SEPOLIA() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.BLAST_SEPOLIA"); + } + + function BOBA() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.BOBA"); + } + + function INK() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.INK"); + } + + function INK_SEPOLIA() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.INK_SEPOLIA"); + } + + function LISK() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.LISK"); + } + + function LISK_SEPOLIA() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.LISK_SEPOLIA"); + } + + function MODE() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.MODE"); + } + + function MODE_SEPOLIA() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.MODE_SEPOLIA"); + } + + function REDSTONE() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.REDSTONE"); + } + + function SONEIUM() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.SONEIUM"); + } + + function WORLD_CHAIN() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.WORLD_CHAIN"); + } + + function ZORA() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".chainIds.ZORA"); + } + + // Token addresses - loaded from JSON + function WRAPPED_NATIVE_TOKEN_MAINNET() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.MAINNET")); + } + + function WRAPPED_NATIVE_TOKEN_SEPOLIA() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.SEPOLIA")); + } + + function WRAPPED_NATIVE_TOKEN_ARBITRUM() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.ARBITRUM")); + } + + function WRAPPED_NATIVE_TOKEN_ARBITRUM_SEPOLIA() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.ARBITRUM_SEPOLIA")); + } + + function WRAPPED_NATIVE_TOKEN_BSC() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.BSC")); + } + + function WRAPPED_NATIVE_TOKEN_POLYGON() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.POLYGON")); + } + + function WRAPPED_NATIVE_TOKEN_POLYGON_AMOY() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.POLYGON_AMOY")); + } + + function WRAPPED_NATIVE_TOKEN_ZK_SYNC() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.ZK_SYNC")); + } + + function WRAPPED_NATIVE_TOKEN_OPTIMISM() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.OPTIMISM")); + } + + function WRAPPED_NATIVE_TOKEN_OPTIMISM_SEPOLIA() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.OPTIMISM_SEPOLIA")); + } + + function WRAPPED_NATIVE_TOKEN_BASE() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.BASE")); + } + + function WRAPPED_NATIVE_TOKEN_BASE_SEPOLIA() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.BASE_SEPOLIA")); + } + + function WRAPPED_NATIVE_TOKEN_LENS() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.LENS")); + } + + function WRAPPED_NATIVE_TOKEN_LENS_TESTNET() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.LENS_TESTNET")); + } + + function WRAPPED_NATIVE_TOKEN_LINEA() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.LINEA")); + } + + function WRAPPED_NATIVE_TOKEN_LINEA_SEPOLIA() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.LINEA_SEPOLIA")); + } + + function WRAPPED_NATIVE_TOKEN_SCROLL_SEPOLIA() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.SCROLL_SEPOLIA")); + } + + function WRAPPED_NATIVE_TOKEN_SCROLL() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.SCROLL")); + } + + function WRAPPED_NATIVE_TOKEN_UNICHAIN() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.UNICHAIN")); + } + + function WRAPPED_NATIVE_TOKEN_UNICHAIN_SEPOLIA() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.UNICHAIN_SEPOLIA")); + } + + function WRAPPED_NATIVE_TOKEN_ALEPH_ZERO() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.ALEPH_ZERO")); + } + + function WRAPPED_NATIVE_TOKEN_BLAST() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.BLAST")); + } + + function WRAPPED_NATIVE_TOKEN_BLAST_SEPOLIA() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.BLAST_SEPOLIA")); + } + + function WRAPPED_NATIVE_TOKEN_BOBA() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.BOBA")); + } + + function WRAPPED_NATIVE_TOKEN_INK() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.INK")); + } + + function WRAPPED_NATIVE_TOKEN_LISK() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.LISK")); + } + + function WRAPPED_NATIVE_TOKEN_LISK_SEPOLIA() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.LISK_SEPOLIA")); + } + + function WRAPPED_NATIVE_TOKEN_MODE() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.MODE")); + } + + function WRAPPED_NATIVE_TOKEN_MODE_SEPOLIA() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.MODE_SEPOLIA")); + } + + function WRAPPED_NATIVE_TOKEN_REDSTONE() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.REDSTONE")); + } + + function WRAPPED_NATIVE_TOKEN_SONEIUM() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.SONEIUM")); + } + + function WRAPPED_NATIVE_TOKEN_WORLD_CHAIN() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.WORLD_CHAIN")); + } + + function WRAPPED_NATIVE_TOKEN_ZORA() public view returns (WETH9Interface) { + return WETH9Interface(vm.parseJsonAddress("constants.json", ".wrappedNativeTokens.ZORA")); + } + + // Other constants - loaded from JSON + function ZERO_ADDRESS() public view returns (address) { + return vm.parseJsonAddress("constants.json", ".otherConstants.ZERO_ADDRESS"); + } + + function QUOTE_TIME_BUFFER() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".timeConstants.QUOTE_TIME_BUFFER"); + } + + function FILL_DEADLINE_BUFFER() public view returns (uint256) { + return vm.parseJsonUint("constants.json", ".timeConstants.FILL_DEADLINE_BUFFER"); + } + + // L1 Address Map + struct L1Addresses { + address finder; + address l1ArbitrumInbox; + address l1ERC20GatewayRouter; + address polygonRootChainManager; + address polygonFxRoot; + address polygonERC20Predicate; + address polygonRegistry; + address polygonDepositManager; + address cctpTokenMessenger; + address cctpV2TokenMessenger; + address cctpMessageTransmitter; + address lineaMessageService; + address lineaTokenBridge; + address scrollERC20GatewayRouter; + address scrollMessengerRelay; + address scrollGasPriceOracle; + address blastYieldManager; + address blastDaiRetriever; + address l1AlephZeroInbox; + address l1AlephZeroERC20GatewayRouter; + address donationBox; + address hubPoolStore; + address zkBridgeHub; + address zkUsdcSharedBridge_232; + address zkUsdcSharedBridge_324; + } + + // L2 Address Map + struct L2Addresses { + address l2GatewayRouter; + address fxChild; + address cctpTokenMessenger; + address cctpMessageTransmitter; + address uniswapV3SwapRouter; + address helios; + address zkErc20Bridge; + address zkUSDCBridge; + address lineaMessageService; + address cctpV2TokenMessenger; + address lineaTokenBridge; + address scrollERC20GatewayRouter; + address scrollGasPriceOracle; + address scrollMessenger; + address l2Weth; + address polygonZkEvmBridge; + } + + // OP Stack Address Map + struct OpStackAddresses { + address L1CrossDomainMessenger; + address L1StandardBridge; + address L1BlastBridge; + address L1OpUSDCBridgeAdapter; + } + + // Helper functions to get addresses for a specific chain + function getL1Addresses(uint256 chainId) public view returns (L1Addresses memory) { + string memory chainName = _getChainName(chainId); + if (chainId == MAINNET() || chainId == SEPOLIA()) { + return + L1Addresses({ + finder: vm.parseJsonAddress("constants.json", string.concat(".l1Addresses.", chainName, ".finder")), + l1ArbitrumInbox: vm.parseJsonAddress( + "constants.json", + string.concat(".l1Addresses.", chainName, ".l1ArbitrumInbox") + ), + l1ERC20GatewayRouter: vm.parseJsonAddress( + "constants.json", + string.concat(".l1Addresses.", chainName, ".l1ERC20GatewayRouter") + ), + polygonRootChainManager: vm.parseJsonAddress( + "constants.json", + string.concat(".l1Addresses.", chainName, ".polygonRootChainManager") + ), + polygonFxRoot: vm.parseJsonAddress( + "constants.json", + string.concat(".l1Addresses.", chainName, ".polygonFxRoot") + ), + polygonERC20Predicate: vm.parseJsonAddress( + "constants.json", + string.concat(".l1Addresses.", chainName, ".polygonERC20Predicate") + ), + polygonRegistry: vm.parseJsonAddress( + "constants.json", + string.concat(".l1Addresses.", chainName, ".polygonRegistry") + ), + polygonDepositManager: vm.parseJsonAddress( + "constants.json", + string.concat(".l1Addresses.", chainName, ".polygonDepositManager") + ), + cctpTokenMessenger: vm.parseJsonAddress( + "constants.json", + string.concat(".l1Addresses.", chainName, ".cctpTokenMessenger") + ), + cctpV2TokenMessenger: vm.parseJsonAddress( + "constants.json", + string.concat(".l1Addresses.", chainName, ".cctpV2TokenMessenger") + ), + cctpMessageTransmitter: vm.parseJsonAddress( + "constants.json", + string.concat(".l1Addresses.", chainName, ".cctpMessageTransmitter") + ), + lineaMessageService: vm.parseJsonAddress( + "constants.json", + string.concat(".l1Addresses.", chainName, ".lineaMessageService") + ), + lineaTokenBridge: vm.parseJsonAddress( + "constants.json", + string.concat(".l1Addresses.", chainName, ".lineaTokenBridge") + ), + scrollERC20GatewayRouter: vm.parseJsonAddress( + "constants.json", + string.concat(".l1Addresses.", chainName, ".scrollERC20GatewayRouter") + ), + scrollMessengerRelay: vm.parseJsonAddress( + "constants.json", + string.concat(".l1Addresses.", chainName, ".scrollMessengerRelay") + ), + scrollGasPriceOracle: vm.parseJsonAddress( + "constants.json", + string.concat(".l1Addresses.", chainName, ".scrollGasPriceOracle") + ), + blastYieldManager: vm.parseJsonAddress( + "constants.json", + string.concat(".l1Addresses.", chainName, ".blastYieldManager") + ), + blastDaiRetriever: vm.parseJsonAddress( + "constants.json", + string.concat(".l1Addresses.", chainName, ".blastDaiRetriever") + ), + l1AlephZeroInbox: vm.parseJsonAddress( + "constants.json", + string.concat(".l1Addresses.", chainName, ".l1AlephZeroInbox") + ), + l1AlephZeroERC20GatewayRouter: vm.parseJsonAddress( + "constants.json", + string.concat(".l1Addresses.", chainName, ".l1AlephZeroERC20GatewayRouter") + ), + donationBox: vm.parseJsonAddress( + "constants.json", + string.concat(".l1Addresses.", chainName, ".donationBox") + ), + hubPoolStore: vm.parseJsonAddress( + "constants.json", + string.concat(".l1Addresses.", chainName, ".hubPoolStore") + ), + zkBridgeHub: vm.parseJsonAddress( + "constants.json", + string.concat(".l1Addresses.", chainName, ".zkBridgeHub") + ), + zkUsdcSharedBridge_232: vm.parseJsonAddress( + "constants.json", + string.concat(".l1Addresses.", chainName, ".zkUsdcSharedBridge_232") + ), + zkUsdcSharedBridge_324: vm.parseJsonAddress( + "constants.json", + string.concat(".l1Addresses.", chainName, ".zkUsdcSharedBridge_324") + ) + }); + } + revert("Unsupported chain ID"); + } + + function getOpStackAddresses(uint256 hubChainId, uint256 spokeChainId) + public + view + returns (OpStackAddresses memory) + { + string memory hubChainName = _getChainName(hubChainId); + string memory spokeChainName = _getChainName(spokeChainId); + + string memory path = string.concat(".opStackAddresses.", hubChainName, ".", spokeChainName); + + return + OpStackAddresses({ + L1CrossDomainMessenger: vm.parseJsonAddress( + "constants.json", + string.concat(path, ".L1CrossDomainMessenger") + ), + L1StandardBridge: vm.parseJsonAddress("constants.json", string.concat(path, ".L1StandardBridge")), + L1BlastBridge: vm.parseJsonAddress("constants.json", string.concat(path, ".L1BlastBridge")), + L1OpUSDCBridgeAdapter: vm.parseJsonAddress( + "constants.json", + string.concat(path, ".L1OpUSDCBridgeAdapter") + ) + }); + } + + // Circle domain IDs mapping + function getCircleDomainId(uint256 chainId) public view returns (uint32) { + string memory chainName = _getChainName(chainId); + return uint32(vm.parseJsonUint("constants.json", string.concat(".circleDomainIds.", chainName))); + } + + // Get WETH address for any supported chain + function getWrappedNativeToken(uint256 chainId) public view returns (WETH9Interface) { + string memory chainName = _getChainName(chainId); + return WETH9Interface(vm.parseJsonAddress("constants.json", string.concat(".wrappedNativeTokens.", chainName))); + } + + // Helper function to convert chain ID to chain name + function _getChainName(uint256 chainId) internal view returns (string memory) { + if (chainId == MAINNET()) return "MAINNET"; + if (chainId == SEPOLIA()) return "SEPOLIA"; + if (chainId == ARBITRUM()) return "ARBITRUM"; + if (chainId == ARBITRUM_SEPOLIA()) return "ARBITRUM_SEPOLIA"; + if (chainId == BSC()) return "BSC"; + if (chainId == POLYGON()) return "POLYGON"; + if (chainId == POLYGON_AMOY()) return "POLYGON_AMOY"; + if (chainId == ZK_SYNC()) return "ZK_SYNC"; + if (chainId == OPTIMISM()) return "OPTIMISM"; + if (chainId == OPTIMISM_SEPOLIA()) return "OPTIMISM_SEPOLIA"; + if (chainId == BASE()) return "BASE"; + if (chainId == BASE_SEPOLIA()) return "BASE_SEPOLIA"; + if (chainId == LENS()) return "LENS"; + if (chainId == LENS_TESTNET()) return "LENS_TESTNET"; + if (chainId == LINEA()) return "LINEA"; + if (chainId == LINEA_SEPOLIA()) return "LINEA_SEPOLIA"; + if (chainId == SCROLL_SEPOLIA()) return "SCROLL_SEPOLIA"; + if (chainId == SCROLL()) return "SCROLL"; + if (chainId == UNICHAIN()) return "UNICHAIN"; + if (chainId == UNICHAIN_SEPOLIA()) return "UNICHAIN_SEPOLIA"; + if (chainId == ALEPH_ZERO()) return "ALEPH_ZERO"; + if (chainId == BLAST()) return "BLAST"; + if (chainId == BLAST_SEPOLIA()) return "BLAST_SEPOLIA"; + if (chainId == BOBA()) return "BOBA"; + if (chainId == INK()) return "INK"; + if (chainId == LISK()) return "LISK"; + if (chainId == LISK_SEPOLIA()) return "LISK_SEPOLIA"; + if (chainId == MODE()) return "MODE"; + if (chainId == MODE_SEPOLIA()) return "MODE_SEPOLIA"; + if (chainId == REDSTONE()) return "REDSTONE"; + if (chainId == SONEIUM()) return "SONEIUM"; + if (chainId == WORLD_CHAIN()) return "WORLD_CHAIN"; + if (chainId == ZORA()) return "ZORA"; + revert("Unsupported chain ID"); + } +} diff --git a/script/DeployEthereumSpokePool.s.sol b/script/DeployEthereumSpokePool.s.sol new file mode 100644 index 000000000..894289807 --- /dev/null +++ b/script/DeployEthereumSpokePool.s.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import { Script } from "forge-std/Script.sol"; +import { Test } from "forge-std/Test.sol"; +import { console } from "forge-std/console.sol"; +import { Ethereum_SpokePool } from "../contracts/Ethereum_SpokePool.sol"; +import { WETH9Interface } from "../contracts/external/interfaces/WETH9Interface.sol"; +import { DeploymentUtils } from "./DeploymentUtils.sol"; +import { Constants } from "./Constants.sol"; + +// How to run: +// 1. `source .env` where `.env` has MNEMONIC="x x x ... x" and HUBPOOL_ADDRESS="0x..." entries +// 2. forge script script/002_DeployEthereumSpokePool.s.sol:DeployEthereumSpokePool --rpc-url $NODE_URL_1 -vvvv +// 3. Verify the above works in simulation mode. +// 4. Deploy with: forge script script/002_DeployEthereumSpokePool.s.sol:DeployEthereumSpokePool --rpc-url $NODE_URL_1 --broadcast --verify + +contract DeployEthereumSpokePool is Script, Test, Constants, DeploymentUtils { + function run() external { + string memory deployerMnemonic = vm.envString("MNEMONIC"); + uint256 deployerPrivateKey = vm.deriveKey(deployerMnemonic, 0); + + // Get deployment information + DeploymentInfo memory info = getSpokePoolDeploymentInfo(address(0)); // Will use HUBPOOL_ADDRESS from env + + console.log("HubPool address:", info.hubPool); + + // Get the appropriate addresses for this chain + WETH9Interface weth = getWrappedNativeToken(info.spokeChainId); + + vm.startBroadcast(deployerPrivateKey); + + // Prepare constructor arguments for Ethereum_SpokePool + bytes memory constructorArgs = abi.encode( + address(weth), // _weth + QUOTE_TIME_BUFFER(), // _quoteTimeBuffer + FILL_DEADLINE_BUFFER() // _fillDeadlineBuffer + ); + + // Initialize deposit counter to very high number of deposits to avoid duplicate deposit ID's + // with deprecated spoke pool. + bytes memory initArgs = abi.encodeWithSelector( + Ethereum_SpokePool.initialize.selector, + 1_000_000, // _initialDepositId + info.hubPool // _withdrawalRecipient (will be set to deployer) + ); + + // Deploy the proxy + DeploymentResult memory result = deployNewProxy( + "Ethereum_SpokePool", + constructorArgs, + initArgs, + false // implementationOnly + ); + + // Log the deployed addresses + console.log("Chain ID:", info.spokeChainId); + console.log("Hub Chain ID:", info.hubChainId); + console.log("HubPool address:", info.hubPool); + console.log("WETH address:", address(weth)); + console.log("Ethereum_SpokePool proxy deployed to:", result.proxy); + console.log("Ethereum_SpokePool implementation deployed to:", result.implementation); + + // Transfer ownership to hub pool if this is a new proxy + if (result.isNewProxy) { + // TODO: Implement ownership transfer if needed + console.log("Note: Ownership transfer to hub pool may be required"); + } + + vm.stopBroadcast(); + } +} diff --git a/script/DeployHubPool.s.sol b/script/DeployHubPool.s.sol new file mode 100644 index 000000000..16a2366fe --- /dev/null +++ b/script/DeployHubPool.s.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import { Script } from "forge-std/Script.sol"; +import { Test } from "forge-std/Test.sol"; +import { console } from "forge-std/console.sol"; +import { HubPool } from "../contracts/HubPool.sol"; +import { LpTokenFactory } from "../contracts/LpTokenFactory.sol"; +import { FinderInterface } from "@uma/core/contracts/data-verification-mechanism/interfaces/FinderInterface.sol"; +import { WETH9Interface } from "../contracts/external/interfaces/WETH9Interface.sol"; +import { Constants } from "./Constants.sol"; + +// How to run: +// 1. `source .env` where `.env` has MNEMONIC="x x x ... x" and ETHERSCAN_API_KEY="x" entries +// 2. forge script script/DeployHubPool.s.sol:DeployHubPool --rpc-url $NODE_URL_1 -vvvv +// 3. Verify the above works in simulation mode. +// 4. Deploy on mainnet by adding --broadcast --verify flags. +// 5. forge script script/DeployHubPool.s.sol:DeployHubPool --rpc-url $NODE_URL_1 --broadcast --verify -vvvv + +contract DeployHubPool is Script, Test, Constants { + function run() external { + string memory deployerMnemonic = vm.envString("MNEMONIC"); + uint256 deployerPrivateKey = vm.deriveKey(deployerMnemonic, 0); + + // Get the current chain ID + uint256 chainId = block.chainid; + + // Get the appropriate addresses for this chain + WETH9Interface weth = getWrappedNativeToken(chainId); + FinderInterface finder = FinderInterface(getL1Addresses(chainId).finder); + + vm.startBroadcast(deployerPrivateKey); + + // Deploy LpTokenFactory first + LpTokenFactory lpTokenFactory = new LpTokenFactory(); + + // Deploy HubPool with the LpTokenFactory address + HubPool hubPool = new HubPool(lpTokenFactory, finder, weth, ZERO_ADDRESS()); + + // Log the deployed addresses + console.log("Chain ID:", chainId); + console.log("LpTokenFactory deployed to:", address(lpTokenFactory)); + console.log("HubPool deployed to:", address(hubPool)); + console.log("WETH address:", address(weth)); + console.log("Finder address:", address(finder)); + + vm.stopBroadcast(); + } +} diff --git a/script/DeployedAddresses.sol b/script/DeployedAddresses.sol new file mode 100644 index 000000000..634771634 --- /dev/null +++ b/script/DeployedAddresses.sol @@ -0,0 +1,155 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "forge-std/StdJson.sol"; +import "forge-std/Test.sol"; + +/** + * @title DeployedAddresses + * @notice This contract contains all deployed contract addresses from Foundry broadcast files + * @dev Generated on: 2025-06-24T15:04:31.369Z + * @dev This file is auto-generated. Do not edit manually. + * @dev Uses Foundry's parseJson functionality for scripts/tests only (not for on-chain use) + */ +contract DeployedAddresses is Test { + using stdJson for string; + + // Path to the JSON file containing deployed addresses + string private constant JSON_PATH = "./broadcast/deployed-addresses.json"; + + /** + * @notice Get contract address by chain ID and contract name + * @param chainId The chain ID + * @param contractName The contract name + * @return The contract address + */ + function getAddress(uint256 chainId, string memory contractName) public view returns (address) { + string memory jsonData = vm.readFile(JSON_PATH); + string memory path = string.concat( + '.chains["', + vm.toString(chainId), + '"].contracts["', + contractName, + '"].address' + ); + + if (!vm.keyExists(jsonData, path)) { + return address(0); + } + + return jsonData.readAddress(path); + } + + /** + * @notice Check if a contract exists for the given chain ID and name + * @param chainId The chain ID + * @param contractName The contract name + * @return True if the contract exists, false otherwise + */ + function hasAddress(uint256 chainId, string memory contractName) public view returns (bool) { + return getAddress(chainId, contractName) != address(0); + } + + /** + * @notice Get transaction hash for a contract + * @param chainId The chain ID + * @param contractName The contract name + * @return The transaction hash + */ + function getTransactionHash(uint256 chainId, string memory contractName) public view returns (string memory) { + string memory jsonData = vm.readFile(JSON_PATH); + string memory path = string.concat( + '.chains["', + vm.toString(chainId), + '"].contracts["', + contractName, + '"].transaction_hash' + ); + return jsonData.readString(path); + } + + /** + * @notice Get block number for a contract deployment + * @param chainId The chain ID + * @param contractName The contract name + * @return The block number + */ + function getBlockNumber(uint256 chainId, string memory contractName) public view returns (uint256) { + string memory jsonData = vm.readFile(JSON_PATH); + string memory path = string.concat( + '.chains["', + vm.toString(chainId), + '"].contracts["', + contractName, + '"].block_number' + ); + return jsonData.readUint(path); + } + + /** + * @notice Get chain name for a given chain ID + * @param chainId The chain ID + * @return The chain name + */ + function getChainName(uint256 chainId) public view returns (string memory) { + string memory jsonData = vm.readFile(JSON_PATH); + string memory path = string.concat('.chains["', vm.toString(chainId), '"].chain_name'); + return jsonData.readString(path); + } + + /** + * @notice Get all contract names for a given chain ID + * @param chainId The chain ID + * @return Array of contract names + */ + function getContractNames(uint256 chainId) public view returns (string[] memory) { + string memory jsonData = vm.readFile(JSON_PATH); + string memory path = string.concat('.chains["', vm.toString(chainId), '"].contracts'); + return vm.parseJsonKeys(jsonData, path); + } + + /** + * @notice Get all chain IDs + * @return Array of chain IDs + */ + function getChainIds() public view returns (uint256[] memory) { + string memory jsonData = vm.readFile(JSON_PATH); + string[] memory chainIdStrings = vm.parseJsonKeys(jsonData, ".chains"); + uint256[] memory chainIds = new uint256[](chainIdStrings.length); + for (uint256 i = 0; i < chainIdStrings.length; i++) { + chainIds[i] = vm.parseUint(chainIdStrings[i]); + } + return chainIds; + } + + /** + * @notice Get the generation timestamp of the JSON file + * @return The generation timestamp + */ + function getGeneratedAt() public view returns (string memory) { + string memory jsonData = vm.readFile(JSON_PATH); + return jsonData.readString(".generated_at"); + } + + /** + * @notice Get contract info for a specific contract + * @param chainId The chain ID + * @param contractName The contract name + * @return addr The contract address + * @return txHash The transaction hash + * @return blockNum The block number + */ + function getContractInfo(uint256 chainId, string memory contractName) + public + view + returns ( + address addr, + string memory txHash, + uint256 blockNum + ) + { + addr = getAddress(chainId, contractName); + txHash = getTransactionHash(chainId, contractName); + blockNum = getBlockNumber(chainId, contractName); + } +} diff --git a/script/DeploymentUtils.sol b/script/DeploymentUtils.sol new file mode 100644 index 000000000..9218b04a3 --- /dev/null +++ b/script/DeploymentUtils.sol @@ -0,0 +1,192 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import { Script } from "forge-std/Script.sol"; +import { Test } from "forge-std/Test.sol"; +import { console } from "forge-std/console.sol"; +import { Upgrades, Core, UnsafeUpgrades } from "@openzeppelin/foundry-upgrades/src/LegacyUpgrades.sol"; +import { Options } from "@openzeppelin/foundry-upgrades/src/Options.sol"; +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { Constants } from "./Constants.sol"; +import { DeployedAddresses } from "./DeployedAddresses.sol"; + +/** + * @title DeploymentUtils + * @notice Foundry smart contract script that provides deployment utilities for Across Protocol contracts + * @dev This contract implements the equivalent functionality of utils.hre.ts for Foundry scripts + */ +contract DeploymentUtils is Script, Test, Constants, DeployedAddresses { + // Struct to hold deployment information + struct DeploymentInfo { + address hubPool; + uint256 hubChainId; + uint256 spokeChainId; + } + + // Struct to hold deployment result + struct DeploymentResult { + address proxy; + address implementation; + bool isNewProxy; + } + + /** + * @notice Get deployment information for SpokePool deployment + * @dev This function mimics getSpokePoolDeploymentInfo from utils.hre.ts + * @param hubPoolAddress The address of the HubPool (can be set via environment variable) + * @return info Deployment information struct + */ + function getSpokePoolDeploymentInfo(address hubPoolAddress) public view returns (DeploymentInfo memory info) { + uint256 spokeChainId = block.chainid; + + // Determine hub chain ID based on spoke chain ID + uint256 hubChainId; + if (spokeChainId == MAINNET()) { + hubChainId = MAINNET(); + } else if (spokeChainId == SEPOLIA()) { + hubChainId = SEPOLIA(); + } else { + // For L2 chains, hub is typically mainnet or sepolia + hubChainId = isTestnet(spokeChainId) ? SEPOLIA() : MAINNET(); + } + + // If hubPoolAddress is not provided, try to get it from environment + address hubPool = hubPoolAddress; + if (hubPool == address(0)) { + hubPool = getAddress(hubChainId, "HubPool"); + } + + require(hubPool != address(0), "HubPool address cannot be zero"); + + info = DeploymentInfo({ hubPool: hubPool, hubChainId: hubChainId, spokeChainId: spokeChainId }); + + console.log("Using chain", hubChainId, "HubPool @", hubPool); + } + + /** + * @notice Deploy a new proxy contract or upgrade existing implementation + * @dev This function mimics deployNewProxy from utils.hre.ts using custom deployment for OpenZeppelin v4 + * @param contractName Name of the contract to deploy + * @param constructorArgs Constructor arguments for the implementation + * @param initArgs Initialization arguments for the proxy + * @param implementationOnly Whether to only deploy implementation (for upgrades) + * @return result Deployment result struct + */ + function deployNewProxy( + string memory contractName, + bytes memory constructorArgs, + bytes memory initArgs, + bool implementationOnly + ) public returns (DeploymentResult memory result) { + uint256 chainId = block.chainid; + + contractName = string(abi.encodePacked(contractName, ".sol")); + + // Check if a SpokePool already exists on this chain + address existingProxy = getDeployedAddress("SpokePool", chainId, false); + + // Determine if we should only deploy implementation + if (!implementationOnly) { + implementationOnly = existingProxy != address(0); + } + + Options memory opts; + + opts.constructorData = constructorArgs; + // opts.referenceBuildInfoDir = "artifacts"; + + if (implementationOnly && existingProxy != address(0)) { + console.log( + contractName, + "deployment already detected @", + existingProxy, + ", deploying new implementation." + ); + + // For upgrades, we'll use the prepareUpgrade method from LegacyUpgrades + address implementation = Core.deploy(contractName, constructorArgs, opts); + + result = DeploymentResult({ proxy: existingProxy, implementation: implementation, isNewProxy: false }); + + console.log("New", contractName, "implementation deployed @", implementation); + } else { + address implementation = Core.deploy(contractName, constructorArgs, opts); + + ERC1967Proxy proxy = new ERC1967Proxy(address(implementation), initArgs); + + // For now, return a placeholder result + result = DeploymentResult({ proxy: address(proxy), implementation: implementation, isNewProxy: true }); + + console.log("New", contractName, "proxy deployed @", address(proxy)); + console.log("New", contractName, "implementation deployed @", implementation); + } + + return result; + } + + /** + * @notice Upgrade an existing proxy to a new implementation + * @param proxyAddress Address of the existing proxy + * @param contractName Name of the new implementation contract + * @param constructorArgs Constructor arguments for the new implementation + * @return newImplementation Address of the new implementation + */ + function upgradeProxy( + address proxyAddress, + string memory contractName, + bytes memory constructorArgs + ) public returns (address newImplementation) { + Options memory opts; + Upgrades.upgradeProxy(proxyAddress, contractName, constructorArgs, opts); + + // Get the new implementation address + newImplementation = Upgrades.getImplementationAddress(proxyAddress); + + console.log("Proxy", proxyAddress, "upgraded to implementation @", newImplementation); + return newImplementation; + } + + /** + * @notice Get deployed address from deployments.json + * @param contractName Name of the contract + * @param chainId Chain ID + * @param throwOnError Whether to throw error if not found + * @return address Deployed contract address + */ + function getDeployedAddress( + string memory contractName, + uint256 chainId, + bool throwOnError + ) public view returns (address) { + // Try to get the address from DeployedAddresses contract + address deployedAddress = getAddress(chainId, contractName); + + if (deployedAddress == address(0) && throwOnError) { + revert(string(abi.encodePacked("Contract ", contractName, " not found on chain ", vm.toString(chainId)))); + } + + return deployedAddress; + } + + /** + * @notice Check if a chain ID is a testnet + * @param chainId Chain ID to check + * @return bool True if testnet + */ + function isTestnet(uint256 chainId) internal view returns (bool) { + return + chainId == SEPOLIA() || + chainId == ARBITRUM_SEPOLIA() || + chainId == OPTIMISM_SEPOLIA() || + chainId == BASE_SEPOLIA() || + chainId == POLYGON_AMOY() || + chainId == LENS_TESTNET() || + chainId == LINEA_SEPOLIA() || + chainId == SCROLL_SEPOLIA() || + chainId == UNICHAIN_SEPOLIA() || + chainId == BLAST_SEPOLIA() || + chainId == INK_SEPOLIA() || + chainId == LISK_SEPOLIA() || + chainId == MODE_SEPOLIA(); + } +} diff --git a/script/ExtractDeployedFoundryAddresses.ts b/script/ExtractDeployedFoundryAddresses.ts new file mode 100644 index 000000000..a70007b87 --- /dev/null +++ b/script/ExtractDeployedFoundryAddresses.ts @@ -0,0 +1,563 @@ +#!/usr/bin/env node +/** + * Script to extract deployed contract addresses from Foundry broadcast files. + * + * This script reads from the broadcast folder and generates a file with the latest deployed + * smart contract addresses that are in the broadcast folder. + * + * It specifically looks at the run-latest.json file for each smart contract and inside + * that JSON looks at the `contractAddress` field. + */ + +import * as fs from "fs"; +import * as path from "path"; +import { getAddress } from "ethers/lib/utils"; + +interface BroadcastFile { + scriptName: string; + chainId: number; + filePath: string; + isDeploymentsJson?: boolean; + deploymentsData?: any; +} + +interface Contract { + contractName: string; + contractAddress: string; + transactionHash: string; + blockNumber: number | null; +} + +interface ChainInfo { + chainName: string; + scripts: { [scriptName: string]: Contract[] }; +} + +interface AllContracts { + [chainId: number]: ChainInfo; +} + +interface JsonOutput { + generated_at: string; + chains: { + [chainId: string]: { + chain_name: string; + contracts: { + [contractName: string]: { + address: string; + transaction_hash: string; + block_number: number | null; + }; + }; + }; + }; +} + +function findBroadcastFiles(broadcastDir: string): BroadcastFile[] { + const broadcastFiles: BroadcastFile[] = []; + + try { + const scriptDirs = fs.readdirSync(broadcastDir); + + for (const scriptDir of scriptDirs) { + const scriptPath = path.join(broadcastDir, scriptDir); + const stat = fs.statSync(scriptPath); + + if (stat.isDirectory()) { + // Each script has its own directory (e.g., DeployHubPool.s.sol) + const chainDirs = fs.readdirSync(scriptPath); + + for (const chainDir of chainDirs) { + const chainPath = path.join(scriptPath, chainDir); + const chainStat = fs.statSync(chainPath); + + if (chainStat.isDirectory() && /^\d+$/.test(chainDir)) { + // Chain ID directories (e.g., 11155111 for Sepolia) + const runLatestPath = path.join(chainPath, "run-latest.json"); + + if (fs.existsSync(runLatestPath)) { + broadcastFiles.push({ + scriptName: scriptDir, + chainId: parseInt(chainDir), + filePath: runLatestPath, + }); + } + } + } + } + } + } catch (error) { + console.error(`Error reading broadcast directory: ${error}`); + } + + return broadcastFiles; +} + +function readDeploymentsFile(deploymentsDir: string): BroadcastFile[] { + const deploymentsFiles: BroadcastFile[] = []; + + try { + const deploymentsPath = path.join(deploymentsDir, "deployments.json"); + + if (fs.existsSync(deploymentsPath)) { + const data = JSON.parse(fs.readFileSync(deploymentsPath, "utf8")); + + for (const [chainId, contracts] of Object.entries(data)) { + if (typeof contracts === "object" && contracts !== null) { + // Create a virtual broadcast file for deployments.json + deploymentsFiles.push({ + scriptName: "DeploymentsJson", + chainId: parseInt(chainId), + filePath: deploymentsPath, + isDeploymentsJson: true, + deploymentsData: contracts as any, + }); + } + } + } + } catch (error) { + console.error(`Error reading deployments.json: ${error}`); + } + + return deploymentsFiles; +} + +function extractContractAddresses(broadcastFile: BroadcastFile): Contract[] { + if (broadcastFile.isDeploymentsJson && broadcastFile.deploymentsData) { + // Handle deployments.json format + const contracts: Contract[] = []; + const deploymentsData = broadcastFile.deploymentsData; + + for (const [contractName, contractInfo] of Object.entries(deploymentsData)) { + if (typeof contractInfo === "object" && contractInfo !== null && "address" in contractInfo) { + const info = contractInfo as any; + contracts.push({ + contractName: contractName, + contractAddress: info.address, + transactionHash: info.transactionHash || "Unknown", + blockNumber: info.blockNumber || null, + }); + } + } + + return contracts; + } else { + // Handle broadcast file format + try { + const data = JSON.parse(fs.readFileSync(broadcastFile.filePath, "utf8")); + const contracts: Contract[] = []; + const transactions = data.transactions || []; + const receipts = data.receipts || []; + + // Create a mapping of transaction hash to block number + const txHashToBlock: { [hash: string]: number } = {}; + for (const receipt of receipts) { + const txHash = receipt.transactionHash; + let blockNumber = receipt.blockNumber; + if (txHash && blockNumber) { + // Convert hex to decimal + if (typeof blockNumber === "string" && blockNumber.startsWith("0x")) { + blockNumber = parseInt(blockNumber, 16); + } + txHashToBlock[txHash] = blockNumber; + } + } + + for (const tx of transactions) { + if (tx.transactionType === "CREATE" && tx.contractAddress) { + const txHash = tx.hash; + const blockNumber = txHashToBlock[txHash] || null; + + contracts.push({ + contractName: tx.contractName || "Unknown", + contractAddress: tx.contractAddress, + transactionHash: txHash, + blockNumber: blockNumber, + }); + } + } + + return contracts; + } catch (error) { + console.error(`Error reading ${broadcastFile.filePath}: ${error}`); + return []; + } + } +} + +function getChainName(chainId: number): string { + const chainNames: { [id: number]: string } = { + 1: "Mainnet", + 11155111: "Sepolia", + 42161: "Arbitrum One", + 421614: "Arbitrum Sepolia", + 137: "Polygon", + 80002: "Polygon Amoy", + 10: "Optimism", + 11155420: "Optimism Sepolia", + 8453: "Base", + 84532: "Base Sepolia", + 56: "BSC", + 324: "zkSync Era", + 59144: "Linea", + 534352: "Scroll", + 534351: "Scroll Sepolia", + 81457: "Blast", + 168587773: "Blast Sepolia", + // Add more chain IDs as needed + }; + return chainNames[chainId] || `Chain ${chainId}`; +} + +function toChecksumAddress(address: string): string { + // Check if this looks like an Ethereum address (0x followed by 40 hex characters) + if (/^0x[a-fA-F0-9]{40}$/.test(address)) { + // Use ethers.js to get the checksummed address for valid Ethereum addresses + try { + return getAddress(address); + } catch (error) { + // If ethers validation fails, return the original address + console.warn(`Warning: Invalid Ethereum address format: ${address}`); + return address; + } + } else { + // For non-Ethereum addresses (like Solana), return as-is + return address; + } +} + +function sanitizeContractName(name: string): string { + // Remove special characters and replace with underscores + let sanitized = name.replace(/[^a-zA-Z0-9]/g, "_"); + // Remove multiple consecutive underscores + sanitized = sanitized.replace(/_+/g, "_"); + // Remove leading/trailing underscores + sanitized = sanitized.replace(/^_+|_+$/g, ""); + // Ensure it starts with a letter + if (sanitized && /^\d/.test(sanitized)) { + sanitized = "CONTRACT_" + sanitized; + } + return sanitized.toUpperCase(); +} + +function generateFoundryScript(broadcastFiles: BroadcastFile[], outputFile: string): void { + // Generate Solidity contract content + const content: string[] = []; + content.push("// SPDX-License-Identifier: MIT"); + content.push("pragma solidity ^0.8.19;"); + content.push(""); + content.push('import "forge-std/StdJson.sol";'); + content.push('import "forge-std/Test.sol";'); + content.push(""); + content.push("/**"); + content.push(" * @title DeployedAddresses"); + content.push(" * @notice This contract contains all deployed contract addresses from Foundry broadcast files"); + content.push(` * @dev Generated on: ${new Date().toISOString()}`); + content.push(" * @dev This file is auto-generated. Do not edit manually."); + content.push(" * @dev Uses Foundry's parseJson functionality for scripts/tests only (not for on-chain use)"); + content.push(" */"); + content.push("contract DeployedAddresses is Test {"); + content.push(" using stdJson for string;"); + content.push(""); + content.push(" // Path to the JSON file containing deployed addresses"); + content.push(' string private constant JSON_PATH = "../broadcast/deployed-addresses.json";'); + content.push(""); + content.push(" /**"); + content.push(" * @notice Get contract address by chain ID and contract name"); + content.push(" * @param chainId The chain ID"); + content.push(" * @param contractName The contract name"); + content.push(" * @return The contract address"); + content.push(" */"); + content.push(" function getAddress(uint256 chainId, string memory contractName) public view returns (address) {"); + content.push(" string memory jsonData = vm.readFile(JSON_PATH);"); + content.push(" string memory path = string.concat("); + content.push(" '.chains[\"', "); + content.push(" vm.toString(chainId), "); + content.push(" '\"].contracts[\"', "); + content.push(" contractName, "); + content.push(" '\"].address'"); + content.push(" );"); + content.push(" return jsonData.readAddress(path);"); + content.push(" }"); + content.push(""); + content.push(" /**"); + content.push(" * @notice Check if a contract exists for the given chain ID and name"); + content.push(" * @param chainId The chain ID"); + content.push(" * @param contractName The contract name"); + content.push(" * @return True if the contract exists, false otherwise"); + content.push(" */"); + content.push(" function hasAddress(uint256 chainId, string memory contractName) public view returns (bool) {"); + content.push(" return getAddress(chainId, contractName) != address(0);"); + content.push(" }"); + content.push(""); + content.push(" /**"); + content.push(" * @notice Get transaction hash for a contract"); + content.push(" * @param chainId The chain ID"); + content.push(" * @param contractName The contract name"); + content.push(" * @return The transaction hash"); + content.push(" */"); + content.push( + " function getTransactionHash(uint256 chainId, string memory contractName) public view returns (string memory) {" + ); + content.push(" string memory jsonData = vm.readFile(JSON_PATH);"); + content.push(" string memory path = string.concat("); + content.push(" '.chains[\"', "); + content.push(" vm.toString(chainId), "); + content.push(" '\"].contracts[\"', "); + content.push(" contractName, "); + content.push(" '\"].transaction_hash'"); + content.push(" );"); + content.push(" return jsonData.readString(path);"); + content.push(" }"); + content.push(""); + content.push(" /**"); + content.push(" * @notice Get block number for a contract deployment"); + content.push(" * @param chainId The chain ID"); + content.push(" * @param contractName The contract name"); + content.push(" * @return The block number"); + content.push(" */"); + content.push( + " function getBlockNumber(uint256 chainId, string memory contractName) public view returns (uint256) {" + ); + content.push(" string memory jsonData = vm.readFile(JSON_PATH);"); + content.push(" string memory path = string.concat("); + content.push(" '.chains[\"', "); + content.push(" vm.toString(chainId), "); + content.push(" '\"].contracts[\"', "); + content.push(" contractName, "); + content.push(" '\"].block_number'"); + content.push(" );"); + content.push(" return jsonData.readUint(path);"); + content.push(" }"); + content.push(""); + content.push(" /**"); + content.push(" * @notice Get chain name for a given chain ID"); + content.push(" * @param chainId The chain ID"); + content.push(" * @return The chain name"); + content.push(" */"); + content.push(" function getChainName(uint256 chainId) public view returns (string memory) {"); + content.push(" string memory jsonData = vm.readFile(JSON_PATH);"); + content.push(" string memory path = string.concat('.chains[\"', vm.toString(chainId), '\"].chain_name');"); + content.push(" return jsonData.readString(path);"); + content.push(" }"); + content.push(""); + content.push(" /**"); + content.push(" * @notice Get all contract names for a given chain ID"); + content.push(" * @param chainId The chain ID"); + content.push(" * @return Array of contract names"); + content.push(" */"); + content.push(" function getContractNames(uint256 chainId) public view returns (string[] memory) {"); + content.push(" string memory jsonData = vm.readFile(JSON_PATH);"); + content.push( + " string memory path = string.concat('.chains[\"', vm.toString(chainId), '\"].contracts | keys');" + ); + content.push(" return jsonData.readStringArray(path);"); + content.push(" }"); + content.push(""); + content.push(" /**"); + content.push(" * @notice Get all chain IDs"); + content.push(" * @return Array of chain IDs"); + content.push(" */"); + content.push(" function getChainIds() public view returns (uint256[] memory) {"); + content.push(" string memory jsonData = vm.readFile(JSON_PATH);"); + content.push(' string[] memory chainIdStrings = jsonData.readStringArray(".chains | keys");'); + content.push(" uint256[] memory chainIds = new uint256[](chainIdStrings.length);"); + content.push(" for (uint256 i = 0; i < chainIdStrings.length; i++) {"); + content.push(" chainIds[i] = vm.parseUint(chainIdStrings[i]);"); + content.push(" }"); + content.push(" return chainIds;"); + content.push(" }"); + content.push(""); + content.push(" /**"); + content.push(" * @notice Get the generation timestamp of the JSON file"); + content.push(" * @return The generation timestamp"); + content.push(" */"); + content.push(" function getGeneratedAt() public view returns (string memory) {"); + content.push(" string memory jsonData = vm.readFile(JSON_PATH);"); + content.push(' return jsonData.readString(".generated_at");'); + content.push(" }"); + content.push(""); + content.push(" /**"); + content.push(" * @notice Get contract info for a specific contract"); + content.push(" * @param chainId The chain ID"); + content.push(" * @param contractName The contract name"); + content.push(" * @return addr The contract address"); + content.push(" * @return txHash The transaction hash"); + content.push(" * @return blockNum The block number"); + content.push(" */"); + content.push(" function getContractInfo("); + content.push(" uint256 chainId,"); + content.push(" string memory contractName"); + content.push(" ) public view returns (address addr, string memory txHash, uint256 blockNum) {"); + content.push(" addr = getAddress(chainId, contractName);"); + content.push(" txHash = getTransactionHash(chainId, contractName);"); + content.push(" blockNum = getBlockNumber(chainId, contractName);"); + content.push(" }"); + content.push("}"); + + // Write Solidity file + const solidityFile = outputFile.replace(/\.[^/.]+$/, ".sol"); + fs.writeFileSync(solidityFile, content.join("\n")); + + console.log(`Generated Foundry script: ${solidityFile}`); +} + +function generateAddressesFile(broadcastFiles: BroadcastFile[], outputFile: string): void { + const allContracts: AllContracts = {}; + + // Process each broadcast file + for (const broadcastFile of broadcastFiles) { + const contracts = extractContractAddresses(broadcastFile); + + if (contracts.length > 0) { + const chainId = broadcastFile.chainId; + const chainName = getChainName(chainId); + // For deployments.json, use contract name as scriptName for each contract + if (broadcastFile.isDeploymentsJson) { + for (const contract of contracts) { + const scriptName = contract.contractName; + if (!allContracts[chainId]) { + allContracts[chainId] = { + chainName: chainName, + scripts: {}, + }; + } + allContracts[chainId].scripts[scriptName] = [contract]; + console.log(`Added deployments.json contract ${contract.contractName} on ${chainName}`); + } + } else { + const scriptName = broadcastFile.scriptName; + if (!allContracts[chainId]) { + allContracts[chainId] = { + chainName: chainName, + scripts: {}, + }; + } + allContracts[chainId].scripts[scriptName] = contracts; + console.log(`Added ${contracts.length} contracts from ${scriptName} on ${chainName}`); + } + } + } + + // Generate output content + const content: string[] = []; + content.push("# Deployed Contract Addresses"); + content.push(""); + content.push(`Generated on: ${new Date().toISOString()}`); + content.push(""); + content.push("This file contains the latest deployed smart contract addresses from the broadcast folder."); + content.push(""); + + // Sort by chain ID for consistent output + const sortedChainIds = Object.keys(allContracts) + .map(Number) + .sort((a, b) => a - b); + + for (const chainId of sortedChainIds) { + const chainInfo = allContracts[chainId]; + content.push(`## ${chainInfo.chainName} (Chain ID: ${chainId})`); + content.push(""); + + for (const [scriptName, contracts] of Object.entries(chainInfo.scripts)) { + content.push(`### ${scriptName}`); + content.push(""); + + for (const contract of contracts) { + content.push(`- **${contract.contractName}**: \`${contract.contractAddress}\``); + content.push(` - Transaction Hash: \`${contract.transactionHash}\``); + if (contract.blockNumber !== null) { + content.push(` - Block Number: \`${contract.blockNumber}\``); + } + content.push(""); + } + } + + content.push(""); + } + + // Generate JSON format as well + const jsonOutput: JsonOutput = { + generated_at: new Date().toISOString(), + chains: {}, + }; + + for (const [chainId, chainInfo] of Object.entries(allContracts)) { + jsonOutput.chains[chainId] = { + chain_name: chainInfo.chainName, + contracts: {}, + }; + + for (const [scriptName, contracts] of Object.entries(chainInfo.scripts)) { + for (const contract of contracts as Contract[]) { + const contractName = contract.contractName; + jsonOutput.chains[chainId].contracts[contractName] = { + address: contract.contractAddress, + transaction_hash: contract.transactionHash, + block_number: contract.blockNumber, + }; + } + } + } + + // Write markdown file + const markdownFile = outputFile.replace(/\.[^/.]+$/, ".md"); + fs.writeFileSync(markdownFile, content.join("\n")); + + // Write JSON file + const jsonFile = outputFile.replace(/\.[^/.]+$/, ".json"); + fs.writeFileSync(jsonFile, JSON.stringify(jsonOutput, null, 2)); + + console.log("Generated deployed addresses files:"); + console.log(` - Markdown: ${markdownFile}`); + console.log(` - JSON: ${jsonFile}`); +} + +function main(): void { + // Get the script directory and find broadcast folder + const scriptDir = path.dirname(__filename); + const projectRoot = path.dirname(scriptDir); + const broadcastDir = path.join(projectRoot, "broadcast"); + const deploymentsDir = path.join(projectRoot, "deployments"); + + if (!fs.existsSync(broadcastDir)) { + console.error(`Error: Broadcast directory not found at ${broadcastDir}`); + process.exit(1); + } + + console.log(`Scanning broadcast directory: ${broadcastDir}`); + console.log(`Scanning deployments directory: ${deploymentsDir}`); + + // Find all broadcast files + const broadcastFiles = findBroadcastFiles(broadcastDir); + + // Read deployments.json + const deploymentsFiles = readDeploymentsFile(deploymentsDir); + + // Combine both sources + const allFiles = [...broadcastFiles, ...deploymentsFiles]; + + if (allFiles.length === 0) { + console.error("No run-latest.json files found in broadcast directory and no deployments.json found"); + process.exit(1); + } + + console.log(`Found ${broadcastFiles.length} broadcast files and ${deploymentsFiles.length} deployment entries:`); + for (const bf of allFiles) { + const source = bf.isDeploymentsJson ? "deployments.json" : "broadcast"; + console.log(` - ${bf.scriptName} on ${getChainName(bf.chainId)} (from ${source})`); + } + + // Generate output files inside broadcast directory + const outputFile = path.join(broadcastDir, "deployed-addresses.json"); + generateAddressesFile(allFiles, outputFile); + + // Generate Foundry script in script directory + const scriptOutputFile = path.join(scriptDir, "DeployedAddresses.sol"); + generateFoundryScript(allFiles, scriptOutputFile); + + console.log("\nDone!"); +} + +if (require.main === module) { + main(); +} diff --git a/script/README.md b/script/README.md new file mode 100644 index 000000000..14f24090c --- /dev/null +++ b/script/README.md @@ -0,0 +1,214 @@ +# Foundry Address Extraction Scripts + +This directory contains scripts to extract deployed contract addresses from Foundry broadcast files and generate useful artifacts for use in other deployment scripts. + +## Prerequisites + +The extraction script requires Node.js and TypeScript support. + +### Installation + +```bash +# Install dependencies (if not already installed) +yarn install + + +``` + +## Files + +- `extract_foundry_addresses.sh` - Bash script to run the extraction process +- `ExtractDeployedFoundryAddresses.ts` - TypeScript script that does the actual extraction +- `DeployedAddresses.sol` - Auto-generated Solidity contract with all deployed addresses (generated by the script) +- `ExampleUsage.s.sol` - Example script showing how to use the DeployedAddresses contract + +## Usage + +### Running the Script + +```bash +# Using yarn (recommended) +yarn extract-addresses + + +# Or run the bash script directly +./script/extract_foundry_addresses.sh +``` + +### Generated Output + +The script generates three files: + +1. **`broadcast/deployed-addresses.md`** - Human-readable markdown file with all deployed addresses +2. **`broadcast/deployed-addresses.json`** - Structured JSON data with all deployed addresses +3. **`script/DeployedAddresses.sol`** - Solidity contract that uses Foundry's parseJson functionality to read addresses dynamically + +### Using DeployedAddresses.sol in Your Scripts + +The generated `DeployedAddresses.sol` contract uses Foundry's `parseJson` functionality to dynamically read addresses from the JSON file. This approach is **only for use in Foundry scripts and tests** (not for on-chain deployment). + +#### Basic Usage + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import { Script } from "forge-std/Script.sol"; +import { DeployedAddresses } from "./DeployedAddresses.sol"; + +contract MyDeploymentScript is Script { + function run() external { + uint256 sepoliaChainId = 11155111; + + // Get addresses dynamically by chain ID and contract name + address hubPool = DeployedAddresses.getAddress(sepoliaChainId, "HubPool"); + address lpTokenFactory = DeployedAddresses.getAddress(sepoliaChainId, "LpTokenFactory"); + + // Check if a contract exists before using it + if (DeployedAddresses.hasAddress(sepoliaChainId, "HubPool")) { + // Contract exists, safe to use + address hubPoolAddress = DeployedAddresses.getAddress(sepoliaChainId, "HubPool"); + } + + // Get additional contract information + (address addr, string memory txHash, uint256 blockNum) = DeployedAddresses.getContractInfo( + sepoliaChainId, + "HubPool" + ); + } +} + +``` + +### Available Functions + +The `DeployedAddresses` contract provides these functions: + +#### `getAddress(uint256 chainId, string memory contractName)` + +- Returns the contract address for the given chain ID and contract name +- Returns `address(0)` if the contract doesn't exist +- **View function** - no gas cost for reading +- Uses Foundry's `vm.readFile` and `stdJson` to read from the JSON file + +#### `hasAddress(uint256 chainId, string memory contractName)` + +- Returns `true` if a contract exists for the given chain ID and name +- Returns `false` if the contract doesn't exist +- **View function** - no gas cost for reading + +#### `getTransactionHash(uint256 chainId, string memory contractName)` + +- Returns the transaction hash for the contract deployment +- Returns empty string if not available + +#### `getBlockNumber(uint256 chainId, string memory contractName)` + +- Returns the block number where the contract was deployed +- Returns `0` if not available + +#### `getChainName(uint256 chainId)` + +- Returns the human-readable name for the given chain ID +- Returns empty string if chain ID is not recognized + +#### `getContractNames(uint256 chainId)` + +- Returns an array of all contract names deployed on the given chain +- Returns empty array if no contracts found + +#### `getChainIds()` + +- Returns an array of all chain IDs that have deployed contracts + +#### `getGeneratedAt()` + +- Returns the timestamp when the JSON file was generated + +#### `getContractInfo(uint256 chainId, string memory contractName)` + +- Returns a tuple with (address, transactionHash, blockNumber) for the contract +- Convenience function to get all info at once + +### Contract Name for Dynamic Lookup + +For the `getAddress()` and `hasAddress()` functions, use the original contract name as it appears in the deployment: + +Examples: + +- `"HubPool"` - for the HubPool contract +- `"LpTokenFactory"` - for the LpTokenFactory contract +- `"PermissionSplitterProxy"` - for the PermissionSplitterProxy contract +- `"SpokePool"` - for the SpokePool contract + +### Chain Support + +The script recognizes these chains: + +- Mainnet (Chain ID: 1) +- Sepolia (Chain ID: 11155111) +- Arbitrum One (Chain ID: 42161) +- Arbitrum Sepolia (Chain ID: 421614) +- Polygon (Chain ID: 137) +- Polygon Amoy (Chain ID: 80002) +- Optimism (Chain ID: 10) +- Optimism Sepolia (Chain ID: 11155420) +- Base (Chain ID: 8453) +- Base Sepolia (Chain ID: 84532) +- BSC (Chain ID: 56) +- zkSync Era (Chain ID: 324) +- Linea (Chain ID: 59144) +- Scroll (Chain ID: 534352) +- Scroll Sepolia (Chain ID: 534351) +- Blast (Chain ID: 81457) +- Blast Sepolia (Chain ID: 168587773) +- And many more chains from deployments.json + +## How It Works + +1. The script scans the `broadcast/` directory for `run-latest.json` files +2. It also reads from `deployments/deployments.json` for additional contract addresses +3. It extracts contract addresses from each file's transaction data +4. It organizes the data by chain ID and contract name +5. It generates the three output files with the extracted information +6. The Solidity contract uses Foundry's `parseJson` functionality to read addresses dynamically from the JSON file +7. All addresses are properly formatted using EIP-55 checksum for Solidity compatibility + +## Important Notes + +- The `DeployedAddresses.sol` file is auto-generated and should not be edited manually +- Run the extraction script after each deployment to keep the addresses up to date +- The script only processes the latest deployment for each script/chain combination +- **The contract only works in Foundry scripts and tests** - it cannot be deployed on-chain due to the use of `vm` cheatcodes +- The contract reads addresses dynamically from the JSON file, so it always reflects the latest data +- All addresses are properly checksummed using EIP-55 format for Solidity compatibility +- Non-Ethereum addresses (like Solana addresses) are filtered out for the Solidity contract + +## Example Test Usage + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import { Test } from "forge-std/Test.sol"; +import { DeployedAddresses } from "./DeployedAddresses.sol"; + +contract DeployedAddressesTest is Test { + DeployedAddresses public deployedAddresses; + + function setUp() public { + deployedAddresses = new DeployedAddresses(); + } + + function testGetMainnetAddresses() public view { + address hubPool = deployedAddresses.getAddress(1, "HubPool"); + assertEq(hubPool, 0xc186fA914353c44b2E33eBE05f21846F1048bEda, "HubPool address mismatch"); + } + + function testGetSepoliaAddresses() public view { + address hubPool = deployedAddresses.getAddress(11155111, "HubPool"); + assertEq(hubPool, 0x14224e63716aface30c9a417e0542281869f7d9e, "Sepolia HubPool address mismatch"); + } +} + +``` diff --git a/script/constants.json b/script/constants.json new file mode 100644 index 000000000..a57028d68 --- /dev/null +++ b/script/constants.json @@ -0,0 +1,355 @@ +{ + "chainIds": { + "MAINNET": 1, + "SEPOLIA": 11155111, + "ARBITRUM": 42161, + "ARBITRUM_SEPOLIA": 421614, + "BSC": 56, + "POLYGON": 137, + "POLYGON_AMOY": 80002, + "ZK_SYNC": 324, + "OPTIMISM": 10, + "OPTIMISM_SEPOLIA": 11155420, + "BASE": 8453, + "BASE_SEPOLIA": 84532, + "LENS": 232, + "LENS_TESTNET": 37111, + "LINEA": 59144, + "LINEA_SEPOLIA": 59141, + "SCROLL": 534352, + "SCROLL_SEPOLIA": 534351, + "UNICHAIN": 130, + "UNICHAIN_SEPOLIA": 1301, + "ALEPH_ZERO": 41455, + "BLAST": 81457, + "BLAST_SEPOLIA": 168587773, + "BOBA": 288, + "INK": 57073, + "INK_SEPOLIA": 763373, + "LISK": 1135, + "LISK_SEPOLIA": 4202, + "MODE": 34443, + "MODE_SEPOLIA": 919, + "REDSTONE": 690, + "SONEIUM": 1868, + "WORLD_CHAIN": 480, + "ZORA": 7777777 + }, + "wrappedNativeTokens": { + "MAINNET": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "SEPOLIA": "0x7b79995e5f793A07Bc00c21412e50Ecae098E7f9", + "ARBITRUM": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "ARBITRUM_SEPOLIA": "0x980B62Da83eFf3D4576C647993b0c1D7faf17c73", + "BSC": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", + "POLYGON": "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270", + "POLYGON_AMOY": "0xA5733b3A8e62A8faF43b0376d5fAF46E89B3033E", + "ZK_SYNC": "0x5AEa5775959fBC2557Cc8789bC1bf90A239D9a91", + "OPTIMISM": "0x4200000000000000000000000000000000000006", + "OPTIMISM_SEPOLIA": "0x74A4A85C611679B73F402B36c0F84A7D2CcdFDa3", + "BASE": "0x4200000000000000000000000000000000000006", + "BASE_SEPOLIA": "0x999B45BB215209e567FaF486515af43b8353e393", + "LENS": "0x4200000000000000000000000000000000000006", + "LENS_TESTNET": "0xaA91D645D7a6C1aeaa5988e0547267B77d33fe16", + "LINEA": "0xe5D7C2a44FfDDf6b295A15c148167daaAf5Cf34f", + "LINEA_SEPOLIA": "0x10253594A832f967994b44f33411940533302ACb", + "SCROLL_SEPOLIA": "0x5300000000000000000000000000000000000004", + "SCROLL": "0x5300000000000000000000000000000000000004", + "UNICHAIN": "0x4200000000000000000000000000000000000006", + "UNICHAIN_SEPOLIA": "0x4200000000000000000000000000000000000006", + "ALEPH_ZERO": "0xB3f0eE446723f4258862D949B4c9688e7e7d35d3", + "BLAST": "0x4300000000000000000000000000000000000004", + "BLAST_SEPOLIA": "0x4200000000000000000000000000000000000023", + "BOBA": "0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000", + "INK": "0x4200000000000000000000000000000000000006", + "LISK": "0x4200000000000000000000000000000000000006", + "LISK_SEPOLIA": "0x4200000000000000000000000000000000000006", + "MODE": "0x4200000000000000000000000000000000000006", + "MODE_SEPOLIA": "0x4200000000000000000000000000000000000006", + "REDSTONE": "0x4200000000000000000000000000000000000006", + "SONEIUM": "0x4200000000000000000000000000000000000006", + "WORLD_CHAIN": "0x4200000000000000000000000000000000000006", + "ZORA": "0x4200000000000000000000000000000000000006" + }, + "l2Addresses": { + "ALEPH_ZERO": { + "l2GatewayRouter": "0xD296d45171B97720D3aBdb68B0232be01F1A9216" + }, + "ARBITRUM_SEPOLIA": { + "l2GatewayRouter": "0x9fDD1C4E4AA24EEc1d913FABea925594a20d43C7", + "cctpTokenMessenger": "0x9f3B8679c73C2Fef8b59B4f3444d4e156fb70AA5", + "cctpMessageTransmitter": "0xaCF1ceeF35caAc005e15888dDb8A3515C41B4872" + }, + "ARBITRUM": { + "l2GatewayRouter": "0x5288c571Fd7aD117beA99bF60FE0846C4E84F933", + "cctpTokenMessenger": "0x19330d10D9Cc8751218eaf51E8885D058642E08A", + "cctpMessageTransmitter": "0xC30362313FBBA5cf9163F0bb16a0e01f01A896ca", + "uniswapV3SwapRouter": "0xE592427A0AEce92De3Edee1F18E0157C05861564", + "1inchV6Router": "0x111111125421cA6dc452d289314280a0f8842A65" + }, + "BSC": { + "helios": "0xCdb25d0A6FfFE639BC591a565F2D99507837f2b7" + }, + "POLYGON": { + "fxChild": "0x8397259c983751DAf40400790063935a11afa28a", + "cctpTokenMessenger": "0x9daF8c91AEFAE50b9c0E69629D3F6Ca40cA3B3FE", + "cctpMessageTransmitter": "0xF3be9355363857F3e001be68856A2f96b4C39Ba9", + "uniswapV3SwapRouter": "0xE592427A0AEce92De3Edee1F18E0157C05861564", + "1inchV6Router": "0x111111125421cA6dc452d289314280a0f8842A65" + }, + "POLYGON_AMOY": { + "fxChild": "0xE5930336866d0388f0f745A2d9207C7781047C0f", + "cctpTokenMessenger": "0x9f3B8679c73C2Fef8b59B4f3444d4e156fb70AA5", + "cctpMessageTransmitter": "0x7865fAfC2db2093669d92c0F33AeEF291086BEFD" + }, + "ZK_SYNC": { + "zkErc20Bridge": "0x11f943b2c77b743AB90f4A0Ae7d5A4e7FCA3E102", + "1inchV6Router": "0x6fd4383cB451173D5f9304F041C7BCBf27d561fF" + }, + "OPTIMISM": { + "cctpTokenMessenger": "0x2B4069517957735bE00ceE0fadAE88a26365528f", + "cctpMessageTransmitter": "0x4D41f22c5a0e5c74090899E5a8Fb597a8842b3e8", + "uniswapV3SwapRouter": "0xE592427A0AEce92De3Edee1F18E0157C05861564", + "1inchV6Router": "0x111111125421cA6dc452d289314280a0f8842A65" + }, + "OPTIMISM_SEPOLIA": { + "cctpTokenMessenger": "0x9f3B8679c73C2Fef8b59B4f3444d4e156fb70AA5", + "cctpMessageTransmitter": "0x7865fAfC2db2093669d92c0F33AeEF291086BEFD", + "uniswapV3SwapRouter": "0xd8866E76441df243fc98B892362Fc6264dC3ca80" + }, + "BASE": { + "cctpTokenMessenger": "0x1682Ae6375C4E4A97e4B583BC394c861A46D8962", + "cctpMessageTransmitter": "0xAD09780d193884d503182aD4588450C416D6F9D4", + "uniswapV3SwapRouter": "0x2626664c2603336E57B271c5C0b26F421741e481", + "1inchV6Router": "0x111111125421cA6dc452d289314280a0f8842A65" + }, + "BASE_SEPOLIA": { + "cctpTokenMessenger": "0x9f3B8679c73C2Fef8b59B4f3444d4e156fb70AA5", + "cctpMessageTransmitter": "0x7865fAfC2db2093669d92c0F33AeEF291086BEFD", + "uniswapV3SwapRouter": "0x7945814dE23D76dfFf0CFC6ecB76456B9F7Ac648" + }, + "LENS": { + "zkErc20Bridge": "0xfBEC23c5BB0E076F2ef4d0AaD7fe331aE5A01143", + "zkUSDCBridge": "0x7188B6975EeC82ae914b6eC7AC32b3c9a18b2c81" + }, + "LENS_TESTNET": { + "zkErc20Bridge": "0x427373Be173120D7A042b44D0804E37F25E7330b" + }, + "LINEA": { + "lineaMessageService": "0x508Ca82Df566dCD1B0DE8296e70a96332cD644ec", + "cctpV2TokenMessenger": "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d", + "lineaTokenBridge": "0x353012dc4a9A6cF55c941bADC267f82004A8ceB9" + }, + "SCROLL_SEPOLIA": { + "scrollERC20GatewayRouter": "0x9aD3c5617eCAa556d6E166787A97081907171230", + "scrollGasPriceOracle": "0x5300000000000000000000000000000000000002", + "scrollMessenger": "0xBa50f5340FB9F3Bd074bD638c9BE13eCB36E603d" + }, + "SCROLL": { + "scrollERC20GatewayRouter": "0x4C0926FF5252A435FD19e10ED15e5a249Ba19d79", + "scrollGasPriceOracle": "0x5300000000000000000000000000000000000002", + "scrollMessenger": "0x781e90f1c8Fc4611c9b7497C3B47F99Ef6969CbC" + }, + "UNICHAIN": { + "cctpTokenMessenger": "0x4e744b28E787c3aD0e810eD65A24461D4ac5a762", + "cctpMessageTransmitter": "0x353bE9E2E38AB1D19104534e4edC21c643Df86f4" + }, + "UNICHAIN_SEPOLIA": { + "cctpTokenMessenger": "0x8ed94B8dAd2Dc5453862ea5e316A8e71AAed9782", + "cctpMessageTransmitter": "0xbc498c326533d675cf571B90A2Ced265ACb7d086" + } + }, + "l1Addresses": { + "MAINNET": { + "finder": "0x40f941E48A552bF496B154Af6bf55725f18D77c3", + "l1ArbitrumInbox": "0x4Dbd4fc535Ac27206064B68FfCf827b0A60BAB3f", + "l1ERC20GatewayRouter": "0x72Ce9c846789fdB6fC1f34aC4AD25Dd9ef7031ef", + "polygonRootChainManager": "0xA0c68C638235ee32657e8f720a23ceC1bFc77C77", + "polygonFxRoot": "0xfe5e5D361b2ad62c541bAb87C45a0B9B018389a2", + "polygonERC20Predicate": "0x40ec5B33f54e0E8A33A975908C5BA1c14e5BbbDf", + "polygonRegistry": "0x33a02E6cC863D393d6Bf231B697b82F6e499cA71", + "polygonDepositManager": "0x401F6c983eA34274ec46f84D70b31C151321188b", + "cctpTokenMessenger": "0xBd3fa81B58Ba92a82136038B25aDec7066af3155", + "cctpV2TokenMessenger": "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d", + "cctpMessageTransmitter": "0x0a992d191DEeC32aFe36203Ad87D7d289a738F81", + "lineaMessageService": "0xd19d4B5d358258f05D7B411E21A1460D11B0876F", + "lineaTokenBridge": "0x051F1D88f0aF5763fB888eC4378b4D8B29ea3319", + "scrollERC20GatewayRouter": "0xF8B1378579659D8F7EE5f3C929c2f3E332E41Fd6", + "scrollMessengerRelay": "0x6774Bcbd5ceCeF1336b5300fb5186a12DDD8b367", + "scrollGasPriceOracle": "0x56971da63A3C0205184FEF096E9ddFc7A8C2D18a", + "blastYieldManager": "0xa230285d5683C74935aD14c446e137c8c8828438", + "blastDaiRetriever": "0x98Dd57048d7d5337e92D9102743528ea4Fea64aB", + "l1AlephZeroInbox": "0x56D8EC76a421063e1907503aDd3794c395256AEb", + "l1AlephZeroERC20GatewayRouter": "0xeBb17f398ed30d02F2e8733e7c1e5cf566e17812", + "donationBox": "0x0d57392895Db5aF3280e9223323e20F3951E81B1", + "hubPoolStore": "0x1Ace3BbD69b63063F859514Eca29C9BDd8310E61", + "zkBridgeHub": "0x303a465B659cBB0ab36eE643eA362c509EEb5213", + "zkUsdcSharedBridge_232": "0xf553E6D903AA43420ED7e3bc2313bE9286A8F987", + "zkUsdcSharedBridge_324": "0xD7f9f54194C633F36CCD5F3da84ad4a1c38cB2cB" + }, + "SEPOLIA": { + "finder": "0xeF684C38F94F48775959ECf2012D7E864ffb9dd4", + "l1ArbitrumInbox": "0xaAe29B0366299461418F5324a79Afc425BE5ae21", + "l1ERC20GatewayRouter": "0xcE18836b233C83325Cc8848CA4487e94C6288264", + "polygonRootChainManager": "0x34F5A25B627f50Bb3f5cAb72807c4D4F405a9232", + "polygonFxRoot": "0x0E13EBEdDb8cf9f5987512d5E081FdC2F5b0991e", + "polygonERC20Predicate": "0x4258C75b752c812B7Fa586bdeb259f2d4bd17f4F", + "polygonRegistry": "0xfE92F7c3a701e43d8479738c8844bCc555b9e5CD", + "polygonDepositManager": "0x44Ad17990F9128C6d823Ee10dB7F0A5d40a731A4", + "cctpTokenMessenger": "0x9f3B8679c73C2Fef8b59B4f3444d4e156fb70AA5", + "cctpV2TokenMessenger": "0x0000000000000000000000000000000000000000", + "cctpMessageTransmitter": "0x7865fAfC2db2093669d92c0F33AeEF291086BEFD", + "lineaMessageService": "0xd19d4B5d358258f05D7B411E21A1460D11B0876F", + "lineaTokenBridge": "0x051F1D88f0aF5763fB888eC4378b4D8B29ea3319", + "scrollERC20GatewayRouter": "0x13FBE0D0e5552b8c9c4AE9e2435F38f37355998a", + "scrollMessengerRelay": "0x50c7d3e7f7c656493D1D76aaa1a836CedfCBB16A", + "scrollGasPriceOracle": "0x247969F4fad93a33d4826046bc3eAE0D36BdE548", + "blastYieldManager": "0x0000000000000000000000000000000000000000", + "blastDaiRetriever": "0x0000000000000000000000000000000000000000", + "l1AlephZeroInbox": "0x0000000000000000000000000000000000000000", + "l1AlephZeroERC20GatewayRouter": "0x0000000000000000000000000000000000000000", + "donationBox": "0x74f00724075443Cbbf55129F17CbAB0F77bA0722", + "hubPoolStore": "0x0000000000000000000000000000000000000000", + "zkBridgeHub": "0x236D1c3Ff32Bd0Ca26b72Af287E895627c0478cE", + "zkUsdcSharedBridge_232": "0x0000000000000000000000000000000000000000", + "zkUsdcSharedBridge_324": "0x0000000000000000000000000000000000000000" + } + }, + "opStackAddresses": { + "MAINNET": { + "BASE": { + "L1CrossDomainMessenger": "0x866E82a600A1414e583f7F13623F1aC5d58b0Afa", + "L1StandardBridge": "0x3154Cf16ccdb4C6d922629664174b904d80F2C35", + "L1BlastBridge": "0x0000000000000000000000000000000000000000", + "L1OpUSDCBridgeAdapter": "0x0000000000000000000000000000000000000000" + }, + "BOBA": { + "L1CrossDomainMessenger": "0x6D4528d192dB72E282265D6092F4B872f9Dff69e", + "L1StandardBridge": "0xdc1664458d2f0B6090bEa60A8793A4E66c2F1c00", + "L1BlastBridge": "0x0000000000000000000000000000000000000000", + "L1OpUSDCBridgeAdapter": "0x0000000000000000000000000000000000000000" + }, + "BLAST": { + "L1CrossDomainMessenger": "0x5D4472f31Bd9385709ec61305AFc749F0fA8e9d0", + "L1StandardBridge": "0x697402166Fbf2F22E970df8a6486Ef171dbfc524", + "L1BlastBridge": "0x3a05E5d33d7Ab3864D53aaEc93c8301C1Fa49115", + "L1OpUSDCBridgeAdapter": "0x0000000000000000000000000000000000000000" + }, + "UNICHAIN": { + "L1CrossDomainMessenger": "0x9A3D64E386C18Cb1d6d5179a9596A4B5736e98A6", + "L1StandardBridge": "0x81014F44b0a345033bB2b3B21C7a1A308B35fEeA", + "L1BlastBridge": "0x0000000000000000000000000000000000000000", + "L1OpUSDCBridgeAdapter": "0x0000000000000000000000000000000000000000" + }, + "INK": { + "L1CrossDomainMessenger": "0x69d3Cf86B2Bf1a9e99875B7e2D9B6a84426c171f", + "L1StandardBridge": "0x88FF1e5b602916615391F55854588EFcBB7663f0", + "L1BlastBridge": "0x0000000000000000000000000000000000000000", + "L1OpUSDCBridgeAdapter": "0x0000000000000000000000000000000000000000" + }, + "LISK": { + "L1CrossDomainMessenger": "0x31B72D76FB666844C41EdF08dF0254875Dbb7edB", + "L1StandardBridge": "0x2658723Bf70c7667De6B25F99fcce13A16D25d08", + "L1BlastBridge": "0x0000000000000000000000000000000000000000", + "L1OpUSDCBridgeAdapter": "0xE3622468Ea7dD804702B56ca2a4f88C0936995e6" + }, + "MODE": { + "L1CrossDomainMessenger": "0x95bDCA6c8EdEB69C98Bd5bd17660BaCef1298A6f", + "L1StandardBridge": "0x735aDBbE72226BD52e818E7181953f42E3b0FF21", + "L1BlastBridge": "0x0000000000000000000000000000000000000000", + "L1OpUSDCBridgeAdapter": "0x0000000000000000000000000000000000000000" + }, + "OPTIMISM": { + "L1CrossDomainMessenger": "0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1", + "L1StandardBridge": "0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1", + "L1BlastBridge": "0x0000000000000000000000000000000000000000", + "L1OpUSDCBridgeAdapter": "0x0000000000000000000000000000000000000000" + }, + "REDSTONE": { + "L1CrossDomainMessenger": "0x592C1299e0F8331D81A28C0FC7352Da24eDB444a", + "L1StandardBridge": "0xc473ca7E02af24c129c2eEf51F2aDf0411c1Df69", + "L1BlastBridge": "0x0000000000000000000000000000000000000000", + "L1OpUSDCBridgeAdapter": "0x0000000000000000000000000000000000000000" + }, + "SONEIUM": { + "L1CrossDomainMessenger": "0x9CF951E3F74B644e621b36Ca9cea147a78D4c39f", + "L1StandardBridge": "0xeb9bf100225c214Efc3E7C651ebbaDcF85177607", + "L1BlastBridge": "0x0000000000000000000000000000000000000000", + "L1OpUSDCBridgeAdapter": "0xC67A8c5f22b40274Ca7C4A56Db89569Ee2AD3FAb" + }, + "WORLD_CHAIN": { + "L1CrossDomainMessenger": "0xf931a81D18B1766d15695ffc7c1920a62b7e710a", + "L1StandardBridge": "0x470458C91978D2d929704489Ad730DC3E3001113", + "L1BlastBridge": "0x0000000000000000000000000000000000000000", + "L1OpUSDCBridgeAdapter": "0x153A69e4bb6fEDBbAaF463CB982416316c84B2dB" + }, + "ZORA": { + "L1CrossDomainMessenger": "0xdC40a14d9abd6F410226f1E6de71aE03441ca506", + "L1StandardBridge": "0x3e2Ea9B92B7E48A52296fD261dc26fd995284631", + "L1BlastBridge": "0x0000000000000000000000000000000000000000", + "L1OpUSDCBridgeAdapter": "0x0000000000000000000000000000000000000000" + } + }, + "SEPOLIA": { + "BASE_SEPOLIA": { + "L1CrossDomainMessenger": "0xC34855F4De64F1840e5686e64278da901e261f20", + "L1StandardBridge": "0xfd0Bf71F60660E2f608ed56e1659C450eB113120", + "L1BlastBridge": "0x0000000000000000000000000000000000000000", + "L1OpUSDCBridgeAdapter": "0x0000000000000000000000000000000000000000" + }, + "BLAST_SEPOLIA": { + "L1CrossDomainMessenger": "0x9338F298F29D3918D5D1Feb209aeB9915CC96333", + "L1StandardBridge": "0xDeDa8D3CCf044fE2A16217846B6e1f1cfD8e122f", + "L1BlastBridge": "0xc644cc19d2A9388b71dd1dEde07cFFC73237Dca8", + "L1OpUSDCBridgeAdapter": "0x0000000000000000000000000000000000000000" + }, + "LISK_SEPOLIA": { + "L1CrossDomainMessenger": "0x857824E6234f7733ecA4e9A76804fd1afa1A3A2C", + "L1StandardBridge": "0x1Fb30e446eA791cd1f011675E5F3f5311b70faF5", + "L1BlastBridge": "0x0000000000000000000000000000000000000000", + "L1OpUSDCBridgeAdapter": "0x0000000000000000000000000000000000000000" + }, + "MODE_SEPOLIA": { + "L1CrossDomainMessenger": "0xc19a60d9E8C27B9A43527c3283B4dd8eDC8bE15C", + "L1StandardBridge": "0xbC5C679879B2965296756CD959C3C739769995E2", + "L1BlastBridge": "0x0000000000000000000000000000000000000000", + "L1OpUSDCBridgeAdapter": "0x0000000000000000000000000000000000000000" + }, + "OPTIMISM_SEPOLIA": { + "L1CrossDomainMessenger": "0x58Cc85b8D04EA49cC6DBd3CbFFd00B4B8D6cb3ef", + "L1StandardBridge": "0xFBb0621E0B23b5478B630BD55a5f21f67730B0F1", + "L1BlastBridge": "0x0000000000000000000000000000000000000000", + "L1OpUSDCBridgeAdapter": "0x0000000000000000000000000000000000000000" + }, + "UNICHAIN_SEPOLIA": { + "L1CrossDomainMessenger": "0x448A37330A60494E666F6DD60aD48d930AEbA381", + "L1StandardBridge": "0xea58fcA6849d79EAd1f26608855c2D6407d54Ce2", + "L1BlastBridge": "0x0000000000000000000000000000000000000000", + "L1OpUSDCBridgeAdapter": "0x0000000000000000000000000000000000000000" + } + } + }, + "circleDomainIds": { + "MAINNET": 0, + "ARBITRUM": 3, + "OPTIMISM": 2, + "BASE": 6, + "POLYGON": 7, + "LINEA": 8, + "UNICHAIN": 9, + "BLAST": 10, + "SEPOLIA": 0, + "ARBITRUM_SEPOLIA": 0, + "OPTIMISM_SEPOLIA": 0, + "BASE_SEPOLIA": 0, + "POLYGON_AMOY": 0, + "UNICHAIN_SEPOLIA": 0, + "BLAST_SEPOLIA": 0 + }, + "timeConstants": { + "QUOTE_TIME_BUFFER": 3600, + "FILL_DEADLINE_BUFFER": 21600 + }, + "otherConstants": { + "ZERO_ADDRESS": "0x0000000000000000000000000000000000000000" + } +} diff --git a/script/extract_foundry_addresses.sh b/script/extract_foundry_addresses.sh new file mode 100755 index 000000000..491a56427 --- /dev/null +++ b/script/extract_foundry_addresses.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +# Extract deployed contract addresses from Foundry broadcast files using TypeScript +# This script reads from the broadcast folder and generates files with the latest +# deployed smart contract addresses. + +set -e + +# Get the directory where this script is located +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" + +echo "Extracting deployed contract addresses using TypeScript..." +echo "Project root: $PROJECT_ROOT" + +# Check if TypeScript is available +if ! command -v npx &> /dev/null; then + echo "Error: npx is not available. Please install Node.js and npm." + exit 1 +fi + +# Run the TypeScript script using ts-node +if command -v ts-node &> /dev/null; then + echo "Using ts-node to run TypeScript script..." + ts-node "$PROJECT_ROOT/script/ExtractDeployedFoundryAddresses.ts" +elif command -v npx &> /dev/null; then + echo "Using npx ts-node to run TypeScript script..." + npx ts-node "$PROJECT_ROOT/script/ExtractDeployedFoundryAddresses.ts" +else + echo "Error: ts-node is not available. Please install it with: npm install -g ts-node" + echo "Or install it locally: npm install --save-dev ts-node" + exit 1 +fi + +echo "" +echo "Generated files:" +echo " - $PROJECT_ROOT/broadcast/deployed-addresses.md (Markdown format)" +echo " - $PROJECT_ROOT/broadcast/deployed-addresses.json (JSON format)" +echo " - $PROJECT_ROOT/script/DeployedAddresses.sol (Foundry smart contract with all addresses)" +echo "" +echo "You can now import DeployedAddresses.sol in your other Foundry scripts to use the deployed addresses." \ No newline at end of file diff --git a/test/evm/foundry/local/Blast_DaiRetriever.t.sol b/test/evm/foundry/local/Blast_DaiRetriever.t.sol index f6c356956..af506683e 100644 --- a/test/evm/foundry/local/Blast_DaiRetriever.t.sol +++ b/test/evm/foundry/local/Blast_DaiRetriever.t.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.0; import { Test } from "forge-std/Test.sol"; -import { MockERC20 } from "forge-std/mocks/MockERC20.sol"; import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; diff --git a/test/evm/foundry/local/Forwarder.t.sol b/test/evm/foundry/local/Forwarder.t.sol index 5ff33cfad..3a7d5d4a7 100644 --- a/test/evm/foundry/local/Forwarder.t.sol +++ b/test/evm/foundry/local/Forwarder.t.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.0; import { Test } from "forge-std/Test.sol"; -import { MockERC20 } from "forge-std/mocks/MockERC20.sol"; import { ERC20, IERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import { IERC20Upgradeable } from "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; diff --git a/test/evm/foundry/local/Router_Adapter.t.sol b/test/evm/foundry/local/Router_Adapter.t.sol index 9059c71e9..feb1b8143 100644 --- a/test/evm/foundry/local/Router_Adapter.t.sol +++ b/test/evm/foundry/local/Router_Adapter.t.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.0; import { Test } from "forge-std/Test.sol"; -import { MockERC20 } from "forge-std/mocks/MockERC20.sol"; import { ERC20, IERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import { IERC20Upgradeable } from "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; diff --git a/test/evm/foundry/local/ZkStack_Adapter.t.sol b/test/evm/foundry/local/ZkStack_Adapter.t.sol index 3c9a49a8a..cbf9164a8 100644 --- a/test/evm/foundry/local/ZkStack_Adapter.t.sol +++ b/test/evm/foundry/local/ZkStack_Adapter.t.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.0; import { Test } from "forge-std/Test.sol"; -import { MockERC20 } from "forge-std/mocks/MockERC20.sol"; import { ERC20, IERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import { IERC20Upgradeable } from "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; diff --git a/yarn.lock b/yarn.lock index e680c2a94..622f1a544 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2231,6 +2231,11 @@ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.6.tgz#2a880a24eb19b4f8b25adc2a5095f2aa27f39677" integrity sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA== +"@openzeppelin/foundry-upgrades@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/foundry-upgrades/-/foundry-upgrades-0.4.0.tgz#dfab3741e94971429789a37a9633be4f6a79344c" + integrity sha512-x9wxogNteR5rdDzh5d/XnINR+ncUdPsCLWud99ULCa1pNNqRVPYMadr6iEVmjdTEy/4keIgbHwLB0rw2zXiRyQ== + "@openzeppelin/hardhat-upgrades@^1.22.0": version "1.22.0" resolved "https://registry.yarnpkg.com/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-1.22.0.tgz#2a432c72a428a9f277201646bc1a248021538f06"