kabu_execution_multicaller/
deploy.rs

1use alloy_eips::eip1559::BaseFeeParams;
2use alloy_network::eip2718::Encodable2718;
3use alloy_network::{Ethereum, EthereumWallet, TransactionBuilder, TxSigner};
4use alloy_primitives::{hex, Address, Bytes, TxKind, B256};
5use alloy_provider::ext::AnvilApi;
6use alloy_provider::Provider;
7use alloy_rpc_types::{BlockId, BlockNumberOrTag, TransactionInput, TransactionRequest};
8use alloy_rpc_types_trace::geth::AccountState;
9use alloy_signer_local::PrivateKeySigner;
10use eyre::{eyre, OptionExt, Result};
11use k256::SecretKey;
12use lazy_static::lazy_static;
13use std::time::Duration;
14use tracing::{debug, error, info};
15
16lazy_static! {
17    static ref NO_OWNER_CODE : Vec<u8> = hex::decode("36156142d6575f3560e01c80632847241714611672578063fa461e3314612be757806323a69e7514612be75780638b4187131461166a57806320c13b0b146141a45780631626ba7e146141b4578063f04f2707146100ec57806391dd73461461167a578063923b8a2a14612bc65750606435806080146100b7575060443580606014612be75750600435806020146100af5750602435806040146100af57506084358060a0146100af57506142d6565b600401612c69565b80600401356014146141c4575060243580156100d5576020526100dd565b506044356020525b60205f52606435600401612c69565b5060643560040180358091602001610120375961010052610120016101205b8080518060f01c8061800016151561020057828260b01c62ffffff1680156101bc578062ffffff146101bc579081610fff160181600c1c60ff1680156101ba57908260141c60071660051b6020018362800000161561016c57602090035f51035b905b82151561017c5750506101b4565b8260201161019b5781518152602001906020019160209003919061016e565b905160018360031b1b6001900380199116908251161790525b506101be565b505b505b5061ffff1680156116175780617ffc146102ad5780617ffe14610da85780617ffb146104145780617fff14610e365780617ffd14610ec45780617ffa1461034b575b508060b01c697fffffffffffffffffff1691908073ffffffffffffffffffffffffffffffffffffffff16818060a01c61ffff165f5f826020880189875af1156142da579491505015156102a3578060c81c62ffffff1680156102a1578062ffffff146102a15780610fff1681600c1c60ff169082628000001615610285575f51610290565b8260141c60071660051b5b6020830683810182015f52016020013e5b505b505060200161161d565b505f91908073ffffffffffffffffffffffffffffffffffffffff16818060a01c61ffff165f5f826020880189875af1156142da57949150501515610341578060c81c62ffffff16801561033f578062ffffff1461033f5780610fff1681600c1c60ff169082628000001615610323575f5161032e565b8260141c60071660051b5b6020830683810182015f52016020013e5b505b505060200161161d565b508060b01c62ffffff168060141c60071660051b6020018162800000161561037557602090035f51035b51905091908073ffffffffffffffffffffffffffffffffffffffff16818060a01c61ffff165f5f826020880189875af1156142da5794915050151561040a578060c81c62ffffff168015610408578062ffffff146104085780610fff1681600c1c60ff1690826280000016156103ec575f516103f7565b8260141c60071660051b5b6020830683810182015f52016020013e5b505b505060200161161d565b5060a01c61ffff16600c0190600c015b805160f81c8015610d97576010811161054357806001146104ad57806002146104b857806003146104c357806004146104ce57806005146104d957806006146104e457806007146104ef57806008146104fa5780600a1461050d5780600b146105165780600c1461051f5780600d146105285780600e146105315780600f1461053a5750610d97565b506020516001610d8f565b506040516001610d8f565b506060516001610d8f565b506080516001610d8f565b5060a0516001610d8f565b5060c0516001610d8f565b5060e0516001610d8f565b505f51805190602090035f526001610d8f565b50476001610d8f565b50416001610d8f565b50426001610d8f565b50436001610d8f565b50486001610d8f565b503a6001610d8f565b602081101561068257806011146105ca57806012146105d557806013146105e057806014146105eb57806015146105f65780601614610601578060171461060c578060181461061757806019146106225780601a1461062c5780601b146106405780601c146106545780601d146106615780601e1461066e5780601f146106785750610d97565b509190016001610d8f565b509190036001610d8f565b509190026001610d8f565b509190046001610d8f565b509190056001610d8f565b509190166001610d8f565b509190176001610d8f565b509190186001610d8f565b5090196001610d8f565b50806001015160f81c9091901b6002610d8f565b50806001015160f81c9091901c6002610d8f565b5090600190016001610d8f565b5090600190036001610d8f565b5091036001610d8f565b5091046001610d8f565b60308110156107b857806020146106d157806021146106e257806022146106f25780602314610716578060241461072d578060251461074a57806026146107695780602a1461078c5750610d97565b5080600101516021610d8f56610d97565b50806001015160ff166002610d8f565b50806001015161ffff166003610d8f565b50806001015163ffffffff166005610d8f565b50806001015167ffffffffffffffff166009610d8f565b5080600101516dffffffffffffffffffffffffffff166007610d8f565b5080600101516fffffffffffffffffffffffffffffffff166009610d8f565b50806001015173ffffffffffffffffffffffffffffffffffffffff16600d610d8f565b50907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90026001610d8f565b603081101561087657806031146107ef57806032146107fa57806033146108145780603414610826578060351461083e5750610d97565b5060ff166001610d8f565b5061ffff166001610d8f565b5063ffffffff166001610d8f565b5067ffffffffffffffff166001610d8f565b506dffffffffffffffffffffffffffff166001610d8f565b506fffffffffffffffffffffffffffffffff166001610d8f565b5073ffffffffffffffffffffffffffffffffffffffff166001610d8f565b6050811015610d095780604014610905578060411461096d57806042146109d45780604314610a3c5780604414610aa35780604514610b0b5780604614610b725780604714610bd75780604814610c3d5780604914610c575780604a14610c705780604b14610c8a5780604c14610ca35780604d14610cbd5780604e14610cd65780604f14610ced5750610d97565b50919014156109175760016001610d8f565b7f455100000000000000000000000000000000000000000000000000000000000060027f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b5091901461097e5760016001610d8f565b7f4e4551000000000000000000000000000000000000000000000000000000000060037f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b50919010156109e65760016001610d8f565b7f4c5400000000000000000000000000000000000000000000000000000000000060027f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b50919010610a4d5760016001610d8f565b7f475445000000000000000000000000000000000000000000000000000000000060037f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b5091901115610ab55760016001610d8f565b7f475400000000000000000000000000000000000000000000000000000000000060027f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b50919011610b1c5760016001610d8f565b7f4c5445000000000000000000000000000000000000000000000000000000000060037f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b5090610b815760016001610d8f565b7f5a5200000000000000000000000000000000000000000000000000000000000060027f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b509015610be75760016001610d8f565b7f4e5a52000000000000000000000000000000000000000000000000000000000060037f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b5091901415610c4f5760016001610d8f565b5f5f5260205ff35b50919014610c685760016001610d8f565b5f5f5260205ff35b5091901015610c825760016001610d8f565b5f5f5260205ff35b50919010610c9b5760016001610d8f565b5f5f5260205ff35b5091901115610cb55760016001610d8f565b5f5f5260205ff35b50919011610cce5760016001610d8f565b5f5f5260205ff35b5090610ce55760016001610d8f565b5f5f5260205ff35b509015610cfd5760016001610d8f565b5f5f5260205ff3610d97565b6060811015610d895780605014610d285780605114610d5c5750610d97565b50806001015160f81c8060051b5f5103805f525f5b9060200190815101916001900391821515610d3d579150506002610d8f565b50806001015160f81c5f515f5b815101906020900390916001900391821515610d69579150506002610d8f565b50610d97565b909101610424565b50505f516020019081525f5261161d565b508073ffffffffffffffffffffffffffffffffffffffff168160a01c61ffff165f5f8260208701855afa156142da5792505060c81c62ffffff168015610e2d578062ffffff14610e2d5780610fff1681600c1c60ff169082628000001615610e11575f51610e1c565b8260141c60071660051b5b6020830683810182015f52016020013e5b5060200161161d565b508073ffffffffffffffffffffffffffffffffffffffff168160a01c61ffff165f5f8260208701855af4156142da5792505060c81c62ffffff168015610ebb578062ffffff14610ebb5780610fff1681600c1c60ff169082628000001615610e9f575f51610eaa565b8260141c60071660051b5b6020830683810182015f52016020013e5b5060200161161d565b508060a01c61ffff1682600c015160e01c8063a85f1d24146113815780634df86adf1461129c57806305ec9cad1461143c5780639b81788b14610f845780638bceaa1814610fe757806384f16ca01461104957806395b66162146110ac5780639a23842e1461110e5780634fae2f2314611172578063a9f2812f146111d5578063f93a171614611239578063fe9bf13d14611548578063fcccdd981461157c5780631e00cebd146115b15780630a6c13bf146115f4576199995f5260205ffd5b5083600c016126f2908060240151906004015161010051630902f1ac8152606081600483601c01855afa15610fc157905080602001519051610fc6565b50505f5f5b9082026127100291900390910290046001015f516020019081525f5261160c565b5083600c016126f2908060240151906004015161010051630902f1ac8152606081600483601c01855afa1561102457905080602001519051611029565b50505f5f5b82026127100291900390910290046001015f516020019081525f5261160c565b5083600c016126f2908060240151906004015161010051630902f1ac8152606081600483601c01855afa156110865790508060200151905161108b565b50505f5f5b9090919092029182029190612710020190045f516020019081525f5261160c565b5083600c016126f2908060240151906004015161010051630902f1ac8152606081600483601c01855afa156110e9579050806020015190516110ee565b50505f5f5b90919092029182029190612710020190045f516020019081525f5261160c565b5083600c0180602401518160440151916004015161010051630902f1ac8152606081600483601c01855afa1561114c57905080602001519051611151565b50505f5f5b9082026127100291900390910290046001015f516020019081525f5261160c565b5083600c0180602401518160440151916004015161010051630902f1ac8152606081600483601c01855afa156111b0579050806020015190516111b5565b50505f5f5b82026127100291900390910290046001015f516020019081525f5261160c565b5083600c0180602401518160440151916004015161010051630902f1ac8152606081600483601c01855afa1561121357905080602001519051611218565b50505f5f5b9090919092029182029190612710020190045f516020019081525f5261160c565b5083600c0180602401518160440151916004015161010051630902f1ac8152606081600483601c01855afa156112775790508060200151905161127c565b50505f5f5b90919092029182029190612710020190045f516020019081525f5261160c565b5083600c0180600401518160240151826044015182610100516370a082318152308160200152602081602483601c01855afa156142da575180156112df57600190035b8084111561133d577f424200000000000000000000000000000000000000000000000000000000000060027f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b85606401516101005163a9059cbb81529081602001529081604001525f5f604483601c015f865af15050508015611378575f5f5f5f84415af1505b5050505061160c565b5083600c0180600401518160240151826044015182610100516370a082318152308160200152602081602483601c01855afa156142da575180156113c457600190035b80841115611422577f424200000000000000000000000000000000000000000000000000000000000060027f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b50508015611434575f5f5f5f84415af1505b50505061160c565b5083600c0173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160040151826024015182610100516370a082318152308160200152602081602483601c01855afa156142da5751801561148f57600190035b808411156114ed577f424200000000000000000000000000000000000000000000000000000000000060027f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b61010051632e1a7d4d81529081602001525f5f602483601c015f73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af150508115611530575f5f5f5f85415af1505b84604401515f5f5f475f945af150505050505061160c565b5083600c0180600401517f4bc761c3621ed10674d0b96fcf93f708ec089e64acf91cec204e8e5e6bc415685f5fa25061160c565b5083600c015f51805f01517f89af0fd11b64392b3a1ab47eb65ae5e5f01335c6fc2ac518b0fc21aa0f7ff8c65f5fa35061160c565b5083600c018060240151906004015160051b5f5180919003517f89af0fd11b64392b3a1ab47eb65ae5e5f01335c6fc2ac518b0fc21aa0f7ff8c65f5fa35061160c565b5083600c018060040151600160ff1b1760045260245ffd5b915050600c0161161d565b5061ffff015b0181811061010b575b505060043560240135602435602401356044356024013501336101005163a9059cbb81529081602001529081604001525f5f604483601c015f865af15050506142e2565b506084612c69565b506024612c69565b50602480358091602001610120375961010052610120016101205b8080518060f01c8061800016151561178a57828260b01c62ffffff168015611746578062ffffff14611746579081610fff160181600c1c60ff16801561174457908260141c60071660051b602001836280000016156116f657602090035f51035b905b82151561170657505061173e565b82602011611725578151815260200190602001916020900391906116f8565b905160018360031b1b6001900380199116908251161790525b50611748565b505b505b5061ffff168015612ba15780617ffc146118375780617ffe146123325780617ffb1461199e5780617fff146123c05780617ffd1461244e5780617ffa146118d5575b508060b01c697fffffffffffffffffff1691908073ffffffffffffffffffffffffffffffffffffffff16818060a01c61ffff165f5f826020880189875af1156142da5794915050151561182d578060c81c62ffffff16801561182b578062ffffff1461182b5780610fff1681600c1c60ff16908262800000161561180f575f5161181a565b8260141c60071660051b5b6020830683810182015f52016020013e5b505b5050602001612ba7565b505f91908073ffffffffffffffffffffffffffffffffffffffff16818060a01c61ffff165f5f826020880189875af1156142da579491505015156118cb578060c81c62ffffff1680156118c9578062ffffff146118c95780610fff1681600c1c60ff1690826280000016156118ad575f516118b8565b8260141c60071660051b5b6020830683810182015f52016020013e5b505b5050602001612ba7565b508060b01c62ffffff168060141c60071660051b602001816280000016156118ff57602090035f51035b51905091908073ffffffffffffffffffffffffffffffffffffffff16818060a01c61ffff165f5f826020880189875af1156142da57949150501515611994578060c81c62ffffff168015611992578062ffffff146119925780610fff1681600c1c60ff169082628000001615611976575f51611981565b8260141c60071660051b5b6020830683810182015f52016020013e5b505b5050602001612ba7565b5060a01c61ffff16600c0190600c015b805160f81c80156123215760108111611acd5780600114611a375780600214611a425780600314611a4d5780600414611a585780600514611a635780600614611a6e5780600714611a795780600814611a845780600a14611a975780600b14611aa05780600c14611aa95780600d14611ab25780600e14611abb5780600f14611ac45750612321565b506020516001612319565b506040516001612319565b506060516001612319565b506080516001612319565b5060a0516001612319565b5060c0516001612319565b5060e0516001612319565b505f51805190602090035f526001612319565b50476001612319565b50416001612319565b50426001612319565b50436001612319565b50486001612319565b503a6001612319565b6020811015611c0c5780601114611b545780601214611b5f5780601314611b6a5780601414611b755780601514611b805780601614611b8b5780601714611b965780601814611ba15780601914611bac5780601a14611bb65780601b14611bca5780601c14611bde5780601d14611beb5780601e14611bf85780601f14611c025750612321565b509190016001612319565b509190036001612319565b509190026001612319565b509190046001612319565b509190056001612319565b509190166001612319565b509190176001612319565b509190186001612319565b5090196001612319565b50806001015160f81c9091901b6002612319565b50806001015160f81c9091901c6002612319565b5090600190016001612319565b5090600190036001612319565b5091036001612319565b5091046001612319565b6030811015611d425780602014611c5b5780602114611c6c5780602214611c7c5780602314611ca05780602414611cb75780602514611cd45780602614611cf35780602a14611d165750612321565b508060010151602161231956612321565b50806001015160ff166002612319565b50806001015161ffff166003612319565b50806001015163ffffffff166005612319565b50806001015167ffffffffffffffff166009612319565b5080600101516dffffffffffffffffffffffffffff166007612319565b5080600101516fffffffffffffffffffffffffffffffff166009612319565b50806001015173ffffffffffffffffffffffffffffffffffffffff16600d612319565b50907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90026001612319565b6030811015611e005780603114611d795780603214611d845780603314611d9e5780603414611db05780603514611dc85750612321565b5060ff166001612319565b5061ffff166001612319565b5063ffffffff166001612319565b5067ffffffffffffffff166001612319565b506dffffffffffffffffffffffffffff166001612319565b506fffffffffffffffffffffffffffffffff166001612319565b5073ffffffffffffffffffffffffffffffffffffffff166001612319565b60508110156122935780604014611e8f5780604114611ef75780604214611f5e5780604314611fc6578060441461202d578060451461209557806046146120fc578060471461216157806048146121c757806049146121e15780604a146121fa5780604b146122145780604c1461222d5780604d146122475780604e146122605780604f146122775750612321565b5091901415611ea15760016001612319565b7f455100000000000000000000000000000000000000000000000000000000000060027f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b50919014611f085760016001612319565b7f4e4551000000000000000000000000000000000000000000000000000000000060037f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b5091901015611f705760016001612319565b7f4c5400000000000000000000000000000000000000000000000000000000000060027f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b50919010611fd75760016001612319565b7f475445000000000000000000000000000000000000000000000000000000000060037f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b509190111561203f5760016001612319565b7f475400000000000000000000000000000000000000000000000000000000000060027f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b509190116120a65760016001612319565b7f4c5445000000000000000000000000000000000000000000000000000000000060037f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b509061210b5760016001612319565b7f5a5200000000000000000000000000000000000000000000000000000000000060027f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b5090156121715760016001612319565b7f4e5a52000000000000000000000000000000000000000000000000000000000060037f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b50919014156121d95760016001612319565b5f5f5260205ff35b509190146121f25760016001612319565b5f5f5260205ff35b509190101561220c5760016001612319565b5f5f5260205ff35b509190106122255760016001612319565b5f5f5260205ff35b509190111561223f5760016001612319565b5f5f5260205ff35b509190116122585760016001612319565b5f5f5260205ff35b509061226f5760016001612319565b5f5f5260205ff35b5090156122875760016001612319565b5f5f5260205ff3612321565b606081101561231357806050146122b257806051146122e65750612321565b50806001015160f81c8060051b5f5103805f525f5b90602001908151019160019003918215156122c7579150506002612319565b50806001015160f81c5f515f5b8151019060209003909160019003918215156122f3579150506002612319565b50612321565b9091016119ae565b50505f516020019081525f52612ba7565b508073ffffffffffffffffffffffffffffffffffffffff168160a01c61ffff165f5f8260208701855afa156142da5792505060c81c62ffffff1680156123b7578062ffffff146123b75780610fff1681600c1c60ff16908262800000161561239b575f516123a6565b8260141c60071660051b5b6020830683810182015f52016020013e5b50602001612ba7565b508073ffffffffffffffffffffffffffffffffffffffff168160a01c61ffff165f5f8260208701855af4156142da5792505060c81c62ffffff168015612445578062ffffff146124455780610fff1681600c1c60ff169082628000001615612429575f51612434565b8260141c60071660051b5b6020830683810182015f52016020013e5b50602001612ba7565b508060a01c61ffff1682600c015160e01c8063a85f1d241461290b5780634df86adf1461282657806305ec9cad146129c65780639b81788b1461250e5780638bceaa181461257157806384f16ca0146125d357806395b66162146126365780639a23842e146126985780634fae2f23146126fc578063a9f2812f1461275f578063f93a1716146127c3578063fe9bf13d14612ad2578063fcccdd9814612b065780631e00cebd14612b3b5780630a6c13bf14612b7e576199995f5260205ffd5b5083600c016126f2908060240151906004015161010051630902f1ac8152606081600483601c01855afa1561254b57905080602001519051612550565b50505f5f5b9082026127100291900390910290046001015f516020019081525f52612b96565b5083600c016126f2908060240151906004015161010051630902f1ac8152606081600483601c01855afa156125ae579050806020015190516125b3565b50505f5f5b82026127100291900390910290046001015f516020019081525f52612b96565b5083600c016126f2908060240151906004015161010051630902f1ac8152606081600483601c01855afa1561261057905080602001519051612615565b50505f5f5b9090919092029182029190612710020190045f516020019081525f52612b96565b5083600c016126f2908060240151906004015161010051630902f1ac8152606081600483601c01855afa1561267357905080602001519051612678565b50505f5f5b90919092029182029190612710020190045f516020019081525f52612b96565b5083600c0180602401518160440151916004015161010051630902f1ac8152606081600483601c01855afa156126d6579050806020015190516126db565b50505f5f5b9082026127100291900390910290046001015f516020019081525f52612b96565b5083600c0180602401518160440151916004015161010051630902f1ac8152606081600483601c01855afa1561273a5790508060200151905161273f565b50505f5f5b82026127100291900390910290046001015f516020019081525f52612b96565b5083600c0180602401518160440151916004015161010051630902f1ac8152606081600483601c01855afa1561279d579050806020015190516127a2565b50505f5f5b9090919092029182029190612710020190045f516020019081525f52612b96565b5083600c0180602401518160440151916004015161010051630902f1ac8152606081600483601c01855afa1561280157905080602001519051612806565b50505f5f5b90919092029182029190612710020190045f516020019081525f52612b96565b5083600c0180600401518160240151826044015182610100516370a082318152308160200152602081602483601c01855afa156142da5751801561286957600190035b808411156128c7577f424200000000000000000000000000000000000000000000000000000000000060027f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b85606401516101005163a9059cbb81529081602001529081604001525f5f604483601c015f865af15050508015612902575f5f5f5f84415af1505b50505050612b96565b5083600c0180600401518160240151826044015182610100516370a082318152308160200152602081602483601c01855afa156142da5751801561294e57600190035b808411156129ac577f424200000000000000000000000000000000000000000000000000000000000060027f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b505080156129be575f5f5f5f84415af1505b505050612b96565b5083600c0173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160040151826024015182610100516370a082318152308160200152602081602483601c01855afa156142da57518015612a1957600190035b80841115612a77577f424200000000000000000000000000000000000000000000000000000000000060027f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b61010051632e1a7d4d81529081602001525f5f602483601c015f73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af150508115612aba575f5f5f5f85415af1505b84604401515f5f5f475f945af1505050505050612b96565b5083600c0180600401517f4bc761c3621ed10674d0b96fcf93f708ec089e64acf91cec204e8e5e6bc415685f5fa250612b96565b5083600c015f51805f01517f89af0fd11b64392b3a1ab47eb65ae5e5f01335c6fc2ac518b0fc21aa0f7ff8c65f5fa350612b96565b5083600c018060240151906004015160051b5f5180919003517f89af0fd11b64392b3a1ab47eb65ae5e5f01335c6fc2ac518b0fc21aa0f7ff8c65f5fa350612b96565b5083600c018060040151600160ff1b1760045260245ffd5b915050600c01612ba7565b5061ffff015b01818110611695575b50505f515160205f52602060205260405260605ff35b604435600401803560141461428f5750600435604052602435602052612c5e565b50604435600401803560141461428f57506004355f8112612c32576040526024357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02602052612c5e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff026020526024356040525b60405f526044356004015b80358091602001610120375961010052610120016101205b8080518060f01c80618000161515612d7657828260b01c62ffffff168015612d32578062ffffff14612d32579081610fff160181600c1c60ff168015612d3057908260141c60071660051b60200183628000001615612ce257602090035f51035b905b821515612cf2575050612d2a565b82602011612d1157815181526020019060200191602090039190612ce4565b905160018360031b1b6001900380199116908251161790525b50612d34565b505b505b5061ffff16801561418d5780617ffc14612e235780617ffe1461391e5780617ffb14612f8a5780617fff146139ac5780617ffd14613a3a5780617ffa14612ec1575b508060b01c697fffffffffffffffffff1691908073ffffffffffffffffffffffffffffffffffffffff16818060a01c61ffff165f5f826020880189875af1156142da57949150501515612e19578060c81c62ffffff168015612e17578062ffffff14612e175780610fff1681600c1c60ff169082628000001615612dfb575f51612e06565b8260141c60071660051b5b6020830683810182015f52016020013e5b505b5050602001614193565b505f91908073ffffffffffffffffffffffffffffffffffffffff16818060a01c61ffff165f5f826020880189875af1156142da57949150501515612eb7578060c81c62ffffff168015612eb5578062ffffff14612eb55780610fff1681600c1c60ff169082628000001615612e99575f51612ea4565b8260141c60071660051b5b6020830683810182015f52016020013e5b505b5050602001614193565b508060b01c62ffffff168060141c60071660051b60200181628000001615612eeb57602090035f51035b51905091908073ffffffffffffffffffffffffffffffffffffffff16818060a01c61ffff165f5f826020880189875af1156142da57949150501515612f80578060c81c62ffffff168015612f7e578062ffffff14612f7e5780610fff1681600c1c60ff169082628000001615612f62575f51612f6d565b8260141c60071660051b5b6020830683810182015f52016020013e5b505b5050602001614193565b5060a01c61ffff16600c0190600c015b805160f81c801561390d57601081116130b95780600114613023578060021461302e57806003146130395780600414613044578060051461304f578060061461305a578060071461306557806008146130705780600a146130835780600b1461308c5780600c146130955780600d1461309e5780600e146130a75780600f146130b0575061390d565b506020516001613905565b506040516001613905565b506060516001613905565b506080516001613905565b5060a0516001613905565b5060c0516001613905565b5060e0516001613905565b505f51805190602090035f526001613905565b50476001613905565b50416001613905565b50426001613905565b50436001613905565b50486001613905565b503a6001613905565b60208110156131f85780601114613140578060121461314b57806013146131565780601414613161578060151461316c57806016146131775780601714613182578060181461318d57806019146131985780601a146131a25780601b146131b65780601c146131ca5780601d146131d75780601e146131e45780601f146131ee575061390d565b509190016001613905565b509190036001613905565b509190026001613905565b509190046001613905565b509190056001613905565b509190166001613905565b509190176001613905565b509190186001613905565b5090196001613905565b50806001015160f81c9091901b6002613905565b50806001015160f81c9091901c6002613905565b5090600190016001613905565b5090600190036001613905565b5091036001613905565b5091046001613905565b603081101561332e578060201461324757806021146132585780602214613268578060231461328c57806024146132a357806025146132c057806026146132df5780602a14613302575061390d565b50806001015160216139055661390d565b50806001015160ff166002613905565b50806001015161ffff166003613905565b50806001015163ffffffff166005613905565b50806001015167ffffffffffffffff166009613905565b5080600101516dffffffffffffffffffffffffffff166007613905565b5080600101516fffffffffffffffffffffffffffffffff166009613905565b50806001015173ffffffffffffffffffffffffffffffffffffffff16600d613905565b50907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90026001613905565b60308110156133ec57806031146133655780603214613370578060331461338a578060341461339c57806035146133b4575061390d565b5060ff166001613905565b5061ffff166001613905565b5063ffffffff166001613905565b5067ffffffffffffffff166001613905565b506dffffffffffffffffffffffffffff166001613905565b506fffffffffffffffffffffffffffffffff166001613905565b5073ffffffffffffffffffffffffffffffffffffffff166001613905565b605081101561387f578060401461347b57806041146134e3578060421461354a57806043146135b25780604414613619578060451461368157806046146136e8578060471461374d57806048146137b357806049146137cd5780604a146137e65780604b146138005780604c146138195780604d146138335780604e1461384c5780604f14613863575061390d565b509190141561348d5760016001613905565b7f455100000000000000000000000000000000000000000000000000000000000060027f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b509190146134f45760016001613905565b7f4e4551000000000000000000000000000000000000000000000000000000000060037f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b509190101561355c5760016001613905565b7f4c5400000000000000000000000000000000000000000000000000000000000060027f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b509190106135c35760016001613905565b7f475445000000000000000000000000000000000000000000000000000000000060037f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b509190111561362b5760016001613905565b7f475400000000000000000000000000000000000000000000000000000000000060027f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b509190116136925760016001613905565b7f4c5445000000000000000000000000000000000000000000000000000000000060037f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b50906136f75760016001613905565b7f5a5200000000000000000000000000000000000000000000000000000000000060027f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b50901561375d5760016001613905565b7f4e5a52000000000000000000000000000000000000000000000000000000000060037f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b50919014156137c55760016001613905565b5f5f5260205ff35b509190146137de5760016001613905565b5f5f5260205ff35b50919010156137f85760016001613905565b5f5f5260205ff35b509190106138115760016001613905565b5f5f5260205ff35b509190111561382b5760016001613905565b5f5f5260205ff35b509190116138445760016001613905565b5f5f5260205ff35b509061385b5760016001613905565b5f5f5260205ff35b5090156138735760016001613905565b5f5f5260205ff361390d565b60608110156138ff578060501461389e57806051146138d2575061390d565b50806001015160f81c8060051b5f5103805f525f5b90602001908151019160019003918215156138b3579150506002613905565b50806001015160f81c5f515f5b8151019060209003909160019003918215156138df579150506002613905565b5061390d565b909101612f9a565b50505f516020019081525f52614193565b508073ffffffffffffffffffffffffffffffffffffffff168160a01c61ffff165f5f8260208701855afa156142da5792505060c81c62ffffff1680156139a3578062ffffff146139a35780610fff1681600c1c60ff169082628000001615613987575f51613992565b8260141c60071660051b5b6020830683810182015f52016020013e5b50602001614193565b508073ffffffffffffffffffffffffffffffffffffffff168160a01c61ffff165f5f8260208701855af4156142da5792505060c81c62ffffff168015613a31578062ffffff14613a315780610fff1681600c1c60ff169082628000001615613a15575f51613a20565b8260141c60071660051b5b6020830683810182015f52016020013e5b50602001614193565b508060a01c61ffff1682600c015160e01c8063a85f1d2414613ef75780634df86adf14613e1257806305ec9cad14613fb25780639b81788b14613afa5780638bceaa1814613b5d57806384f16ca014613bbf57806395b6616214613c225780639a23842e14613c845780634fae2f2314613ce8578063a9f2812f14613d4b578063f93a171614613daf578063fe9bf13d146140be578063fcccdd98146140f25780631e00cebd146141275780630a6c13bf1461416a576199995f5260205ffd5b5083600c016126f2908060240151906004015161010051630902f1ac8152606081600483601c01855afa15613b3757905080602001519051613b3c565b50505f5f5b9082026127100291900390910290046001015f516020019081525f52614182565b5083600c016126f2908060240151906004015161010051630902f1ac8152606081600483601c01855afa15613b9a57905080602001519051613b9f565b50505f5f5b82026127100291900390910290046001015f516020019081525f52614182565b5083600c016126f2908060240151906004015161010051630902f1ac8152606081600483601c01855afa15613bfc57905080602001519051613c01565b50505f5f5b9090919092029182029190612710020190045f516020019081525f52614182565b5083600c016126f2908060240151906004015161010051630902f1ac8152606081600483601c01855afa15613c5f57905080602001519051613c64565b50505f5f5b90919092029182029190612710020190045f516020019081525f52614182565b5083600c0180602401518160440151916004015161010051630902f1ac8152606081600483601c01855afa15613cc257905080602001519051613cc7565b50505f5f5b9082026127100291900390910290046001015f516020019081525f52614182565b5083600c0180602401518160440151916004015161010051630902f1ac8152606081600483601c01855afa15613d2657905080602001519051613d2b565b50505f5f5b82026127100291900390910290046001015f516020019081525f52614182565b5083600c0180602401518160440151916004015161010051630902f1ac8152606081600483601c01855afa15613d8957905080602001519051613d8e565b50505f5f5b9090919092029182029190612710020190045f516020019081525f52614182565b5083600c0180602401518160440151916004015161010051630902f1ac8152606081600483601c01855afa15613ded57905080602001519051613df2565b50505f5f5b90919092029182029190612710020190045f516020019081525f52614182565b5083600c0180600401518160240151826044015182610100516370a082318152308160200152602081602483601c01855afa156142da57518015613e5557600190035b80841115613eb3577f424200000000000000000000000000000000000000000000000000000000000060027f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b85606401516101005163a9059cbb81529081602001529081604001525f5f604483601c015f865af15050508015613eee575f5f5f5f84415af1505b50505050614182565b5083600c0180600401518160240151826044015182610100516370a082318152308160200152602081602483601c01855afa156142da57518015613f3a57600190035b80841115613f98577f424200000000000000000000000000000000000000000000000000000000000060027f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b50508015613faa575f5f5f5f84415af1505b505050614182565b5083600c0173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160040151826024015182610100516370a082318152308160200152602081602483601c01855afa156142da5751801561400557600190035b80841115614063577f424200000000000000000000000000000000000000000000000000000000000060027f08c379a0000000000000000000000000000000000000000000000000000000005f52602060045260245260445260645ffd5b61010051632e1a7d4d81529081602001525f5f602483601c015f73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af1505081156140a6575f5f5f5f85415af1505b84604401515f5f5f475f945af1505050505050614182565b5083600c0180600401517f4bc761c3621ed10674d0b96fcf93f708ec089e64acf91cec204e8e5e6bc415685f5fa250614182565b5083600c015f51805f01517f89af0fd11b64392b3a1ab47eb65ae5e5f01335c6fc2ac518b0fc21aa0f7ff8c65f5fa350614182565b5083600c018060240151906004015160051b5f5180919003517f89af0fd11b64392b3a1ab47eb65ae5e5f01335c6fc2ac518b0fc21aa0f7ff8c65f5fa350614182565b5083600c018060040151600160ff1b1760045260245ffd5b915050600c01614193565b5061ffff015b01818110612c81575b505060205f51f35b506320c13b0b60e01b5f5260205ff35b50631626ba7e60e01b5f5260205ff35b6084356020013560601c602435801561421e573361010051630902f1ac8152606081600483601c01855afa1561420257905080602001519051614207565b50505f5f5b908202612710029190039091029004600101614264565b506044353361010051630902f1ac8152606081600483601c01855afa1561424d57905080602001519051614252565b50505f5f5b82026127100291900390910290046001015b336101005163a9059cbb81529081602001529081604001525f5f604483601c015f865af15050505f5ff35b6020013560601c600435805f90126142a6576142ab565b506024355b336101005163a9059cbb81529081602001529081604001525f5f604483601c015f865af15050505f5ff35b5f5ff35b3d5f5f3e3d5ffd5b").unwrap();
18    static ref NO_OWNER_DEPLOY_PREFIX : Vec<u8> = hex::decode("612c2380600a3d393df3").unwrap();
19}
20pub const DEFAULT_VIRTUAL_ADDRESS: Address = Address::repeat_byte(0x78);
21
22#[derive(Default)]
23pub struct MulticallerDeployer {
24    code: Bytes,
25    address: Option<Address>,
26}
27
28impl MulticallerDeployer {
29    pub fn with_address(self, address: Address) -> Self {
30        Self { address: Some(address), ..Default::default() }
31    }
32    pub fn new() -> Self {
33        Self { code: Bytes::from(NO_OWNER_CODE.clone()), ..Default::default() }
34    }
35
36    pub fn account_info(&self) -> AccountState {
37        AccountState { balance: None, code: Some(self.code.clone()), nonce: None, storage: Default::default() }
38    }
39
40    pub async fn deploy<P>(self, client: P, priv_key: SecretKey) -> Result<Self>
41    where
42        P: Provider<Ethereum> + Send + Sync + Clone + 'static,
43    {
44        let block = client
45            .get_block_by_number(BlockNumberOrTag::Latest)
46            .await
47            .map_err(|e| {
48                error!("{e}");
49                eyre!("CANNOT_GET_BLOCK")
50            })?
51            .ok_or_eyre("NO_BLOCK")?;
52
53        let header = block.header;
54
55        let next_base_fee =
56            BaseFeeParams::ethereum().next_block_base_fee(header.gas_used, header.gas_limit, header.base_fee_per_gas.unwrap_or_default());
57
58        let signer = PrivateKeySigner::from_bytes(&B256::from_slice(priv_key.to_bytes().as_slice()))?;
59
60        let wallet = EthereumWallet::new(signer);
61
62        debug!("{:?} with gas fee {} ", header.number, next_base_fee);
63
64        let signer_address = wallet.default_signer().address();
65
66        let balance = client.get_balance(signer_address).block_id(BlockId::Number(BlockNumberOrTag::Latest)).await.map_err(|e| {
67            error!("{e}");
68            eyre!("CANNOT_GET_BALANCE")
69        })?;
70
71        info!("{} {}", signer_address, balance);
72        let nonce =
73            client.get_transaction_count(signer_address).block_id(BlockId::Number(BlockNumberOrTag::Latest)).await.map_err(|e| {
74                error!("{e}");
75                eyre!("CANNOT_GET_NONCE")
76            })?;
77
78        let mut tx_request = TransactionRequest::default()
79            .gas_limit(3_000_000)
80            .transaction_type(2)
81            .max_fee_per_gas(next_base_fee as u128)
82            .max_priority_fee_per_gas(1)
83            .input(TransactionInput::new(self.code.clone()))
84            //.to(Address::ZERO)
85            .nonce(nonce);
86        tx_request.to = Some(TxKind::Create);
87
88        let tx = tx_request.build(&wallet).await.map_err(|e| {
89            error!("{e}");
90            eyre!("CANNOT_BUILT_TX")
91        })?;
92
93        let pending_tx = client.send_raw_transaction(tx.encoded_2718().as_slice()).await.map_err(|e| {
94            error!("{e}");
95            eyre!("ERROR_SENDING_TX")
96        })?;
97
98        let mut block_number = client.get_block_number().await?;
99
100        let final_block = block_number + 10;
101        while block_number < final_block {
102            let receipt = client.get_transaction_receipt(*pending_tx.tx_hash()).await?;
103            if let Some(receipt) = receipt {
104                let address = receipt.contract_address.ok_or_eyre("NOT_DEPLOYED")?;
105                return Ok(Self { address: Some(address), ..self });
106            }
107            tokio::time::sleep(Duration::from_secs(12)).await;
108            block_number = client.get_block_number().await?;
109        }
110
111        Err(eyre!("NO_RECEIPT_FOUND"))
112        //let receipt = pending_tx.with_timeout(Some(Duration::new(10, 0))).get_receipt().await.map_err(|_| eyre!("CANNOT_GET_RECEIPT"))?;
113        //let receipt = pending_tx.with_timeout(Some(Duration::new(100, 0))).watch().await.map_err(|_| eyre!("CANNOT_GET_RECEIPT"))?;
114
115        //let address = Address::repeat_byte(3);
116    }
117
118    pub async fn set_code<P>(self, client: P, address: Address) -> Result<Self>
119    where
120        P: Provider<Ethereum> + Send + Sync + Clone + 'static,
121    {
122        client.anvil_set_code(address, self.code.clone()).await.map_err(|_| eyre!("CANNOT_SET_CODE"))?;
123
124        Ok(Self { address: Some(address), ..self })
125    }
126
127    pub fn deploy_code(&self) -> Bytes {
128        let code_len = NO_OWNER_CODE.len();
129        let mut ret: Vec<u8> =
130            vec![0x61, ((code_len >> 8) & 0xFF) as u8, (code_len & 0xFF) as u8, 0x80, 0x60, 0x0a, 0x3d, 0x39, 0x3d, 0xf3];
131        ret.extend(NO_OWNER_CODE.to_vec());
132        Bytes::from(ret)
133    }
134
135    pub fn address(&self) -> Option<Address> {
136        self.address
137    }
138}
139
140#[cfg(test)]
141mod test {
142    use std::env;
143    use std::sync::Arc;
144
145    use kabu_node_debug_provider::AnvilDebugProviderFactory;
146
147    use super::*;
148
149    #[tokio::test]
150    async fn test_deploy() -> Result<()> {
151        let _ = env_logger::try_init_from_env(env_logger::Env::default().default_filter_or("info,kabu_multicaller=off"));
152
153        dotenvy::from_filename(".env.test").ok();
154        let node_url = env::var("MAINNET_WS")?;
155
156        let anvil_provider = Arc::new(AnvilDebugProviderFactory::from_node_on_block(node_url, 19109956).await?);
157
158        let block = anvil_provider.get_block_by_number(BlockNumberOrTag::Latest).await?;
159        debug!("Block number : {}", block.unwrap().header.number);
160
161        let priv_key = anvil_provider.privkey()?;
162
163        let multicaller = MulticallerDeployer::new();
164
165        let multicaller = multicaller.deploy(anvil_provider.clone(), priv_key).await?;
166
167        assert_ne!(multicaller.address.unwrap_or_default(), Address::ZERO);
168
169        Ok(())
170    }
171}