diff --git a/deterministicConfig/factoryProxy/params.json b/deterministicConfig/factoryProxy/params.json new file mode 100644 index 000000000..ba250ba45 --- /dev/null +++ b/deterministicConfig/factoryProxy/params.json @@ -0,0 +1,10 @@ +{ + "deployerAddress": "0x9444390c01Dd5b7249E53FAc31290F7dFF53450D", + "deterministicProxyAddress": "0x77777717174B0c89e0D284C5aF9Eca37C0f20eB5", + "proxyCreationCode": "0x604060808152346102185761041b908138038061001b8161021d565b93843982019181818403126102185780516001600160a01b038116808203610218576020838101516001600160401b0394919391858211610218570186601f820112156102185780519061007661007183610258565b61021d565b91808352858301988682840101116102185788866100949301610273565b813b156101be577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b031916841790556000927fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8480a28051158015906101b7575b610110575b855160d1908161034a8239f35b85519460608601908111868210176101a35786978492839261018d9952602788527f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c87890152660819985a5b195960ca1b8a8901525190845af4913d15610199573d9061017f61007183610258565b91825281943d92013e610296565b50803880808080610103565b5060609250610296565b634e487b7160e01b84526041600452602484fd5b50826100fe565b855162461bcd60e51b815260048101859052602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608490fd5b600080fd5b6040519190601f01601f191682016001600160401b0381118382101761024257604052565b634e487b7160e01b600052604160045260246000fd5b6001600160401b03811161024257601f01601f191660200190565b60005b8381106102865750506000910152565b8181015183820152602001610276565b919290156102f857508151156102aa575090565b3b156102b35790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b82519091501561030b5750805190602001fd5b6044604051809262461bcd60e51b82526020600483015261033b8151809281602486015260208686019101610273565b601f01601f19168101030190fdfe608060405236156054577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc54600090819081906001600160a01b0316368280378136915af43d82803e156050573d90f35b3d90fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc54600090819081906001600160a01b0316368280378136915af43d82803e156050573d90f3fea26469706673582212206025166eeb4ada632b54cc380a4ace3ecc81b0f2ed030f2e6feb8f47e8aa935264736f6c63430008110033", + "proxyDeployerAddress": "0x13c30fcbF4c50b7036881FC67Dd2E4c0068DA566", + "proxyDeployerCreationCode": "0x61016080604052346200016157620000178162000166565b601a8152602081017f44657465726d696e697374696350726f78794465706c6f796572000000000000815260405191620000518362000166565b6001835260208301603160f81b81526200006b8262000182565b926101209384526200007d8562000355565b92610140938452519020938460e05251902091610100938385524660a0526040519360208501917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8352604086015260608501524660808501523060a085015260a0845260c084019380851060018060401b038611176200014b57846040525190206080523060c052611654938462000503853960805184610be4015260a05184610caf015260c05184610bae015260e05184610c3301525183610c590152518260e8015251816101120152f35b634e487b7160e01b600052604160045260246000fd5b600080fd5b604081019081106001600160401b038211176200014b57604052565b8051602091908281101562000221575090601f825111620001c05780825192015190808310620001b157501790565b82600019910360031b1b161790565b90604051809263305a27a960e01b82528060048301528251908160248401526000935b82851062000207575050604492506000838284010152601f80199101168101030190fd5b8481018201518686016044015293810193859350620001e3565b6001600160401b0381116200014b576000928354926001938481811c911680156200034a575b838210146200033657601f811162000300575b5081601f841160011462000299575092829391839286946200028d575b50501b916000199060031b1c191617905560ff90565b01519250388062000277565b919083601f1981168780528488209488905b88838310620002e55750505010620002cb575b505050811b01905560ff90565b015160001960f88460031b161c19169055388080620002be565b858701518855909601959485019487935090810190620002ab565b85805284601f848820920160051c820191601f860160051c015b8281106200032a5750506200025a565b8781550185906200031a565b634e487b7160e01b86526022600452602486fd5b90607f169062000247565b805160209081811015620003e35750601f825111620003825780825192015190808310620001b157501790565b90604051809263305a27a960e01b82528060048301528251908160248401526000935b828510620003c9575050604492506000838284010152601f80199101168101030190fd5b8481018201518686016044015293810193859350620003a5565b9192916001600160401b0381116200014b5760019182548381811c91168015620004f7575b82821014620004e157601f8111620004a8575b5080601f83116001146200045b5750819293946000926200044f575b5050600019600383901b1c191690821b17905560ff90565b01519050388062000437565b90601f198316958460005282600020926000905b888210620004905750508385969710620002cb57505050811b01905560ff90565b8087859682949686015181550195019301906200046f565b8360005283601f83600020920160051c820191601f850160051c015b828110620004d45750506200041b565b60008155018490620004c4565b634e487b7160e01b600052602260045260246000fd5b90607f16906200040856fe6040608081526004908136101561001557600080fd5b600091823560e01c80633486f857146104fe5780634e486aab146104a95780637621fd67146104465780637ff95ee8146101ef57806384b0196e146100d15763a2c8dd9e1461006357600080fd5b346100cd5760603660031901126100cd576001600160401b036024358181116100c957610093903690840161060c565b9190946044359182116100c6575091602094916100b66100bf943690840161060c565b93909235610cd5565b9051908152f35b80fd5b8480fd5b8280fd5b5090346100cd57826003193601126100cd5761010c7f0000000000000000000000000000000000000000000000000000000000000000610717565b926101367f000000000000000000000000000000000000000000000000000000000000000061081f565b90825192602092838501958587106001600160401b038811176101da57509280610190838896610183998b9996528686528151998a99600f60f81b8b5260e0868c015260e08b019061068d565b91898303908a015261068d565b924660608801523060808801528460a088015286840360c088015251928381520193925b8281106101c357505050500390f35b8351855286955093810193928101926001016101b4565b604190634e487b7160e01b6000525260246000fd5b5090346100cd5760e03660031901126100cd5760248035928035916001600160401b036044358181116103f057610229903690850161060c565b94909161023461063e565b9761023d610654565b9360a4359760018060a01b0394858a16998a81036104425760c43586811161043e576102a161029986610293898f6102a6978f8b61028261028b948d9b36910161060c565b9790958b610af8565b9236916108ef565b90610a3b565b919091610926565b610e0d565b8a51610763808201908282108883111761042b578f928092602092610ebc8339308152030191f5908115610421578a51928660208501931683528b808501528d60608501526060845260808401958487109087111761040f576020610343948f88958f868c9b9761033e978d9c99610332945260a087013784019160a08301938452845193849161066a565b010380855201836106f6565b610d61565b98169716968088036103f45750863b156103f0578551631b2ce7f360e11b815291168382015286818381838a5af180156103e6576103d1575b50908591853b156100cd57845193849263189acdbd60e31b84528301528183875af180156103c7576103b3575b6020838351908152f35b6103bd84916106b2565b6100cd57826103a9565b82513d86823e3d90fd5b6103de90969192966106b2565b94903861037c565b85513d89823e3d90fd5b8780fd5b8488856044938a51936312ae30e560e01b8552840152820152fd5b634e487b7160e01b8e5260418a52888efd5b8a513d8e823e3d90fd5b50634e487b7160e01b8f5260418b52898ffd5b8e80fd5b8d80fd5b5082346100c657826003193601126100c657602435906001600160401b0382116100c6576020610499856104918661048a6104833689840161060c565b36916108ef565b9035610a3b565b929092610926565b516001600160a01b039091168152f35b5091346100c65760a03660031901126100c657604435906001600160401b0382116100c657506020926104e26100bf923690830161060c565b6104ea61063e565b916104f3610654565b936024359035610af8565b50919034610608576080366003190112610608576001600160401b039183356024358481116100cd57610534903690870161060c565b91906044358681116100c95761054d903690890161060c565b9390966064359081116106045792610594859361059a93610483846102a16102998f9b8f610293908f9e8f9e61028b916105899136910161060c565b9490928a8c8a610cd5565b90610d61565b9581865192839283378101838152039082875af1903d156105fe573d906105c0826108d4565b916105cd855193846106f6565b825260203d92013e5b156105ef57516001600160a01b03909116815260209150f35b5163dc94ae4b60e01b81529050fd5b506105d6565b8580fd5b5080fd5b9181601f84011215610639578235916001600160401b038311610639576020838186019501011161063957565b600080fd5b606435906001600160a01b038216820361063957565b608435906001600160a01b038216820361063957565b60005b83811061067d5750506000910152565b818101518382015260200161066d565b906020916106a68151809281855285808601910161066a565b601f01601f1916010190565b6001600160401b0381116106c557604052565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b038211176106c557604052565b90601f801991011681019081106001600160401b038211176106c557604052565b60ff81146107555760ff811690601f82116107435760405191610739836106db565b8252602082015290565b604051632cd44ac360e21b8152600490fd5b506040516000805490600182811c90808416938415610815575b602094858410811461080157838752869493929181156107e157506001146107a3575b50506107a0925003826106f6565b90565b600080805285812095935091905b8183106107c95750506107a093508201013880610792565b855487840185015294850194869450918301916107b1565b9150506107a094925060ff191682840152151560051b8201013880610792565b634e487b7160e01b85526022600452602485fd5b91607f169161076f565b60ff81146108415760ff811690601f82116107435760405191610739836106db565b50604051600060019081549182811c908084169384156108ca575b602094858410811461080157838752869493929181156107e1575060011461088c5750506107a0925003826106f6565b600081815285812095935091905b8183106108b25750506107a093508201013880610792565b8554878401850152948501948694509183019161089a565b91607f169161085c565b6001600160401b0381116106c557601f01601f191660200190565b9291926108fb826108d4565b9161090960405193846106f6565b829481845281830111610639578281602093846000960137010152565b6005811015610a2557806109375750565b6001810361097f5760405162461bcd60e51b815260206004820152601860248201527745434453413a20696e76616c6964207369676e617475726560401b6044820152606490fd5b600281036109cc5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b6003146109d557565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b634e487b7160e01b600052602160045260246000fd5b906041815114600014610a6957610a65916020820151906060604084015193015160001a90610a73565b9091565b5050600090600290565b9291906fa2a8918ca85bafe22016d0b997e4df60600160ff1b038311610aec5791608094939160ff602094604051948552168484015260408301526060820152600093849182805260015afa15610adf5781516001600160a01b03811615610ad9579190565b50600190565b50604051903d90823e3d90fd5b50505050600090600390565b939291610b0891959236916108ef565b602081519101206040519460208601947f4f2bfcc23c1adbe54973f469f111f1848a62d32cc4a906c7a5ced17481b366ea865260408701526060860152608085015260018060a01b0380921660a08501521660c083015260c0825260e08201918083106001600160401b038411176106c5576107a0926040525190205b604290610b90610bab565b906040519161190160f01b8352600283015260228201522090565b307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161480610cac575b15610c06577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527f000000000000000000000000000000000000000000000000000000000000000060408201527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260a0815260c081018181106001600160401b038211176106c55760405251902090565b507f00000000000000000000000000000000000000000000000000000000000000004614610bdd565b9290610ce690610cf59336916108ef565b602081519101209336916108ef565b602081519101206040519260208401927f11ebd6670048529a84d03c14cb6bf8539a7ce6288dd624a22bb7111cacc9358e84526040850152606084015260808301526080825260a08201918083106001600160401b038411176106c5576107a092604052519020610b85565b90805115610dc9576020815191016000f5906001600160a01b03821615610d8457565b60405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606490fd5b606460405162461bcd60e51b815260206004820152602060248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152fd5b60018060a01b03168160601c14908115610ea3575b5015610e2a57565b60405162461bcd60e51b815260206004820152604560248201527f496e76616c69642073616c74202d206669727374203230206279746573206f6660448201527f207468652073616c74206d757374206d617463682063616c6c696e67206164646064820152643932b9b99760d91b608482015260a490fd5b6bffffffffffffffffffffffff191615905038610e2256fe60c03461008b57601f61076338819003918201601f19168301916001600160401b038311848410176100905780849260209460405283398101031261008b57516001600160a01b038116810361008b573060805260a0526040516106bc90816100a782396080518181816058015281816101280152610394015260a05181818161016d01526103da0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060408181526004918236101561001657600080fd5b600090813560e01c9081633659cfe61461036a575080634f1ef286146100ad576352d1902d1461004557600080fd5b346100aa57806003193601126100aa57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316300361009d57602090516000805160206106678339815191528152f35b51635e4c25f160e01b8152fd5b80fd5b509080600319360112610366576100c2610587565b9060243567ffffffffffffffff811161036257366023820112156103625780850135906100ee826105da565b6100fa845191826105a2565b8281526020928382019236602483830101116103035781889260248793018637830101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116903082146103525760008051602061066783398151915291818354160361034257807f000000000000000000000000000000000000000000000000000000000000000016330361030e577f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156101d1575050505050506101ce9192506105f6565b80f35b86979597169087516352d1902d60e01b815285818b81865afa8791816102db575b5061020757885163e5ec176960e01b81528a90fd5b989293949698979597036102cc5761021e886105f6565b8451907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8880a28251158015906102c4575b610260575b505050505050905080f35b873b156102b857505093809581926102a19651915af4903d156102ae573d61029361028a826105da565b925192836105a2565b81528481933d92013e61063d565b5080388080808080610255565b506060915061063d565b63369891e760e01b8152fd5b506001610250565b5083516308373ebf60e41b8152fd5b9091508681813d8311610307575b6102f381836105a2565b81010312610303575190386101f2565b8780fd5b503d6102e9565b855162461bcd60e51b8152808a01869052600e60248201526d1b9bdd08185d5d1a1bdc9a5e995960921b6044820152606490fd5b85516364cd8d1960e01b81528990fd5b8551631932df4560e01b81528990fd5b8380fd5b5080fd5b91929050346105835760208060031936011261036257610388610587565b926001600160a01b03907f0000000000000000000000000000000000000000000000000000000000000000821690308214610575575060008051602061066783398151915290828254160361056557817f0000000000000000000000000000000000000000000000000000000000000000163303610531578351908382019282841067ffffffffffffffff85111761051e578386528783527f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561045b575050505050506101ce9192506105f6565b86979597169087516352d1902d60e01b815285818b81865afa8791816104ef575b5061049157885163e5ec176960e01b81528a90fd5b989293949698979597036102cc576104a8886105f6565b8451907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8880a28251158015906104e85761026057505050505050905080f35b5086610250565b9091508681813d8311610517575b61050781836105a2565b810103126103035751903861047c565b503d6104fd565b634e487b7160e01b885260418952602488fd5b835162461bcd60e51b8152808801849052600e60248201526d1b9bdd08185d5d1a1bdc9a5e995960921b6044820152606490fd5b83516364cd8d1960e01b81528790fd5b631932df4560e01b81528790fd5b8280fd5b600435906001600160a01b038216820361059d57565b600080fd5b90601f8019910116810190811067ffffffffffffffff8211176105c457604052565b634e487b7160e01b600052604160045260246000fd5b67ffffffffffffffff81116105c457601f01601f191660200190565b803b1561062b5760008051602061066783398151915280546001600160a01b0319166001600160a01b03909216919091179055565b60405163529880eb60e01b8152600490fd5b156106455790565b80511561065457805190602001fd5b6040516350a28c9b60e11b8152600490fdfe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca264697066735822122045956a6c2f86f27f4001483acf6a61195441ac40433c504ce3ac6d6bef8b1b1864736f6c63430008110033a2646970667358221220114f022292a418cbe0db59aa75af37529b0c83b91c282cd1b5df40001ca338e364736f6c63430008110033", + "proxyDeployerSalt": "0x0000000000000000000000000000000000000000668d7f9ec18e35000dbaba0e", + "proxySalt": "0x330a1b759446fcaf321db98337cb4c9aef25c4a0660186f405dc35e33bc8f900", + "proxyShimSalt": "0x9444390c01dd5b7249e53fac31290f7dff53450d000000000000000000000064" +} \ No newline at end of file diff --git a/deterministicConfig/premintExecutorProxy/params.json b/deterministicConfig/premintExecutorProxy/params.json new file mode 100644 index 000000000..3f25d8cdd --- /dev/null +++ b/deterministicConfig/premintExecutorProxy/params.json @@ -0,0 +1,10 @@ +{ + "deployerAddress": "0x9444390c01Dd5b7249E53FAc31290F7dFF53450D", + "deterministicProxyAddress": "0x777777AEEb23414EC2DAEBE5899EF97157379bdf", + "proxyCreationCode": "0x604060808152346102185761041b908138038061001b8161021d565b93843982019181818403126102185780516001600160a01b038116808203610218576020838101516001600160401b0394919391858211610218570186601f820112156102185780519061007661007183610258565b61021d565b91808352858301988682840101116102185788866100949301610273565b813b156101be577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b031916841790556000927fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8480a28051158015906101b7575b610110575b855160d1908161034a8239f35b85519460608601908111868210176101a35786978492839261018d9952602788527f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c87890152660819985a5b195960ca1b8a8901525190845af4913d15610199573d9061017f61007183610258565b91825281943d92013e610296565b50803880808080610103565b5060609250610296565b634e487b7160e01b84526041600452602484fd5b50826100fe565b855162461bcd60e51b815260048101859052602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608490fd5b600080fd5b6040519190601f01601f191682016001600160401b0381118382101761024257604052565b634e487b7160e01b600052604160045260246000fd5b6001600160401b03811161024257601f01601f191660200190565b60005b8381106102865750506000910152565b8181015183820152602001610276565b919290156102f857508151156102aa575090565b3b156102b35790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b82519091501561030b5750805190602001fd5b6044604051809262461bcd60e51b82526020600483015261033b8151809281602486015260208686019101610273565b601f01601f19168101030190fdfe608060405236156054577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc54600090819081906001600160a01b0316368280378136915af43d82803e156050573d90f35b3d90fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc54600090819081906001600160a01b0316368280378136915af43d82803e156050573d90f3fea26469706673582212206c4dcbca55999ff942c0fb847439fecf042b44555b3c49500e153a99fd59cb8964736f6c63430008110033", + "proxyDeployerAddress": "0x13c30fcbF4c50b7036881FC67Dd2E4c0068DA566", + "proxyDeployerCreationCode": "0x61016080604052346200016157620000178162000166565b601a8152602081017f44657465726d696e697374696350726f78794465706c6f796572000000000000815260405191620000518362000166565b6001835260208301603160f81b81526200006b8262000182565b926101209384526200007d8562000355565b92610140938452519020938460e05251902091610100938385524660a0526040519360208501917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8352604086015260608501524660808501523060a085015260a0845260c084019380851060018060401b038611176200014b57846040525190206080523060c052611654938462000503853960805184610be4015260a05184610caf015260c05184610bae015260e05184610c3301525183610c590152518260e8015251816101120152f35b634e487b7160e01b600052604160045260246000fd5b600080fd5b604081019081106001600160401b038211176200014b57604052565b8051602091908281101562000221575090601f825111620001c05780825192015190808310620001b157501790565b82600019910360031b1b161790565b90604051809263305a27a960e01b82528060048301528251908160248401526000935b82851062000207575050604492506000838284010152601f80199101168101030190fd5b8481018201518686016044015293810193859350620001e3565b6001600160401b0381116200014b576000928354926001938481811c911680156200034a575b838210146200033657601f811162000300575b5081601f841160011462000299575092829391839286946200028d575b50501b916000199060031b1c191617905560ff90565b01519250388062000277565b919083601f1981168780528488209488905b88838310620002e55750505010620002cb575b505050811b01905560ff90565b015160001960f88460031b161c19169055388080620002be565b858701518855909601959485019487935090810190620002ab565b85805284601f848820920160051c820191601f860160051c015b8281106200032a5750506200025a565b8781550185906200031a565b634e487b7160e01b86526022600452602486fd5b90607f169062000247565b805160209081811015620003e35750601f825111620003825780825192015190808310620001b157501790565b90604051809263305a27a960e01b82528060048301528251908160248401526000935b828510620003c9575050604492506000838284010152601f80199101168101030190fd5b8481018201518686016044015293810193859350620003a5565b9192916001600160401b0381116200014b5760019182548381811c91168015620004f7575b82821014620004e157601f8111620004a8575b5080601f83116001146200045b5750819293946000926200044f575b5050600019600383901b1c191690821b17905560ff90565b01519050388062000437565b90601f198316958460005282600020926000905b888210620004905750508385969710620002cb57505050811b01905560ff90565b8087859682949686015181550195019301906200046f565b8360005283601f83600020920160051c820191601f850160051c015b828110620004d45750506200041b565b60008155018490620004c4565b634e487b7160e01b600052602260045260246000fd5b90607f16906200040856fe6040608081526004908136101561001557600080fd5b600091823560e01c80633486f857146104fe5780634e486aab146104a95780637621fd67146104465780637ff95ee8146101ef57806384b0196e146100d15763a2c8dd9e1461006357600080fd5b346100cd5760603660031901126100cd576001600160401b036024358181116100c957610093903690840161060c565b9190946044359182116100c6575091602094916100b66100bf943690840161060c565b93909235610cd5565b9051908152f35b80fd5b8480fd5b8280fd5b5090346100cd57826003193601126100cd5761010c7f0000000000000000000000000000000000000000000000000000000000000000610717565b926101367f000000000000000000000000000000000000000000000000000000000000000061081f565b90825192602092838501958587106001600160401b038811176101da57509280610190838896610183998b9996528686528151998a99600f60f81b8b5260e0868c015260e08b019061068d565b91898303908a015261068d565b924660608801523060808801528460a088015286840360c088015251928381520193925b8281106101c357505050500390f35b8351855286955093810193928101926001016101b4565b604190634e487b7160e01b6000525260246000fd5b5090346100cd5760e03660031901126100cd5760248035928035916001600160401b036044358181116103f057610229903690850161060c565b94909161023461063e565b9761023d610654565b9360a4359760018060a01b0394858a16998a81036104425760c43586811161043e576102a161029986610293898f6102a6978f8b61028261028b948d9b36910161060c565b9790958b610af8565b9236916108ef565b90610a3b565b919091610926565b610e0d565b8a51610763808201908282108883111761042b578f928092602092610ebc8339308152030191f5908115610421578a51928660208501931683528b808501528d60608501526060845260808401958487109087111761040f576020610343948f88958f868c9b9761033e978d9c99610332945260a087013784019160a08301938452845193849161066a565b010380855201836106f6565b610d61565b98169716968088036103f45750863b156103f0578551631b2ce7f360e11b815291168382015286818381838a5af180156103e6576103d1575b50908591853b156100cd57845193849263189acdbd60e31b84528301528183875af180156103c7576103b3575b6020838351908152f35b6103bd84916106b2565b6100cd57826103a9565b82513d86823e3d90fd5b6103de90969192966106b2565b94903861037c565b85513d89823e3d90fd5b8780fd5b8488856044938a51936312ae30e560e01b8552840152820152fd5b634e487b7160e01b8e5260418a52888efd5b8a513d8e823e3d90fd5b50634e487b7160e01b8f5260418b52898ffd5b8e80fd5b8d80fd5b5082346100c657826003193601126100c657602435906001600160401b0382116100c6576020610499856104918661048a6104833689840161060c565b36916108ef565b9035610a3b565b929092610926565b516001600160a01b039091168152f35b5091346100c65760a03660031901126100c657604435906001600160401b0382116100c657506020926104e26100bf923690830161060c565b6104ea61063e565b916104f3610654565b936024359035610af8565b50919034610608576080366003190112610608576001600160401b039183356024358481116100cd57610534903690870161060c565b91906044358681116100c95761054d903690890161060c565b9390966064359081116106045792610594859361059a93610483846102a16102998f9b8f610293908f9e8f9e61028b916105899136910161060c565b9490928a8c8a610cd5565b90610d61565b9581865192839283378101838152039082875af1903d156105fe573d906105c0826108d4565b916105cd855193846106f6565b825260203d92013e5b156105ef57516001600160a01b03909116815260209150f35b5163dc94ae4b60e01b81529050fd5b506105d6565b8580fd5b5080fd5b9181601f84011215610639578235916001600160401b038311610639576020838186019501011161063957565b600080fd5b606435906001600160a01b038216820361063957565b608435906001600160a01b038216820361063957565b60005b83811061067d5750506000910152565b818101518382015260200161066d565b906020916106a68151809281855285808601910161066a565b601f01601f1916010190565b6001600160401b0381116106c557604052565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b038211176106c557604052565b90601f801991011681019081106001600160401b038211176106c557604052565b60ff81146107555760ff811690601f82116107435760405191610739836106db565b8252602082015290565b604051632cd44ac360e21b8152600490fd5b506040516000805490600182811c90808416938415610815575b602094858410811461080157838752869493929181156107e157506001146107a3575b50506107a0925003826106f6565b90565b600080805285812095935091905b8183106107c95750506107a093508201013880610792565b855487840185015294850194869450918301916107b1565b9150506107a094925060ff191682840152151560051b8201013880610792565b634e487b7160e01b85526022600452602485fd5b91607f169161076f565b60ff81146108415760ff811690601f82116107435760405191610739836106db565b50604051600060019081549182811c908084169384156108ca575b602094858410811461080157838752869493929181156107e1575060011461088c5750506107a0925003826106f6565b600081815285812095935091905b8183106108b25750506107a093508201013880610792565b8554878401850152948501948694509183019161089a565b91607f169161085c565b6001600160401b0381116106c557601f01601f191660200190565b9291926108fb826108d4565b9161090960405193846106f6565b829481845281830111610639578281602093846000960137010152565b6005811015610a2557806109375750565b6001810361097f5760405162461bcd60e51b815260206004820152601860248201527745434453413a20696e76616c6964207369676e617475726560401b6044820152606490fd5b600281036109cc5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b6003146109d557565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b634e487b7160e01b600052602160045260246000fd5b906041815114600014610a6957610a65916020820151906060604084015193015160001a90610a73565b9091565b5050600090600290565b9291906fa2a8918ca85bafe22016d0b997e4df60600160ff1b038311610aec5791608094939160ff602094604051948552168484015260408301526060820152600093849182805260015afa15610adf5781516001600160a01b03811615610ad9579190565b50600190565b50604051903d90823e3d90fd5b50505050600090600390565b939291610b0891959236916108ef565b602081519101206040519460208601947f4f2bfcc23c1adbe54973f469f111f1848a62d32cc4a906c7a5ced17481b366ea865260408701526060860152608085015260018060a01b0380921660a08501521660c083015260c0825260e08201918083106001600160401b038411176106c5576107a0926040525190205b604290610b90610bab565b906040519161190160f01b8352600283015260228201522090565b307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161480610cac575b15610c06577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527f000000000000000000000000000000000000000000000000000000000000000060408201527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260a0815260c081018181106001600160401b038211176106c55760405251902090565b507f00000000000000000000000000000000000000000000000000000000000000004614610bdd565b9290610ce690610cf59336916108ef565b602081519101209336916108ef565b602081519101206040519260208401927f11ebd6670048529a84d03c14cb6bf8539a7ce6288dd624a22bb7111cacc9358e84526040850152606084015260808301526080825260a08201918083106001600160401b038411176106c5576107a092604052519020610b85565b90805115610dc9576020815191016000f5906001600160a01b03821615610d8457565b60405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606490fd5b606460405162461bcd60e51b815260206004820152602060248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152fd5b60018060a01b03168160601c14908115610ea3575b5015610e2a57565b60405162461bcd60e51b815260206004820152604560248201527f496e76616c69642073616c74202d206669727374203230206279746573206f6660448201527f207468652073616c74206d757374206d617463682063616c6c696e67206164646064820152643932b9b99760d91b608482015260a490fd5b6bffffffffffffffffffffffff191615905038610e2256fe60c03461008b57601f61076338819003918201601f19168301916001600160401b038311848410176100905780849260209460405283398101031261008b57516001600160a01b038116810361008b573060805260a0526040516106bc90816100a782396080518181816058015281816101280152610394015260a05181818161016d01526103da0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060408181526004918236101561001657600080fd5b600090813560e01c9081633659cfe61461036a575080634f1ef286146100ad576352d1902d1461004557600080fd5b346100aa57806003193601126100aa57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316300361009d57602090516000805160206106678339815191528152f35b51635e4c25f160e01b8152fd5b80fd5b509080600319360112610366576100c2610587565b9060243567ffffffffffffffff811161036257366023820112156103625780850135906100ee826105da565b6100fa845191826105a2565b8281526020928382019236602483830101116103035781889260248793018637830101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116903082146103525760008051602061066783398151915291818354160361034257807f000000000000000000000000000000000000000000000000000000000000000016330361030e577f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156101d1575050505050506101ce9192506105f6565b80f35b86979597169087516352d1902d60e01b815285818b81865afa8791816102db575b5061020757885163e5ec176960e01b81528a90fd5b989293949698979597036102cc5761021e886105f6565b8451907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8880a28251158015906102c4575b610260575b505050505050905080f35b873b156102b857505093809581926102a19651915af4903d156102ae573d61029361028a826105da565b925192836105a2565b81528481933d92013e61063d565b5080388080808080610255565b506060915061063d565b63369891e760e01b8152fd5b506001610250565b5083516308373ebf60e41b8152fd5b9091508681813d8311610307575b6102f381836105a2565b81010312610303575190386101f2565b8780fd5b503d6102e9565b855162461bcd60e51b8152808a01869052600e60248201526d1b9bdd08185d5d1a1bdc9a5e995960921b6044820152606490fd5b85516364cd8d1960e01b81528990fd5b8551631932df4560e01b81528990fd5b8380fd5b5080fd5b91929050346105835760208060031936011261036257610388610587565b926001600160a01b03907f0000000000000000000000000000000000000000000000000000000000000000821690308214610575575060008051602061066783398151915290828254160361056557817f0000000000000000000000000000000000000000000000000000000000000000163303610531578351908382019282841067ffffffffffffffff85111761051e578386528783527f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561045b575050505050506101ce9192506105f6565b86979597169087516352d1902d60e01b815285818b81865afa8791816104ef575b5061049157885163e5ec176960e01b81528a90fd5b989293949698979597036102cc576104a8886105f6565b8451907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8880a28251158015906104e85761026057505050505050905080f35b5086610250565b9091508681813d8311610517575b61050781836105a2565b810103126103035751903861047c565b503d6104fd565b634e487b7160e01b885260418952602488fd5b835162461bcd60e51b8152808801849052600e60248201526d1b9bdd08185d5d1a1bdc9a5e995960921b6044820152606490fd5b83516364cd8d1960e01b81528790fd5b631932df4560e01b81528790fd5b8280fd5b600435906001600160a01b038216820361059d57565b600080fd5b90601f8019910116810190811067ffffffffffffffff8211176105c457604052565b634e487b7160e01b600052604160045260246000fd5b67ffffffffffffffff81116105c457601f01601f191660200190565b803b1561062b5760008051602061066783398151915280546001600160a01b0319166001600160a01b03909216919091179055565b60405163529880eb60e01b8152600490fd5b156106455790565b80511561065457805190602001fd5b6040516350a28c9b60e11b8152600490fdfe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca264697066735822122045956a6c2f86f27f4001483acf6a61195441ac40433c504ce3ac6d6bef8b1b1864736f6c63430008110033a2646970667358221220114f022292a418cbe0db59aa75af37529b0c83b91c282cd1b5df40001ca338e364736f6c63430008110033", + "proxyDeployerSalt": "0x0000000000000000000000000000000000000000668d7f9ec18e35000dbaba0e", + "proxySalt": "0xe9a904b6f24b6191eb1ff70510d198d9fa83709b7c57b7b4dd410fd644d4d20d", + "proxyShimSalt": "0x9444390c01dd5b7249e53fac31290f7dff53450d0000000000000000000000c8" +} \ No newline at end of file diff --git a/deterministicConfig/upgradeGate/params.json b/deterministicConfig/upgradeGate/params.json new file mode 100644 index 000000000..80c319684 --- /dev/null +++ b/deterministicConfig/upgradeGate/params.json @@ -0,0 +1,7 @@ +{ + "creationCode": "0x6080806040523461001657610948908161001c8239f35b600080fdfe6080604081815260048036101561001557600080fd5b600092833560e01c90816321f74347146107b95750806323452b9c14610753578063395db2cd146106d15780634dc5b7c71461068357806375d0c0dc1461062157806379ba5097146105cc5780638da5cb5b146105a457806392b60a4c1461042e578063c4d66de8146102d6578063e30c3978146102ad578063e8a3d48514610211578063ed0c7091146101ac578063f0fad9911461011c5763f2fde38b146100bd57600080fd5b34610118576020366003190112610118576100d6610805565b916001600160a01b038084161561010a5784541633036100fd57836100fa846108a9565b80f35b5163d238ed5960e01b8152fd5b5051631627621f60e11b8152fd5b8280fd5b5034610118578160031936011261011857610135610805565b9161013e610820565b845490936001600160a01b039390918416330361019e57508216918285526035602052818520931692838552602052832060ff1981541690557f0ebd98f6f75e38ba2f0751378f5c86205cafca83e206cb62795f45fcea7283338380a380f35b825163d238ed5960e01b8152fd5b50346101185782600319360112610118578254916001600160a01b039182841691338390036100fd57505083906000805160206108f38339815191528280a36001600160a01b03199182168355600154908116610207578280f35b1660015538808280f35b509190346102a957816003193601126102a957805191606083019083821067ffffffffffffffff831117610296575061029293508152602f82527f68747470733a2f2f6769746875622e636f6d2f6f75727a6f72612f7a6f72612d60208301526e313135352d636f6e7472616374732f60881b818301525191829182610836565b0390f35b634e487b7160e01b815260418552602490fd5b5080fd5b5050346102a957816003193601126102a95760015490516001600160a01b039091168152602090f35b5034610118576020366003190112610118576102f0610805565b6034549060ff8260081c16159182801590610422575b8061040a575b6103fa5760ff198116600117603455826103e8575b506001600160a01b03169283156103d9576034549260ff8460081c16156103cc575084546001600160a01b031916841785555192846000805160206108f38339815191528180a37f0c52cc367a132cac0ea9f3a1e1f75873b17977858812b85c89a9654486e444388480a1610394578280f35b61ff001916603455600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a138808280f35b90516296bfb160e81b8152fd5b51631627621f60e11b81529050fd5b61ffff19166101011760345538610321565b8451633d5c224160e11b81528490fd5b50303b15158061030c5750600160ff8216141561030c565b5060ff81161515610306565b503461011857816003193601126101185780359067ffffffffffffffff8083116105a057366023840112156105a057828201359281841161058d578360051b93855192601f19603f8701168401908482109082111761057a57865282526020936024858401918301019136831161057657602401905b828210610553575050506104b6610820565b855490946001600160a01b039390918416330361054557509293821692855b82518110156105415780846104ec6001938661087f565b51168852603587528288208689528752828820805460ff1916831790558585610515838761087f565b51167fab6a7dc54721d6a1a284ca865830f8981d6f12fbddb3618d1774b71c003680598a80a3016104d5565b8680f35b905163d238ed5960e01b8152fd5b81356001600160a01b03811681036105725781529085019085016104a4565b8880fd5b8780fd5b634e487b7160e01b885260418552602488fd5b634e487b7160e01b865260418352602486fd5b8480fd5b5050346102a957816003193601126102a957905490516001600160a01b039091168152602090f35b50346101185782600319360112610118576001546001600160a01b0392908316330361061457505033908254166000805160206108f38339815191528380a36100fa336108a9565b5163065cd53160e01b8152fd5b509190346102a957816003193601126102a9578051918183019083821067ffffffffffffffff83111761029657506102929350815260168252755a4f524120313135352055706772616465204761746560501b60208301525191829182610836565b5050346102a957806003193601126102a95760ff816020936106a3610805565b6106ab610820565b6001600160a01b0391821683526035875283832091168252855220549151911615158152f35b509034610118576020366003190112610118576001600160a01b0391826106f6610805565b1692831561074457845416918233036100fd575050600180546001600160a01b031916831790557f4f2638f5949b9614ef8d5e268cb51348ad7f434a34812bf64b6e95014fbd357e8380a380f35b509051631627621f60e11b8152fd5b50903461011857826003193601126101185782546001600160a01b039290831691338390036100fd575050600154918216907f682679deecef4dcd49674845cc1e3a075fea9073680aa445a8207d5a4bdea3da8480a36001600160a01b03191660015580f35b8490843461011857806003193601126101185760ff906020936107da610805565b6107e2610820565b6001600160a01b0391821683526035875283832091168252855220541615158152f35b600435906001600160a01b038216820361081b57565b600080fd5b602435906001600160a01b038216820361081b57565b6020808252825181830181905290939260005b82811061086b57505060409293506000838284010152601f8019910116010190565b818101860151848201604001528501610849565b80518210156108935760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b6000549060018060a01b03809116808284166000805160206108f3833981519152600080a36001600160a01b0319928316176000556001549081166108ec575050565b1660015556fe8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76a26469706673582212203688178943b2026721abcfbfcebbb085e4ba140c746a309cdb1069b7b4ee6d7264736f6c63430008110033", + "deployerAddress": "0x9444390c01Dd5b7249E53FAc31290F7dFF53450D", + "proxyDeployerAddress": "0x13c30fcbF4c50b7036881FC67Dd2E4c0068DA566", + "salt": "0x9444390c01dd5b7249e53fac31290f7dff53450d00000000000000000000000a", + "upgradeGateAddress": "0xCE3aDea9fdb1C1ABe71eaDd4Dd0d07C211d5A642" +} \ No newline at end of file diff --git a/package/deployment.ts b/package/deployment.ts index 7d183b352..210077579 100644 --- a/package/deployment.ts +++ b/package/deployment.ts @@ -1,4 +1,4 @@ -import { Address, LocalAccount } from "viem"; +import { Address, LocalAccount, Hex } from "viem"; export type ConfiguredSalt = `0x${string}`; // Load environment variables from `.env.local` @@ -6,7 +6,15 @@ export type DeterministicDeploymentConfig = { proxyDeployerAddress: Address; proxyShimSalt: ConfiguredSalt; proxySalt: ConfiguredSalt; - proxyCreationCode: `0x${string}`; + proxyCreationCode: Hex; +}; + +export type GenericDeploymentConfiguration = { + creationCode: Hex; + salt: Hex; + deployerAddress: Address; + upgradeGateAddress: Address; + proxyDeployerAddress: Address; }; export type DeployedContracts = { @@ -51,3 +59,36 @@ export const signDeployFactory = ({ verifyingContract: config.proxyDeployerAddress, }, }); + +export const signGenericDeploy = ({ + account, + config, + chainId, + initCall, +}: { + account: LocalAccount; + config: GenericDeploymentConfiguration; + initCall: Hex; + chainId: number; +}) => + account.signTypedData({ + types: { + createGenericContract: [ + { name: "salt", type: "bytes32" }, + { name: "creationCode", type: "bytes" }, + { name: "initCall", type: "bytes" }, + ], + }, + message: { + salt: config.salt, + creationCode: config.creationCode, + initCall, + }, + primaryType: "createGenericContract", + domain: { + chainId, + name: "DeterministicProxyDeployer", + version: "1", + verifyingContract: config.proxyDeployerAddress, + }, + }); diff --git a/script/CalculateDeterministicParams.s.sol b/script/CalculateDeterministicParams.s.sol new file mode 100644 index 000000000..9298cf263 --- /dev/null +++ b/script/CalculateDeterministicParams.s.sol @@ -0,0 +1,85 @@ +// spdx-license-identifier: mit +pragma solidity ^0.8.17; + +import "forge-std/Script.sol"; +import "forge-std/console2.sol"; + +import {ZoraDeployerBase} from "./ZoraDeployerBase.sol"; +import {Zora1155Factory} from "../src/proxies/Zora1155Factory.sol"; +import {ProxyShim} from "../src/utils/ProxyShim.sol"; +import {UpgradeGate} from "../src/upgrades/UpgradeGate.sol"; +import {LibString} from "solady/utils/LibString.sol"; +import {Create2} from "@openzeppelin/contracts/utils/Create2.sol"; +import {ZoraDeployerUtils} from "../src/deployment/ZoraDeployerUtils.sol"; +import {Zora1155PremintExecutor} from "../src/proxies/Zora1155PremintExecutor.sol"; +import {DeterministicDeployerScript, DeterministicParams} from "../src/deployment/DeterministicDeployerScript.sol"; +import {DeterministicProxyDeployer} from "../src/deployment/DeterministicProxyDeployer.sol"; +import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; + +/// @title Gets parameters for determinstically deploying a new 1155 factory proxy at an address starting with 0x777777, regardless of the chain. +/// @dev Example usage: DEPLOYER=0xf69fEc6d858c77e969509843852178bd24CAd2B6 forge script script/GetDeterminsticParam.s.sol --rpc-url https://testnet.rpc.zora.energy --ffi +/// @author doved +/// @notice Ensure to set env variable for DEPLOYER +contract FactoryProxyDeterministicParams is ZoraDeployerBase, DeterministicDeployerScript { + address deployerAddress; + // Set in step 2 + address proxyDeployerAddress; + + function run() public { + vm.createSelectFork("zora_goerli", 1252119); + + deployerAddress = vm.envAddress("TURNKEY_TARGET_ADDRESS"); + + calculateForFactoryProxy(); + calculateForPremintExecutorProxy(); + + // Note: relies on proxyDeployerAddress + calculateUpgradeGateAddress(); + } + + function calculateForFactoryProxy() internal { + bytes memory proxyCreationCode = type(Zora1155Factory).creationCode; + + DeterministicParams memory deterministicParams = getDeterministicDeploymentParams(deployerAddress, proxyCreationCode, 100); + + proxyDeployerAddress = deterministicParams.proxyDeployerAddress; + + mkdir("deterministicConfig/factoryProxy"); + serializeAndSaveOutput(deterministicParams, "factoryProxy"); + } + + function calculateForPremintExecutorProxy() internal { + bytes memory proxyCreationCode = type(Zora1155PremintExecutor).creationCode; + + DeterministicParams memory deterministicParams = getDeterministicDeploymentParams(deployerAddress, proxyCreationCode, 200); + + mkdir("deterministicConfig/premintExecutorProxy"); + serializeAndSaveOutput(deterministicParams, "premintExecutorProxy"); + } + + // @notice Since this doesn't + function calculateUpgradeGateAddress() internal { + bytes memory creationCodeUpgradeGate = type(UpgradeGate).creationCode; + bytes32 salt = saltWithAddressInFirst20Bytes(deployerAddress, 10); + address resultAddress = Create2.computeAddress(salt, keccak256(creationCodeUpgradeGate), proxyDeployerAddress); + + vm.serializeAddress("UPGRADE_GATE_JSON", "deployerAddress", deployerAddress); + vm.serializeAddress("UPGRADE_GATE_JSON", "upgradeGateAddress", resultAddress); + vm.serializeAddress("UPGRADE_GATE_JSON", "proxyDeployerAddress", proxyDeployerAddress); + vm.serializeBytes32("UPGRADE_GATE_JSON", "salt", salt); + string memory output = vm.serializeBytes("UPGRADE_GATE_JSON", "creationCode", creationCodeUpgradeGate); + + console2.log(output); + + mkdir("deterministicConfig/upgradeGate"); + vm.writeJson(output, paramsFilePath("upgradeGate")); + } + + function mkdir(string memory path) internal { + string[] memory commands = new string[](3); + commands[0] = "mkdir"; + commands[1] = "-p"; + commands[2] = path; + vm.ffi(commands); + } +} diff --git a/script/DeployNewImplementation.s.sol b/script/DeployNewImplementation.s.sol index d56d005ee..9a54fd5ef 100644 --- a/script/DeployNewImplementation.s.sol +++ b/script/DeployNewImplementation.s.sol @@ -32,6 +32,13 @@ contract DeployNewImplementations is ZoraDeployerBase { console2.log("factoryOwner", chainConfig.factoryOwner); console2.log("protocolRewards", chainConfig.protocolRewards); + deployment.upgradeGate = vm.parseJsonAddress( + vm.readFile("./deterministicDeployments/upgradeGate/params.json"), + ".upgradeGateAddress" + ); + + console2.log("upgradeGateAddress", deployment.upgradeGate); + vm.startBroadcast(); (address factoryImplAddress, address contract1155ImplAddress) = ZoraDeployerUtils.deployNew1155AndFactoryImpl( diff --git a/script/DeployNewProxies.s.sol b/script/DeployNewProxies.s.sol index 74579427a..9dd726c29 100644 --- a/script/DeployNewProxies.s.sol +++ b/script/DeployNewProxies.s.sol @@ -25,6 +25,14 @@ contract DeployNewProxies is ZoraDeployerBase, DeterministicDeployerScript { // get signing instructions vm.startBroadcast(deployerPrivateKey); + // Sanity check to make sure that the factory owner is a smart contract. + // This may catch cross-chain data copy mistakes where there is no safe at the desired admin address. + if ( + address(chainConfig.factoryOwner).code.length == 0 + ) { + revert("FactoryOwner should be a contract. See DeployNewProxies:31."); + } + address factoryProxyAddress = deployDeterministicProxy({ proxyName: "factoryProxy", implementation: deployment.factoryImpl, @@ -39,10 +47,16 @@ contract DeployNewProxies is ZoraDeployerBase, DeterministicDeployerScript { chain: chain }); + address upgradeGateAddress = deployUpgradeGate({ + chain: chain, + upgradeGateOwner: chainConfig.factoryOwner + }); + vm.stopBroadcast(); deployment.factoryProxy = factoryProxyAddress; deployment.preminterProxy = preminterProxyAddress; + deployment.upgradeGate = upgradeGateAddress; return getDeploymentJSON(deployment); } diff --git a/script/DeployMinters.s.sol b/script/DeployerMintersScript.s.sol similarity index 98% rename from script/DeployMinters.s.sol rename to script/DeployerMintersScript.s.sol index 3458314ab..df4c9e4e6 100644 --- a/script/DeployMinters.s.sol +++ b/script/DeployerMintersScript.s.sol @@ -19,7 +19,7 @@ import {ZoraCreatorFixedPriceSaleStrategy} from "../src/minters/fixed-price/Zora import {ZoraCreatorMerkleMinterStrategy} from "../src/minters/merkle/ZoraCreatorMerkleMinterStrategy.sol"; import {ZoraCreatorRedeemMinterFactory} from "../src/minters/redeem/ZoraCreatorRedeemMinterFactory.sol"; -contract DeployScript is ZoraDeployerBase { +contract DeployerMintersScript is ZoraDeployerBase { function run() public returns (string memory) { Deployment memory deployment; ChainConfig memory chainConfig = getChainConfig(); diff --git a/script/FactoryProxyDeterministicParams.s.sol b/script/FactoryProxyDeterministicParams.s.sol deleted file mode 100644 index c6cccc28f..000000000 --- a/script/FactoryProxyDeterministicParams.s.sol +++ /dev/null @@ -1,31 +0,0 @@ -// spdx-license-identifier: mit -pragma solidity ^0.8.17; - -import "forge-std/Script.sol"; -import "forge-std/console2.sol"; - -import {ZoraDeployerBase} from "./ZoraDeployerBase.sol"; -import {Zora1155Factory} from "../src/proxies/Zora1155Factory.sol"; -import {ProxyShim} from "../src/utils/ProxyShim.sol"; -import {LibString} from "solady/utils/LibString.sol"; -import {Create2} from "@openzeppelin/contracts/utils/Create2.sol"; -import {ZoraDeployerUtils} from "../src/deployment/ZoraDeployerUtils.sol"; -import {DeterministicDeployerScript, DeterministicParams} from "../src/deployment/DeterministicDeployerScript.sol"; -import {DeterministicProxyDeployer} from "../src/deployment/DeterministicProxyDeployer.sol"; -import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; - -/// @title Gets parameters for determinstically deploying a new 1155 factory proxy at an address starting with 0x777777, regardless of the chain. -/// Example usage: DEPLOYER=0xf69fEc6d858c77e969509843852178bd24CAd2B6 forge script script/GetDeterminsticParam.s.sol --rpc-url https://testnet.rpc.zora.energy --ffi -/// @author doved -/// @notice Ensure to set env variable for DEPLOYER -contract FactoryProxyDeterministicParams is ZoraDeployerBase, DeterministicDeployerScript { - function run() public returns (DeterministicParams memory deterministicParams) { - address deployerAddress = vm.envAddress("DEPLOYER"); - - bytes memory proxyCreationCode = type(Zora1155Factory).creationCode; - - deterministicParams = getDeterministicDeploymentParams(deployerAddress, proxyCreationCode, 100); - - serializeAndSaveOutput(deterministicParams, "factoryProxy"); - } -} diff --git a/script/PremintProxyDeterminsticParams.sol b/script/PremintProxyDeterminsticParams.sol deleted file mode 100644 index 80f5287c7..000000000 --- a/script/PremintProxyDeterminsticParams.sol +++ /dev/null @@ -1,31 +0,0 @@ -// spdx-license-identifier: mit -pragma solidity ^0.8.17; - -import "forge-std/Script.sol"; -import "forge-std/console2.sol"; - -import {ZoraDeployerBase} from "./ZoraDeployerBase.sol"; -import {Zora1155PremintExecutor} from "../src/proxies/Zora1155PremintExecutor.sol"; -import {ProxyShim} from "../src/utils/ProxyShim.sol"; -import {LibString} from "solady/utils/LibString.sol"; -import {Create2} from "@openzeppelin/contracts/utils/Create2.sol"; -import {ZoraDeployerUtils} from "../src/deployment/ZoraDeployerUtils.sol"; -import {DeterministicDeployerScript, DeterministicParams} from "../src/deployment/DeterministicDeployerScript.sol"; -import {DeterministicProxyDeployer} from "../src/deployment/DeterministicProxyDeployer.sol"; -import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; - -/// @title Gets parameters for determinstically deploying a new 1155 factory proxy at an address starting with 0x777777, regardless of the chain. -/// Example usage: DEPLOYER=0xf69fEc6d858c77e969509843852178bd24CAd2B6 forge script script/GetDeterminsticParam.s.sol --rpc-url https://testnet.rpc.zora.energy --ffi -/// @author -/// @notice -contract PremintProxyDeterminsticParams is ZoraDeployerBase, DeterministicDeployerScript { - function run() public returns (DeterministicParams memory determinsticParams) { - address deployerAddress = 0x4F9991C82C76aE04CC39f23aB909AA919886ba12; - - bytes memory proxyCreationCode = type(Zora1155PremintExecutor).creationCode; - - determinsticParams = getDeterministicDeploymentParams(deployerAddress, proxyCreationCode, 200); - - serializeAndSaveOutput(determinsticParams, "premintExecutorProxy"); - } -} diff --git a/script/signDeploymentTransactions.ts b/script/signDeploymentTransactions.ts index c9f68e6cf..095076cc1 100644 --- a/script/signDeploymentTransactions.ts +++ b/script/signDeploymentTransactions.ts @@ -1,6 +1,6 @@ import { createAccount } from "@turnkey/viem"; import { TurnkeyClient } from "@turnkey/http"; -import { Address, LocalAccount } from "viem"; +import { Address, encodeFunctionData, parseAbi, LocalAccount, Hex } from "viem"; import { ApiKeyStamper } from "@turnkey/api-key-stamper"; import { glob } from "glob"; import * as path from "path"; @@ -9,7 +9,9 @@ import { writeFile, readFile } from "fs/promises"; import { ConfiguredSalt, DeterministicDeploymentConfig, + GenericDeploymentConfiguration, signDeployFactory, + signGenericDeploy, } from "../package/deployment"; import { fileURLToPath } from "url"; import { dirname } from "path"; @@ -21,52 +23,129 @@ const __dirname = dirname(__filename); dotenv.config({ path: path.resolve(__dirname, "../.env") }); type ChainConfig = { - chainId: number, - implementationAddress: Address, - owner: Address + chainId: number; + implementationAddress: Address; + owner: Address; }; async function signAndSaveSignatures({ turnkeyAccount, chainConfigs, - proxyName + proxyName, }: { - turnkeyAccount: LocalAccount, - chainConfigs: ChainConfig[], - proxyName: "factoryProxy" | "premintExecutorProxy" + turnkeyAccount: LocalAccount; + chainConfigs: ChainConfig[]; + proxyName: "factoryProxy" | "premintExecutorProxy"; }) { - const configFolder = path.resolve(__dirname, `../deterministicConfig/${proxyName}/`); - const configFile = path.join(configFolder, 'params.json'); - const deterministicDeployConfig = JSON.parse(await readFile(configFile, 'utf-8')); + const configFolder = path.resolve( + __dirname, + `../deterministicConfig/${proxyName}/` + ); + const configFile = path.join(configFolder, "params.json"); + const deterministicDeployConfig = JSON.parse( + await readFile(configFile, "utf-8") + ); const deploymentConfig: DeterministicDeploymentConfig = { - proxyDeployerAddress: deterministicDeployConfig.proxyDeployerAddress as Address, + proxyDeployerAddress: + deterministicDeployConfig.proxyDeployerAddress as Address, proxySalt: deterministicDeployConfig.proxySalt as ConfiguredSalt, proxyShimSalt: deterministicDeployConfig.proxyShimSalt as ConfiguredSalt, - proxyCreationCode: deterministicDeployConfig.proxyCreationCode as Address - } + proxyCreationCode: deterministicDeployConfig.proxyCreationCode as Address, + }; - const signedConfigs = await Promise.all(chainConfigs.map(async chainConfig => { - return { - chainId: chainConfig.chainId, + const signedConfigs = await Promise.all( + chainConfigs.map(async (chainConfig) => { + return { + chainId: chainConfig.chainId, signature: await signDeployFactory({ account: turnkeyAccount, implementationAddress: chainConfig.implementationAddress, owner: chainConfig.owner, chainId: chainConfig.chainId, - deterministicDeploymentConfig: deploymentConfig + deterministicDeploymentConfig: deploymentConfig, }), - } - })); + }; + }) + ); // aggregate above to object of key value pair indexed by chain id as number: const byChainId = signedConfigs.reduce((acc, { chainId, signature }) => { acc[chainId] = signature; return acc; - }, {} as { [key: number]: string } ); + }, {} as { [key: number]: string }); // write as json to ../deterministicConfig/factoryDeploySignatures.json: - await writeFile(path.join(configFolder, "signatures.json"), JSON.stringify(byChainId, null, 2)); + await writeFile( + path.join(configFolder, "signatures.json"), + JSON.stringify(byChainId, null, 2) + ); +} + +async function signAndSaveGenericSignatures({ + turnkeyAccount, + chainConfigs, + proxyName, +}: { + turnkeyAccount: LocalAccount; + chainConfigs: ChainConfig[]; + proxyName: "upgradeGate"; +}) { + const configFolder = path.resolve( + __dirname, + `../deterministicConfig/${proxyName}/` + ); + const configFile = path.join(configFolder, "params.json"); + const deterministicDeployConfig = JSON.parse( + await readFile(configFile, "utf-8") + ); + + const deploymentConfig: GenericDeploymentConfiguration = { + creationCode: deterministicDeployConfig.creationCode! as Hex, + salt: deterministicDeployConfig.salt! as Hex, + deployerAddress: deterministicDeployConfig.deployerAddress! as Address, + upgradeGateAddress: + deterministicDeployConfig.upgradeGateAddress! as Address, + proxyDeployerAddress: + deterministicDeployConfig.proxyDeployerAddress! as Address, + }; + + const upgradeGateAbi = parseAbi([ + // ^? const abi: readonly [{ name: "balanceOf"; type: "function"; stateMutability:... + "function initialize(address owner)", + ]); + + const signedConfigs = await Promise.all( + chainConfigs.map(async (chainConfig) => { + const initCall = encodeFunctionData({ + abi: upgradeGateAbi, + functionName: "initialize", + args: [chainConfig.owner], + }); + + return { + chainId: chainConfig.chainId, + signature: await signGenericDeploy({ + account: turnkeyAccount, + chainId: chainConfig.chainId, + config: deploymentConfig, + initCall, + }), + }; + }) + ); + + // aggregate above to object of key value pair indexed by chain id as number: + const byChainId = signedConfigs.reduce((acc, { chainId, signature }) => { + acc[chainId] = signature; + return acc; + }, {} as { [key: number]: string }); + + // write as json to ../deterministicConfig/factoryDeploySignatures.json: + await writeFile( + path.join(configFolder, "signatures.json"), + JSON.stringify(byChainId, null, 2) + ); } const getFactoryImplConfigs = async () => { @@ -74,50 +153,56 @@ const getFactoryImplConfigs = async () => { path.resolve(__dirname, "../addresses/*.json") ); - const chainConfigs = await Promise.all(addresseFiles.map(async addressConfigFile => { - const chainId = parseInt(path.basename(addressConfigFile).split(".")[0]!); + const chainConfigs = await Promise.all( + addresseFiles.map(async (addressConfigFile) => { + const chainId = parseInt(path.basename(addressConfigFile).split(".")[0]!); - // read file and process JSON contents: - const fileContents = await import(addressConfigFile); + // read file and process JSON contents: + const fileContents = await import(addressConfigFile); - // read chain config file as json, which is located at: ../chainConfigs/${chainId}.json: - const chainConfig = await import(path.resolve(__dirname, `../chainConfigs/${chainId}.json`)); + // read chain config file as json, which is located at: ../chainConfigs/${chainId}.json: + const chainConfig = await import( + path.resolve(__dirname, `../chainConfigs/${chainId}.json`) + ); - return { - chainId, - implementationAddress: fileContents['FACTORY_IMPL'] as Address, - owner: chainConfig['FACTORY_OWNER'] as Address - } - })); + return { + chainId, + implementationAddress: fileContents["FACTORY_IMPL"] as Address, + owner: chainConfig["FACTORY_OWNER"] as Address, + }; + }) + ); return chainConfigs; -} +}; const getPreminterImplConfigs = async () => { const addresseFiles = await glob( path.resolve(__dirname, "../addresses/*.json") ); - const chainConfigs = await Promise.all(addresseFiles.map(async addressConfigFile => { - const chainId = parseInt(path.basename(addressConfigFile).split(".")[0]!); + const chainConfigs = await Promise.all( + addresseFiles.map(async (addressConfigFile) => { + const chainId = parseInt(path.basename(addressConfigFile).split(".")[0]!); - // read file and process JSON contents: - const fileContents = await import(addressConfigFile); - - // read chain config file as json, which is located at: ../chainConfigs/${chainId}.json: - const chainConfig = await import(path.resolve(__dirname, `../chainConfigs/${chainId}.json`)); - - return { - chainId, - implementationAddress: fileContents['PREMINTER_IMPL'] as Address, - owner: chainConfig['FACTORY_OWNER'] as Address - } - })); + // read file and process JSON contents: + const fileContents = await import(addressConfigFile); + // read chain config file as json, which is located at: ../chainConfigs/${chainId}.json: + const chainConfig = await import( + path.resolve(__dirname, `../chainConfigs/${chainId}.json`) + ); + return { + chainId, + implementationAddress: fileContents["PREMINTER_IMPL"] as Address, + owner: chainConfig["FACTORY_OWNER"] as Address, + }; + }) + ); - return chainConfigs.filter(x => x.implementationAddress !== undefined); -} + return chainConfigs.filter((x) => x.implementationAddress !== undefined); +}; async function main() { // Create a Turnkey HTTP client with API key credentials @@ -145,13 +230,19 @@ async function main() { await signAndSaveSignatures({ turnkeyAccount, chainConfigs: await getFactoryImplConfigs(), - proxyName: "factoryProxy" + proxyName: "factoryProxy", }); await signAndSaveSignatures({ turnkeyAccount, chainConfigs: await getPreminterImplConfigs(), - proxyName: "premintExecutorProxy" + proxyName: "premintExecutorProxy", + }); + + await signAndSaveGenericSignatures({ + turnkeyAccount, + chainConfigs: await getPreminterImplConfigs(), + proxyName: "upgradeGate", }); } diff --git a/src/deployment/DeterministicDeployerScript.sol b/src/deployment/DeterministicDeployerScript.sol index a8992b0e9..e313b7fff 100644 --- a/src/deployment/DeterministicDeployerScript.sol +++ b/src/deployment/DeterministicDeployerScript.sol @@ -6,6 +6,7 @@ import {Deployment, ChainConfig} from "./DeploymentConfig.sol"; import {ProxyShim} from "../utils/ProxyShim.sol"; import {DeterministicProxyDeployer} from "./DeterministicProxyDeployer.sol"; import {Create2} from "@openzeppelin/contracts/utils/Create2.sol"; +import {UpgradeGate} from "../upgrades/UpgradeGate.sol"; import {LibString} from "solady/utils/LibString.sol"; import {ZoraDeployerUtils} from "./ZoraDeployerUtils.sol"; @@ -187,4 +188,29 @@ contract DeterministicDeployerScript is Script { signature ); } + + function deployUpgradeGate(uint256 chain, address upgradeGateOwner) internal returns (address) { + string memory signatures = vm.readFile(signaturesFilePath("upgradeGate")); + bytes memory signature = signatures.readBytes(string.concat(".", string.concat(vm.toString(chain)))); + + string memory upgradeGateParams = vm.readFile("./deployDeterministic/upgradeGate/params.json"); + + address proxyDeployerAddress = vm.parseJsonAddress(upgradeGateParams, ".proxyDeployerAddress"); + bytes32 genericCreationSalt = vm.parseJsonBytes32(upgradeGateParams, ".salt"); + bytes memory creationCode = vm.parseJsonBytes(upgradeGateParams, ".creationCode"); + + if (!ZoraDeployerUtils.IMMUTABLE_CREATE2_FACTORY.hasBeenDeployed(proxyDeployerAddress)) { + revert("The main proxy deployer needs to be deployed first"); + } + + DeterministicProxyDeployer factoryDeployer = DeterministicProxyDeployer(proxyDeployerAddress); + + return + factoryDeployer.createAndInitGenericContractDeterministic({ + genericCreationSalt: genericCreationSalt, + creationCode: creationCode, + initCall: abi.encodeWithSelector(UpgradeGate.initialize.selector, upgradeGateOwner), + signature: signature + }); + } } diff --git a/src/deployment/DeterministicProxyDeployer.sol b/src/deployment/DeterministicProxyDeployer.sol index 40437b569..19a2979db 100644 --- a/src/deployment/DeterministicProxyDeployer.sol +++ b/src/deployment/DeterministicProxyDeployer.sol @@ -52,7 +52,6 @@ contract DeterministicProxyDeployer is EIP712 { return factoryProxyAddress; } - function _createAndInitGenericContractDeterministic( bytes32 genericCreationSalt, bytes calldata creationCode, @@ -68,13 +67,9 @@ contract DeterministicProxyDeployer is EIP712 { bytes32 constant DOMAIN_UPGRADEABLE_PROXY = keccak256("createProxy(bytes32 proxyShimSalt,bytes32 proxySalt,bytes proxyCreationCode,address implementationAddress,address owner)"); - bytes32 constant DOMAIN_GENERIC_CREATION = - keccak256("createGenericContract(bytes32 salt,bytes creationCode,bytes initCall)"); + bytes32 constant DOMAIN_GENERIC_CREATION = keccak256("createGenericContract(bytes32 salt,bytes creationCode,bytes initCall)"); - function recoverSignature( - bytes32 digest, - bytes calldata signature - ) public pure returns (address) { + function recoverSignature(bytes32 digest, bytes calldata signature) public pure returns (address) { return ECDSA.recover(digest, signature); } @@ -85,14 +80,13 @@ contract DeterministicProxyDeployer is EIP712 { address implementationAddress, address newOwner ) public view returns (bytes32) { - return _hashTypedDataV4(keccak256(abi.encode(DOMAIN_UPGRADEABLE_PROXY, proxyShimSalt, proxySalt, keccak256(proxyCreationCode), implementationAddress, newOwner))); + return + _hashTypedDataV4( + keccak256(abi.encode(DOMAIN_UPGRADEABLE_PROXY, proxyShimSalt, proxySalt, keccak256(proxyCreationCode), implementationAddress, newOwner)) + ); } - function hashedDigestGenericCreation( - bytes32 salt, - bytes calldata creationCode, - bytes calldata initCall - ) public view returns (bytes32) { + function hashedDigestGenericCreation(bytes32 salt, bytes calldata creationCode, bytes calldata initCall) public view returns (bytes32) { return _hashTypedDataV4(keccak256(abi.encode(DOMAIN_GENERIC_CREATION, salt, keccak256(creationCode), keccak256(initCall)))); } @@ -115,10 +109,7 @@ contract DeterministicProxyDeployer is EIP712 { address owner, bytes calldata signature ) external returns (address factoryProxyAddress) { - address signer = recoverSignature( - hashedDigestFactoryProxy(proxyShimSalt, proxySalt, proxyCreationCode, implementationAddress, owner), - signature - ); + address signer = recoverSignature(hashedDigestFactoryProxy(proxyShimSalt, proxySalt, proxyCreationCode, implementationAddress, owner), signature); requireContainsCaller(signer, proxyShimSalt); @@ -139,10 +130,7 @@ contract DeterministicProxyDeployer is EIP712 { bytes calldata initCall, bytes calldata signature ) external returns (address resultAddress) { - address signer = recoverSignature( - hashedDigestGenericCreation(genericCreationSalt, creationCode, initCall), - signature - ); + address signer = recoverSignature(hashedDigestGenericCreation(genericCreationSalt, creationCode, initCall), signature); requireContainsCaller(signer, genericCreationSalt); diff --git a/src/deployment/ZoraDeployerUtils.sol b/src/deployment/ZoraDeployerUtils.sol index b5cba9a28..6a323d352 100644 --- a/src/deployment/ZoraDeployerUtils.sol +++ b/src/deployment/ZoraDeployerUtils.sol @@ -43,7 +43,8 @@ library ZoraDeployerUtils { bytes32 constant FACTORY_DEPLOYER_DEPLOYMENT_SALT = bytes32(0x0000000000000000000000000000000000000000668d7f9ec18e35000dbaba0e); function createDeterministicFactoryProxyDeployer() internal returns (DeterministicProxyDeployer) { - return DeterministicProxyDeployer(IMMUTABLE_CREATE2_FACTORY.safeCreate2(FACTORY_DEPLOYER_DEPLOYMENT_SALT, type(DeterministicProxyDeployer).creationCode)); + return + DeterministicProxyDeployer(IMMUTABLE_CREATE2_FACTORY.safeCreate2(FACTORY_DEPLOYER_DEPLOYMENT_SALT, type(DeterministicProxyDeployer).creationCode)); } function deployNewPreminterImplementation(address factoryProxyAddress) internal returns (address) { diff --git a/test/deployer/NewFactoryProxyDeployer.t.sol b/test/deployer/NewFactoryProxyDeployer.t.sol index 78263763c..ab260b2be 100644 --- a/test/deployer/NewFactoryProxyDeployer.t.sol +++ b/test/deployer/NewFactoryProxyDeployer.t.sol @@ -109,7 +109,13 @@ contract DeterministicProxyDeployerTest is Test { bytes memory factoryProxyCreationCode = type(Zora1155Factory).creationCode; - bytes32 digest = factoryProxyDeployer.hashedDigestFactoryProxy(proxyShimSalt, factoryProxySalt, factoryProxyCreationCode, factoryImplAddress, factoryOwner); + bytes32 digest = factoryProxyDeployer.hashedDigestFactoryProxy( + proxyShimSalt, + factoryProxySalt, + factoryProxyCreationCode, + factoryImplAddress, + factoryOwner + ); // sign the message (uint8 v, bytes32 r, bytes32 s) = vm.sign(deployerPrivateKey, digest); @@ -148,16 +154,12 @@ contract DeterministicProxyDeployerTest is Test { bytes memory upgradeGateDeployCode = type(UpgradeGate).creationCode; - bytes memory initCall = abi.encodeWithSignature('initialize(address)', gateAdmin); + bytes memory initCall = abi.encodeWithSignature("initialize(address)", gateAdmin); - bytes32 genericTestDeploySalt = bytes32(0x0000000000000000000000000000000000000000baaaaaacafeaaaaaacafef00) & + bytes32 genericTestDeploySalt = bytes32(0x0000000000000000000000000000000000000000baaaaaacafeaaaaaacafef00) & bytes32(uint256(uint160(address(deployerAddress))) << 96); - bytes32 digest = factoryProxyDeployer.hashedDigestGenericCreation( - genericTestDeploySalt, - upgradeGateDeployCode, - initCall - ); + bytes32 digest = factoryProxyDeployer.hashedDigestGenericCreation(genericTestDeploySalt, upgradeGateDeployCode, initCall); // sign the message (uint8 v, bytes32 r, bytes32 s) = vm.sign(deployerPrivateKey, digest); @@ -166,6 +168,5 @@ contract DeterministicProxyDeployerTest is Test { bytes memory signature = abi.encodePacked(r, s, v); factoryProxyDeployer.createAndInitGenericContractDeterministic(genericTestDeploySalt, upgradeGateDeployCode, initCall, signature); - } }