diff --git a/.env.sample b/.env.sample index cfb5b837a..80261a415 100644 --- a/.env.sample +++ b/.env.sample @@ -10,4 +10,9 @@ STAKING_ADMIN_ADDRESS= STAKING_NODES_ADMIN_ADDRESS= VALIDATOR_MANAGER_ADDRESS= REWARDS_DISTRIBUTOR_ADDRESS= -PROXY_OWNER \ No newline at end of file +PROXY_OWNER= + +# for deploying the contracts +RPC_URL= +# for use with cast wallet. store the deployer private key in the keystore and put the public address here. +DEPLOYER_ADDRESS= diff --git a/Makefile b/Makefile index 72f3c2dde..22b8eb273 100644 --- a/Makefile +++ b/Makefile @@ -28,3 +28,17 @@ deploy-protocol :; forge script script/DeployYieldNest.s.sol:DeployYieldNest -- # Verify verify-roles :; forge script script/Verify.s.sol --rpc-url ${rpc} + +# to set up cast wallet run: cast wallet import yieldnestDeployerKey --interactive +# then import the private key with which you wish to deploy, create a password and add the public address of that key to the .env under DEPLOYER_ADDRESS. + +# make ynEigen path=script/ynEigen/input/lsd-mainnet.json rpc=your-rpc-here deployer=0xYourPublicAddressThatCorrespondsToYourSavedPrivateKeyInyieldnestDeployerKey api=etherscanApiKey +deployerAccountName ?= yieldnestDeployerKey +ynEigen :; forge script script/ynEigen/YnEigenScript.s.sol:YnEigenScript --rpc-url ${rpc} --sig "run(string)" ${path} --account ${deployerAccountName} --sender ${deployer} --broadcast --etherscan-api-key ${api} --verify + +# make ynEigen-verify path=script/ynEigen/input/lsd-mainnet.json rpc=your-rpc-here +ynEigen-verify :; forge script script/ynEigen/YnEigenScript.s.sol:YnEigenScript --rpc-url ${rpc} --sig "verify(string)" ${path} --broadcast + +# alternative bash script with less inputs +# make ynEigen-bash path=script/ynEigen/input/lsd-mainnet.json +ynEigen-bash :; ./script/ynEigen/bash/deployYnEigen.sh ${path} diff --git a/deployments/YnLSDe-1.json b/deployments/YnLSDe-1.json new file mode 100644 index 000000000..aac6385a9 --- /dev/null +++ b/deployments/YnLSDe-1.json @@ -0,0 +1,37 @@ +{ + "ADMIN": "0xfcad670592a3b24869C0b51a6c6FDED4F95D6975", + "DEFAULT_SIGNER": "0xa1E340bd1e3ea09B3981164BBB4AfeDdF0e7bA0D", + "EIGEN_STRATEGY_ADMIN": "0xfcad670592a3b24869C0b51a6c6FDED4F95D6975", + "PAUSE_ADMIN": "0xa08F39d30dc865CC11a49b6e5cBd27630D6141C3", + "PROXY_ADMIN_OWNER": "0xfcad670592a3b24869C0b51a6c6FDED4F95D6975", + "STAKING_ADMIN": "0xfcad670592a3b24869C0b51a6c6FDED4F95D6975", + "STAKING_NODES_OPERATOR": "0xa08F39d30dc865CC11a49b6e5cBd27630D6141C3", + "STRATEGY_CONTROLLER": "0x0573A7DaFBc080064663623979287286Bb65C1BD", + "TOKEN_STAKING_NODE_CREATOR": "0xa08F39d30dc865CC11a49b6e5cBd27630D6141C3", + "UNPAUSE_ADMIN": "0xfcad670592a3b24869C0b51a6c6FDED4F95D6975", + "YNDev": "0xa08F39d30dc865CC11a49b6e5cBd27630D6141C3", + "YnSecurityCouncil": "0xfcad670592a3b24869C0b51a6c6FDED4F95D6975", + "implementation-YnLSDe": "0x3688bAce1C507b368b5061F97cB48037f0Df6b2f", + "implementation-assetRegistry": "0x84dA5aB890B0a3314deEd0BeBd2463309a755EAc", + "implementation-eigenStrategyManager": "0xE2343a850394ee1b1e33b16Da5bD73B076D6Fa81", + "implementation-rateProvider": "0xAEDC83F607126b4D2437F79285e2C635685BBA01", + "implementation-tokenStakingNodesManager": "0x17e77F964538fed3ADEc3E8dBB6147dA258206Da", + "implementation-ynEigenDepositAdapter": "0x5F8c55A5A33d63CAa231c668a62f69AA862020E9", + "implementation-ynEigenViewer": "0x95046553147036dA98Aecc02B2526FCBc36F4306", + "proxy-YnLSDe": "0x35Ec69A77B79c255e5d47D5A3BdbEFEfE342630c", + "proxy-assetRegistry": "0x323C933df2523D5b0C756210446eeE0fB84270fd", + "proxy-eigenStrategyManager": "0x92D904019A92B0Cafce3492Abb95577C285A68fC", + "proxy-rateProvider": "0xb658Cf6F4C232Be5c6035f2b42b96393089F20D9", + "proxy-tokenStakingNodesManager": "0x6B566CB6cDdf7d140C59F84594756a151030a0C3", + "proxy-ynEigenDepositAdapter": "0xA9CD5a5199177b704287e379e85af95F0f061Bf2", + "proxy-ynEigenViewer": "0x9B933D84Fac0782F3B275D76B64a0DBf6FBEf28F", + "proxyAdmin-YnLSDe": "0x1bfF798A6072597c401f7C83A6a1096Ae5F0aFf7", + "proxyAdmin-assetRegistry": "0xDf92BE359fB53846cCdaC8FFF1884314533949C7", + "proxyAdmin-eigenStrategyManager": "0x69C34FB00Ebc0d7ac09Ab7968D2Eb9a07C2eB301", + "proxyAdmin-rateProvider": "0x16c95825faD0CE0dD56698bc8Ab49E7B00Fa29d9", + "proxyAdmin-tokenStakingNodesManager": "0x850d012115fb4D90711F53e86B2945019Bf7F36C", + "proxyAdmin-ynEigenDepositAdapter": "0x7D779806B0c6A0201984b82e57830B84a75c3C07", + "proxyAdmin-ynEigenViewer": "0x40fBdD124e80fF168574Fa7823440E574345307E", + "tokenStakingNodeImplementation": "0x57e1D090B1aF526CD4174019D5b9702EEBE236FA", + "upgradeTimelock": "0xbB73f8a5B0074b27c6df026c77fA08B0111D017A" +} \ No newline at end of file diff --git a/deployments/YnLSDe-17000.json b/deployments/YnLSDe-17000.json new file mode 100644 index 000000000..47f1d1fa7 --- /dev/null +++ b/deployments/YnLSDe-17000.json @@ -0,0 +1,37 @@ +{ + "ADMIN": "0x743b91CDB1C694D4F51bCDA3a4A59DcC0d02b913", + "DEFAULT_SIGNER": "0x72fdBD51085bDa5eEEd3b55D1a46E2e92f0837a5", + "EIGEN_STRATEGY_ADMIN": "0x743b91CDB1C694D4F51bCDA3a4A59DcC0d02b913", + "PAUSE_ADMIN": "0x743b91CDB1C694D4F51bCDA3a4A59DcC0d02b913", + "PROXY_ADMIN_OWNER": "0x743b91CDB1C694D4F51bCDA3a4A59DcC0d02b913", + "STAKING_ADMIN": "0x743b91CDB1C694D4F51bCDA3a4A59DcC0d02b913", + "STAKING_NODES_OPERATOR": "0x9Dd8F69b62ddFd990241530F47dcEd0Dad7f7d39", + "STRATEGY_CONTROLLER": "0x1234567890123456789012345678901234567890", + "TOKEN_STAKING_NODE_CREATOR": "0x9Dd8F69b62ddFd990241530F47dcEd0Dad7f7d39", + "UNPAUSE_ADMIN": "0x743b91CDB1C694D4F51bCDA3a4A59DcC0d02b913", + "YNDev": "0x9Dd8F69b62ddFd990241530F47dcEd0Dad7f7d39", + "YnSecurityCouncil": "0x743b91CDB1C694D4F51bCDA3a4A59DcC0d02b913", + "implementation-YnLSDe": "0xA6cf070663127FAa41a2150BdadAD8D84b876AEb", + "implementation-assetRegistry": "0x7385f1dBF3b0Ee3d85c89A38901Aa87333D30946", + "implementation-eigenStrategyManager": "0xc599064e66FB509FD49B5083896649a742066758", + "implementation-rateProvider": "0x94009d1296dc2e6370Aa34c94BEDFeD55f96a276", + "implementation-tokenStakingNodesManager": "0xAD89Fd40BE78811E279C89FF15DC3B831785192D", + "implementation-ynEigenDepositAdapter": "0x7af5cc12cee35dee9ccd0aa4d5e1772eb45b2046", + "implementation-ynEigenViewer": "0x85bB85b81Db2f9b446e9100057420AE5DE7232E4", + "proxy-YnLSDe": "0x071bdC8eDcdD66730f45a3D3A6F794FAA37C75ED", + "proxy-assetRegistry": "0xaD31546AdbfE1EcD7137310508f112039a35b6F7", + "proxy-eigenStrategyManager": "0xA0a11A9b84bf87c0323bc183715a22eC7881B7FC", + "proxy-rateProvider": "0xd68C29263F6dC2Ff8D9307b3AfAcD6D6fDeFbB3A", + "proxy-tokenStakingNodesManager": "0x5c20D1a85C7d9acB503135a498E26Eb55d806552", + "proxy-ynEigenDepositAdapter": "0x7d0c1F604571a1c015684e6c15f2DdEc432C5e74", + "proxy-ynEigenViewer": "0xECCE549926637E974Ca5739a8827E612682415E7", + "proxyAdmin-YnLSDe": "0x92Df7b6001EF4cFe40B6b425bC4a358c05f27624", + "proxyAdmin-assetRegistry": "0x4248392db8Ee31aA579822207d059A28A38c4510", + "proxyAdmin-eigenStrategyManager": "0x010c60d663fddDAA076F0cE63f6692f0b5605fE5", + "proxyAdmin-rateProvider": "0x401af3714dc0c0d28f752dbdd70cf423c667246e", + "proxyAdmin-tokenStakingNodesManager": "0x18ED5129bCEfA996B4cade4e614c8941De3126d2", + "proxyAdmin-ynEigenDepositAdapter": "0x9E9ce6D0fD72c7A31Eb7D99d8eCEA4b35a4FD088", + "proxyAdmin-ynEigenViewer": "0x4879936e5822b936A9981f8F67844BC77096d433", + "tokenStakingNodeImplementation": "0xd1436C90205Dc2F807C33D88F122dC9D06964200", + "upgradeTimelock": "0x62173555C27C67644C5634e114e42A63A59CD7A5" +} \ No newline at end of file diff --git a/deployments/v0.0.1-ynEigenViewer-17000-5de937eb1b24988a0dd41055c952704cb9f80b52.json b/deployments/v0.0.1-ynEigenViewer-17000-5de937eb1b24988a0dd41055c952704cb9f80b52.json new file mode 100644 index 000000000..ecab0c513 --- /dev/null +++ b/deployments/v0.0.1-ynEigenViewer-17000-5de937eb1b24988a0dd41055c952704cb9f80b52.json @@ -0,0 +1,138 @@ +{ + "transactions": [ + { + "hash": "0xf6bfd7e25ff21b070def44eefe3634e11f65a3a581d33cdda8b117793891b7cd", + "transactionType": "CREATE", + "contractName": "ynEigenViewer", + "contractAddress": "0x0310a0fc1a7e90ce415d3aff47840ca85eea4669", + "function": null, + "arguments": [ + "0xc92b41c727AC4bB5D64D9a3CC5541Ef7113578b0", + "0x36594E4127F9335A1877A510c6F20D2F95138Fcd", + "0xc87e63553fCd94A833cb512AF9244DE9001f8eB3", + "0xCA4c0f3C573cC3Ae09C312aBd1dC0Be0A12913bA" + ], + "transaction": { + "from": "0x318d0059efe546b5687fa6744af4339391153981", + "gas": "0xd2c15", + "value": "0x0", + "input": "0x610100604052348015610010575f80fd5b50604051610c0f380380610c0f83398101604081905261002f9161006c565b6001600160a01b0393841660805291831660a052821660c0521660e0526100bd565b80516001600160a01b0381168114610067575f80fd5b919050565b5f805f806080858703121561007f575f80fd5b61008885610051565b935061009660208601610051565b92506100a460408601610051565b91506100b260608601610051565b905092959194509250565b60805160a05160c05160e051610afd6101125f395f818161013e015261033e01525f8181610117015261065401525f818160d8015281816102a801526103f101525f8181610165015261019b0152610afd5ff3fe608060405234801561000f575f80fd5b5060043610610085575f3560e01c80637c0867af116100585780637c0867af14610112578063949db65814610139578063979d7e86146101605780639d8e217714610187575f80fd5b80632786b556146100895780632e0f2625146100a75780633ff36802146100be57806363f7bad5146100d3575b5f80fd5b610091610196565b60405161009e9190610726565b60405180910390f35b6100b06103e881565b60405190815260200161009e565b6100c6610650565b60405161009e91906107d6565b6100fa7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161009e565b6100fa7f000000000000000000000000000000000000000000000000000000000000000081565b6100fa7f000000000000000000000000000000000000000000000000000000000000000081565b6100fa7f000000000000000000000000000000000000000000000000000000000000000081565b6100b0670de0b6b3a764000081565b60605f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166367e4ac2c6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156101f4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261021b91908101906108a1565b80519091508067ffffffffffffffff81111561023957610239610822565b6040519080825280602002602001820160405280156102a257816020015b61028f6040518060a001604052805f6001600160a01b0316815260200160608152602001606081526020015f81526020015f81525090565b8152602001906001900390816102575790505b5092505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa158015610302573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610326919061093b565b90505f5b82811015610649575f670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630ba9d8ca87858151811061037d5761037d610952565b60200260200101516040518263ffffffff1660e01b81526004016103b091906001600160a01b0391909116815260200190565b602060405180830381865afa1580156103cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103ef919061093b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663cd88e55888868151811061043057610430610952565b60200260200101516040518263ffffffff1660e01b815260040161046391906001600160a01b0391909116815260200190565b602060405180830381865afa15801561047e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a2919061093b565b6104ac9190610966565b6104b6919061098f565b90506040518060a001604052808684815181106104d5576104d5610952565b60200260200101516001600160a01b031681526020018684815181106104fd576104fd610952565b60200260200101516001600160a01b03166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa15801561053f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261056691908101906109ae565b815260200186848151811061057d5761057d610952565b60200260200101516001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa1580156105bf573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105e691908101906109ae565b81526020015f831180156105f957505f85115b610603575f61061a565b846106106103e885610966565b61061a919061098f565b81526020018281525086838151811061063557610635610952565b60209081029190910101525060010161032a565b5050505090565b60607f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a1174e7d6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156106ad573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106d49190810190610a3d565b905090565b5f5b838110156106f35781810151838201526020016106db565b50505f910152565b5f81518084526107128160208601602086016106d9565b601f01601f19169290920160200192915050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b838110156107c857888303603f19018552815180516001600160a01b031684528781015160a089860181905290610786828701826106fb565b915050878201518582038987015261079e82826106fb565b6060848101519088015260809384015193909601929092525050938601939086019060010161074d565b509098975050505050505050565b602080825282518282018190525f9190848201906040850190845b818110156108165783516001600160a01b0316835292840192918401916001016107f1565b50909695505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561085f5761085f610822565b604052919050565b5f67ffffffffffffffff82111561088057610880610822565b5060051b60200190565b6001600160a01b038116811461089e575f80fd5b50565b5f60208083850312156108b2575f80fd5b825167ffffffffffffffff8111156108c8575f80fd5b8301601f810185136108d8575f80fd5b80516108eb6108e682610867565b610836565b81815260059190911b82018301908381019087831115610909575f80fd5b928401925b828410156109305783516109218161088a565b8252928401929084019061090e565b979650505050505050565b5f6020828403121561094b575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b808202811582820484141761098957634e487b7160e01b5f52601160045260245ffd5b92915050565b5f826109a957634e487b7160e01b5f52601260045260245ffd5b500490565b5f602082840312156109be575f80fd5b815167ffffffffffffffff808211156109d5575f80fd5b818401915084601f8301126109e8575f80fd5b8151818111156109fa576109fa610822565b610a0d601f8201601f1916602001610836565b9150808252856020828501011115610a23575f80fd5b610a348160208401602086016106d9565b50949350505050565b5f6020808385031215610a4e575f80fd5b825167ffffffffffffffff811115610a64575f80fd5b8301601f81018513610a74575f80fd5b8051610a826108e682610867565b81815260059190911b82018301908381019087831115610aa0575f80fd5b928401925b82841015610930578351610ab88161088a565b82529284019290840190610aa556fea26469706673582212206575e6f708ed2865968430fd2a4e24448ad3ce55fb1d3d3920767fe39f50739664736f6c63430008180033000000000000000000000000c92b41c727ac4bb5d64d9a3cc5541ef7113578b000000000000000000000000036594e4127f9335a1877a510c6f20d2f95138fcd000000000000000000000000c87e63553fcd94a833cb512af9244de9001f8eb3000000000000000000000000ca4c0f3c573cc3ae09c312abd1dc0be0a12913ba", + "nonce": "0x3", + "chainId": "0x4268" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x5f3df9e78021882429e3a9a5344a2c6b2a168616ff57a37045729d09d23ec1ae", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0xc438806b0726ade87f746d2b2ad07f6f05a26a85", + "function": null, + "arguments": [ + "0x0310A0fc1A7E90CE415D3AFf47840CA85eEa4669", + "0x743b91CDB1C694D4F51bCDA3a4A59DcC0d02b913", + "0x" + ], + "transaction": { + "from": "0x318d0059efe546b5687fa6744af4339391153981", + "gas": "0xce728", + "value": "0x0", + "input": "0x60a060405260405162000e5038038062000e508339810160408190526200002691620003bc565b828162000034828262000099565b50508160405162000045906200035a565b6001600160a01b039091168152602001604051809103905ff0801580156200006f573d5f803e3d5ffd5b506001600160a01b0316608052620000906200008a60805190565b620000fe565b505050620004b3565b620000a4826200016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000f057620000eb8282620001ee565b505050565b620000fa62000267565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6200013f5f8051602062000e30833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16200016c8162000289565b50565b806001600160a01b03163b5f03620001aa57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516200020c919062000496565b5f60405180830381855af49150503d805f811462000246576040519150601f19603f3d011682016040523d82523d5f602084013e6200024b565b606091505b5090925090506200025e858383620002ca565b95945050505050565b3415620002875760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b038116620002b457604051633173bdd160e11b81525f6004820152602401620001a1565b805f8051602062000e30833981519152620001cd565b606082620002e357620002dd8262000330565b62000329565b8151158015620002fb57506001600160a01b0384163b155b156200032657604051639996b31560e01b81526001600160a01b0385166004820152602401620001a1565b50805b9392505050565b805115620003415780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6104fc806200093483390190565b80516001600160a01b03811681146200037f575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620003b45781810151838201526020016200039a565b50505f910152565b5f805f60608486031215620003cf575f80fd5b620003da8462000368565b9250620003ea6020850162000368565b60408501519092506001600160401b038082111562000407575f80fd5b818601915086601f8301126200041b575f80fd5b81518181111562000430576200043062000384565b604051601f8201601f19908116603f011681019083821181831017156200045b576200045b62000384565b8160405282815289602084870101111562000474575f80fd5b6200048783602083016020880162000398565b80955050505050509250925092565b5f8251620004a981846020870162000398565b9190910192915050565b608051610469620004cb5f395f601001526104695ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007a575f356001600160e01b03191663278f794360e11b14610070576040516334ad5dbb60e21b815260040160405180910390fd5b610078610082565b565b6100786100b0565b5f806100913660048184610303565b81019061009e919061033e565b915091506100ac82826100c0565b5050565b6100786100bb61011a565b610151565b6100c98261016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101125761010d82826101ea565b505050565b6100ac61025c565b5f61014c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e80801561016b573d5ff35b3d5ffd5b806001600160a01b03163b5f036101a957604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102069190610407565b5f60405180830381855af49150503d805f811461023e576040519150601f19603f3d011682016040523d82523d5f602084013e610243565b606091505b509150915061025385838361027b565b95945050505050565b34156100785760405163b398979f60e01b815260040160405180910390fd5b6060826102905761028b826102da565b6102d3565b81511580156102a757506001600160a01b0384163b155b156102d057604051639996b31560e01b81526001600160a01b03851660048201526024016101a0565b50805b9392505050565b8051156102ea5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610311575f80fd5b8386111561031d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561034f575f80fd5b82356001600160a01b0381168114610365575f80fd5b9150602083013567ffffffffffffffff80821115610381575f80fd5b818501915085601f830112610394575f80fd5b8135818111156103a6576103a661032a565b604051601f8201601f19908116603f011681019083821181831017156103ce576103ce61032a565b816040528281528860208487010111156103e6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610426576020818601810151858301520161040c565b505f92019182525091905056fea26469706673582212202bdadd4d90be9694cdd96b74937fb73e8cb3ab30807abea8aecf7c946f10f50364736f6c63430008180033608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea26469706673582212204852424075b6dea1d1527c7df075e3c174ec7222e99be5d8f0c28327860a53d964736f6c63430008180033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000000310a0fc1a7e90ce415d3aff47840ca85eea4669000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b91300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x4", + "chainId": "0x4268" + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0x83388ccee650bf6fc7a2c771531032f1dee62631", + "initCode": "0x608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea26469706673582212204852424075b6dea1d1527c7df075e3c174ec7222e99be5d8f0c28327860a53d964736f6c63430008180033000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x1d8a10", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0xf6bfd7e25ff21b070def44eefe3634e11f65a3a581d33cdda8b117793891b7cd", + "transactionIndex": "0x8", + "blockHash": "0x3ab1a186fe5df7ded089a4e0a79013cbcf8ca3d59955a04e95b8a31a9c360b02", + "blockNumber": "0x1fdede", + "gasUsed": "0xa21e9", + "effectiveGasPrice": "0x989687", + "from": "0x318d0059efe546b5687fa6744af4339391153981", + "to": null, + "contractAddress": "0x0310a0fc1a7e90ce415d3aff47840ca85eea4669" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x458d9d", + "logs": [ + { + "address": "0xc438806b0726ade87f746d2b2ad07f6f05a26a85", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x0000000000000000000000000310a0fc1a7e90ce415d3aff47840ca85eea4669" + ], + "data": "0x", + "blockHash": "0xeeb73d2c0db12722709e423a6bca2d0f26cd99e12fd854ee48047e5c016017e6", + "blockNumber": "0x1fdedf", + "transactionHash": "0x5f3df9e78021882429e3a9a5344a2c6b2a168616ff57a37045729d09d23ec1ae", + "transactionIndex": "0x14", + "logIndex": "0x13", + "removed": false + }, + { + "address": "0x83388ccee650bf6fc7a2c771531032f1dee62631", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913" + ], + "data": "0x", + "blockHash": "0xeeb73d2c0db12722709e423a6bca2d0f26cd99e12fd854ee48047e5c016017e6", + "blockNumber": "0x1fdedf", + "transactionHash": "0x5f3df9e78021882429e3a9a5344a2c6b2a168616ff57a37045729d09d23ec1ae", + "transactionIndex": "0x14", + "logIndex": "0x14", + "removed": false + }, + { + "address": "0xc438806b0726ade87f746d2b2ad07f6f05a26a85", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083388ccee650bf6fc7a2c771531032f1dee62631", + "blockHash": "0xeeb73d2c0db12722709e423a6bca2d0f26cd99e12fd854ee48047e5c016017e6", + "blockNumber": "0x1fdedf", + "transactionHash": "0x5f3df9e78021882429e3a9a5344a2c6b2a168616ff57a37045729d09d23ec1ae", + "transactionIndex": "0x14", + "logIndex": "0x15", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000400000000000000000800000000000000001000000000004000000000000000000000000000000000000000100000000000000000000000000000040000002000081000000002000000000000000000000000000020000000000000000000800400000800000000000000000000000400000020000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000010000000000000000000000000000020000000000000020000000000000000000400000000000000000020000000000000000400000000000000000000008000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x5f3df9e78021882429e3a9a5344a2c6b2a168616ff57a37045729d09d23ec1ae", + "transactionIndex": "0x14", + "blockHash": "0xeeb73d2c0db12722709e423a6bca2d0f26cd99e12fd854ee48047e5c016017e6", + "blockNumber": "0x1fdedf", + "gasUsed": "0x9ece4", + "effectiveGasPrice": "0x989687", + "from": "0x318d0059efe546b5687fa6744af4339391153981", + "to": null, + "contractAddress": "0xc438806b0726ade87f746d2b2ad07f6f05a26a85" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1723071925, + "chain": 17000, + "commit": "5de937e" + } \ No newline at end of file diff --git a/deployments/v0.0.1-ynLSDe-1-a3475434f19a3174081e6e24f9c1adf811d0b387.json b/deployments/v0.0.1-ynLSDe-1-a3475434f19a3174081e6e24f9c1adf811d0b387.json new file mode 100644 index 000000000..c59d3be2d --- /dev/null +++ b/deployments/v0.0.1-ynLSDe-1-a3475434f19a3174081e6e24f9c1adf811d0b387.json @@ -0,0 +1,1934 @@ +{ + "transactions": [ + { + "hash": "0xf0712dba18ecfd0c72fccc0556b6dd7301259f1aefcf3bf891f1f0e33a8a790c", + "transactionType": "CREATE", + "contractName": "ContractAddresses", + "contractAddress": "0xaa5ea91ad3bf55fc8daa013eeb95cd4d67307d02", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "gas": "0x2ba161", + "value": "0x0", + "input": "0x60c06040526001608081905261426860a0819052908055600255348015610024575f80fd5b506040518060c00160405280604051806040016040528073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031681526020016f219ab540356cbb839cbe05303d7705fa6001600160a01b031681525081526020016040518060c001604052807391e677b07f7af907ec9a428aafa9fc14a0d3a3386001600160a01b031681526020017339053d51b77dc0d36036fc1fcc8cb819df8ef37a6001600160a01b0316815260200173369e6f597e22eab55ffb173c6d9cd234bd6991116001600160a01b0316815260200173858646372cc42e1a627fce94aa7a7033e7cf075a6001600160a01b0316815260200173be1685c81aa44ff9fb319dd389addd9374383e906001600160a01b03168152602001737fe7e9cc0f274d2435ad5d56d5fa73e47f6a23d86001600160a01b0316815250815260200160405180610140016040528073ac3e018457b222d93114458476f3e3416abbe38f6001600160a01b0316815260200173ae78736cd615f374d3085123a210448e74fc63936001600160a01b0316815260200173ae7ab96520de3a18e5e111b5eaab095312d7fe846001600160a01b03168152602001737f39c581f595b53c5cb19bd0b3f8da6c935e2ca06001600160a01b0316815260200173856c4efb76c1d1ae02e20ceb03a2a6a08b0b8dc36001600160a01b0316815260200173dcee70654261af21c44c093c300ed3bb97b781926001600160a01b03168152602001739858e47bcbbe6fbac040519b02d7cd4b2c470c666001600160a01b0316815260200173f951e335afb289353dc249e82926178eac7ded786001600160a01b0316815260200173d5f7838f5c461feff7fe49ea5ebaf7728bb0adfa6001600160a01b0316815260200173be9895146f7af43049ca1c1ae358b0541ea497046001600160a01b031681525081526020016040518060e00160405280731bee69b7dfffa4e2d53c2a2df135c388ad25dcd26001600160a01b031681526020017393c4b944d05dfe6df7645a86cd2206016c51564d6001600160a01b0316815260200173a4c637e0f704745d182e4d38cab7e7485321d0596001600160a01b03168152602001738ca7a5d6f3acd3a7a8bc468a8cd0fb14b6bd28b66001600160a01b03168152602001730fe4f44bee93503346a3ac9ee5a26b130a5796d66001600160a01b0316815260200173298afb19a105d59e74658c4c334ff360bade6dd26001600160a01b031681526020017354945180db7943c0ed0fee7edab2bd24620256bc6001600160a01b031681525081526020016040518060a001604052807309db87a538bd693e9d08544577d5ccfaa6373a486001600160a01b03168152602001738c33a1d6d062db7b51f79702355771d44359cd7d6001600160a01b031681526020017340d5ff3e218f54f4982661a0464a298cf66523516001600160a01b03168152602001731d6b2a11ffea5f9a8ed85a02581910b3d695c12b6001600160a01b0316815260200173e439fe4563f7666fcd7405bec24ae7b0d226536e6001600160a01b031681525081526020016040518060e001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f6001600160a01b031681526020015f6001600160a01b031681526020015f6001600160a01b031681526020015f6001600160a01b031681526020015f6001600160a01b03168152508152505f8060015f015481526020019081526020015f205f820151815f015f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050506020820151816002015f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506080820151816004015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a0820151816005015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050506040820151816008015f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506080820151816004015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a0820151816005015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060c0820151816006015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e0820151816007015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550610100820151816008015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550610120820151816009015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050506060820151816012015f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506080820151816004015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a0820151816005015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060c0820151816006015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050506080820151816019015f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506080820151816004015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550505060a082015181601e015f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506080820151816004015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a0820151816005015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060c0820151816006015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050509050505f600190506040518060c001604052806040518060400160405280846001600160a01b031681526020017342424242424242424242424242424242424242426001600160a01b031681525081526020016040518060c001604052807330770d7e3e71112d7a6b7259542d1f680a70e3156001600160a01b0316815260200173a44151489861fe9e3055d95adc98fbd462b948e76001600160a01b031681526020017328ade60640fdbdb2609d8d8734d1b5cbefc0c3486001600160a01b0316815260200173dfb5f6ce42aaa7830e94ecfccad411bef4d4d5b66001600160a01b031681526020017328ade60640fdbdb2609d8d8734d1b5cbefc0c3486001600160a01b0316815260200173642c646053eaf2254f088e9019acd73d9ae0fa326001600160a01b0316815250815260200160405180610140016040528073a63f56985f9c7f3bc9ffc5685535649e0c1a55f36001600160a01b03168152602001737322c24752f79c05ffd1e2a6fcb97020c1c264f16001600160a01b03168152602001733f1c547b21f65e10480de3ad8e19faac46c950346001600160a01b03168152602001738d09a4502cc8cf1547ad300e066060d043f6982d6001600160a01b031681526020017310b83fbce870642ee33f0877ffb7ea43530e473d6001600160a01b0316815260200173baacdcc565006b6429f57bc0f436dfaf14a526b16001600160a01b03168152602001739858e47bcbbe6fbac040519b02d7cd4b2c470c666001600160a01b0316815260200173f951e335afb289353dc249e82926178eac7ded786001600160a01b0316815260200173e3c063b1bee9de02eb28352b55d49d85514c67ff6001600160a01b03168152602001738720095fa5739ab051799211b146a2eee4dd8b376001600160a01b031681525081526020016040518060e00160405280733a8fbdf9e77dfc25d09741f51d3e181b25d0c4e06001600160a01b03168152602001737d704507b76571a51d9cae8addabbfd0ba0e63d36001600160a01b0316815260200173a4c637e0f704745d182e4d38cab7e7485321d0596001600160a01b03168152602001739281ff96637710cd9a5cacce9c6fad8c9f54631c6001600160a01b03168152602001730fe4f44bee93503346a3ac9ee5a26b130a5796d66001600160a01b0316815260200173accc5a86732be85b5012e8614af237801636f8e56001600160a01b031681526020017370eb4d3c164a6b4a5f908d4fbb5a9caffb66bab66001600160a01b031681525081526020016040518060a0016040528073d9029669bc74878bcb5be58c259ed0a277c5c16e6001600160a01b0316815260200173c2387ebb4ea66627e3543a771e260bd84218d6a16001600160a01b031681526020017382915eff62af9fcc0d0735b8681959e069e3f2d86001600160a01b0316815260200173a5e9e1ceb4cc1854d0e186a9b3e67158b84ad0726001600160a01b0316815260200173706eed02702ffe9cbefd6a65e63f3c2b59b7ef2d6001600160a01b031681525081526020016040518060e0016040528073071bdc8edcdd66730f45a3d3a6f794faa37c75ed6001600160a01b03168152602001735c20d1a85c7d9acb503135a498e26eb55d8065526001600160a01b0316815260200173ad31546adbfe1ecd7137310508f112039a35b6f76001600160a01b0316815260200173a0a11a9b84bf87c0323bc183715a22ec7881b7fc6001600160a01b0316815260200173d68c29263f6dc2ff8d9307b3afacd6d6fdefbb3a6001600160a01b03168152602001737d0c1f604571a1c015684e6c15f2ddec432c5e746001600160a01b031681526020017362173555c27c67644c5634e114e42a63a59cd7a56001600160a01b03168152508152505f80600180015481526020019081526020015f205f820151815f015f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050506020820151816002015f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506080820151816004015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a0820151816005015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050506040820151816008015f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0390811691909102919091179091556040848101516002850180546001600160a01b03199081169285169290921790556060808701516003870180548416918616919091179055608080880151600488018054851691871691909117905560a080890151600589018054861691881691909117905560c0808a015160068a018054871691891691909117905560e08a015160078a01805487169189169190911790556101008a015160088a0180548716918916919091179055610120909901516009909801805485169887169890981790975589820151805160128b018054861691881691909117905560208082015160138c01805487169189169190911790558186015160148c01805487169189169190911790558184015160158c01805487169189169190911790558183015160168c01805487169189169190911790558189015160178c01805487169189169190911790559089015160188b01805486169188169190911790558a820151805160198c018054871691891691909117905580820151601a8c018054871691891691909117905580860151601b8c018054871691891691909117905580840151601c8c0180548716918916919091179055820151601d8b0180548616918816919091179055998701518051601e8b0180548616918816919091179055808b0151601f8b018054861691881691909117905593840151998901805484169a86169a909a179099558201516021880180548316918516919091179055968101516022870180548916918416919091179055928301516023860180548816918316919091179055919092015160249093018054909416921691909117909155506109329050806115605f395ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c8063b04f9b5314610043578063edf26d9b1461006c578063fbe4b7c014610285575b5f80fd5b610056610051366004610615565b6102a8565b60405161006391906107fd565b60405180910390f35b61027361007a366004610615565b5f60208181529181526040908190208151808301835281546001600160a01b0390811682526001830154811682860152835160c080820186526002850154831682526003850154831682880152600485015483168287015260058501548316606080840191909152600686015484166080808501919091526007870154851660a080860191909152885161014081018a5260088901548716815260098901548716818c0152600a8901548716818b0152600b890154871681850152600c890154871681840152600d890154871681830152600e890154871681860152600f890154871660e08083019190915260108a0154881661010083015260118a015488166101208301528a518082018c5260128b01548916815260138b01548916818e015260148b01548916818d015260158b015489168187015260168b015489168186015260178b015489168185015260188b01548916818801528b518085018d5260198c01548a168152601a8c01548a16818f0152601b8c01548a16818e0152601c8c01548a1681880152601d8c01548a16818701528c519283018d52601e8c01548a168352601f8c01548a16838f01529c8b015489169b82019b909b5260218a0154881694810194909452602289015487169284019290925260238801548616908301526024909601549093169083015291949193919086565b60405161006396959493929190610887565b600154600254610293919082565b60408051928352602083019190915201610063565b6103f66040805161010081019091525f60c0820181815260e0830191909152819081526040805160c0810182525f8082526020828101829052928201819052606082018190526080820181905260a0820152910190815260408051610140810182525f8082526020828101829052928201819052606082018190526080820181905260a0820181905260c0820181905260e08201819052610100820181905261012082015291019081526040805160e0810182525f8082526020828101829052928201819052606082018190526080820181905260a0820181905260c082015291019081526040805160a0810182525f808252602082810182905292820181905260608201819052608082015291019081526040805160e0810182525f8082526020828101829052928201819052606082018190526080820181905260a0820181905260c082015291015290565b505f90815260208181526040918290208251610100808201855282546001600160a01b0390811660c08085019182526001860154831660e08087019190915291855287518082018952600287015484168152600387015484168189015260048701548416818a015260058701548416606080830191909152600688015485166080808401919091526007890154861660a080850191909152888b01939093528a5161014081018c5260088a01548716815260098a01548716818c0152600a8a01548716818d0152600b8a0154871681840152600c8a0154871681830152600d8a0154871681850152600e8a0154871681860152600f8a015487168187015260108a015487169781019790975260118901548616610120880152878b019690965289518085018b5260128901548616815260138901548616818b015260148901548616818c015260158901548616818301526016890154861681880152601789015486168184015260188901548616818501528188015289518083018b52601989015486168152601a8901548616818b0152601b8901548616818c0152601c890154861681830152601d8901548616818801528688015289519384018a52601e88015485168452601f8801548516848a015297870154841698830198909852602186015483169682019690965260228501548216928101929092526023840154811682870152602490930154909216928201929092529181019190915290565b5f60208284031215610625575f80fd5b5035919050565b80516001600160a01b03908116835260208083015182169084015260408083015182169084015260608083015182169084015260808083015182169084015260a09182015116910152565b80516001600160a01b03168252602081015161069e60208401826001600160a01b03169052565b5060408101516106b960408401826001600160a01b03169052565b5060608101516106d460608401826001600160a01b03169052565b5060808101516106ef60808401826001600160a01b03169052565b5060a081015161070a60a08401826001600160a01b03169052565b5060c081015161072560c08401826001600160a01b03169052565b5060e081015161074060e08401826001600160a01b03169052565b50610100818101516001600160a01b03908116918401919091526101209182015116910152565b80516001600160a01b03908116835260208083015182169084015260408083015182169084015260608083015182169084015260808083015182169084015260a08281015182169084015260c09182015116910152565b80516001600160a01b03908116835260208083015182169084015260408083015182169084015260608083015182169084015260809182015116910152565b815180516001600160a01b03908116835260209182015116908201526104a081016020830151610830604084018261062c565b506040830151610844610100840182610677565b506060830151610858610240840182610767565b50608083015161086c6103208401826107be565b5060a08301516108806103c0840182610767565b5092915050565b6104a081016108ac828980516001600160a01b03908116835260209182015116910152565b6108b9604083018861062c565b6108c7610100830187610677565b6108d5610240830186610767565b6108e36103208301856107be565b6108f16103c0830184610767565b97965050505050505056fea26469706673582212204cc383f848227f28ae7a1733a9da0b97ee1e347a915d2ae954c9cacc38331c8d64736f6c63430008180033", + "nonce": "0x8c", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x0fbed8a55e718c0786c396297e47dd60e4b17434c1853b94d96f80cc2b449773", + "transactionType": "CREATE", + "contractName": "TimelockController", + "contractAddress": "0xbb73f8a5b0074b27c6df026c77fa08b0111d017a", + "function": null, + "arguments": [ + "259200", + "[0xfcad670592a3b24869C0b51a6c6FDED4F95D6975]", + "[0xfcad670592a3b24869C0b51a6c6FDED4F95D6975]", + "0xfcad670592a3b24869C0b51a6c6FDED4F95D6975" + ], + "transaction": { + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "gas": "0x2059a2", + "value": "0x0", + "input": "0x608060405234801562000010575f80fd5b5060405162001d4c38038062001d4c833981016040819052620000339162000320565b6200003f5f3062000197565b506001600160a01b038116156200005e576200005c5f8262000197565b505b5f5b8351811015620000fd57620000b87fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1858381518110620000a457620000a4620003a2565b60200260200101516200019760201b60201c565b50620000f37ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783858381518110620000a457620000a4620003a2565b5060010162000060565b505f5b82518110156200014e57620001447fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63848381518110620000a457620000a4620003a2565b5060010162000100565b506002849055604080515f8152602081018690527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a150505050620003b6565b5f828152602081815260408083206001600160a01b038516845290915281205460ff166200023a575f838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055620001f13390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016200023d565b505f5b92915050565b634e487b7160e01b5f52604160045260245ffd5b80516001600160a01b03811681146200026e575f80fd5b919050565b5f82601f83011262000283575f80fd5b815160206001600160401b0380831115620002a257620002a262000243565b8260051b604051601f19603f83011681018181108482111715620002ca57620002ca62000243565b6040529384526020818701810194908101925087851115620002ea575f80fd5b6020870191505b848210156200031557620003058262000257565b83529183019190830190620002f1565b979650505050505050565b5f805f806080858703121562000334575f80fd5b845160208601519094506001600160401b038082111562000353575f80fd5b620003618883890162000273565b9450604087015191508082111562000377575f80fd5b50620003868782880162000273565b925050620003976060860162000257565b905092959194509250565b634e487b7160e01b5f52603260045260245ffd5b61198880620003c45f395ff3fe6080604052600436106101b2575f3560e01c80638065657f116100e7578063bc197c8111610087578063d547741f11610062578063d547741f14610546578063e38335e514610565578063f23a6e6114610578578063f27a0c92146105a3575f80fd5b8063bc197c81146104d1578063c4d252f5146104fc578063d45c44351461051b575f80fd5b806391d14854116100c257806391d148541461044d578063a217fddf1461046c578063b08e51c01461047f578063b1c5f427146104b2575f80fd5b80638065657f146103dc5780638f2a0bb0146103fb5780638f61f4f51461041a575f80fd5b80632ab0f5291161015257806336568abe1161012d57806336568abe14610353578063584b153e1461037257806364d62353146103915780637958004c146103b0575f80fd5b80632ab0f529146102f65780632f2ff15d1461031557806331d5075014610334575f80fd5b8063134008d31161018d578063134008d31461025357806313bc9f2014610266578063150b7a0214610285578063248a9ca3146102c8575f80fd5b806301d5062a146101bd57806301ffc9a7146101de57806307bd026514610212575f80fd5b366101b957005b5f80fd5b3480156101c8575f80fd5b506101dc6101d7366004611163565b6105b7565b005b3480156101e9575f80fd5b506101fd6101f83660046111d1565b61068b565b60405190151581526020015b60405180910390f35b34801561021d575f80fd5b506102457fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610209565b6101dc6102613660046111f8565b61069b565b348015610271575f80fd5b506101fd61028036600461125e565b61074d565b348015610290575f80fd5b506102af61029f366004611324565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610209565b3480156102d3575f80fd5b506102456102e236600461125e565b5f9081526020819052604090206001015490565b348015610301575f80fd5b506101fd61031036600461125e565b610772565b348015610320575f80fd5b506101dc61032f366004611387565b61077a565b34801561033f575f80fd5b506101fd61034e36600461125e565b6107a4565b34801561035e575f80fd5b506101dc61036d366004611387565b6107c8565b34801561037d575f80fd5b506101fd61038c36600461125e565b610800565b34801561039c575f80fd5b506101dc6103ab36600461125e565b610845565b3480156103bb575f80fd5b506103cf6103ca36600461125e565b6108b8565b60405161020991906113c5565b3480156103e7575f80fd5b506102456103f63660046111f8565b610900565b348015610406575f80fd5b506101dc61041536600461142b565b61093e565b348015610425575f80fd5b506102457fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610458575f80fd5b506101fd610467366004611387565b610aca565b348015610477575f80fd5b506102455f81565b34801561048a575f80fd5b506102457ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b3480156104bd575f80fd5b506102456104cc3660046114d3565b610af2565b3480156104dc575f80fd5b506102af6104eb3660046115ef565b63bc197c8160e01b95945050505050565b348015610507575f80fd5b506101dc61051636600461125e565b610b36565b348015610526575f80fd5b5061024561053536600461125e565b5f9081526001602052604090205490565b348015610551575f80fd5b506101dc610560366004611387565b610be0565b6101dc6105733660046114d3565b610c04565b348015610583575f80fd5b506102af610592366004611691565b63f23a6e6160e01b95945050505050565b3480156105ae575f80fd5b50600254610245565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16105e181610d85565b5f6105f0898989898989610900565b90506105fc8184610d92565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161063796959493929190611718565b60405180910390a3831561068057807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d03878560405161067791815260200190565b60405180910390a25b505050505050505050565b5f61069582610e23565b92915050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e636106c6815f610aca565b6106d4576106d48133610e47565b5f6106e3888888888888610900565b90506106ef8185610e84565b6106fb88888888610ed2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a6040516107329493929190611754565b60405180910390a361074381610f46565b5050505050505050565b5f60025b61075a836108b8565b600381111561076b5761076b6113b1565b1492915050565b5f6003610751565b5f8281526020819052604090206001015461079481610d85565b61079e8383610f71565b50505050565b5f806107af836108b8565b60038111156107c0576107c06113b1565b141592915050565b6001600160a01b03811633146107f15760405163334bd91960e11b815260040160405180910390fd5b6107fb8282611000565b505050565b5f8061080b836108b8565b90506001816003811115610821576108216113b1565b148061083e5750600281600381111561083c5761083c6113b1565b145b9392505050565b333081146108765760405163e2850c5960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b60025460408051918252602082018490527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a150600255565b5f81815260016020526040812054805f036108d557505f92915050565b600181036108e65750600392915050565b428111156108f75750600192915050565b50600292915050565b5f86868686868660405160200161091c96959493929190611718565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161096881610d85565b88871415806109775750888514155b156109a9576040516001624fcdef60e01b03198152600481018a9052602481018690526044810188905260640161086d565b5f6109ba8b8b8b8b8b8b8b8b610af2565b90506109c68184610d92565b5f5b8a811015610a7b5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610a0557610a05611785565b9050602002016020810190610a1a9190611799565b8d8d86818110610a2c57610a2c611785565b905060200201358c8c87818110610a4557610a45611785565b9050602002810190610a5791906117b2565b8c8b604051610a6b96959493929190611718565b60405180910390a36001016109c8565b508315610abd57807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d038785604051610ab491815260200190565b60405180910390a25b5050505050505050505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b5f8888888888888888604051602001610b12989796959493929190611885565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610b6081610d85565b610b6982610800565b610ba55781610b786002611069565b610b826001611069565b604051635ead8eb560e01b8152600481019390935217602482015260440161086d565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610bfa81610d85565b61079e8383611000565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63610c2f815f610aca565b610c3d57610c3d8133610e47565b8786141580610c4c5750878414155b15610c7e576040516001624fcdef60e01b0319815260048101899052602481018590526044810187905260640161086d565b5f610c8f8a8a8a8a8a8a8a8a610af2565b9050610c9b8185610e84565b5f5b89811015610d6f575f8b8b83818110610cb857610cb8611785565b9050602002016020810190610ccd9190611799565b90505f8a8a84818110610ce257610ce2611785565b905060200201359050365f8a8a86818110610cff57610cff611785565b9050602002810190610d1191906117b2565b91509150610d2184848484610ed2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b5886868686604051610d589493929190611754565b60405180910390a350505050806001019050610c9d565b50610d7981610f46565b50505050505050505050565b610d8f8133610e47565b50565b610d9b826107a4565b15610dcc5781610daa5f611069565b604051635ead8eb560e01b81526004810192909252602482015260440161086d565b5f610dd660025490565b905080821015610e0357604051635433660960e01b8152600481018390526024810182905260440161086d565b610e0d8242611924565b5f93845260016020526040909320929092555050565b5f6001600160e01b03198216630271189760e51b148061069557506106958261108b565b610e518282610aca565b610e805760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161086d565b5050565b610e8d8261074d565b610e9c5781610daa6002611069565b8015801590610eb15750610eaf81610772565b155b15610e805760405163121534c360e31b81526004810182905260240161086d565b5f80856001600160a01b0316858585604051610eef929190611943565b5f6040518083038185875af1925050503d805f8114610f29576040519150601f19603f3d011682016040523d82523d5f602084013e610f2e565b606091505b5091509150610f3d82826110bf565b50505050505050565b610f4f8161074d565b610f5e5780610daa6002611069565b5f90815260016020819052604090912055565b5f610f7c8383610aca565b610ff9575f838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610fb13390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610695565b505f610695565b5f61100b8383610aca565b15610ff9575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610695565b5f81600381111561107c5761107c6113b1565b600160ff919091161b92915050565b5f6001600160e01b03198216637965db0b60e01b148061069557506301ffc9a760e01b6001600160e01b0319831614610695565b6060826110d4576110cf826110db565b610695565b5080610695565b8051156110eb5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80356001600160a01b038116811461111a575f80fd5b919050565b5f8083601f84011261112f575f80fd5b5081356001600160401b03811115611145575f80fd5b60208301915083602082850101111561115c575f80fd5b9250929050565b5f805f805f805f60c0888a031215611179575f80fd5b61118288611104565b96506020880135955060408801356001600160401b038111156111a3575f80fd5b6111af8a828b0161111f565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f602082840312156111e1575f80fd5b81356001600160e01b03198116811461083e575f80fd5b5f805f805f8060a0878903121561120d575f80fd5b61121687611104565b95506020870135945060408701356001600160401b03811115611237575f80fd5b61124389828a0161111f565b979a9699509760608101359660809091013595509350505050565b5f6020828403121561126e575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156112b1576112b1611275565b604052919050565b5f82601f8301126112c8575f80fd5b81356001600160401b038111156112e1576112e1611275565b6112f4601f8201601f1916602001611289565b818152846020838601011115611308575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611337575f80fd5b61134085611104565b935061134e60208601611104565b92506040850135915060608501356001600160401b0381111561136f575f80fd5b61137b878288016112b9565b91505092959194509250565b5f8060408385031215611398575f80fd5b823591506113a860208401611104565b90509250929050565b634e487b7160e01b5f52602160045260245ffd5b60208101600483106113e557634e487b7160e01b5f52602160045260245ffd5b91905290565b5f8083601f8401126113fb575f80fd5b5081356001600160401b03811115611411575f80fd5b6020830191508360208260051b850101111561115c575f80fd5b5f805f805f805f805f60c08a8c031215611443575f80fd5b89356001600160401b0380821115611459575f80fd5b6114658d838e016113eb565b909b50995060208c013591508082111561147d575f80fd5b6114898d838e016113eb565b909950975060408c01359150808211156114a1575f80fd5b506114ae8c828d016113eb565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b0312156114ea575f80fd5b88356001600160401b0380821115611500575f80fd5b61150c8c838d016113eb565b909a50985060208b0135915080821115611524575f80fd5b6115308c838d016113eb565b909850965060408b0135915080821115611548575f80fd5b506115558b828c016113eb565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112611582575f80fd5b813560206001600160401b0382111561159d5761159d611275565b8160051b6115ac828201611289565b92835284810182019282810190878511156115c5575f80fd5b83870192505b848310156115e4578235825291830191908301906115cb565b979650505050505050565b5f805f805f60a08688031215611603575f80fd5b61160c86611104565b945061161a60208701611104565b935060408601356001600160401b0380821115611635575f80fd5b61164189838a01611573565b94506060880135915080821115611656575f80fd5b61166289838a01611573565b93506080880135915080821115611677575f80fd5b50611684888289016112b9565b9150509295509295909350565b5f805f805f60a086880312156116a5575f80fd5b6116ae86611104565b94506116bc60208701611104565b9350604086013592506060860135915060808601356001600160401b038111156116e4575f80fd5b611684888289016112b9565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60018060a01b038716815285602082015260a060408201525f61173f60a0830186886116f0565b60608301949094525060800152949350505050565b60018060a01b0385168152836020820152606060408201525f61177b6060830184866116f0565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156117a9575f80fd5b61083e82611104565b5f808335601e198436030181126117c7575f80fd5b8301803591506001600160401b038211156117e0575f80fd5b60200191503681900382131561115c575f80fd5b5f838385526020808601955060208560051b830101845f5b8781101561187857848303601f19018952813536889003601e19018112611831575f80fd5b870184810190356001600160401b0381111561184b575f80fd5b803603821315611859575f80fd5b6118648582846116f0565b9a86019a945050509083019060010161180c565b5090979650505050505050565b60a080825281018890525f8960c08301825b8b8110156118c5576001600160a01b036118b084611104565b16825260209283019290910190600101611897565b5083810360208501528881526001600160fb1b038911156118e4575f80fd5b8860051b9150818a6020830137018281036020908101604085015261190c90820187896117f4565b60608401959095525050608001529695505050505050565b8082018082111561069557634e487b7160e01b5f52601160045260245ffd5b818382375f910190815291905056fea2646970667358221220ab60f8407c9c5e7d108ec40a3a2791ecd18380f5369e470875894820bdbe6b0b64736f6c63430008180033000000000000000000000000000000000000000000000000000000000003f480000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d69750000000000000000000000000000000000000000000000000000000000000001000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d69750000000000000000000000000000000000000000000000000000000000000001000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d6975", + "nonce": "0x8d", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x69c6e2fb3fc25e43ce44153779d0a576e353932142c26a951972a58707b6358e", + "transactionType": "CREATE", + "contractName": "ynEigen", + "contractAddress": "0x143a5c73bfc78842a95705db242774fc7fa5c3b3", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "gas": "0x2bc7aa", + "value": "0x0", + "input": "0x608060405234801562000010575f80fd5b506200001b62000021565b620000d5565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d25780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b61266d80620000e35f395ff3fe608060405234801561000f575f80fd5b506004361061021e575f3560e01c806370a082311161012a578063a9059cbb116100b4578063e0c784a611610079578063e0c784a6146104e9578063e63ab1e914610509578063f11b818814610530578063f45346dc1461054f578063fb1bb9de14610562575f80fd5b8063a9059cbb14610475578063b8f82b2614610488578063cd88e5581461049b578063d547741f146104c3578063dd62ed3e146104d6575f80fd5b806391d14854116100fa57806391d148541461040957806395d89b411461041c578063979d7e8614610424578063a1a25e6e14610437578063a217fddf1461046e575f80fd5b806370a08231146103a75780638936a91f146103db5780638d252393146103e35780638ffbf6db146103f6575f80fd5b8063313ce567116101ab57806352f94f981161017b57806352f94f981461033a5780635f4caf461461036557806360da3e831461037857806361fd0ae11461038c57806363d8882a1461039f575f80fd5b8063313ce567146102f257806336568abe1461030157806338bca6c8146103145780633e5541f114610327575f80fd5b8063095ea7b3116101f1578063095ea7b31461027f57806318160ddd1461029257806323b872dd146102b9578063248a9ca3146102cc5780632f2ff15d146102df575f80fd5b806301e1d1141461022257806301ffc9a71461023d578063021919801461026057806306fdde031461026a575b5f80fd5b61022a610576565b6040519081526020015b60405180910390f35b61025061024b366004611eef565b6105e5565b6040519015158152602001610234565b61026861061b565b005b61027261069f565b6040516102349190611f38565b61025061028d366004611f8e565b61075f565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025461022a565b6102506102c7366004611fb8565b610776565b61022a6102da366004611ff6565b61079b565b6102686102ed36600461200d565b6107bb565b60405160128152602001610234565b61026861030f36600461200d565b6107dd565b610268610322366004612083565b610815565b61022a610335366004611f8e565b610ae6565b60015461034d906001600160a01b031681565b6040516001600160a01b039091168152602001610234565b6102506103733660046120ea565b610ba0565b60025461025090600160a01b900460ff1681565b61026861039a366004612119565b610c0c565b610268610c31565b61022a6103b53660046120ea565b6001600160a01b03165f9081525f805160206125d8833981519152602052604090205490565b610268610c95565b6102686103f13660046121d9565b610d10565b610268610404366004612119565b611062565b61025061041736600461200d565b611084565b6102726110ba565b60025461034d906001600160a01b031681565b6102506104453660046120ea565b6001600160a01b03165f9081525f805160206125b8833981519152602052604090205460ff1690565b61022a5f81565b610250610483366004611f8e565b6110f8565b61022a610496366004611f8e565b611105565b61022a6104a93660046120ea565b6001600160a01b03165f9081526020819052604090205490565b6102686104d136600461200d565b611110565b61022a6104e4366004612211565b61112c565b6104fc6104f736600461223d565b611175565b604051610234919061227c565b61022a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b61022a61053e3660046120ea565b5f6020819052908152604090205481565b61022a61055d3660046122bf565b61123f565b61022a5f805160206125f883398151915281565b600254604080516278744560e21b815290515f926001600160a01b0316916301e1d1149160048083019260209291908290030181865afa1580156105bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105e091906122fe565b905090565b5f6001600160e01b03198216637965db0b60e01b148061061557506301ffc9a760e01b6001600160e01b03198316145b92915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610645816112aa565b6002805460ff60a01b1916600160a01b908117918290556040517f9723f28d4abaff5df0f62bfb2418f2aac4a739b259edf209b8dc9944fa85aa789261069492900460ff161515815260200190565b60405180910390a150565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f805160206125d8833981519152916106dd90612315565b80601f016020809104026020016040519081016040528092919081815260200182805461070990612315565b80156107545780601f1061072b57610100808354040283529160200191610754565b820191905f5260205f20905b81548152906001019060200180831161073757829003601f168201915b505050505091505090565b5f3361076c8185856112b7565b5060019392505050565b5f336107838582856112c4565b61078e858585611321565b60019150505b9392505050565b5f9081525f80516020612618833981519152602052604090206001015490565b6107c48261079b565b6107cd816112aa565b6107d7838361137e565b50505050565b6001600160a01b03811633146108065760405163334bd91960e11b815260040160405180910390fd5b610810828261141f565b505050565b6001546001600160a01b03163314610847576040516347ed65b360e11b81523360048201526024015b60405180910390fd5b8281811461087257604051637df4c78160e01b8152600481018290526024810183905260440161083e565b6001546001600160a01b03165f5b82811015610add575f87878381811061089b5761089b61234d565b90506020020160208101906108b091906120ea565b600254604051632fa657a360e11b81526001600160a01b038084166004830152929350911690635f4caf4690602401602060405180830381865afa1580156108fa573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091e9190612361565b6109465760405163ee84f40b60e01b81526001600160a01b038216600482015260240161083e565b6001600160a01b0381165f90815260208181526040918290208251918201909252905480825287878581811061097e5761097e61234d565b9050602002013511156109db57805182908888868181106109a1576109a161234d565b60405163a8c6953f60e01b81526001600160a01b03909516600486015260248501939093525060209091020135604482015260640161083e565b8686848181106109ed576109ed61234d565b905060200201355f80846001600160a01b03166001600160a01b031681526020019081526020015f205f015f828254610a269190612394565b90915550610a62905084888886818110610a4257610a4261234d565b90506020020135846001600160a01b03166114989092919063ffffffff16565b7f4104800de83c5a3ae29f33899a811406b39aa89930fcc75e60d84b411803368d82888886818110610a9657610a9661234d565b9050602002013586604051610acb939291906001600160a01b0393841681526020810192909252909116604082015260600190565b60405180910390a15050600101610880565b50505050505050565b5f610af083610ba0565b15610b7c57600254604051631cbf960d60e01b81526001600160a01b038581166004830152602482018590525f921690631cbf960d90604401602060405180830381865afa158015610b44573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6891906122fe565b9050610b74815f6114f7565b915050610615565b60405163ee84f40b60e01b81526001600160a01b038416600482015260240161083e565b600254604051632fa657a360e11b81526001600160a01b0383811660048301525f921690635f4caf4690602401602060405180830381865afa158015610be8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106159190612361565b5f805160206125f8833981519152610c23816112aa565b610c2d825f611554565b5050565b5f805160206125f8833981519152610c48816112aa565b6002805460ff60a01b1916908190556040517f9723f28d4abaff5df0f62bfb2418f2aac4a739b259edf209b8dc9944fa85aa789161069491600160a01b90910460ff161515815260200190565b5f805160206125f8833981519152610cac816112aa565b7f7e7ba5b20f89141f0255e9704ce6ce6e55f5f28e4fc0d626fc76bedba3053201805460ff191690556040515f805160206125b8833981519152907f5b1b646968864ea75fad546d8c819e0de710df0bf61f658f6ba54dc587472e7b905f90a15050565b610d2060608201604083016120ea565b6001600160a01b038116610d475760405163d92e233d60e01b815260040160405180910390fd5b610d5760a08301608084016120ea565b6001600160a01b038116610d7e5760405163d92e233d60e01b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f81158015610dc35750825b90505f8267ffffffffffffffff166001148015610ddf5750303b155b905081158015610ded575080155b15610e0b5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610e3557845460ff60401b1916600160401b1785555b610e3d6115ef565b610e456115f9565b610ecc610e5289806123a7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610e939250505060208b018b6123a7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061160992505050565b610ee55f610ee060a08b0160808c016120ea565b61137e565b50610f1a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610ee060c08b0160a08c016120ea565b50610f3c5f805160206125f8833981519152610ee060e08b0160c08c016120ea565b50610f4d6060890160408a016120ea565b600280546001600160a01b0319166001600160a01b0392909216919091179055610f7d6080890160608a016120ea565b600180546001600160a01b0319166001600160a01b03929092169190911781557f7e7ba5b20f89141f0255e9704ce6ce6e55f5f28e4fc0d626fc76bedba3053201805460ff19169091179055611012610fd960e08a018a6123ea565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525060019250611554915050565b831561105857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f805160206125f8833981519152611079816112aa565b610c2d826001611554565b5f9182525f80516020612618833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f805160206125d8833981519152916106dd90612315565b5f3361076c818585611321565b5f6107948383610ae6565b6111198261079b565b611122816112aa565b6107d7838361141f565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b6060818067ffffffffffffffff81111561119157611191612105565b6040519080825280602002602001820160405280156111ba578160200160208202803683370190505b5091505f5b81811015611237575f808686848181106111db576111db61234d565b90506020020160208101906111f091906120ea565b6001600160a01b03166001600160a01b031681526020019081526020015f205f01548382815181106112245761122461234d565b60209081029190910101526001016111bf565b505092915050565b5f61124861161b565b600254600160a01b900460ff1615611273576040516313d0ff5960e31b815260040160405180910390fd5b61127f84848433611665565b905061079460017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6112b4813361181b565b50565b6108108383836001611854565b5f6112cf848461112c565b90505f1981146107d7578181101561131357604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161083e565b6107d784848484035f611854565b6001600160a01b03831661134a57604051634b637e8f60e11b81525f600482015260240161083e565b6001600160a01b0382166113735760405163ec442f0560e01b81525f600482015260240161083e565b610810838383611938565b5f5f805160206126188339815191526113978484611084565b611416575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556113cc3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610615565b5f915050610615565b5f5f805160206126188339815191526114388484611084565b15611416575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610615565b6040516001600160a01b0383811660248301526044820183905261081091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506119e1565b5f806115217f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025490565b90505f61152c610576565b9050815f0361153f578492505050610615565b61154b85838387611a42565b95945050505050565b5f805160206125b88339815191525f5b83518110156107d7575f8482815181106115805761158061234d565b6020908102919091018101516001600160a01b0381165f818152868452604090819020805460ff19168915159081179091559051908152919350917fac6d52e87f8a8fc486e04600668caffa28c149f8286b136c0f327b4499b8c723910160405180910390a250600101611564565b6115f7611a8f565b565b611601611a8f565b6115f7611ad8565b611611611a8f565b610c2d8282611ae0565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161165f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f61166f85610ba0565b6116975760405163ee84f40b60e01b81526001600160a01b038616600482015260240161083e565b835f036116b757604051631f2a200560e01b815260040160405180910390fd5b6116cc6001600160a01b038616833087611af2565b600254604051631cbf960d60e01b81526001600160a01b038781166004830152602482018790525f921690631cbf960d90604401602060405180830381865afa15801561171b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061173f91906122fe565b905061174b815f6114f7565b9150815f0361176d57604051639811e0c760e01b815260040160405180910390fd5b6117778483611b2b565b6001600160a01b0386165f908152602081905260408120805487929061179e908490612430565b909155505060408051868152602081018490526001600160a01b0380871692908616917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a350949350505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6118258282611084565b610c2d5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161083e565b5f805160206125d88339815191526001600160a01b03851661188b5760405163e602df0560e01b81525f600482015260240161083e565b6001600160a01b0384166118b457604051634a1406b160e11b81525f600482015260240161083e565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561193157836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161192891815260200190565b60405180910390a35b5050505050565b7f7e7ba5b20f89141f0255e9704ce6ce6e55f5f28e4fc0d626fc76bedba3053201545f805160206125b88339815191529060ff16801561199057506001600160a01b0384165f9081526020829052604090205460ff16155b80156119a457506001600160a01b03841615155b80156119b857506001600160a01b03831615155b156119d657604051636ab17e0560e01b815260040160405180910390fd5b6107d7848484611b5f565b5f6119f56001600160a01b03841683611c98565b905080515f14158015611a19575080806020019051810190611a179190612361565b155b1561081057604051635274afe760e01b81526001600160a01b038416600482015260240161083e565b5f80611a4f868686611ca5565b9050611a5a83611d64565b8015611a7557505f8480611a7057611a70612443565b868809115b1561154b57611a85600182612430565b9695505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166115f757604051631afcd79f60e31b815260040160405180910390fd5b6117f5611a8f565b611ae8611a8f565b610c2d8282611d90565b6040516001600160a01b0384811660248301528381166044830152606482018390526107d79186918216906323b872dd906084016114c5565b6001600160a01b038216611b545760405163ec442f0560e01b81525f600482015260240161083e565b610c2d5f8383611938565b5f805160206125d88339815191526001600160a01b038416611b995781816002015f828254611b8e9190612430565b90915550611c099050565b6001600160a01b0384165f9081526020829052604090205482811015611beb5760405163391434e360e21b81526001600160a01b0386166004820152602481018290526044810184905260640161083e565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316611c27576002810180548390039055611c45565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611c8a91815260200190565b60405180910390a350505050565b606061079483835f611de0565b5f838302815f1985870982811083820303915050805f03611cd957838281611ccf57611ccf612443565b0492505050610794565b808411611cf95760405163227bc15360e01b815260040160405180910390fd5b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b5f6002826003811115611d7957611d79612457565b611d83919061246b565b60ff166001149050919050565b611d98611a8f565b5f805160206125d88339815191527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace03611dd184826124dc565b50600481016107d783826124dc565b606081471015611e055760405163cd78605960e01b815230600482015260240161083e565b5f80856001600160a01b03168486604051611e20919061259c565b5f6040518083038185875af1925050503d805f8114611e5a576040519150601f19603f3d011682016040523d82523d5f602084013e611e5f565b606091505b5091509150611a85868383606082611e7f57611e7a82611ec6565b610794565b8151158015611e9657506001600160a01b0384163b155b15611ebf57604051639996b31560e01b81526001600160a01b038516600482015260240161083e565b5080610794565b805115611ed65780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f60208284031215611eff575f80fd5b81356001600160e01b031981168114610794575f80fd5b5f5b83811015611f30578181015183820152602001611f18565b50505f910152565b602081525f8251806020840152611f56816040850160208701611f16565b601f01601f19169190910160400192915050565b6001600160a01b03811681146112b4575f80fd5b8035611f8981611f6a565b919050565b5f8060408385031215611f9f575f80fd5b8235611faa81611f6a565b946020939093013593505050565b5f805f60608486031215611fca575f80fd5b8335611fd581611f6a565b92506020840135611fe581611f6a565b929592945050506040919091013590565b5f60208284031215612006575f80fd5b5035919050565b5f806040838503121561201e575f80fd5b82359150602083013561203081611f6a565b809150509250929050565b5f8083601f84011261204b575f80fd5b50813567ffffffffffffffff811115612062575f80fd5b6020830191508360208260051b850101111561207c575f80fd5b9250929050565b5f805f8060408587031215612096575f80fd5b843567ffffffffffffffff808211156120ad575f80fd5b6120b98883890161203b565b909650945060208701359150808211156120d1575f80fd5b506120de8782880161203b565b95989497509550505050565b5f602082840312156120fa575f80fd5b813561079481611f6a565b634e487b7160e01b5f52604160045260245ffd5b5f602080838503121561212a575f80fd5b823567ffffffffffffffff80821115612141575f80fd5b818501915085601f830112612154575f80fd5b81358181111561216657612166612105565b8060051b604051601f19603f8301168101818110858211171561218b5761218b612105565b6040529182528482019250838101850191888311156121a8575f80fd5b938501935b828510156121cd576121be85611f7e565b845293850193928501926121ad565b98975050505050505050565b5f602082840312156121e9575f80fd5b813567ffffffffffffffff8111156121ff575f80fd5b82016101008185031215610794575f80fd5b5f8060408385031215612222575f80fd5b823561222d81611f6a565b9150602083013561203081611f6a565b5f806020838503121561224e575f80fd5b823567ffffffffffffffff811115612264575f80fd5b6122708582860161203b565b90969095509350505050565b602080825282518282018190525f9190848201906040850190845b818110156122b357835183529284019291840191600101612297565b50909695505050505050565b5f805f606084860312156122d1575f80fd5b83356122dc81611f6a565b92506020840135915060408401356122f381611f6a565b809150509250925092565b5f6020828403121561230e575f80fd5b5051919050565b600181811c9082168061232957607f821691505b60208210810361234757634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612371575f80fd5b81518015158114610794575f80fd5b634e487b7160e01b5f52601160045260245ffd5b8181038181111561061557610615612380565b5f808335601e198436030181126123bc575f80fd5b83018035915067ffffffffffffffff8211156123d6575f80fd5b60200191503681900382131561207c575f80fd5b5f808335601e198436030181126123ff575f80fd5b83018035915067ffffffffffffffff821115612419575f80fd5b6020019150600581901b360382131561207c575f80fd5b8082018082111561061557610615612380565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f60ff83168061248957634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b601f82111561081057805f5260205f20601f840160051c810160208510156124bd5750805b601f840160051c820191505b81811015611931575f81556001016124c9565b815167ffffffffffffffff8111156124f6576124f6612105565b61250a816125048454612315565b84612498565b602080601f83116001811461253d575f84156125265750858301515b5f19600386901b1c1916600185901b178555612594565b5f85815260208120601f198616915b8281101561256b5788860151825594840194600190910190840161254c565b508582101561258857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f82516125ad818460208701611f16565b919091019291505056fe7e7ba5b20f89141f0255e9704ce6ce6e55f5f28e4fc0d626fc76bedba305320052c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800a264697066735822122076f3b6f6b707ff3fd9e3f2a8eb795c10099c9dc0aa7af842bbc08033a78f1fcd64736f6c63430008180033", + "nonce": "0x8e", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x92ab2639a0778892415a4a217b9edfbc145130455f233ce9c4368c05384067cb", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x35ec69a77b79c255e5d47d5a3bdbefefe342630c", + "function": null, + "arguments": [ + "0x143a5c73bFc78842a95705db242774fc7Fa5c3B3", + "0xbB73f8a5B0074b27c6df026c77fA08B0111D017A", + "0x" + ], + "transaction": { + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "gas": "0xce728", + "value": "0x0", + "input": "0x60a060405260405162000e5038038062000e508339810160408190526200002691620003bc565b828162000034828262000099565b50508160405162000045906200035a565b6001600160a01b039091168152602001604051809103905ff0801580156200006f573d5f803e3d5ffd5b506001600160a01b0316608052620000906200008a60805190565b620000fe565b505050620004b3565b620000a4826200016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000f057620000eb8282620001ee565b505050565b620000fa62000267565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6200013f5f8051602062000e30833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16200016c8162000289565b50565b806001600160a01b03163b5f03620001aa57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516200020c919062000496565b5f60405180830381855af49150503d805f811462000246576040519150601f19603f3d011682016040523d82523d5f602084013e6200024b565b606091505b5090925090506200025e858383620002ca565b95945050505050565b3415620002875760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b038116620002b457604051633173bdd160e11b81525f6004820152602401620001a1565b805f8051602062000e30833981519152620001cd565b606082620002e357620002dd8262000330565b62000329565b8151158015620002fb57506001600160a01b0384163b155b156200032657604051639996b31560e01b81526001600160a01b0385166004820152602401620001a1565b50805b9392505050565b805115620003415780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6104fc806200093483390190565b80516001600160a01b03811681146200037f575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620003b45781810151838201526020016200039a565b50505f910152565b5f805f60608486031215620003cf575f80fd5b620003da8462000368565b9250620003ea6020850162000368565b60408501519092506001600160401b038082111562000407575f80fd5b818601915086601f8301126200041b575f80fd5b81518181111562000430576200043062000384565b604051601f8201601f19908116603f011681019083821181831017156200045b576200045b62000384565b8160405282815289602084870101111562000474575f80fd5b6200048783602083016020880162000398565b80955050505050509250925092565b5f8251620004a981846020870162000398565b9190910192915050565b608051610469620004cb5f395f601001526104695ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007a575f356001600160e01b03191663278f794360e11b14610070576040516334ad5dbb60e21b815260040160405180910390fd5b610078610082565b565b6100786100b0565b5f806100913660048184610303565b81019061009e919061033e565b915091506100ac82826100c0565b5050565b6100786100bb61011a565b610151565b6100c98261016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101125761010d82826101ea565b505050565b6100ac61025c565b5f61014c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e80801561016b573d5ff35b3d5ffd5b806001600160a01b03163b5f036101a957604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102069190610407565b5f60405180830381855af49150503d805f811461023e576040519150601f19603f3d011682016040523d82523d5f602084013e610243565b606091505b509150915061025385838361027b565b95945050505050565b34156100785760405163b398979f60e01b815260040160405180910390fd5b6060826102905761028b826102da565b6102d3565b81511580156102a757506001600160a01b0384163b155b156102d057604051639996b31560e01b81526001600160a01b03851660048201526024016101a0565b50805b9392505050565b8051156102ea5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610311575f80fd5b8386111561031d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561034f575f80fd5b82356001600160a01b0381168114610365575f80fd5b9150602083013567ffffffffffffffff80821115610381575f80fd5b818501915085601f830112610394575f80fd5b8135818111156103a6576103a661032a565b604051601f8201601f19908116603f011681019083821181831017156103ce576103ce61032a565b816040528281528860208487010111156103e6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610426576020818601810151858301520161040c565b505f92019182525091905056fea26469706673582212202bdadd4d90be9694cdd96b74937fb73e8cb3ab30807abea8aecf7c946f10f50364736f6c63430008180033608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea26469706673582212204852424075b6dea1d1527c7df075e3c174ec7222e99be5d8f0c28327860a53d964736f6c63430008180033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000143a5c73bfc78842a95705db242774fc7fa5c3b3000000000000000000000000bb73f8a5b0074b27c6df026c77fa08b0111d017a00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x8f", + "chainId": "0x1" + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0x1bff798a6072597c401f7c83a6a1096ae5f0aff7", + "initCode": "0x608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea26469706673582212204852424075b6dea1d1527c7df075e3c174ec7222e99be5d8f0c28327860a53d964736f6c63430008180033000000000000000000000000bb73f8a5b0074b27c6df026c77fa08b0111d017a" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x1a1f7111c5c827287598693aab2e6448a5b37bbe5bee5436e524d67e6d315a94", + "transactionType": "CREATE", + "contractName": "LSDRateProvider", + "contractAddress": "0xaedc83f607126b4d2437f79285e2c635685bba01", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "gas": "0x7e465", + "value": "0x0", + "input": "0x608060405234801561000f575f80fd5b5061063a8061001d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c8063852ec88311610063578063852ec883146101495780639895e4b614610164578063bd0aef491461017f578063e94fe8151461019a578063ed100c3c146101b5575f80fd5b80630ba9d8ca1461009f57806318122e8a146100c557806336d7dd67146100f8578063501a7710146101135780636cb20ee51461012e575b5f80fd5b6100b26100ad366004610585565b6101d0565b6040519081526020015b60405180910390f35b6100e073ae78736cd615f374d3085123a210448e74fc639381565b6040516001600160a01b0390911681526020016100bc565b6100e073dcee70654261af21c44c093c300ed3bb97b7819281565b6100e073d5f7838f5c461feff7fe49ea5ebaf7728bb0adfa81565b6100e073f951e335afb289353dc249e82926178eac7ded7881565b6100e073ac3e018457b222d93114458476f3e3416abbe38f81565b6100e073350a9841956d8b0212eadf5e14a449ca85fae1c081565b6100e073e3cbd06d7dadb3f4e6557bab7edd924cd1489e8f81565b6100e0737f39c581f595b53c5cb19bd0b3f8da6c935e2ca081565b6100e073ae7ab96520de3a18e5e111b5eaab095312d7fe8481565b5f737f39c581f595b53c5cb19bd0b3f8da6c935e2c9f196001600160a01b0383160161027657604051630f451f7160e31b8152670de0b6b3a7640000600482015273ae7ab96520de3a18e5e111b5eaab095312d7fe8490637a28fb88906024015b602060405180830381865afa15801561024c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061027091906105ab565b92915050565b73ac3e018457b222d93114458476f3e3416abbe38e196001600160a01b038316016103ab575f73350a9841956d8b0212eadf5e14a449ca85fae1c06001600160a01b0316634e6c27cb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102ec573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061031091906105ab565b9050670de0b6b3a76400008173ac3e018457b222d93114458476f3e3416abbe38f6001600160a01b03166399530b066040518163ffffffff1660e01b8152600401602060405180830381865afa15801561036c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039091906105ab565b61039a91906105c2565b6103a491906105e5565b9392505050565b73dcee70654261af21c44c093c300ed3bb97b78191196001600160a01b0383160161040f5760405163266d6a8360e11b8152670de0b6b3a7640000600482015273dcee70654261af21c44c093c300ed3bb97b7819290634cdad50690602401610231565b73ae78736cd615f374d3085123a210448e74fc6392196001600160a01b038316016104845773ae78736cd615f374d3085123a210448e74fc63936001600160a01b031663e6aa216c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561024c573d5f803e3d5ffd5b73d5f7838f5c461feff7fe49ea5ebaf7728bb0adf9196001600160a01b038316016104e857604051631624304760e21b8152670de0b6b3a7640000600482015273e3cbd06d7dadb3f4e6557bab7edd924cd1489e8f90635890c11c90602401610231565b73f951e335afb289353dc249e82926178eac7ded77196001600160a01b0383160161055d5773f951e335afb289353dc249e82926178eac7ded786001600160a01b031663d68b2cb66040518163ffffffff1660e01b8152600401602060405180830381865afa15801561024c573d5f803e3d5ffd5b60405163ee84f40b60e01b81526001600160a01b038316600482015260240160405180910390fd5b5f60208284031215610595575f80fd5b81356001600160a01b03811681146103a4575f80fd5b5f602082840312156105bb575f80fd5b5051919050565b808202811582820484141761027057634e487b7160e01b5f52601160045260245ffd5b5f826105ff57634e487b7160e01b5f52601260045260245ffd5b50049056fea264697066735822122022f07d7dfe8c7a5d9c5ad9ce323f4352350c3a55520e3f47b1c4f75b9fe1115d64736f6c63430008180033", + "nonce": "0x90", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x1fc233970a6b03c4ea2045e925b0d2ffed9467a12bc79507d6e7a7af066735e6", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0xb658cf6f4c232be5c6035f2b42b96393089f20d9", + "function": null, + "arguments": [ + "0xAEDC83F607126b4D2437F79285e2C635685BBA01", + "0xbB73f8a5B0074b27c6df026c77fA08B0111D017A", + "0x" + ], + "transaction": { + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "gas": "0xce728", + "value": "0x0", + "input": "0x60a060405260405162000e5038038062000e508339810160408190526200002691620003bc565b828162000034828262000099565b50508160405162000045906200035a565b6001600160a01b039091168152602001604051809103905ff0801580156200006f573d5f803e3d5ffd5b506001600160a01b0316608052620000906200008a60805190565b620000fe565b505050620004b3565b620000a4826200016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000f057620000eb8282620001ee565b505050565b620000fa62000267565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6200013f5f8051602062000e30833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16200016c8162000289565b50565b806001600160a01b03163b5f03620001aa57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516200020c919062000496565b5f60405180830381855af49150503d805f811462000246576040519150601f19603f3d011682016040523d82523d5f602084013e6200024b565b606091505b5090925090506200025e858383620002ca565b95945050505050565b3415620002875760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b038116620002b457604051633173bdd160e11b81525f6004820152602401620001a1565b805f8051602062000e30833981519152620001cd565b606082620002e357620002dd8262000330565b62000329565b8151158015620002fb57506001600160a01b0384163b155b156200032657604051639996b31560e01b81526001600160a01b0385166004820152602401620001a1565b50805b9392505050565b805115620003415780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6104fc806200093483390190565b80516001600160a01b03811681146200037f575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620003b45781810151838201526020016200039a565b50505f910152565b5f805f60608486031215620003cf575f80fd5b620003da8462000368565b9250620003ea6020850162000368565b60408501519092506001600160401b038082111562000407575f80fd5b818601915086601f8301126200041b575f80fd5b81518181111562000430576200043062000384565b604051601f8201601f19908116603f011681019083821181831017156200045b576200045b62000384565b8160405282815289602084870101111562000474575f80fd5b6200048783602083016020880162000398565b80955050505050509250925092565b5f8251620004a981846020870162000398565b9190910192915050565b608051610469620004cb5f395f601001526104695ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007a575f356001600160e01b03191663278f794360e11b14610070576040516334ad5dbb60e21b815260040160405180910390fd5b610078610082565b565b6100786100b0565b5f806100913660048184610303565b81019061009e919061033e565b915091506100ac82826100c0565b5050565b6100786100bb61011a565b610151565b6100c98261016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101125761010d82826101ea565b505050565b6100ac61025c565b5f61014c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e80801561016b573d5ff35b3d5ffd5b806001600160a01b03163b5f036101a957604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102069190610407565b5f60405180830381855af49150503d805f811461023e576040519150601f19603f3d011682016040523d82523d5f602084013e610243565b606091505b509150915061025385838361027b565b95945050505050565b34156100785760405163b398979f60e01b815260040160405180910390fd5b6060826102905761028b826102da565b6102d3565b81511580156102a757506001600160a01b0384163b155b156102d057604051639996b31560e01b81526001600160a01b03851660048201526024016101a0565b50805b9392505050565b8051156102ea5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610311575f80fd5b8386111561031d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561034f575f80fd5b82356001600160a01b0381168114610365575f80fd5b9150602083013567ffffffffffffffff80821115610381575f80fd5b818501915085601f830112610394575f80fd5b8135818111156103a6576103a661032a565b604051601f8201601f19908116603f011681019083821181831017156103ce576103ce61032a565b816040528281528860208487010111156103e6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610426576020818601810151858301520161040c565b505f92019182525091905056fea26469706673582212202bdadd4d90be9694cdd96b74937fb73e8cb3ab30807abea8aecf7c946f10f50364736f6c63430008180033608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea26469706673582212204852424075b6dea1d1527c7df075e3c174ec7222e99be5d8f0c28327860a53d964736f6c63430008180033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000aedc83f607126b4d2437f79285e2c635685bba01000000000000000000000000bb73f8a5b0074b27c6df026c77fa08b0111d017a00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x91", + "chainId": "0x1" + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0x16c95825fad0ce0dd56698bc8ab49e7b00fa29d9", + "initCode": "0x608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea26469706673582212204852424075b6dea1d1527c7df075e3c174ec7222e99be5d8f0c28327860a53d964736f6c63430008180033000000000000000000000000bb73f8a5b0074b27c6df026c77fa08b0111d017a" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x310265520ae709f84cd07cc5f080a4a02bafd58e49079b944723881e5efd9b9b", + "transactionType": "CREATE", + "contractName": "EigenStrategyManager", + "contractAddress": "0xe2343a850394ee1b1e33b16da5bd73b076d6fa81", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "gas": "0x29cf5c", + "value": "0x0", + "input": "0x608060405234801561000f575f80fd5b5061251c8061001d5f395ff3fe608060405234801561000f575f80fd5b50600436106101c6575f3560e01c806391d14854116100fe578063c1fe3e481161009e578063db7711c61161006e578063db7711c614610426578063e63ab1e914610439578063ea4d3c9b14610460578063fb1bb9de14610473575f80fd5b8063c1fe3e48146103da578063d547741f146103ed578063da5be02214610400578063daba667d14610413575f80fd5b8063a217fddf116100d9578063a217fddf14610380578063aa388af614610387578063af9ba225146103b4578063b9ceea0d146103c7575f80fd5b806391d14854146103475780639a2be4af1461035a5780639be323f41461036c575f80fd5b806339ebf823116101695780635ffcfdc7116101445780635ffcfdc7146102fb57806372cb5d971461030e57806374f2ca05146103215780637c0867af14610334575f80fd5b806339ebf823146102ad5780634aa07e64146102d55780634e6c9766146102e8575f80fd5b8063248a9ca3116101a4578063248a9ca3146102475780632f2ff15d1461025a57806336568abe1461026f57806339b70e3814610282575f80fd5b806301ffc9a7146101ca5780630b725136146101f25780630b74ce8c14610212575b5f80fd5b6101dd6101d8366004611e0c565b61049a565b60405190151581526020015b60405180910390f35b610205610200366004611e73565b6104d0565b6040516101e99190611eeb565b6102397f5604e2fe54b4de17b81a5ded6f82357d742fd2722d67304e37ff20bd589b4f3881565b6040519081526020016101e9565b610239610255366004611efd565b6106c0565b61026d610268366004611f28565b6106e0565b005b61026d61027d366004611f28565b610702565b600154610295906001600160a01b031681565b6040516001600160a01b0390911681526020016101e9565b6102956102bb366004611f56565b60046020525f90815260409020546001600160a01b031681565b600554610295906001600160a01b031681565b600754610295906001600160a01b031681565b61026d6103093660046120a8565b61073a565b61026d61031c36600461210f565b61078d565b61023961032f366004611f56565b61096a565b600354610295906001600160a01b031681565b6101dd610355366004611f28565b610a6e565b5f54610295906001600160a01b031681565b6102395f805160206124c783398151915281565b6102395f81565b6101dd610395366004611f56565b6001600160a01b039081165f9081526004602052604090205416151590565b6102396103c236600461213b565b610aa4565b61026d6103d5366004612165565b610b67565b600854610295906001600160a01b031681565b61026d6103fb366004611f28565b6112cb565b61026d61040e366004611e73565b6112e7565b600654610295906001600160a01b031681565b61023961043436600461213b565b611389565b6102397f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b600254610295906001600160a01b031681565b6102397f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a81565b5f6001600160e01b03198216637965db0b60e01b14806104ca57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060816001600160401b038111156104ea576104ea611f71565b604051908082528060200260200182016040528015610513578160200160208202803683370190505b5090505f60035f9054906101000a90046001600160a01b03166001600160a01b031663a1174e7d6040518163ffffffff1660e01b81526004015f60405180830381865afa158015610566573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261058d919081019061219c565b8051909150835f5b818110156106b6575f8787838181106105b0576105b0612230565b90506020020160208101906105c59190611f56565b90505f5b848110156106ac575f8682815181106105e4576105e4612230565b6020908102919091018101516001600160a01b038581165f9081526004938490526040808220549051630aa794bf60e31b81528385169581019590955292945092610676928792169063553ca5f8906024015b602060405180830381865afa158015610652573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104349190612244565b90508089868151811061068b5761068b612230565b6020026020010181815161069f919061225b565b90525050506001016105c9565b5050600101610595565b5050505092915050565b5f9081525f805160206124a7833981519152602052604090206001015490565b6106e9826106c0565b6106f281611460565b6106fc838361146d565b50505050565b6001600160a01b038116331461072b5760405163334bd91960e11b815260040160405180910390fd5b610735828261150e565b505050565b5f805160206124c783398151915261075181611460565b610759611587565b6107648484846115d1565b6106fc60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f5604e2fe54b4de17b81a5ded6f82357d742fd2722d67304e37ff20bd589b4f386107b781611460565b826001600160a01b0381166107df5760405163d92e233d60e01b815260040160405180910390fd5b826001600160a01b0381166108075760405163d92e233d60e01b815260040160405180910390fd5b846001600160a01b0316846001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa15801561084d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610871919061227a565b6001600160a01b0316146109115784846001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108e0919061227a565b60405163d779457160e01b81526001600160a01b039283166004820152911660248201526044015b60405180910390fd5b6001600160a01b038581165f8181526004602052604080822080546001600160a01b0319169489169485179055517f5f6921933580ca0adbbb669ff049927ba73230114570507fc8e10f0758f1d8049190a35050505050565b6001600160a01b038181165f908152600460205260408120549091166109ae5760405163508516b160e11b81526001600160a01b0383166004820152602401610908565b6003546040805163a1174e7d60e01b815290515f926001600160a01b03169163a1174e7d91600480830192869291908290030181865afa1580156109f4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610a1b919081019061219c565b80519091505f5b81811015610a66575f838281518110610a3d57610a3d612230565b60200260200101519050610a518682611a3f565b610a5b908661225b565b945050600101610a22565b505050919050565b5f9182525f805160206124a7833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6001600160a01b038281165f90815260046020526040812054909116610ae85760405163508516b160e11b81526001600160a01b0384166004820152602401610908565b600354604051630735424b60e11b8152600481018490525f916001600160a01b031690630e6a849690602401602060405180830381865afa158015610b2f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b53919061227a565b9050610b5f8482611a3f565b949350505050565b610b776080820160608301611f56565b6001600160a01b038116610b9e5760405163d92e233d60e01b815260040160405180910390fd5b610bae60e0830160c08401611f56565b6001600160a01b038116610bd55760405163d92e233d60e01b815260040160405180910390fd5b610be6610100840160e08501611f56565b6001600160a01b038116610c0d5760405163d92e233d60e01b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610c515750825b90505f826001600160401b03166001148015610c6c5750303b155b905081158015610c7a575080155b15610c985760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610cc257845460ff60401b1916600160401b1785555b610cca611a9a565b610ce35f610cde60e08c0160c08d01611f56565b61146d565b50610d1a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610cde6101408c016101208d01611f56565b50610d517f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a610cde6101208c016101008d01611f56565b50610d745f805160206124c7833981519152610cde6101008c0160e08d01611f56565b50610dab7f5604e2fe54b4de17b81a5ded6f82357d742fd2722d67304e37ff20bd589b4f38610cde6101608c016101408d01611f56565b505f5b610db88a80612295565b9050811015611055575f610dcc8b80612295565b83818110610ddc57610ddc612230565b9050602002016020810190610df19190611f56565b6001600160a01b03161480610e3f57505f610e0f60208c018c612295565b83818110610e1f57610e1f612230565b9050602002016020810190610e349190611f56565b6001600160a01b0316145b15610e5d5760405163d92e233d60e01b815260040160405180910390fd5b5f600481610e6b8d80612295565b85818110610e7b57610e7b612230565b9050602002016020810190610e909190611f56565b6001600160a01b03908116825260208201929092526040015f20541614610f0557610ebb8a80612295565b82818110610ecb57610ecb612230565b9050602002016020810190610ee09190611f56565b604051634af8dd4d60e11b81526001600160a01b039091166004820152602401610908565b610f1260208b018b612295565b82818110610f2257610f22612230565b9050602002016020810190610f379190611f56565b60045f610f448d80612295565b85818110610f5457610f54612230565b9050602002016020810190610f699190611f56565b6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550898060200190610fbb9190612295565b82818110610fcb57610fcb612230565b9050602002016020810190610fe09190611f56565b6001600160a01b0316610ff38b80612295565b8381811061100357611003612230565b90506020020160208101906110189190611f56565b6001600160a01b03167f5f6921933580ca0adbbb669ff049927ba73230114570507fc8e10f0758f1d80460405160405180910390a3600101610dae565b5061106660608a0160408b01611f56565b5f80546001600160a01b0319166001600160a01b039290921691909117905561109560808a0160608b01611f56565b600180546001600160a01b0319166001600160a01b03929092169190911790556110c560a08a0160808b01611f56565b600280546001600160a01b0319166001600160a01b03929092169190911790556110f560c08a0160a08b01611f56565b600380546001600160a01b0319166001600160a01b03929092169190911790556111276101808a016101608b01611f56565b600580546001600160a01b0319166001600160a01b03929092169190911790556111596101a08a016101808b01611f56565b600680546001600160a01b0319166001600160a01b039283161790556005546040805163183fc7c960e31b81529051919092169163c1fe3e489160048083019260209291908290030181865afa1580156111b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111d9919061227a565b600880546001600160a01b0319166001600160a01b03928316179055600654604080516338d52e0f60e01b8152905191909216916338d52e0f9160048083019260209291908290030181865afa158015611235573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611259919061227a565b600780546001600160a01b0319166001600160a01b039290921691909117905583156112c057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2906020015b60405180910390a15b505050505050505050565b6112d4826106c0565b6112dd81611460565b6106fc838361150e565b5f805160206124c78339815191526112fe81611460565b611306611587565b5f5b8281101561135f575f84848381811061132357611323612230565b905060200281019061133591906122da565b61133e906122f8565b9050611356815f0151826020015183604001516115d1565b50600101611308565b5061073560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6005545f906001600160a01b03908116908416036114135760055460405162b0e38960e81b8152600481018490526001600160a01b039091169063b0e38900906024015b602060405180830381865afa1580156113e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061140c9190612244565b90506104ca565b6006546001600160a01b039081169084160361145a5760065460405163ef8b30f760e01b8152600481018490526001600160a01b039091169063ef8b30f7906024016113cd565b50919050565b61146a8133611aa4565b50565b5f5f805160206124a78339815191526114868484610a6e565b611505575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556114bb3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506104ca565b5f9150506104ca565b5f5f805160206124a78339815191526115278484610a6e565b15611505575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506104ca565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016115cb57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b815181518082146115ff576040516355c5b3e360e11b81526004810183905260248101829052604401610908565b600354604051630735424b60e11b8152600481018790525f916001600160a01b031690630e6a849690602401602060405180830381865afa158015611646573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166a919061227a565b90506001600160a01b03811661169657604051630fd3716f60e01b815260048101879052602401610908565b5f836001600160401b038111156116af576116af611f71565b6040519080825280602002602001820160405280156116d8578160200160208202803683370190505b5090505f5b848110156117d0575f8782815181106116f8576116f8612230565b6020026020010151905086828151811061171457611714612230565b60200260200101515f036117585786828151811061173457611734612230565b602002602001015160405163fdea5f4d60e01b815260040161090891815260200190565b6001600160a01b038082165f90815260046020526040902054168061179b57604051634234b21b60e11b81526001600160a01b0383166004820152602401610908565b808484815181106117ae576117ae612230565b6001600160a01b039092166020928302919091019091015250506001016116dd565b505f5460405163071794d960e31b81526001600160a01b03909116906338bca6c89061180290899089906004016123bb565b5f604051808303815f87803b158015611819575f80fd5b505af115801561182b573d5f803e3d5ffd5b505050505f846001600160401b0381111561184857611848611f71565b604051908082528060200260200182016040528015611871578160200160208202803683370190505b5090505f846001600160401b0381111561188d5761188d611f71565b6040519080825280602002602001820160405280156118b6578160200160208202803683370190505b5090505f5b86811015611974575f806119018b84815181106118da576118da612230565b60200260200101518b85815181106118f4576118f4612230565b6020026020010151611ae1565b915091508185848151811061191857611918612230565b60200260200101906001600160a01b031690816001600160a01b0316815250508084848151811061194b5761194b612230565b602090810291909101015261196a6001600160a01b0383168883611bde565b50506001016118bb565b50887f73aaca990b709624ed7bf23319e478279075f1941e8b6546adedb985d67979b989896040516119a79291906123bb565b60405180910390a260405163b778bf7b60e01b81526001600160a01b0385169063b778bf7b906119df908590859088906004016123e8565b5f604051808303815f87803b1580156119f6575f80fd5b505af1158015611a08573d5f803e3d5ffd5b505050507f94baf291029a59fe5651fb679bc5b38c0924cda9db75126bc7ec9e84bf5b1c2e8282856040516112b7939291906123e8565b6001600160a01b038281165f908152600460208190526040808320549051630aa794bf60e31b81528585169281019290925291928392611a8e928792919091169063553ca5f890602401610637565b9050610b5f818361225b565b611aa2611c30565b565b611aae8282610a6e565b611add5760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610908565b5050565b6005545f9081906001600160a01b0390811690851603611b7657600854600554604051636f074d1f60e11b8152600481018690526001600160a01b03928316945091169063de0e9a3e906024015b6020604051808303815f875af1158015611b4b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b6f9190612244565b9050611bd7565b6006546001600160a01b0390811690851603611bd157600754600654604051635d043b2960e11b815260048101869052306024820181905260448201526001600160a01b03928316945091169063ba08765290606401611b2f565b50829050815b9250929050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610735908490611c79565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611aa257604051631afcd79f60e31b815260040160405180910390fd5b5f611c8d6001600160a01b03841683611cda565b905080515f14158015611cb1575080806020019051810190611caf919061245b565b155b1561073557604051635274afe760e01b81526001600160a01b0384166004820152602401610908565b6060611ce783835f611cee565b9392505050565b606081471015611d135760405163cd78605960e01b8152306004820152602401610908565b5f80856001600160a01b03168486604051611d2e919061247a565b5f6040518083038185875af1925050503d805f8114611d68576040519150601f19603f3d011682016040523d82523d5f602084013e611d6d565b606091505b5091509150611d7d868383611d87565b9695505050505050565b606082611d9c57611d9782611de3565b611ce7565b8151158015611db357506001600160a01b0384163b155b15611ddc57604051639996b31560e01b81526001600160a01b0385166004820152602401610908565b5080611ce7565b805115611df35780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f60208284031215611e1c575f80fd5b81356001600160e01b031981168114611ce7575f80fd5b5f8083601f840112611e43575f80fd5b5081356001600160401b03811115611e59575f80fd5b6020830191508360208260051b8501011115611bd7575f80fd5b5f8060208385031215611e84575f80fd5b82356001600160401b03811115611e99575f80fd5b611ea585828601611e33565b90969095509350505050565b5f815180845260208085019450602084015f5b83811015611ee057815187529582019590820190600101611ec4565b509495945050505050565b602081525f611ce76020830184611eb1565b5f60208284031215611f0d575f80fd5b5035919050565b6001600160a01b038116811461146a575f80fd5b5f8060408385031215611f39575f80fd5b823591506020830135611f4b81611f14565b809150509250929050565b5f60208284031215611f66575f80fd5b8135611ce781611f14565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715611fad57611fad611f71565b604052919050565b5f6001600160401b03821115611fcd57611fcd611f71565b5060051b60200190565b5f82601f830112611fe6575f80fd5b81356020611ffb611ff683611fb5565b611f85565b8083825260208201915060208460051b87010193508684111561201c575f80fd5b602086015b8481101561204157803561203481611f14565b8352918301918301612021565b509695505050505050565b5f82601f83011261205b575f80fd5b8135602061206b611ff683611fb5565b8083825260208201915060208460051b87010193508684111561208c575f80fd5b602086015b848110156120415780358352918301918301612091565b5f805f606084860312156120ba575f80fd5b8335925060208401356001600160401b03808211156120d7575f80fd5b6120e387838801611fd7565b935060408601359150808211156120f8575f80fd5b506121058682870161204c565b9150509250925092565b5f8060408385031215612120575f80fd5b823561212b81611f14565b91506020830135611f4b81611f14565b5f806040838503121561214c575f80fd5b823561215781611f14565b946020939093013593505050565b5f60208284031215612175575f80fd5b81356001600160401b0381111561218a575f80fd5b82016101a08185031215611ce7575f80fd5b5f60208083850312156121ad575f80fd5b82516001600160401b038111156121c2575f80fd5b8301601f810185136121d2575f80fd5b80516121e0611ff682611fb5565b81815260059190911b820183019083810190878311156121fe575f80fd5b928401925b8284101561222557835161221681611f14565b82529284019290840190612203565b979650505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612254575f80fd5b5051919050565b808201808211156104ca57634e487b7160e01b5f52601160045260245ffd5b5f6020828403121561228a575f80fd5b8151611ce781611f14565b5f808335601e198436030181126122aa575f80fd5b8301803591506001600160401b038211156122c3575f80fd5b6020019150600581901b3603821315611bd7575f80fd5b5f8235605e198336030181126122ee575f80fd5b9190910192915050565b5f60608236031215612308575f80fd5b604051606081016001600160401b03828210818311171561232b5761232b611f71565b81604052843583526020850135915080821115612346575f80fd5b61235236838701611fd7565b6020840152604085013591508082111561236a575f80fd5b506123773682860161204c565b60408301525092915050565b5f815180845260208085019450602084015f5b83811015611ee05781516001600160a01b031687529582019590820190600101612396565b604081525f6123cd6040830185612383565b82810360208401526123df8185611eb1565b95945050505050565b606081525f6123fa6060830186612383565b6020838203602085015261240e8287611eb1565b8481036040860152855180825260208088019450909101905f5b8181101561244d5784516001600160a01b031683529383019391830191600101612428565b509098975050505050505050565b5f6020828403121561246b575f80fd5b81518015158114611ce7575f80fd5b5f82515f5b81811015612499576020818601810151858301520161247f565b505f92019182525091905056fe02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800d804c5bf32ccb7c8f087c7a3be22668464f9b4302aec069f690a2c9ba96fc026a2646970667358221220a4ff11d363bb04f18ea6e97818a0b8a50cab3e8211b6c0c34c67eb09661a204e64736f6c63430008180033", + "nonce": "0x92", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x48bd0c68992e37d973267c1a62275d077999384b331de5658a00b00f7560f3fb", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x92d904019a92b0cafce3492abb95577c285a68fc", + "function": null, + "arguments": [ + "0xE2343a850394ee1b1e33b16Da5bD73B076D6Fa81", + "0xbB73f8a5B0074b27c6df026c77fA08B0111D017A", + "0x" + ], + "transaction": { + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "gas": "0xce728", + "value": "0x0", + "input": "0x60a060405260405162000e5038038062000e508339810160408190526200002691620003bc565b828162000034828262000099565b50508160405162000045906200035a565b6001600160a01b039091168152602001604051809103905ff0801580156200006f573d5f803e3d5ffd5b506001600160a01b0316608052620000906200008a60805190565b620000fe565b505050620004b3565b620000a4826200016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000f057620000eb8282620001ee565b505050565b620000fa62000267565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6200013f5f8051602062000e30833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16200016c8162000289565b50565b806001600160a01b03163b5f03620001aa57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516200020c919062000496565b5f60405180830381855af49150503d805f811462000246576040519150601f19603f3d011682016040523d82523d5f602084013e6200024b565b606091505b5090925090506200025e858383620002ca565b95945050505050565b3415620002875760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b038116620002b457604051633173bdd160e11b81525f6004820152602401620001a1565b805f8051602062000e30833981519152620001cd565b606082620002e357620002dd8262000330565b62000329565b8151158015620002fb57506001600160a01b0384163b155b156200032657604051639996b31560e01b81526001600160a01b0385166004820152602401620001a1565b50805b9392505050565b805115620003415780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6104fc806200093483390190565b80516001600160a01b03811681146200037f575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620003b45781810151838201526020016200039a565b50505f910152565b5f805f60608486031215620003cf575f80fd5b620003da8462000368565b9250620003ea6020850162000368565b60408501519092506001600160401b038082111562000407575f80fd5b818601915086601f8301126200041b575f80fd5b81518181111562000430576200043062000384565b604051601f8201601f19908116603f011681019083821181831017156200045b576200045b62000384565b8160405282815289602084870101111562000474575f80fd5b6200048783602083016020880162000398565b80955050505050509250925092565b5f8251620004a981846020870162000398565b9190910192915050565b608051610469620004cb5f395f601001526104695ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007a575f356001600160e01b03191663278f794360e11b14610070576040516334ad5dbb60e21b815260040160405180910390fd5b610078610082565b565b6100786100b0565b5f806100913660048184610303565b81019061009e919061033e565b915091506100ac82826100c0565b5050565b6100786100bb61011a565b610151565b6100c98261016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101125761010d82826101ea565b505050565b6100ac61025c565b5f61014c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e80801561016b573d5ff35b3d5ffd5b806001600160a01b03163b5f036101a957604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102069190610407565b5f60405180830381855af49150503d805f811461023e576040519150601f19603f3d011682016040523d82523d5f602084013e610243565b606091505b509150915061025385838361027b565b95945050505050565b34156100785760405163b398979f60e01b815260040160405180910390fd5b6060826102905761028b826102da565b6102d3565b81511580156102a757506001600160a01b0384163b155b156102d057604051639996b31560e01b81526001600160a01b03851660048201526024016101a0565b50805b9392505050565b8051156102ea5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610311575f80fd5b8386111561031d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561034f575f80fd5b82356001600160a01b0381168114610365575f80fd5b9150602083013567ffffffffffffffff80821115610381575f80fd5b818501915085601f830112610394575f80fd5b8135818111156103a6576103a661032a565b604051601f8201601f19908116603f011681019083821181831017156103ce576103ce61032a565b816040528281528860208487010111156103e6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610426576020818601810151858301520161040c565b505f92019182525091905056fea26469706673582212202bdadd4d90be9694cdd96b74937fb73e8cb3ab30807abea8aecf7c946f10f50364736f6c63430008180033608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea26469706673582212204852424075b6dea1d1527c7df075e3c174ec7222e99be5d8f0c28327860a53d964736f6c63430008180033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000e2343a850394ee1b1e33b16da5bd73b076d6fa81000000000000000000000000bb73f8a5b0074b27c6df026c77fa08b0111d017a00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x93", + "chainId": "0x1" + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0x69c34fb00ebc0d7ac09ab7968d2eb9a07c2eb301", + "initCode": "0x608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea26469706673582212204852424075b6dea1d1527c7df075e3c174ec7222e99be5d8f0c28327860a53d964736f6c63430008180033000000000000000000000000bb73f8a5b0074b27c6df026c77fa08b0111d017a" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xbb8e954738175a8d942b2990220e9cedef03c18064e8c0c8707f604119ccb9bb", + "transactionType": "CREATE", + "contractName": "TokenStakingNodesManager", + "contractAddress": "0x17e77f964538fed3adec3e8dbb6147da258206da", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "gas": "0x23bc82", + "value": "0x0", + "input": "0x608060405234801561000f575f80fd5b5061001861001d565b6100cf565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161561006d5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100cc5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b611f2e806100dc5f395ff3fe608060405234801562000010575f80fd5b5060043610620001f8575f3560e01c8063a217fddf1162000113578063d547741f11620000ab578063ea4d3c9b1162000077578063ea4d3c9b14620004b1578063f33de6c014620004c5578063f9645e7414620004ce578063fb1bb9de14620004e5575f80fd5b8063d547741f1462000425578063e6319b41146200043c578063e63ab1e91462000461578063e967f4b61462000489575f80fd5b8063cb70bd7911620000eb578063cb70bd7914620003e6578063ce8572d314620003f0578063d131585d1462000407578063d26095201462000411575f80fd5b8063a217fddf146200039f578063a39cebe914620003a7578063c4240d2514620003be575f80fd5b80632f2ff15d116200019357806361464d2d116200015f57806361464d2d14620003305780637eb694a8146200034757806391d14854146200036f578063a1174e7d1462000386575f80fd5b80632f2ff15d14620002db57806336568abe14620002f257806339b70e38146200030957806352f94f98146200031c575f80fd5b80630e6a849611620001d35780630e6a849614620002645780631c53c2801462000294578063248a9ca314620002ab5780632d321fc714620002c2575f80fd5b806301ffc9a714620001fc57806304f67aa1146200022857806306a78ba6146200024d575b5f80fd5b620002136200020d366004620013b1565b6200050d565b60405190151581526020015b60405180910390f35b6200023e5f8051602062001eb983398151915281565b6040519081526020016200021f565b620002136200025e366004620013f6565b62000544565b6200027b6200027536600462001414565b62000571565b6040516001600160a01b0390911681526020016200021f565b6200027b620002a536600462001414565b620005ce565b6200023e620002bc36600462001414565b620005f7565b620002d9620002d3366004620013f6565b62000618565b005b620002d9620002ec3660046200142c565b62000727565b620002d9620003033660046200142c565b6200074f565b5f546200027b906001600160a01b031681565b6002546200027b906001600160a01b031681565b620002d96200034136600462001414565b6200078a565b6200023e7f9cb3b45ba8017381348975633951e84d77cd512b58a6ebd2533f422ddd94389081565b62000213620003803660046200142c565b620007e0565b6200039062000817565b6040516200021f91906200145d565b6200023e5f81565b620002d9620003b8366004620013f6565b62000879565b6200023e7fc54b323804427575ac6f9f18bf0a027fc2cb84d5af10f03a09d54fd69842fde981565b6200023e60055481565b6200021362000401366004620013f6565b620009d9565b6200027b62000a06565b6003546200027b906001600160a01b031681565b620002d9620004363660046200142c565b62000b81565b620002136200044d366004620013f6565b6002546001600160a01b0391821691161490565b6200023e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6200023e7fd47f55d1ccb2b675ff4066bc639e489a7cb307c80ad9e87fc3104cf217c2b3ee81565b6001546200027b906001600160a01b031681565b6004546200023e565b620002d9620004df366004620014ab565b62000ba3565b6200023e7f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a81565b5f6001600160e01b03198216637965db0b60e01b14806200053e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f6200053e7f9cb3b45ba8017381348975633951e84d77cd512b58a6ebd2533f422ddd94389083620007e0565b6004545f9082106200059e57604051631ca9e25f60e01b8152600481018390526024015b60405180910390fd5b60048281548110620005b457620005b4620014c3565b5f918252602090912001546001600160a01b031692915050565b60048181548110620005de575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f9081525f8051602062001ed9833981519152602052604090206001015490565b5f8051602062001eb983398151915262000632816200102e565b816001600160a01b0381166200065b5760405163d92e233d60e01b815260040160405180910390fd5b6003546001600160a01b031615620006865760405163a81fbfef60e01b815260040160405180910390fd5b8230604051620006969062001395565b6001600160a01b03928316815291166020820152604001604051809103905ff080158015620006c7573d5f803e3d5ffd5b50600380546001600160a01b0319166001600160a01b039283169081179091556040805191825291851660208201527fd13f13f7d12bbc1ec3c2f99ed663d6b643f722a4654c11d4325b35ed88d9fb7591015b60405180910390a1505050565b6200073282620005f7565b6200073d816200102e565b6200074983836200103d565b50505050565b6001600160a01b0381163314620007795760405163334bd91960e11b815260040160405180910390fd5b620007858282620010e5565b505050565b5f8051602062001eb9833981519152620007a4816200102e565b60058290556040518281527f5179ce38a6079ec731d2e265edcf9e1635e8ac7fd689ad42c5e20a7571c054159060200160405180910390a15050565b5f9182525f8051602062001ed9833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060048054806020026020016040519081016040528092919081815260200182805480156200086f57602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831162000850575b5050505050905090565b5f8051602062001eb983398151915262000893816200102e565b816001600160a01b038116620008bc5760405163d92e233d60e01b815260040160405180910390fd5b6003546001600160a01b0316620008e657604051636aef646b60e11b815260040160405180910390fd5b600354604051631b2ce7f360e11b81526001600160a01b03858116600483015290911690633659cfe6906024015f604051808303815f87803b1580156200092b575f80fd5b505af11580156200093e573d5f803e3d5ffd5b505060045491505f90505b81811015620009905762000987600482815481106200096c576200096c620014c3565b5f918252602090912001546001600160a01b03168362001163565b60010162000949565b50604080516001600160a01b0386168152602081018390527f02c79c1e3f8b682a9487f84feb1ab388b1ebf7a5e85307e941ec19122d2ed14e910160405180910390a150505050565b5f6200053e7fd47f55d1ccb2b675ff4066bc639e489a7cb307c80ad9e87fc3104cf217c2b3ee83620007e0565b6003545f906001600160a01b03168062000a335760405163d92e233d60e01b815260040160405180910390fd5b7fc54b323804427575ac6f9f18bf0a027fc2cb84d5af10f03a09d54fd69842fde962000a5f816200102e565b600454600554811062000a8c57600554604051634ec828df60e11b81526004016200059591815260200190565b6003546040515f916001600160a01b03169062000aa990620013a3565b6001600160a01b0390911681526040602082018190525f90820152606001604051809103905ff08015801562000ae1573d5f803e3d5ffd5b5090508062000af1818462001163565b600480546001810182555f919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b0383169081179091556040805185815260208101929092527fbf09b194225fb976ecbedf24587fc7de2987992ad982f5321a563ce92221000b910160405180910390a194505050505090565b62000b8c82620005f7565b62000b97816200102e565b620007498383620010e5565b62000bb26020820182620013f6565b6001600160a01b03811662000bda5760405163d92e233d60e01b815260040160405180910390fd5b62000bec60a0830160808401620013f6565b6001600160a01b03811662000c145760405163d92e233d60e01b815260040160405180910390fd5b62000c27610100840160e08501620013f6565b6001600160a01b03811662000c4f5760405163d92e233d60e01b815260040160405180910390fd5b62000c6361012085016101008601620013f6565b6001600160a01b03811662000c8b5760405163d92e233d60e01b815260040160405180910390fd5b62000c9f61014086016101208701620013f6565b6001600160a01b03811662000cc75760405163d92e233d60e01b815260040160405180910390fd5b62000cdb61016087016101408801620013f6565b6001600160a01b03811662000d035760405163d92e233d60e01b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f8115801562000d495750825b90505f8267ffffffffffffffff16600114801562000d665750303b155b90508115801562000d75575080155b1562000d945760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831562000dbf57845460ff60401b1916600160401b1785555b62000dc9620012fe565b62000deb5f801b8d608001602081019062000de59190620013f6565b6200103d565b5062000e145f8051602062001eb98339815191528d60e001602081019062000de59190620013f6565b5062000e507f9cb3b45ba8017381348975633951e84d77cd512b58a6ebd2533f422ddd9438908d61010001602081019062000de59190620013f6565b5062000e8c7fc54b323804427575ac6f9f18bf0a027fc2cb84d5af10f03a09d54fd69842fde98d61012001602081019062000de59190620013f6565b5062000ec87fd47f55d1ccb2b675ff4066bc639e489a7cb307c80ad9e87fc3104cf217c2b3ee8d61014001602081019062000de59190620013f6565b5062000f037f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a8d60a001602081019062000de59190620013f6565b5062000f3e7f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a8d60c001602081019062000de59190620013f6565b5062000f4e60208d018d620013f6565b5f80546001600160a01b0319166001600160a01b039290921691909117905562000f7f60408d0160208e01620013f6565b600180546001600160a01b0319166001600160a01b039290921691909117905562000fb160608d0160408e01620013f6565b600280546001600160a01b0319166001600160a01b039290921691909117905560608c013560055583156200102057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050505050565b6200103a81336200130a565b50565b5f5f8051602062001ed9833981519152620010598484620007e0565b620010db575f848152602082815260408083206001600160a01b03871684529091529020805460ff19166001179055620010903390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506200053e565b5f9150506200053e565b5f5f8051602062001ed9833981519152620011018484620007e0565b15620010db575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506200053e565b5f826001600160a01b031663b3c650156040518163ffffffff1660e01b8152600401602060405180830381865afa158015620011a1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620011c79190620014d7565b90508067ffffffffffffffff165f0362000785576040805180820182523081526020810184815291516377b3492760e01b815290516001600160a01b03908116600483015291516024820152908416906377b34927906044015f604051808303815f87803b15801562001238575f80fd5b505af11580156200124b573d5f803e3d5ffd5b50505050826001600160a01b031663b3c650156040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200128c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620012b29190620014d7565b604080516001600160a01b038616815267ffffffffffffffff831660208201529192507fa070c83df7efc58b668afb64705222890e09b4090d56ee9981fc66ac1c552aa191016200071a565b620013086200134b565b565b620013168282620007e0565b620013475760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440162000595565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166200130857604051631afcd79f60e31b815260040160405180910390fd5b610421806200150183390190565b610597806200192283390190565b5f60208284031215620013c2575f80fd5b81356001600160e01b031981168114620013da575f80fd5b9392505050565b6001600160a01b03811681146200103a575f80fd5b5f6020828403121562001407575f80fd5b8135620013da81620013e1565b5f6020828403121562001425575f80fd5b5035919050565b5f80604083850312156200143e575f80fd5b8235915060208301356200145281620013e1565b809150509250929050565b602080825282518282018190525f9190848201906040850190845b818110156200149f5783516001600160a01b03168352928401929184019160010162001478565b50909695505050505050565b5f6101608284031215620014bd575f80fd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215620014e8575f80fd5b815167ffffffffffffffff81168114620013da575f80fdfe608060405234801561000f575f80fd5b5060405161042138038061042183398101604081905261002e9161015f565b806001600160a01b03811661005d57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61006681610077565b50610070826100c6565b5050610190565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b806001600160a01b03163b5f036100fb5760405163211eb15960e21b81526001600160a01b0382166004820152602401610054565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b80516001600160a01b038116811461015a575f80fd5b919050565b5f8060408385031215610170575f80fd5b61017983610144565b915061018760208401610144565b90509250929050565b6102848061019d5f395ff3fe608060405234801561000f575f80fd5b5060043610610055575f3560e01c80633659cfe6146100595780635c60da1b1461006e578063715018a6146100975780638da5cb5b1461009f578063f2fde38b146100af575b5f80fd5b61006c610067366004610221565b6100c2565b005b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b61006c6100d6565b5f546001600160a01b031661007b565b61006c6100bd366004610221565b6100e9565b6100ca610128565b6100d381610154565b50565b6100de610128565b6100e75f6101d2565b565b6100f1610128565b6001600160a01b03811661011f57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6100d3816101d2565b5f546001600160a01b031633146100e75760405163118cdaa760e01b8152336004820152602401610116565b806001600160a01b03163b5f036101895760405163211eb15960e21b81526001600160a01b0382166004820152602401610116565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610231575f80fd5b81356001600160a01b0381168114610247575f80fd5b939250505056fea264697066735822122024f3063d3bec545d5607dbb337dcdef322d9822da58bfe32422b791414a91c4b64736f6c6343000818003360a060405260405161059738038061059783398101604081905261002291610376565b61002c828261003e565b506001600160a01b0316608052610465565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e49190610431565b82610209565b505050565b6100f761027c565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d29190610431565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f80846001600160a01b031684604051610225919061044a565b5f60405180830381855af49150503d805f811461025d576040519150601f19603f3d011682016040523d82523d5f602084013e610262565b606091505b50909250905061027385838361029d565b95945050505050565b341561029b5760405163b398979f60e01b815260040160405180910390fd5b565b6060826102b2576102ad826102fc565b6102f5565b81511580156102c957506001600160a01b0384163b155b156102f257604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b50805b9392505050565b80511561030c5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461033b575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561036e578181015183820152602001610356565b50505f910152565b5f8060408385031215610387575f80fd5b61039083610325565b60208401519092506001600160401b03808211156103ac575f80fd5b818501915085601f8301126103bf575f80fd5b8151818111156103d1576103d1610340565b604051601f8201601f19908116603f011681019083821181831017156103f9576103f9610340565b81604052828152886020848701011115610411575f80fd5b610422836020830160208801610354565b80955050505050509250929050565b5f60208284031215610441575f80fd5b6102f582610325565b5f825161045b818460208701610354565b9190910192915050565b60805161011b61047c5f395f601d015261011b5ff3fe6080604052600a600c565b005b60186014601a565b609d565b565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156076573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906098919060ba565b905090565b365f80375f80365f845af43d5f803e80801560b6573d5ff35b3d5ffd5b5f6020828403121560c9575f80fd5b81516001600160a01b038116811460de575f80fd5b939250505056fea2646970667358221220bf10978c44de912e8bc8b9a364c5d15b45108d578b50f0697ce762a91dbae19364736f6c6343000818003324791c44c040514a5d2580696fc45e7d3cb6c9fa65bf3db2e4755362d6c155b502dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800a26469706673582212202105f36fd5df99fd76d0e25dbaaf88d2e01a5c80e66c378d4b7710317ffff60364736f6c63430008180033", + "nonce": "0x94", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x26d21ebbab7cf280edd83f7ef139380a50a45bc0abcb819bd2d08788d0f13f58", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x6b566cb6cddf7d140c59f84594756a151030a0c3", + "function": null, + "arguments": [ + "0x17e77F964538fed3ADEc3E8dBB6147dA258206Da", + "0xbB73f8a5B0074b27c6df026c77fA08B0111D017A", + "0x" + ], + "transaction": { + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "gas": "0xce728", + "value": "0x0", + "input": "0x60a060405260405162000e5038038062000e508339810160408190526200002691620003bc565b828162000034828262000099565b50508160405162000045906200035a565b6001600160a01b039091168152602001604051809103905ff0801580156200006f573d5f803e3d5ffd5b506001600160a01b0316608052620000906200008a60805190565b620000fe565b505050620004b3565b620000a4826200016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000f057620000eb8282620001ee565b505050565b620000fa62000267565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6200013f5f8051602062000e30833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16200016c8162000289565b50565b806001600160a01b03163b5f03620001aa57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516200020c919062000496565b5f60405180830381855af49150503d805f811462000246576040519150601f19603f3d011682016040523d82523d5f602084013e6200024b565b606091505b5090925090506200025e858383620002ca565b95945050505050565b3415620002875760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b038116620002b457604051633173bdd160e11b81525f6004820152602401620001a1565b805f8051602062000e30833981519152620001cd565b606082620002e357620002dd8262000330565b62000329565b8151158015620002fb57506001600160a01b0384163b155b156200032657604051639996b31560e01b81526001600160a01b0385166004820152602401620001a1565b50805b9392505050565b805115620003415780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6104fc806200093483390190565b80516001600160a01b03811681146200037f575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620003b45781810151838201526020016200039a565b50505f910152565b5f805f60608486031215620003cf575f80fd5b620003da8462000368565b9250620003ea6020850162000368565b60408501519092506001600160401b038082111562000407575f80fd5b818601915086601f8301126200041b575f80fd5b81518181111562000430576200043062000384565b604051601f8201601f19908116603f011681019083821181831017156200045b576200045b62000384565b8160405282815289602084870101111562000474575f80fd5b6200048783602083016020880162000398565b80955050505050509250925092565b5f8251620004a981846020870162000398565b9190910192915050565b608051610469620004cb5f395f601001526104695ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007a575f356001600160e01b03191663278f794360e11b14610070576040516334ad5dbb60e21b815260040160405180910390fd5b610078610082565b565b6100786100b0565b5f806100913660048184610303565b81019061009e919061033e565b915091506100ac82826100c0565b5050565b6100786100bb61011a565b610151565b6100c98261016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101125761010d82826101ea565b505050565b6100ac61025c565b5f61014c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e80801561016b573d5ff35b3d5ffd5b806001600160a01b03163b5f036101a957604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102069190610407565b5f60405180830381855af49150503d805f811461023e576040519150601f19603f3d011682016040523d82523d5f602084013e610243565b606091505b509150915061025385838361027b565b95945050505050565b34156100785760405163b398979f60e01b815260040160405180910390fd5b6060826102905761028b826102da565b6102d3565b81511580156102a757506001600160a01b0384163b155b156102d057604051639996b31560e01b81526001600160a01b03851660048201526024016101a0565b50805b9392505050565b8051156102ea5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610311575f80fd5b8386111561031d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561034f575f80fd5b82356001600160a01b0381168114610365575f80fd5b9150602083013567ffffffffffffffff80821115610381575f80fd5b818501915085601f830112610394575f80fd5b8135818111156103a6576103a661032a565b604051601f8201601f19908116603f011681019083821181831017156103ce576103ce61032a565b816040528281528860208487010111156103e6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610426576020818601810151858301520161040c565b505f92019182525091905056fea26469706673582212202bdadd4d90be9694cdd96b74937fb73e8cb3ab30807abea8aecf7c946f10f50364736f6c63430008180033608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea26469706673582212204852424075b6dea1d1527c7df075e3c174ec7222e99be5d8f0c28327860a53d964736f6c63430008180033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610300000000000000000000000017e77f964538fed3adec3e8dbb6147da258206da000000000000000000000000bb73f8a5b0074b27c6df026c77fa08b0111d017a00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x95", + "chainId": "0x1" + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0x850d012115fb4d90711f53e86b2945019bf7f36c", + "initCode": "0x608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea26469706673582212204852424075b6dea1d1527c7df075e3c174ec7222e99be5d8f0c28327860a53d964736f6c63430008180033000000000000000000000000bb73f8a5b0074b27c6df026c77fa08b0111d017a" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x25e972c3c81dfd1335e61bc387d22818f6a762c86f4cc212facb298a7fd58e09", + "transactionType": "CREATE", + "contractName": "AssetRegistry", + "contractAddress": "0x84da5ab890b0a3314deed0bebd2463309a755eac", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "gas": "0x22e64d", + "value": "0x0", + "input": "0x608060405234801561000f575f80fd5b5061001861001d565b6100cf565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161561006d5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100cc5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b611e57806100dc5f395ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c806370807528116100f3578063c92110c311610093578063e63ab1e91161006e578063e63ab1e9146103cf578063efe0b29c146103f6578063fb1bb9de14610409578063fc1198c014610430575f80fd5b8063c92110c31461037a578063cf35bdd0146103a9578063d547741f146103bc575f80fd5b80639a2be4af116100ce5780639a2be4af14610344578063a217fddf14610357578063a4b32de81461035e578063c5f827e614610372575f80fd5b8063708075281461030657806391d1485414610319578063949db6581461032c575f80fd5b806336568abe1161015e5780635f4caf46116101395780635f4caf46146102bc578063613e85ff146102cf57806367e4ac2c146102e45780636be1fcc3146102f9575f80fd5b806336568abe1461025e57806339b70e381461027157806341fee44a1461029c575f80fd5b80631cbf960d116101995780631cbf960d14610212578063248a9ca314610225578063298410e5146102385780632f2ff15d1461024b575f80fd5b806301e1d114146101bf57806301ffc9a7146101da57806315e09f3c146101fd575b5f80fd5b6101c7610438565b6040519081526020015b60405180910390f35b6101ed6101e83660046118cd565b6104c2565b60405190151581526020016101d1565b61021061020b36600461190f565b6104f8565b005b6101c761022036600461192a565b6107e4565b6101c7610233366004611954565b610914565b61021061024636600461190f565b610934565b61021061025936600461196b565b610bd9565b61021061026c36600461196b565b610bfb565b600354610284906001600160a01b031681565b6040516001600160a01b0390911681526020016101d1565b6102af6102aa36600461190f565b610c33565b6040516101d191906119cd565b6101ed6102ca36600461190f565b610c93565b6102d7610cc9565b6040516101d191906119df565b6102ec610e83565b6040516101d19190611a22565b6002546101ed9060ff1681565b61021061031436600461190f565b610ee2565b6101ed61032736600461196b565b610fe9565b6002546102849061010090046001600160a01b031681565b600454610284906001600160a01b031681565b6101c75f81565b6101c75f80516020611de283398151915281565b61021061101f565b61039c61038836600461190f565b60016020525f908152604090205460ff1681565b6040516101d19190611a62565b6102846103b7366004611954565b611090565b6102106103ca36600461196b565b6110b7565b6101c77f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b610210610404366004611a70565b6110d3565b6101c77f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a81565b6102106115fe565b5f8080610443610cc9565b5f80549192505b818110156104b9575f6104a25f838154811061046857610468611aa8565b905f5260205f20015f9054906101000a90046001600160a01b031685848151811061049557610495611aa8565b60200260200101516107e4565b90506104ae8186611ad0565b94505060010161044a565b50919392505050565b5f6001600160e01b03198216637965db0b60e01b14806104f257506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f80516020611de283398151915261050f81611662565b816001600160a01b0381166105375760405163d92e233d60e01b815260040160405180910390fd5b60025460ff161561055b576040516313d0ff5960e31b815260040160405180910390fd5b60026001600160a01b0384165f9081526001602052604090205460ff16600281111561058957610589611999565b146105b757604051631005a45f60e21b81526001600160a01b03841660048201526024015b60405180910390fd5b600480546040516319b11cab60e31b81526001600160a01b03868116938201939093525f929091169063cd88e55890602401602060405180830381865afa158015610604573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106289190611ae3565b9050801561064c57604051631f17ea1d60e01b8152600481018290526024016105ae565b6003546040516374f2ca0560e01b81526001600160a01b0386811660048301525f9216906374f2ca0590602401602060405180830381865afa158015610694573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106b89190611ae3565b905080156106dc57604051636f024b5160e01b8152600481018290526024016105ae565b5f6106e68661166f565b5f8054919250906106f990600190611afa565b8154811061070957610709611aa8565b5f91825260208220015481546001600160a01b0390911691908390811061073257610732611aa8565b5f918252602082200180546001600160a01b0319166001600160a01b03939093169290921790915580548061076957610769611b0d565b5f82815260208082205f19908401810180546001600160a01b03191690559092019092556001600160a01b03881680835260018252604092839020805460ff1916905591518381527ff166ed9d03804d1c092d69ed29c647b801c58174de928eff484aa9c92f4d5134910160405180910390a2505050505050565b6002546040516305d4ec6560e11b81526001600160a01b0384811660048301525f92839261010090910490911690630ba9d8ca90602401602060405180830381865afa158015610836573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085a9190611ae3565b90505f846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610899573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108bd9190611b21565b90508060ff166012036108ec57670de0b6b3a76400006108dd8584611b41565b6108e79190611b58565b61090b565b6108f781600a611c57565b6109018584611b41565b61090b9190611b58565b95945050505050565b5f9081525f80516020611e02833981519152602052604090206001015490565b5f80516020611de283398151915261094b81611662565b816001600160a01b0381166109735760405163d92e233d60e01b815260040160405180910390fd5b60025460ff1615610997576040516313d0ff5960e31b815260040160405180910390fd5b6001600160a01b0383165f9081526001602052604081205460ff1660028111156109c3576109c3611999565b146109ec5760405163049437a360e21b81526001600160a01b03841660048201526024016105ae565b60035460405163551c457b60e11b81526001600160a01b0385811660048301529091169063aa388af690602401602060405180830381865afa158015610a34573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a589190611c65565b610a805760405163508516b160e11b81526001600160a01b03841660048201526024016105ae565b6002546040516305d4ec6560e11b81526001600160a01b03858116600483015261010090920490911690630ba9d8ca90602401602060405180830381865afa925050508015610aec575060408051601f3d908101601f19168201909252610ae991810190611ae3565b60015b610b1457604051633a798e4760e21b81526001600160a01b03841660048201526024016105ae565b505f8054600180820183557f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390910180546001600160a01b0319166001600160a01b0387169081179091556040805160208082018352848252928552918390529092208251815491929091839160ff1990911690836002811115610b9a57610b9a611999565b0217905550506040516001600160a01b03851691507f0e3c58ebfb2e7465fbb1c32e6b4f40c3c4f5ca77e8218a386aff8617831260d7905f90a2505050565b610be282610914565b610beb81611662565b610bf583836116e5565b50505050565b6001600160a01b0381163314610c245760405163334bd91960e11b815260040160405180910390fd5b610c2e8282611786565b505050565b60408051602080820183525f8083526001600160a01b0385168152600182528390208351918201909352825491929091829060ff166002811115610c7957610c79611999565b6002811115610c8a57610c8a611999565b90525092915050565b5f60016001600160a01b0383165f9081526001602052604090205460ff166002811115610cc257610cc2611999565b1492915050565b5f546060908067ffffffffffffffff811115610ce757610ce7611c84565b604051908082528060200260200182016040528015610d10578160200160208202803683370190505b5060048054604051637063c25360e11b81529294506001600160a01b03169163e0c784a691610d41915f9101611c98565b5f60405180830381865afa158015610d5b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d829190810190611cdb565b6003546040516305b9289b60e11b81529193505f916001600160a01b0390911690630b72513690610db7908490600401611c98565b5f60405180830381865afa158015610dd1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610df89190810190611cdb565b905081815114610e285780516040516355c5b3e360e11b81526105ae918491600401918252602082015260400190565b5f5b82811015610e7d57818181518110610e4457610e44611aa8565b6020026020010151848281518110610e5e57610e5e611aa8565b60200260200101818151610e729190611ad0565b905250600101610e2a565b50505090565b60605f805480602002602001604051908101604052809291908181526020018280548015610ed857602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610eba575b5050505050905090565b5f80516020611de2833981519152610ef981611662565b816001600160a01b038116610f215760405163d92e233d60e01b815260040160405180910390fd5b60025460ff1615610f45576040516313d0ff5960e31b815260040160405180910390fd5b60016001600160a01b0384165f9081526001602052604090205460ff166002811115610f7357610f73611999565b14610f9c57604051637f93962560e01b81526001600160a01b03841660048201526024016105ae565b6001600160a01b0383165f81815260016020526040808220805460ff19166002179055517ffc9274ad64ab0a7d8dedd8c9297fb4e25d7a17eb057457c6bcf2a8f13dc8859c9190a2505050565b5f9182525f80516020611e02833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61104981611662565b6002805460ff191660019081179091556040519081527f31311016d7204faff81880133e3db244ae8a8b9ce15e83e2432258226d15f942906020015b60405180910390a150565b5f818154811061109e575f80fd5b5f918252602090912001546001600160a01b0316905081565b6110c082610914565b6110c981611662565b610bf58383611786565b6110e3604082016020830161190f565b6001600160a01b03811661110a5760405163d92e233d60e01b815260040160405180910390fd5b61111a60a083016080840161190f565b6001600160a01b0381166111415760405163d92e233d60e01b815260040160405180910390fd5b61115160c0840160a0850161190f565b6001600160a01b0381166111785760405163d92e233d60e01b815260040160405180910390fd5b61118860e0850160c0860161190f565b6001600160a01b0381166111af5760405163d92e233d60e01b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f811580156111f45750825b90505f8267ffffffffffffffff1660011480156112105750303b155b90508115801561121e575080155b1561123c5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561126657845460ff60401b1916600160401b1785555b61126e6117ff565b611276611809565b61128f5f61128a60a08d0160808e0161190f565b6116e5565b506112c47f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61128a60c08d0160a08e0161190f565b506112f97f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a61128a60e08d0160c08e0161190f565b5061131c5f80516020611de283398151915261128a6101008d0160e08e0161190f565b5061132d60608b0160408c0161190f565b600380546001600160a01b0319166001600160a01b03929092169190911790555f6113588b80611d94565b905090505f5b81811015611543575f6113718d80611d94565b8381811061138157611381611aa8565b9050602002016020810190611396919061190f565b90506001600160a01b0381166113bf5760405163d92e233d60e01b815260040160405180910390fd5b60016001600160a01b0382165f9081526001602052604090205460ff1660028111156113ed576113ed611999565b0361141657604051630234bb3360e31b81526001600160a01b03821660048201526024016105ae565b60035460405163551c457b60e11b81526001600160a01b0383811660048301529091169063aa388af690602401602060405180830381865afa15801561145e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114829190611c65565b6114aa5760405163508516b160e11b81526001600160a01b03821660048201526024016105ae565b5f8054600180820183557f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390910180546001600160a01b0319166001600160a01b0385169081179091556040805160208082018352848252928552918390529092208251815491929091839160ff199091169083600281111561152f5761152f611999565b0217905550506001909201915061135e9050565b5061155460408c0160208d0161190f565b600280546001600160a01b039290921661010002610100600160a81b031990921691909117905561158b60808c0160608d0161190f565b600480546001600160a01b0319166001600160a01b03929092169190911790555083156115f257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b7f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a61162881611662565b6002805460ff191690556040515f81527f31311016d7204faff81880133e3db244ae8a8b9ce15e83e2432258226d15f94290602001611085565b61166c8133611819565b50565b5f8054815b818110156116c057836001600160a01b03165f828154811061169857611698611aa8565b5f918252602090912001546001600160a01b0316036116b8579392505050565b600101611674565b5060405163067c787f60e41b81526001600160a01b03841660048201526024016105ae565b5f5f80516020611e028339815191526116fe8484610fe9565b61177d575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556117333390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506104f2565b5f9150506104f2565b5f5f80516020611e0283398151915261179f8484610fe9565b1561177d575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506104f2565b611807611856565b565b611811611856565b61180761189f565b6118238282610fe9565b6118525760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016105ae565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661180757604051631afcd79f60e31b815260040160405180910390fd5b6118a7611856565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f602082840312156118dd575f80fd5b81356001600160e01b0319811681146118f4575f80fd5b9392505050565b6001600160a01b038116811461166c575f80fd5b5f6020828403121561191f575f80fd5b81356118f4816118fb565b5f806040838503121561193b575f80fd5b8235611946816118fb565b946020939093013593505050565b5f60208284031215611964575f80fd5b5035919050565b5f806040838503121561197c575f80fd5b82359150602083013561198e816118fb565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b600381106119c957634e487b7160e01b5f52602160045260245ffd5b9052565b5f6020820190506104f28284516119ad565b602080825282518282018190525f9190848201906040850190845b81811015611a16578351835292840192918401916001016119fa565b50909695505050505050565b602080825282518282018190525f9190848201906040850190845b81811015611a165783516001600160a01b031683529284019291840191600101611a3d565b602081016104f282846119ad565b5f60208284031215611a80575f80fd5b813567ffffffffffffffff811115611a96575f80fd5b820161010081850312156118f4575f80fd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156104f2576104f2611abc565b5f60208284031215611af3575f80fd5b5051919050565b818103818111156104f2576104f2611abc565b634e487b7160e01b5f52603160045260245ffd5b5f60208284031215611b31575f80fd5b815160ff811681146118f4575f80fd5b80820281158282048414176104f2576104f2611abc565b5f82611b7257634e487b7160e01b5f52601260045260245ffd5b500490565b600181815b80851115611bb157815f1904821115611b9757611b97611abc565b80851615611ba457918102915b93841c9390800290611b7c565b509250929050565b5f82611bc7575060016104f2565b81611bd357505f6104f2565b8160018114611be95760028114611bf357611c0f565b60019150506104f2565b60ff841115611c0457611c04611abc565b50506001821b6104f2565b5060208310610133831016604e8410600b8410161715611c32575081810a6104f2565b611c3c8383611b77565b805f1904821115611c4f57611c4f611abc565b029392505050565b5f6118f460ff841683611bb9565b5f60208284031215611c75575f80fd5b815180151581146118f4575f80fd5b634e487b7160e01b5f52604160045260245ffd5b602080825282548282018190525f8481528281209092916040850190845b81811015611a165783546001600160a01b031683526001938401939285019201611cb6565b5f6020808385031215611cec575f80fd5b825167ffffffffffffffff80821115611d03575f80fd5b818501915085601f830112611d16575f80fd5b815181811115611d2857611d28611c84565b8060051b604051601f19603f83011681018181108582111715611d4d57611d4d611c84565b604052918252848201925083810185019188831115611d6a575f80fd5b938501935b82851015611d8857845184529385019392850192611d6f565b98975050505050505050565b5f808335601e19843603018112611da9575f80fd5b83018035915067ffffffffffffffff821115611dc3575f80fd5b6020019150600581901b3603821315611dda575f80fd5b925092905056feb1fadd3142ab2ad7f1337ea4d97112bcc8337fc11ce5b20cb04ad038adf9981902dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800a2646970667358221220b16929ce23726d77440c1713b2a8b4f4b2b8a6e49cf9a79d6aa14edb76c8bdc364736f6c63430008180033", + "nonce": "0x96", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xa006ce470e8c8d775255ad617303cede83aa069dbc6dd02fe5ca7805488f0587", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x323c933df2523d5b0c756210446eee0fb84270fd", + "function": null, + "arguments": [ + "0x84dA5aB890B0a3314deEd0BeBd2463309a755EAc", + "0xbB73f8a5B0074b27c6df026c77fA08B0111D017A", + "0x" + ], + "transaction": { + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "gas": "0xce728", + "value": "0x0", + "input": "0x60a060405260405162000e5038038062000e508339810160408190526200002691620003bc565b828162000034828262000099565b50508160405162000045906200035a565b6001600160a01b039091168152602001604051809103905ff0801580156200006f573d5f803e3d5ffd5b506001600160a01b0316608052620000906200008a60805190565b620000fe565b505050620004b3565b620000a4826200016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000f057620000eb8282620001ee565b505050565b620000fa62000267565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6200013f5f8051602062000e30833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16200016c8162000289565b50565b806001600160a01b03163b5f03620001aa57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516200020c919062000496565b5f60405180830381855af49150503d805f811462000246576040519150601f19603f3d011682016040523d82523d5f602084013e6200024b565b606091505b5090925090506200025e858383620002ca565b95945050505050565b3415620002875760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b038116620002b457604051633173bdd160e11b81525f6004820152602401620001a1565b805f8051602062000e30833981519152620001cd565b606082620002e357620002dd8262000330565b62000329565b8151158015620002fb57506001600160a01b0384163b155b156200032657604051639996b31560e01b81526001600160a01b0385166004820152602401620001a1565b50805b9392505050565b805115620003415780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6104fc806200093483390190565b80516001600160a01b03811681146200037f575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620003b45781810151838201526020016200039a565b50505f910152565b5f805f60608486031215620003cf575f80fd5b620003da8462000368565b9250620003ea6020850162000368565b60408501519092506001600160401b038082111562000407575f80fd5b818601915086601f8301126200041b575f80fd5b81518181111562000430576200043062000384565b604051601f8201601f19908116603f011681019083821181831017156200045b576200045b62000384565b8160405282815289602084870101111562000474575f80fd5b6200048783602083016020880162000398565b80955050505050509250925092565b5f8251620004a981846020870162000398565b9190910192915050565b608051610469620004cb5f395f601001526104695ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007a575f356001600160e01b03191663278f794360e11b14610070576040516334ad5dbb60e21b815260040160405180910390fd5b610078610082565b565b6100786100b0565b5f806100913660048184610303565b81019061009e919061033e565b915091506100ac82826100c0565b5050565b6100786100bb61011a565b610151565b6100c98261016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101125761010d82826101ea565b505050565b6100ac61025c565b5f61014c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e80801561016b573d5ff35b3d5ffd5b806001600160a01b03163b5f036101a957604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102069190610407565b5f60405180830381855af49150503d805f811461023e576040519150601f19603f3d011682016040523d82523d5f602084013e610243565b606091505b509150915061025385838361027b565b95945050505050565b34156100785760405163b398979f60e01b815260040160405180910390fd5b6060826102905761028b826102da565b6102d3565b81511580156102a757506001600160a01b0384163b155b156102d057604051639996b31560e01b81526001600160a01b03851660048201526024016101a0565b50805b9392505050565b8051156102ea5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610311575f80fd5b8386111561031d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561034f575f80fd5b82356001600160a01b0381168114610365575f80fd5b9150602083013567ffffffffffffffff80821115610381575f80fd5b818501915085601f830112610394575f80fd5b8135818111156103a6576103a661032a565b604051601f8201601f19908116603f011681019083821181831017156103ce576103ce61032a565b816040528281528860208487010111156103e6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610426576020818601810151858301520161040c565b505f92019182525091905056fea26469706673582212202bdadd4d90be9694cdd96b74937fb73e8cb3ab30807abea8aecf7c946f10f50364736f6c63430008180033608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea26469706673582212204852424075b6dea1d1527c7df075e3c174ec7222e99be5d8f0c28327860a53d964736f6c63430008180033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610300000000000000000000000084da5ab890b0a3314deed0bebd2463309a755eac000000000000000000000000bb73f8a5b0074b27c6df026c77fa08b0111d017a00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x97", + "chainId": "0x1" + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0xdf92be359fb53846ccdac8fff1884314533949c7", + "initCode": "0x608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea26469706673582212204852424075b6dea1d1527c7df075e3c174ec7222e99be5d8f0c28327860a53d964736f6c63430008180033000000000000000000000000bb73f8a5b0074b27c6df026c77fa08b0111d017a" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xab8f33792deef92facc6f61471fe9135c49e561f3e0fce4870ec37551020ca16", + "transactionType": "CALL", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x35ec69a77b79c255e5d47d5a3bdbefefe342630c", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": "0x35ec69a77b79c255e5d47d5a3bdbefefe342630c", + "gas": "0x686a7", + "value": "0x0", + "input": "0x8d252393000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000323c933df2523d5b0c756210446eee0fb84270fd00000000000000000000000092d904019a92b0cafce3492abb95577c285a68fc000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d6975000000000000000000000000a08f39d30dc865cc11a49b6e5cbd27630d6141c3000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d697500000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000235969656c644e6573742052657374616b6564204c5344202d20456967656e6c6179657200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006796e4c53446500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x98", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x837b92e5c2c222a4788552ff35a20602fc9e89c528ec5ae2a4fd1810178f525b", + "transactionType": "CALL", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x92d904019a92b0cafce3492abb95577c285a68fc", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": "0x92d904019a92b0cafce3492abb95577c285a68fc", + "gas": "0xa36f3", + "value": "0x0", + "input": "0xb9ceea0d000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000024000000000000000000000000035ec69a77b79c255e5d47d5a3bdbefefe342630c000000000000000000000000858646372cc42e1a627fce94aa7a7033e7cf075a00000000000000000000000039053d51b77dc0d36036fc1fcc8cb819df8ef37a0000000000000000000000006b566cb6cddf7d140c59f84594756a151030a0c3000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d69750000000000000000000000000573a7dafbc080064663623979287286bb65c1bd000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d6975000000000000000000000000a08f39d30dc865cc11a49b6e5cbd27630d6141c3000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d69750000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0000000000000000000000000dcee70654261af21c44c093c300ed3bb97b7819200000000000000000000000000000000000000000000000000000000000000040000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0000000000000000000000000ac3e018457b222d93114458476f3e3416abbe38f000000000000000000000000dcee70654261af21c44c093c300ed3bb97b78192000000000000000000000000d5f7838f5c461feff7fe49ea5ebaf7728bb0adfa000000000000000000000000000000000000000000000000000000000000000400000000000000000000000093c4b944d05dfe6df7645a86cd2206016c51564d0000000000000000000000008ca7a5d6f3acd3a7a8bc468a8cd0fb14b6bd28b6000000000000000000000000a4c637e0f704745d182e4d38cab7e7485321d059000000000000000000000000298afb19a105d59e74658c4c334ff360bade6dd2", + "nonce": "0x99", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xed94b56178ea20196288af91fca44ebb1942dedbb00c3cba39f242c3581c000d", + "transactionType": "CALL", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x323c933df2523d5b0c756210446eee0fb84270fd", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": "0x323c933df2523d5b0c756210446eee0fb84270fd", + "gas": "0x9e70b", + "value": "0x0", + "input": "0xefe0b29c00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000100000000000000000000000000b658cf6f4c232be5c6035f2b42b96393089f20d900000000000000000000000092d904019a92b0cafce3492abb95577c285a68fc00000000000000000000000035ec69a77b79c255e5d47d5a3bdbefefe342630c000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d6975000000000000000000000000a08f39d30dc865cc11a49b6e5cbd27630d6141c3000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d6975000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d697500000000000000000000000000000000000000000000000000000000000000040000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0000000000000000000000000ac3e018457b222d93114458476f3e3416abbe38f000000000000000000000000dcee70654261af21c44c093c300ed3bb97b78192000000000000000000000000d5f7838f5c461feff7fe49ea5ebaf7728bb0adfa", + "nonce": "0x9a", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xe0fccc6e24cb0d7fb7dd4125cc5ddae1c38770d6f3e8e14d987201aa43e9165d", + "transactionType": "CALL", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x6b566cb6cddf7d140c59f84594756a151030a0c3", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": "0x6b566cb6cddf7d140c59f84594756a151030a0c3", + "gas": "0x6b73e", + "value": "0x0", + "input": "0xf9645e74000000000000000000000000858646372cc42e1a627fce94aa7a7033e7cf075a00000000000000000000000039053d51b77dc0d36036fc1fcc8cb819df8ef37a00000000000000000000000092d904019a92b0cafce3492abb95577c285a68fc000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d000000000000000000000000a08f39d30dc865cc11a49b6e5cbd27630d6141c3000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d6975000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d6975000000000000000000000000a08f39d30dc865cc11a49b6e5cbd27630d6141c3000000000000000000000000df51b7843817f76220c0970ef58ba726630028ef", + "nonce": "0x9b", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x8c59d5cfd5948aa262c50a195ccdc309102b4ed199478af3f1bae9f4c7b5d4c5", + "transactionType": "CREATE", + "contractName": "TokenStakingNode", + "contractAddress": "0x57e1d090b1af526cd4174019d5b9702eebe236fa", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "gas": "0x155056", + "value": "0x0", + "input": "0x608060405234801561000f575f80fd5b5061001861001d565b6100cf565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161561006d5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100cc5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6111f9806100dc5f395ff3fe608060405234801561000f575f80fd5b5060043610610085575f3560e01c80637c0867af116100585780637c0867af146100ed57806392ab89bb146100ff578063b3c6501514610107578063b778bf7b14610128575f80fd5b8063139d7fed146100895780635c60da1b146100a55780635d21e3da146100c557806377b34927146100da575b5f80fd5b61009260015481565b6040519081526020015b60405180910390f35b6100ad61013b565b6040516001600160a01b03909116815260200161009c565b6100d86100d3366004610db7565b6101dd565b005b6100d86100e8366004610e92565b610380565b5f546100ad906001600160a01b031681565b6100d86104df565b61010f610684565b60405167ffffffffffffffff909116815260200161009c565b6100d8610136366004610f12565b6106bc565b5f8061016860017fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d51610fa5565b5f1b90505f815490505f819050806001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d59190610fc4565b935050505090565b5f5460405163ce8572d360e01b81523360048201526001600160a01b039091169063ce8572d390602401602060405180830381865afa158015610222573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102469190610fdf565b61026357604051636e10383f60e11b815260040160405180910390fd5b5f805f9054906101000a90046001600160a01b03166001600160a01b031663ea4d3c9b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102d79190610fc4565b60405163eea9064b60e01b81529091506001600160a01b0382169063eea9064b9061030a90879087908790600401611020565b5f604051808303815f87803b158015610321575f80fd5b505af1158015610333573d5f803e3d5ffd5b50505050836001600160a01b03167fa6ca69be1634c9486160d4fa9f11c9bf604a6a4b1fd23c8336ffc5889ef4b5ab8360405161037291815260200190565b60405180910390a250505050565b80516001600160a01b0381166103a95760405163d92e233d60e01b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f811580156103ee5750825b90505f8267ffffffffffffffff16600114801561040a5750303b155b905081158015610418575080155b156104365760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561046057845460ff60401b1916600160401b1785555b610468610966565b86515f80546001600160a01b0319166001600160a01b03909216919091179055602087015160015583156104d657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f5460405163ce8572d360e01b81523360048201526001600160a01b039091169063ce8572d390602401602060405180830381865afa158015610524573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105489190610fdf565b61056557604051636e10383f60e11b815260040160405180910390fd5b5f805f9054906101000a90046001600160a01b03166001600160a01b031663ea4d3c9b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105d99190610fc4565b6040516336a2fa1960e21b81523060048201529091505f906001600160a01b0383169063da8be864906024015f604051808303815f875af1158015610620573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610647919081019061107e565b90507fffbd194689c4814f1672a47eaea1dd48a269b4b60b24c6d991dfe771cae1396081604051610678919061111f565b60405180910390a15050565b5f6106b77ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005467ffffffffffffffff1690565b905090565b6106c4610978565b5f5460405163e6319b4160e01b81523360048201526001600160a01b039091169063e6319b4190602401602060405180830381865afa158015610709573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072d9190610fdf565b61074a576040516308e8994960e11b815260040160405180910390fd5b5f805f9054906101000a90046001600160a01b03166001600160a01b03166339b70e386040518163ffffffff1660e01b8152600401602060405180830381865afa15801561079a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107be9190610fc4565b9050855f5b81811015610932575f8989838181106107de576107de611162565b90506020020160208101906107f39190611176565b90505f88888481811061080857610808611162565b9050602002013590505f87878581811061082457610824611162565b90506020020160208101906108399190611176565b905061084f6001600160a01b03841687846109c2565b6040516373d0285560e11b81526001600160a01b0382811660048301528481166024830152604482018490525f919088169063e7a050aa906064016020604051808303815f875af11580156108a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ca9190611191565b9050816001600160a01b0316846001600160a01b03167f501f0f7b8b32b1cd5e7b146b296f6118bd16a0575a150d8d19505dfd54fcbfe6858460405161091a929190918252602082015260400190565b60405180910390a35050600190920191506107c39050565b50505061095e60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050505050565b61096e610aa1565b610976610aea565b565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016109bc57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610a138482610af2565b610a7557604080516001600160a01b03851660248201525f6044808301919091528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610a6b908590610b95565b610a758482610b95565b50505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661097657604051631afcd79f60e31b815260040160405180910390fd5b610a7b610aa1565b5f805f846001600160a01b031684604051610b0d91906111a8565b5f604051808303815f865af19150503d805f8114610b46576040519150601f19603f3d011682016040523d82523d5f602084013e610b4b565b606091505b5091509150818015610b75575080511580610b75575080806020019051810190610b759190610fdf565b8015610b8a57505f856001600160a01b03163b115b925050505b92915050565b5f610ba96001600160a01b03841683610c00565b905080515f14158015610bcd575080806020019051810190610bcb9190610fdf565b155b15610bfb57604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b505050565b6060610c0d83835f610c14565b9392505050565b606081471015610c395760405163cd78605960e01b8152306004820152602401610bf2565b5f80856001600160a01b03168486604051610c5491906111a8565b5f6040518083038185875af1925050503d805f8114610c8e576040519150601f19603f3d011682016040523d82523d5f602084013e610c93565b606091505b5091509150610ca3868383610cad565b9695505050505050565b606082610cc257610cbd82610d09565b610c0d565b8151158015610cd957506001600160a01b0384163b155b15610d0257604051639996b31560e01b81526001600160a01b0385166004820152602401610bf2565b5080610c0d565b805115610d195780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50565b6001600160a01b0381168114610d32575f80fd5b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715610d8057610d80610d49565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610daf57610daf610d49565b604052919050565b5f805f60608486031215610dc9575f80fd5b8335610dd481610d35565b925060208481013567ffffffffffffffff80821115610df1575f80fd5b9086019060408289031215610e04575f80fd5b610e0c610d5d565b823582811115610e1a575f80fd5b8301601f81018a13610e2a575f80fd5b803583811115610e3c57610e3c610d49565b610e4e601f8201601f19168701610d86565b93508084528a86828401011115610e63575f80fd5b80868301878601375f908401860152509081529082013591810191909152929592945050506040919091013590565b5f60408284031215610ea2575f80fd5b610eaa610d5d565b8235610eb581610d35565b81526020928301359281019290925250919050565b5f8083601f840112610eda575f80fd5b50813567ffffffffffffffff811115610ef1575f80fd5b6020830191508360208260051b8501011115610f0b575f80fd5b9250929050565b5f805f805f8060608789031215610f27575f80fd5b863567ffffffffffffffff80821115610f3e575f80fd5b610f4a8a838b01610eca565b90985096506020890135915080821115610f62575f80fd5b610f6e8a838b01610eca565b90965094506040890135915080821115610f86575f80fd5b50610f9389828a01610eca565b979a9699509497509295939492505050565b81810381811115610b8f57634e487b7160e01b5f52601160045260245ffd5b5f60208284031215610fd4575f80fd5b8151610c0d81610d35565b5f60208284031215610fef575f80fd5b81518015158114610c0d575f80fd5b5f5b83811015611018578181015183820152602001611000565b50505f910152565b60018060a01b0384168152606060208201525f83516040606084015280518060a08501526110558160c0860160208501610ffe565b60209590950151608084015250506040810191909152601f91909101601f19160160c001919050565b5f602080838503121561108f575f80fd5b825167ffffffffffffffff808211156110a6575f80fd5b818501915085601f8301126110b9575f80fd5b8151818111156110cb576110cb610d49565b8060051b91506110dc848301610d86565b81815291830184019184810190888411156110f5575f80fd5b938501935b83851015611113578451825293850193908501906110fa565b98975050505050505050565b602080825282518282018190525f9190848201906040850190845b818110156111565783518352928401929184019160010161113a565b50909695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611186575f80fd5b8135610c0d81610d35565b5f602082840312156111a1575f80fd5b5051919050565b5f82516111b9818460208701610ffe565b919091019291505056fea2646970667358221220ce42e4fcb8c81ac1c00790730d0a1dde9e185afb9d47e4bf0186bd302aa03fdb64736f6c63430008180033", + "nonce": "0x9c", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x6eaa56be76a8f628ec0ef67f0fffee003f63e7c07c17eb5d88582e7a90ec1da1", + "transactionType": "CALL", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x6b566cb6cddf7d140c59f84594756a151030a0c3", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": "0x6b566cb6cddf7d140c59f84594756a151030a0c3", + "gas": "0x59284", + "value": "0x0", + "input": "0x2d321fc700000000000000000000000057e1d090b1af526cd4174019d5b9702eebe236fa", + "nonce": "0x9d", + "chainId": "0x1" + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0x64bfbaa763a8cfa96b313378d515e4576e5126bd", + "initCode": "0x608060405234801561000f575f80fd5b5060405161042138038061042183398101604081905261002e9161015f565b806001600160a01b03811661005d57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61006681610077565b50610070826100c6565b5050610190565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b806001600160a01b03163b5f036100fb5760405163211eb15960e21b81526001600160a01b0382166004820152602401610054565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b80516001600160a01b038116811461015a575f80fd5b919050565b5f8060408385031215610170575f80fd5b61017983610144565b915061018760208401610144565b90509250929050565b6102848061019d5f395ff3fe608060405234801561000f575f80fd5b5060043610610055575f3560e01c80633659cfe6146100595780635c60da1b1461006e578063715018a6146100975780638da5cb5b1461009f578063f2fde38b146100af575b5f80fd5b61006c610067366004610221565b6100c2565b005b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b61006c6100d6565b5f546001600160a01b031661007b565b61006c6100bd366004610221565b6100e9565b6100ca610128565b6100d381610154565b50565b6100de610128565b6100e75f6101d2565b565b6100f1610128565b6001600160a01b03811661011f57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6100d3816101d2565b5f546001600160a01b031633146100e75760405163118cdaa760e01b8152336004820152602401610116565b806001600160a01b03163b5f036101895760405163211eb15960e21b81526001600160a01b0382166004820152602401610116565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610231575f80fd5b81356001600160a01b0381168114610247575f80fd5b939250505056fea264697066735822122024f3063d3bec545d5607dbb337dcdef322d9822da58bfe32422b791414a91c4b64736f6c6343000818003300000000000000000000000057e1d090b1af526cd4174019d5b9702eebe236fa0000000000000000000000006b566cb6cddf7d140c59f84594756a151030a0c3" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x28678c6d8d7ebc422fbdd262092352fd30c790d31ebb3f3ab0950f811b9280af", + "transactionType": "CALL", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x6b566cb6cddf7d140c59f84594756a151030a0c3", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": "0x6b566cb6cddf7d140c59f84594756a151030a0c3", + "gas": "0x12f4a", + "value": "0x0", + "input": "0x2f2ff15d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d6975", + "nonce": "0x9e", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x0fd580b863d3145f31ec9f18f4b79738944afc318d3eb1106490cd1031a709fb", + "transactionType": "CALL", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x6b566cb6cddf7d140c59f84594756a151030a0c3", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": "0x6b566cb6cddf7d140c59f84594756a151030a0c3", + "gas": "0x1315c", + "value": "0x0", + "input": "0x2f2ff15d24791c44c040514a5d2580696fc45e7d3cb6c9fa65bf3db2e4755362d6c155b5000000000000000000000000bb73f8a5b0074b27c6df026c77fa08b0111d017a", + "nonce": "0x9f", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x4cd13d9963d31a00d241de044cb646ec3495d5336f92289763e5ba0451a11df0", + "transactionType": "CREATE", + "contractName": "ynEigenDepositAdapter", + "contractAddress": "0x5f8c55a5a33d63caa231c668a62f69aa862020e9", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "gas": "0x14518c", + "value": "0x0", + "input": "0x608060405234801561000f575f80fd5b5061118a8061001d5f395ff3fe608060405234801561000f575f80fd5b50600436106100f0575f3560e01c806391d1485411610093578063c1fe3e4811610063578063c1fe3e48146101f5578063d547741f14610208578063daba667d1461021b578063f45346dc1461022e575f80fd5b806391d14854146101b65780639a2be4af146101c9578063a1d0362e146101db578063a217fddf146101ee575f80fd5b80632f2ff15d116100ce5780632f2ff15d1461015257806336568abe146101655780634aa07e64146101785780634e6c9766146101a3575f80fd5b806301ffc9a7146100f45780630415cc151461011c578063248a9ca314610131575b5f80fd5b610107610102366004610f19565b610241565b60405190151581526020015b60405180910390f35b61012f61012a366004610f54565b610277565b005b61014461013f366004610fe3565b61058d565b604051908152602001610113565b61012f610160366004610ffa565b6105ad565b61012f610173366004610ffa565b6105cf565b60015461018b906001600160a01b031681565b6040516001600160a01b039091168152602001610113565b60045461018b906001600160a01b031681565b6101076101c4366004610ffa565b610607565b5f5461018b906001600160a01b031681565b6101446101e9366004611028565b61063d565b6101445f81565b60035461018b906001600160a01b031681565b61012f610216366004610ffa565b61072e565b60025461018b906001600160a01b031681565b61014461023c366004611078565b61074a565b5f6001600160e01b03198216637965db0b60e01b148061027157506301ffc9a760e01b6001600160e01b03198316145b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f811580156102bc5750825b90505f8267ffffffffffffffff1660011480156102d85750303b155b9050811580156102e6575080155b156103045760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561032e57845460ff60401b1916600160401b1785555b85516001600160a01b0381166103575760405163d92e233d60e01b815260040160405180910390fd5b60208701516001600160a01b0381166103835760405163d92e233d60e01b815260040160405180910390fd5b60408801516001600160a01b0381166103af5760405163d92e233d60e01b815260040160405180910390fd5b60608901516001600160a01b0381166103db5760405163d92e233d60e01b815260040160405180910390fd5b6103e3610815565b6103f35f801b8b6060015161081f565b5089515f80546001600160a01b039283166001600160a01b0319918216179091556020808d015160018054918516918416821790556040808f01516002805491909616941693909317909355815163183fc7c960e31b8152915163c1fe3e489260048082019392918290030181865afa158015610472573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061049691906110b7565b600380546001600160a01b0319166001600160a01b03928316179055600254604080516338d52e0f60e01b8152905191909216916338d52e0f9160048083019260209291908290030181865afa1580156104f2573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061051691906110b7565b60045f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050505050831561058557845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f9081525f80516020611135833981519152602052604090206001015490565b6105b68261058d565b6105bf816108c0565b6105c9838361081f565b50505050565b6001600160a01b03811633146105f85760405163334bd91960e11b815260040160405180910390fd5b61060282826108cd565b505050565b5f9182525f80516020611135833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f6001600160a01b0383166106655760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03821661068c5760405163d92e233d60e01b815260040160405180910390fd5b826001600160a01b0316826001600160a01b0316036106be57604051632af47b8760e11b815260040160405180910390fd5b6106c985858561074a565b60408051338152602081018790529081018290524260608201529091506001600160a01b0380841691878216918616907f5ec2325bfdc6696fa381751bb5a9994c005f28fabd0b7dc55488f18ce1a85ef19060800160405180910390a4949350505050565b6107378261058d565b610740816108c0565b6105c983836108cd565b6003545f906001600160a01b03908116908516036107735761076c8383610946565b905061080e565b6004546001600160a01b03908116908516036107935761076c8383610a8e565b5f54604051633d14d1b760e21b81526001600160a01b0386811660048301526024820186905284811660448301529091169063f45346dc906064016020604051808303815f875af11580156107ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061076c91906110d2565b9392505050565b61081d610b98565b565b5f5f805160206111358339815191526108388484610607565b6108b7575f848152602082815260408083206001600160a01b03871684529091529020805460ff1916600117905561086d3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610271565b5f915050610271565b6108ca8133610be1565b50565b5f5f805160206111358339815191526108e68484610607565b156108b7575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610271565b6003545f90610960906001600160a01b0316333086610c23565b60015460035461097d916001600160a01b03918216911685610c8a565b600154604051630ea598cb60e41b8152600481018590525f916001600160a01b03169063ea598cb0906024016020604051808303815f875af11580156109c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e991906110d2565b5f54600154919250610a08916001600160a01b03908116911683610c8a565b5f54600154604051633d14d1b760e21b81526001600160a01b03918216600482015260248101849052858216604482015291169063f45346dc906064015b6020604051808303815f875af1158015610a62573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a8691906110d2565b949350505050565b6004545f90610aa8906001600160a01b0316333086610c23565b600254600454610ac5916001600160a01b03918216911685610c8a565b600254604051636e553f6560e01b8152600481018590523060248201525f916001600160a01b031690636e553f65906044016020604051808303815f875af1158015610b13573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3791906110d2565b5f54600254919250610b56916001600160a01b03908116911683610c8a565b5f54600254604051633d14d1b760e21b81526001600160a01b03918216600482015260248101849052858216604482015291169063f45346dc90606401610a46565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661081d57604051631afcd79f60e31b815260040160405180910390fd5b610beb8282610607565b610c1f5760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044015b60405180910390fd5b5050565b6040516001600160a01b0384811660248301528381166044830152606482018390526105c99186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050610d15565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610cdb8482610d76565b6105c9576040516001600160a01b0384811660248301525f6044830152610d0f91869182169063095ea7b390606401610c58565b6105c984825b5f610d296001600160a01b03841683610e17565b905080515f14158015610d4d575080806020019051810190610d4b91906110e9565b155b1561060257604051635274afe760e01b81526001600160a01b0384166004820152602401610c16565b5f805f846001600160a01b031684604051610d919190611108565b5f604051808303815f865af19150503d805f8114610dca576040519150601f19603f3d011682016040523d82523d5f602084013e610dcf565b606091505b5091509150818015610df9575080511580610df9575080806020019051810190610df991906110e9565b8015610e0e57505f856001600160a01b03163b115b95945050505050565b606061080e83835f845f80856001600160a01b03168486604051610e3b9190611108565b5f6040518083038185875af1925050503d805f8114610e75576040519150601f19603f3d011682016040523d82523d5f602084013e610e7a565b606091505b5091509150610e8a868383610e94565b9695505050505050565b606082610ea957610ea482610ef0565b61080e565b8151158015610ec057506001600160a01b0384163b155b15610ee957604051639996b31560e01b81526001600160a01b0385166004820152602401610c16565b508061080e565b805115610f005780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f60208284031215610f29575f80fd5b81356001600160e01b03198116811461080e575f80fd5b6001600160a01b03811681146108ca575f80fd5b5f60808284031215610f64575f80fd5b6040516080810181811067ffffffffffffffff82111715610f9357634e487b7160e01b5f52604160045260245ffd5b6040528235610fa181610f40565b81526020830135610fb181610f40565b60208201526040830135610fc481610f40565b60408201526060830135610fd781610f40565b60608201529392505050565b5f60208284031215610ff3575f80fd5b5035919050565b5f806040838503121561100b575f80fd5b82359150602083013561101d81610f40565b809150509250929050565b5f805f806080858703121561103b575f80fd5b843561104681610f40565b935060208501359250604085013561105d81610f40565b9150606085013561106d81610f40565b939692955090935050565b5f805f6060848603121561108a575f80fd5b833561109581610f40565b92506020840135915060408401356110ac81610f40565b809150509250925092565b5f602082840312156110c7575f80fd5b815161080e81610f40565b5f602082840312156110e2575f80fd5b5051919050565b5f602082840312156110f9575f80fd5b8151801515811461080e575f80fd5b5f82515f5b81811015611127576020818601810151858301520161110d565b505f92019182525091905056fe02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800a26469706673582212203f748a1dc010b19baac685660e23c200ed83df4e0812135cb8ccf16735e15ce364736f6c63430008180033", + "nonce": "0xa0", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x56095cf36fd141a6f3fbf7bcbb247bb4540ed8ade1716377fbba5f07c68d7cba", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x9e72155d301a6555dc565315be72d295c76753c0", + "function": null, + "arguments": [ + "0x5F8c55A5A33d63CAa231c668a62f69AA862020E9", + "0xbB73f8a5B0074b27c6df026c77fA08B0111D017A", + "0x" + ], + "transaction": { + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "gas": "0xce728", + "value": "0x0", + "input": "0x60a060405260405162000e5038038062000e508339810160408190526200002691620003bc565b828162000034828262000099565b50508160405162000045906200035a565b6001600160a01b039091168152602001604051809103905ff0801580156200006f573d5f803e3d5ffd5b506001600160a01b0316608052620000906200008a60805190565b620000fe565b505050620004b3565b620000a4826200016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000f057620000eb8282620001ee565b505050565b620000fa62000267565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6200013f5f8051602062000e30833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16200016c8162000289565b50565b806001600160a01b03163b5f03620001aa57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516200020c919062000496565b5f60405180830381855af49150503d805f811462000246576040519150601f19603f3d011682016040523d82523d5f602084013e6200024b565b606091505b5090925090506200025e858383620002ca565b95945050505050565b3415620002875760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b038116620002b457604051633173bdd160e11b81525f6004820152602401620001a1565b805f8051602062000e30833981519152620001cd565b606082620002e357620002dd8262000330565b62000329565b8151158015620002fb57506001600160a01b0384163b155b156200032657604051639996b31560e01b81526001600160a01b0385166004820152602401620001a1565b50805b9392505050565b805115620003415780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6104fc806200093483390190565b80516001600160a01b03811681146200037f575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620003b45781810151838201526020016200039a565b50505f910152565b5f805f60608486031215620003cf575f80fd5b620003da8462000368565b9250620003ea6020850162000368565b60408501519092506001600160401b038082111562000407575f80fd5b818601915086601f8301126200041b575f80fd5b81518181111562000430576200043062000384565b604051601f8201601f19908116603f011681019083821181831017156200045b576200045b62000384565b8160405282815289602084870101111562000474575f80fd5b6200048783602083016020880162000398565b80955050505050509250925092565b5f8251620004a981846020870162000398565b9190910192915050565b608051610469620004cb5f395f601001526104695ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007a575f356001600160e01b03191663278f794360e11b14610070576040516334ad5dbb60e21b815260040160405180910390fd5b610078610082565b565b6100786100b0565b5f806100913660048184610303565b81019061009e919061033e565b915091506100ac82826100c0565b5050565b6100786100bb61011a565b610151565b6100c98261016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101125761010d82826101ea565b505050565b6100ac61025c565b5f61014c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e80801561016b573d5ff35b3d5ffd5b806001600160a01b03163b5f036101a957604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102069190610407565b5f60405180830381855af49150503d805f811461023e576040519150601f19603f3d011682016040523d82523d5f602084013e610243565b606091505b509150915061025385838361027b565b95945050505050565b34156100785760405163b398979f60e01b815260040160405180910390fd5b6060826102905761028b826102da565b6102d3565b81511580156102a757506001600160a01b0384163b155b156102d057604051639996b31560e01b81526001600160a01b03851660048201526024016101a0565b50805b9392505050565b8051156102ea5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610311575f80fd5b8386111561031d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561034f575f80fd5b82356001600160a01b0381168114610365575f80fd5b9150602083013567ffffffffffffffff80821115610381575f80fd5b818501915085601f830112610394575f80fd5b8135818111156103a6576103a661032a565b604051601f8201601f19908116603f011681019083821181831017156103ce576103ce61032a565b816040528281528860208487010111156103e6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610426576020818601810151858301520161040c565b505f92019182525091905056fea26469706673582212202bdadd4d90be9694cdd96b74937fb73e8cb3ab30807abea8aecf7c946f10f50364736f6c63430008180033608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea26469706673582212204852424075b6dea1d1527c7df075e3c174ec7222e99be5d8f0c28327860a53d964736f6c63430008180033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000005f8c55a5a33d63caa231c668a62f69aa862020e9000000000000000000000000bb73f8a5b0074b27c6df026c77fa08b0111d017a00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0xa1", + "chainId": "0x1" + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0x7d779806b0c6a0201984b82e57830b84a75c3c07", + "initCode": "0x608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea26469706673582212204852424075b6dea1d1527c7df075e3c174ec7222e99be5d8f0c28327860a53d964736f6c63430008180033000000000000000000000000bb73f8a5b0074b27c6df026c77fa08b0111d017a" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xbaf02cccfbec1639f0d6fa4148168d6d7af26262b866f2b46ec9a08650060018", + "transactionType": "CALL", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x9e72155d301a6555dc565315be72d295c76753c0", + "function": null, + "arguments": null, + "transaction": { + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": "0x9e72155d301a6555dc565315be72d295c76753c0", + "gas": "0x44031", + "value": "0x0", + "input": "0x0415cc1500000000000000000000000035ec69a77b79c255e5d47d5a3bdbefefe342630c0000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0000000000000000000000000dcee70654261af21c44c093c300ed3bb97b78192000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d6975", + "nonce": "0xa2", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xb0cbaeebb127e2275f3c2a6fa37270a5d376ecbe4d7923dc8a4e44714af18c92", + "transactionType": "CREATE", + "contractName": "ynEigenViewer", + "contractAddress": "0x95046553147036da98aecc02b2526fcbc36f4306", + "function": null, + "arguments": [ + "0x323C933df2523D5b0C756210446eeE0fB84270fd", + "0x35Ec69A77B79c255e5d47D5A3BdbEFEfE342630c", + "0x6B566CB6cDdf7d140C59F84594756a151030a0C3", + "0xb658Cf6F4C232Be5c6035f2b42b96393089F20D9" + ], + "transaction": { + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "gas": "0x1417ab", + "value": "0x0", + "input": "0x61010060405234801562000011575f80fd5b506040516200129e3803806200129e833981016040819052620000349162000073565b6001600160a01b0393841660805291831660a052821660c0521660e052620000cd565b80516001600160a01b03811681146200006e575f80fd5b919050565b5f805f806080858703121562000087575f80fd5b620000928562000057565b9350620000a26020860162000057565b9250620000b26040860162000057565b9150620000c26060860162000057565b905092959194509250565b60805160a05160c05160e0516111516200014d5f395f61015d01525f8181610136015261066b01525f818160ef015281816102da015281816103b0015281816106f4015281816107770152818161083f01528181610af601528181610c190152610c7001525f8181610184015281816101cd015261036701526111515ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c80637c0867af116100635780637c0867af14610131578063949db65814610158578063979d7e861461017f5780639d8e2177146101a6578063b8f82b26146101b5575f80fd5b8063075c2b191461009f5780632e0f2625146100bd5780633ff36802146100d557806363f7bad5146100ea578063679aefce14610129575b5f80fd5b6100a76101c8565b6040516100b49190610d34565b60405180910390f35b6100c7620f424081565b6040519081526020016100b4565b6100dd610667565b6040516100b49190610de4565b6101117f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100b4565b6100c76106f0565b6101117f000000000000000000000000000000000000000000000000000000000000000081565b6101117f000000000000000000000000000000000000000000000000000000000000000081565b6101117f000000000000000000000000000000000000000000000000000000000000000081565b6100c7670de0b6b3a764000081565b6100c76101c3366004610e47565b61083b565b60605f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166367e4ac2c6040518163ffffffff1660e01b81526004015f60405180830381865afa158015610226573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261024d9190810190610ed9565b80519091508067ffffffffffffffff81111561026b5761026b610e71565b6040519080825280602002602001820160405280156102d457816020015b6102c16040518060a001604052805f6001600160a01b0316815260200160608152602001606081526020015f81526020015f81525090565b8152602001906001900390816102895790505b5092505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa158015610334573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103589190610f73565b90505f5b82811015610660575f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631cbf960d8684815181106103a6576103a6610f8a565b60200260200101517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663cd88e5588987815181106103ef576103ef610f8a565b60200260200101516040518263ffffffff1660e01b815260040161042291906001600160a01b0391909116815260200190565b602060405180830381865afa15801561043d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104619190610f73565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa1580156104a8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104cc9190610f73565b90506040518060a001604052808684815181106104eb576104eb610f8a565b60200260200101516001600160a01b0316815260200186848151811061051357610513610f8a565b60200260200101516001600160a01b03166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa158015610555573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261057c9190810190610f9e565b815260200186848151811061059357610593610f8a565b60200260200101516001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa1580156105d5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105fc9190810190610f9e565b81526020015f8311801561060f57505f85115b610619575f610631565b84610627620f42408561102d565b6106319190611050565b81526020018281525086838151811061064c5761064c610f8a565b60209081029190910101525060010161035c565b5050505090565b60607f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a1174e7d6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156106c4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106eb919081019061106f565b905090565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561074e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107729190610f73565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107d1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f59190610f73565b9050811580610802575080155b1561081757670de0b6b3a76400009250505090565b8161082a82670de0b6b3a764000061102d565b6108349190611050565b9250505090565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166352f94f986040518163ffffffff1660e01b8152600401602060405180830381865afa158015610899573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108bd91906110f9565b90505f816001600160a01b0316634e6c97666040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108fc573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061092091906110f9565b90505f826001600160a01b031663c1fe3e486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561095f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061098391906110f9565b90505f836001600160a01b031663daba667d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e691906110f9565b90505f846001600160a01b0316634aa07e646040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a25573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4991906110f9565b9050836001600160a01b0316886001600160a01b031603610b6f576040516363737ac960e11b8152600481018890525f906001600160a01b0384169063c6e6f59290602401602060405180830381865afa158015610aa9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610acd9190610f73565b604051635c7c159360e11b81526001600160a01b038581166004830152602482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063b8f82b26906044015b602060405180830381865afa158015610b3e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b629190610f73565b9650505050505050610ce1565b826001600160a01b0316886001600160a01b031603610c4a5760405162b0e38960e81b8152600481018890525f906001600160a01b0383169063b0e3890090602401602060405180830381865afa158015610bcc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf09190610f73565b604051635c7c159360e11b81526001600160a01b038481166004830152602482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063b8f82b2690604401610b23565b604051635c7c159360e11b81526001600160a01b038981166004830152602482018990527f0000000000000000000000000000000000000000000000000000000000000000169063b8f82b2690604401602060405180830381865afa158015610cb5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cd99190610f73565b955050505050505b92915050565b5f5b83811015610d01578181015183820152602001610ce9565b50505f910152565b5f8151808452610d20816020860160208601610ce7565b601f01601f19169290920160200192915050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b83811015610dd657888303603f19018552815180516001600160a01b031684528781015160a089860181905290610d9482870182610d09565b9150508782015185820389870152610dac8282610d09565b60608481015190880152608093840151939096019290925250509386019390860190600101610d5b565b509098975050505050505050565b602080825282518282018190525f9190848201906040850190845b81811015610e245783516001600160a01b031683529284019291840191600101610dff565b50909695505050505050565b6001600160a01b0381168114610e44575f80fd5b50565b5f8060408385031215610e58575f80fd5b8235610e6381610e30565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610eae57610eae610e71565b604052919050565b5f67ffffffffffffffff821115610ecf57610ecf610e71565b5060051b60200190565b5f6020808385031215610eea575f80fd5b825167ffffffffffffffff811115610f00575f80fd5b8301601f81018513610f10575f80fd5b8051610f23610f1e82610eb6565b610e85565b81815260059190911b82018301908381019087831115610f41575f80fd5b928401925b82841015610f68578351610f5981610e30565b82529284019290840190610f46565b979650505050505050565b5f60208284031215610f83575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610fae575f80fd5b815167ffffffffffffffff80821115610fc5575f80fd5b818401915084601f830112610fd8575f80fd5b815181811115610fea57610fea610e71565b610ffd601f8201601f1916602001610e85565b9150808252856020828501011115611013575f80fd5b611024816020840160208601610ce7565b50949350505050565b8082028115828204841417610ce157634e487b7160e01b5f52601160045260245ffd5b5f8261106a57634e487b7160e01b5f52601260045260245ffd5b500490565b5f6020808385031215611080575f80fd5b825167ffffffffffffffff811115611096575f80fd5b8301601f810185136110a6575f80fd5b80516110b4610f1e82610eb6565b81815260059190911b820183019083810190878311156110d2575f80fd5b928401925b82841015610f685783516110ea81610e30565b825292840192908401906110d7565b5f60208284031215611109575f80fd5b815161111481610e30565b939250505056fea26469706673582212206522a30666c5a46c623b3de5b690b575abea162dfd94cbeabdff4d619491165864736f6c63430008180033000000000000000000000000323c933df2523d5b0c756210446eee0fb84270fd00000000000000000000000035ec69a77b79c255e5d47d5a3bdbefefe342630c0000000000000000000000006b566cb6cddf7d140c59f84594756a151030a0c3000000000000000000000000b658cf6f4c232be5c6035f2b42b96393089f20d9", + "nonce": "0xa3", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xdd09f28eee2dc81bd7cef8e5aaba699b7868d6fa92544e8baad8651abd5cfacf", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x9b933d84fac0782f3b275d76b64a0dbf6fbef28f", + "function": null, + "arguments": [ + "0x95046553147036dA98Aecc02B2526FCBc36F4306", + "0xfcad670592a3b24869C0b51a6c6FDED4F95D6975", + "0x" + ], + "transaction": { + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "gas": "0xce728", + "value": "0x0", + "input": "0x60a060405260405162000e5038038062000e508339810160408190526200002691620003bc565b828162000034828262000099565b50508160405162000045906200035a565b6001600160a01b039091168152602001604051809103905ff0801580156200006f573d5f803e3d5ffd5b506001600160a01b0316608052620000906200008a60805190565b620000fe565b505050620004b3565b620000a4826200016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000f057620000eb8282620001ee565b505050565b620000fa62000267565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6200013f5f8051602062000e30833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16200016c8162000289565b50565b806001600160a01b03163b5f03620001aa57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516200020c919062000496565b5f60405180830381855af49150503d805f811462000246576040519150601f19603f3d011682016040523d82523d5f602084013e6200024b565b606091505b5090925090506200025e858383620002ca565b95945050505050565b3415620002875760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b038116620002b457604051633173bdd160e11b81525f6004820152602401620001a1565b805f8051602062000e30833981519152620001cd565b606082620002e357620002dd8262000330565b62000329565b8151158015620002fb57506001600160a01b0384163b155b156200032657604051639996b31560e01b81526001600160a01b0385166004820152602401620001a1565b50805b9392505050565b805115620003415780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6104fc806200093483390190565b80516001600160a01b03811681146200037f575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620003b45781810151838201526020016200039a565b50505f910152565b5f805f60608486031215620003cf575f80fd5b620003da8462000368565b9250620003ea6020850162000368565b60408501519092506001600160401b038082111562000407575f80fd5b818601915086601f8301126200041b575f80fd5b81518181111562000430576200043062000384565b604051601f8201601f19908116603f011681019083821181831017156200045b576200045b62000384565b8160405282815289602084870101111562000474575f80fd5b6200048783602083016020880162000398565b80955050505050509250925092565b5f8251620004a981846020870162000398565b9190910192915050565b608051610469620004cb5f395f601001526104695ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007a575f356001600160e01b03191663278f794360e11b14610070576040516334ad5dbb60e21b815260040160405180910390fd5b610078610082565b565b6100786100b0565b5f806100913660048184610303565b81019061009e919061033e565b915091506100ac82826100c0565b5050565b6100786100bb61011a565b610151565b6100c98261016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101125761010d82826101ea565b505050565b6100ac61025c565b5f61014c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e80801561016b573d5ff35b3d5ffd5b806001600160a01b03163b5f036101a957604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102069190610407565b5f60405180830381855af49150503d805f811461023e576040519150601f19603f3d011682016040523d82523d5f602084013e610243565b606091505b509150915061025385838361027b565b95945050505050565b34156100785760405163b398979f60e01b815260040160405180910390fd5b6060826102905761028b826102da565b6102d3565b81511580156102a757506001600160a01b0384163b155b156102d057604051639996b31560e01b81526001600160a01b03851660048201526024016101a0565b50805b9392505050565b8051156102ea5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610311575f80fd5b8386111561031d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561034f575f80fd5b82356001600160a01b0381168114610365575f80fd5b9150602083013567ffffffffffffffff80821115610381575f80fd5b818501915085601f830112610394575f80fd5b8135818111156103a6576103a661032a565b604051601f8201601f19908116603f011681019083821181831017156103ce576103ce61032a565b816040528281528860208487010111156103e6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610426576020818601810151858301520161040c565b505f92019182525091905056fea26469706673582212202bdadd4d90be9694cdd96b74937fb73e8cb3ab30807abea8aecf7c946f10f50364736f6c63430008180033608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea26469706673582212204852424075b6dea1d1527c7df075e3c174ec7222e99be5d8f0c28327860a53d964736f6c63430008180033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610300000000000000000000000095046553147036da98aecc02b2526fcbc36f4306000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d697500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0xa4", + "chainId": "0x1" + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0x40fbdd124e80ff168574fa7823440e574345307e", + "initCode": "0x608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea26469706673582212204852424075b6dea1d1527c7df075e3c174ec7222e99be5d8f0c28327860a53d964736f6c63430008180033000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d6975" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x1a62baf", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0xf0712dba18ecfd0c72fccc0556b6dd7301259f1aefcf3bf891f1f0e33a8a790c", + "transactionIndex": "0x1c", + "blockHash": "0x37822d0e3ee88124d228a53f46b1164a70b54e68f512b5318fb51132228ca09c", + "blockNumber": "0x1397abd", + "gasUsed": "0x218fd5", + "effectiveGasPrice": "0x343b7660", + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": null, + "contractAddress": "0xaa5ea91ad3bf55fc8daa013eeb95cd4d67307d02" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x143bdbb", + "logs": [ + { + "address": "0xbb73f8a5b0074b27c6df026c77fa08b0111d017a", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000bb73f8a5b0074b27c6df026c77fa08b0111d017a", + "0x000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d" + ], + "data": "0x", + "blockHash": "0x36a6ec9e7ce8a16f5195230da8ec32a353782bcd9083321b5d53a6cf49827fb5", + "blockNumber": "0x1397ac2", + "transactionHash": "0x0fbed8a55e718c0786c396297e47dd60e4b17434c1853b94d96f80cc2b449773", + "transactionIndex": "0xa8", + "logIndex": "0x1b4", + "removed": false + }, + { + "address": "0xbb73f8a5b0074b27c6df026c77fa08b0111d017a", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d6975", + "0x000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d" + ], + "data": "0x", + "blockHash": "0x36a6ec9e7ce8a16f5195230da8ec32a353782bcd9083321b5d53a6cf49827fb5", + "blockNumber": "0x1397ac2", + "transactionHash": "0x0fbed8a55e718c0786c396297e47dd60e4b17434c1853b94d96f80cc2b449773", + "transactionIndex": "0xa8", + "logIndex": "0x1b5", + "removed": false + }, + { + "address": "0xbb73f8a5b0074b27c6df026c77fa08b0111d017a", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1", + "0x000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d6975", + "0x000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d" + ], + "data": "0x", + "blockHash": "0x36a6ec9e7ce8a16f5195230da8ec32a353782bcd9083321b5d53a6cf49827fb5", + "blockNumber": "0x1397ac2", + "transactionHash": "0x0fbed8a55e718c0786c396297e47dd60e4b17434c1853b94d96f80cc2b449773", + "transactionIndex": "0xa8", + "logIndex": "0x1b6", + "removed": false + }, + { + "address": "0xbb73f8a5b0074b27c6df026c77fa08b0111d017a", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783", + "0x000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d6975", + "0x000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d" + ], + "data": "0x", + "blockHash": "0x36a6ec9e7ce8a16f5195230da8ec32a353782bcd9083321b5d53a6cf49827fb5", + "blockNumber": "0x1397ac2", + "transactionHash": "0x0fbed8a55e718c0786c396297e47dd60e4b17434c1853b94d96f80cc2b449773", + "transactionIndex": "0xa8", + "logIndex": "0x1b7", + "removed": false + }, + { + "address": "0xbb73f8a5b0074b27c6df026c77fa08b0111d017a", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63", + "0x000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d6975", + "0x000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d" + ], + "data": "0x", + "blockHash": "0x36a6ec9e7ce8a16f5195230da8ec32a353782bcd9083321b5d53a6cf49827fb5", + "blockNumber": "0x1397ac2", + "transactionHash": "0x0fbed8a55e718c0786c396297e47dd60e4b17434c1853b94d96f80cc2b449773", + "transactionIndex": "0xa8", + "logIndex": "0x1b8", + "removed": false + }, + { + "address": "0xbb73f8a5b0074b27c6df026c77fa08b0111d017a", + "topics": [ + "0x11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f480", + "blockHash": "0x36a6ec9e7ce8a16f5195230da8ec32a353782bcd9083321b5d53a6cf49827fb5", + "blockNumber": "0x1397ac2", + "transactionHash": "0x0fbed8a55e718c0786c396297e47dd60e4b17434c1853b94d96f80cc2b449773", + "transactionIndex": "0xa8", + "logIndex": "0x1b9", + "removed": false + } + ], + "logsBloom": "0x00000004000000000000000000000000020000000000000000000000000000000000000000000000000000000001000000000000000000000200000010200000000000000000000000008010000000000000000000000008000000000000000800000000020000000000000000000800000000000000000000020000100000000000000000000000000000080000000000000000000000080000000000000000004000000020000000000000000000000000000000000000001000200000000000000000040000004000000000000000000000000000000100000100200020000000120000000000000000000000000000000000000000000000020000000000", + "type": "0x0", + "transactionHash": "0x0fbed8a55e718c0786c396297e47dd60e4b17434c1853b94d96f80cc2b449773", + "transactionIndex": "0xa8", + "blockHash": "0x36a6ec9e7ce8a16f5195230da8ec32a353782bcd9083321b5d53a6cf49827fb5", + "blockNumber": "0x1397ac2", + "gasUsed": "0x18e27d", + "effectiveGasPrice": "0x343b7660", + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": null, + "contractAddress": "0xbb73f8a5b0074b27c6df026c77fa08b0111d017a" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1656b03", + "logs": [ + { + "address": "0x143a5c73bfc78842a95705db242774fc7fa5c3b3", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0x36a6ec9e7ce8a16f5195230da8ec32a353782bcd9083321b5d53a6cf49827fb5", + "blockNumber": "0x1397ac2", + "transactionHash": "0x69c6e2fb3fc25e43ce44153779d0a576e353932142c26a951972a58707b6358e", + "transactionIndex": "0xa9", + "logIndex": "0x1ba", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000001000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x69c6e2fb3fc25e43ce44153779d0a576e353932142c26a951972a58707b6358e", + "transactionIndex": "0xa9", + "blockHash": "0x36a6ec9e7ce8a16f5195230da8ec32a353782bcd9083321b5d53a6cf49827fb5", + "blockNumber": "0x1397ac2", + "gasUsed": "0x21ad48", + "effectiveGasPrice": "0x343b7660", + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": null, + "contractAddress": "0x143a5c73bfc78842a95705db242774fc7fa5c3b3" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x16fa9ef", + "logs": [ + { + "address": "0x35ec69a77b79c255e5d47d5a3bdbefefe342630c", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000143a5c73bfc78842a95705db242774fc7fa5c3b3" + ], + "data": "0x", + "blockHash": "0x36a6ec9e7ce8a16f5195230da8ec32a353782bcd9083321b5d53a6cf49827fb5", + "blockNumber": "0x1397ac2", + "transactionHash": "0x92ab2639a0778892415a4a217b9edfbc145130455f233ce9c4368c05384067cb", + "transactionIndex": "0xab", + "logIndex": "0x1bb", + "removed": false + }, + { + "address": "0x1bff798a6072597c401f7c83a6a1096ae5f0aff7", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000bb73f8a5b0074b27c6df026c77fa08b0111d017a" + ], + "data": "0x", + "blockHash": "0x36a6ec9e7ce8a16f5195230da8ec32a353782bcd9083321b5d53a6cf49827fb5", + "blockNumber": "0x1397ac2", + "transactionHash": "0x92ab2639a0778892415a4a217b9edfbc145130455f233ce9c4368c05384067cb", + "transactionIndex": "0xab", + "logIndex": "0x1bc", + "removed": false + }, + { + "address": "0x35ec69a77b79c255e5d47d5a3bdbefefe342630c", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001bff798a6072597c401f7c83a6a1096ae5f0aff7", + "blockHash": "0x36a6ec9e7ce8a16f5195230da8ec32a353782bcd9083321b5d53a6cf49827fb5", + "blockNumber": "0x1397ac2", + "transactionHash": "0x92ab2639a0778892415a4a217b9edfbc145130455f233ce9c4368c05384067cb", + "transactionIndex": "0xab", + "logIndex": "0x1bd", + "removed": false + } + ], + "logsBloom": "0x00082000000000000000000000000000400000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008002000001000000000000000000000000000000000000020000000000000000000800000000800000000000000000100000400000000000000000000000000000200000000000000000002000000000800000004000000000000000000000000000000000000000000000000000200000000000004020000000000000000000000000000000000400000000000000000020000000000000001000000040000008000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x92ab2639a0778892415a4a217b9edfbc145130455f233ce9c4368c05384067cb", + "transactionIndex": "0xab", + "blockHash": "0x36a6ec9e7ce8a16f5195230da8ec32a353782bcd9083321b5d53a6cf49827fb5", + "blockNumber": "0x1397ac2", + "gasUsed": "0x9ece4", + "effectiveGasPrice": "0x343b7660", + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": null, + "contractAddress": "0x35ec69a77b79c255e5d47d5a3bdbefefe342630c" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x175bc16", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x1a1f7111c5c827287598693aab2e6448a5b37bbe5bee5436e524d67e6d315a94", + "transactionIndex": "0xac", + "blockHash": "0x36a6ec9e7ce8a16f5195230da8ec32a353782bcd9083321b5d53a6cf49827fb5", + "blockNumber": "0x1397ac2", + "gasUsed": "0x61227", + "effectiveGasPrice": "0x343b7660", + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": null, + "contractAddress": "0xaedc83f607126b4d2437f79285e2c635685bba01" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x17fa8fa", + "logs": [ + { + "address": "0xb658cf6f4c232be5c6035f2b42b96393089f20d9", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000aedc83f607126b4d2437f79285e2c635685bba01" + ], + "data": "0x", + "blockHash": "0x36a6ec9e7ce8a16f5195230da8ec32a353782bcd9083321b5d53a6cf49827fb5", + "blockNumber": "0x1397ac2", + "transactionHash": "0x1fc233970a6b03c4ea2045e925b0d2ffed9467a12bc79507d6e7a7af066735e6", + "transactionIndex": "0xad", + "logIndex": "0x1be", + "removed": false + }, + { + "address": "0x16c95825fad0ce0dd56698bc8ab49e7b00fa29d9", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000bb73f8a5b0074b27c6df026c77fa08b0111d017a" + ], + "data": "0x", + "blockHash": "0x36a6ec9e7ce8a16f5195230da8ec32a353782bcd9083321b5d53a6cf49827fb5", + "blockNumber": "0x1397ac2", + "transactionHash": "0x1fc233970a6b03c4ea2045e925b0d2ffed9467a12bc79507d6e7a7af066735e6", + "transactionIndex": "0xad", + "logIndex": "0x1bf", + "removed": false + }, + { + "address": "0xb658cf6f4c232be5c6035f2b42b96393089f20d9", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016c95825fad0ce0dd56698bc8ab49e7b00fa29d9", + "blockHash": "0x36a6ec9e7ce8a16f5195230da8ec32a353782bcd9083321b5d53a6cf49827fb5", + "blockNumber": "0x1397ac2", + "transactionHash": "0x1fc233970a6b03c4ea2045e925b0d2ffed9467a12bc79507d6e7a7af066735e6", + "transactionIndex": "0xad", + "logIndex": "0x1c0", + "removed": false + } + ], + "logsBloom": "0x00008000000000000000000000000000400800000000000000800000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000002000001000410000000000000000000000000000000020000000000000000000800000000800000000000000000100000400000000000000000000000000000000000000000000000000000000000800000004000080000000000000000000000000004000004000000000000200000000000000020000000000000000000000000000000000400000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x1fc233970a6b03c4ea2045e925b0d2ffed9467a12bc79507d6e7a7af066735e6", + "transactionIndex": "0xad", + "blockHash": "0x36a6ec9e7ce8a16f5195230da8ec32a353782bcd9083321b5d53a6cf49827fb5", + "blockNumber": "0x1397ac2", + "gasUsed": "0x9ece4", + "effectiveGasPrice": "0x343b7660", + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": null, + "contractAddress": "0xb658cf6f4c232be5c6035f2b42b96393089f20d9" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x19fd255", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x310265520ae709f84cd07cc5f080a4a02bafd58e49079b944723881e5efd9b9b", + "transactionIndex": "0xae", + "blockHash": "0x36a6ec9e7ce8a16f5195230da8ec32a353782bcd9083321b5d53a6cf49827fb5", + "blockNumber": "0x1397ac2", + "gasUsed": "0x20295b", + "effectiveGasPrice": "0x343b7660", + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": null, + "contractAddress": "0xe2343a850394ee1b1e33b16da5bd73b076d6fa81" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1a9bf39", + "logs": [ + { + "address": "0x92d904019a92b0cafce3492abb95577c285a68fc", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000e2343a850394ee1b1e33b16da5bd73b076d6fa81" + ], + "data": "0x", + "blockHash": "0x36a6ec9e7ce8a16f5195230da8ec32a353782bcd9083321b5d53a6cf49827fb5", + "blockNumber": "0x1397ac2", + "transactionHash": "0x48bd0c68992e37d973267c1a62275d077999384b331de5658a00b00f7560f3fb", + "transactionIndex": "0xaf", + "logIndex": "0x1c1", + "removed": false + }, + { + "address": "0x69c34fb00ebc0d7ac09ab7968d2eb9a07c2eb301", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000bb73f8a5b0074b27c6df026c77fa08b0111d017a" + ], + "data": "0x", + "blockHash": "0x36a6ec9e7ce8a16f5195230da8ec32a353782bcd9083321b5d53a6cf49827fb5", + "blockNumber": "0x1397ac2", + "transactionHash": "0x48bd0c68992e37d973267c1a62275d077999384b331de5658a00b00f7560f3fb", + "transactionIndex": "0xaf", + "logIndex": "0x1c2", + "removed": false + }, + { + "address": "0x92d904019a92b0cafce3492abb95577c285a68fc", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069c34fb00ebc0d7ac09ab7968d2eb9a07c2eb301", + "blockHash": "0x36a6ec9e7ce8a16f5195230da8ec32a353782bcd9083321b5d53a6cf49827fb5", + "blockNumber": "0x1397ac2", + "transactionHash": "0x48bd0c68992e37d973267c1a62275d077999384b331de5658a00b00f7560f3fb", + "transactionIndex": "0xaf", + "logIndex": "0x1c3", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000402000000000000100800004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000001000000000000000000000000000000000000060000000000001000000800000000800000000000000000100000400000000000000000000000000000000000000000000000000000000000800000004000000000000000000000000000000000000000000000000000200000000000000020000000000000000000000000000000004400000400000000000020000000000000000000000000000000000000000000000000000000040800000000", + "type": "0x0", + "transactionHash": "0x48bd0c68992e37d973267c1a62275d077999384b331de5658a00b00f7560f3fb", + "transactionIndex": "0xaf", + "blockHash": "0x36a6ec9e7ce8a16f5195230da8ec32a353782bcd9083321b5d53a6cf49827fb5", + "blockNumber": "0x1397ac2", + "gasUsed": "0x9ece4", + "effectiveGasPrice": "0x343b7660", + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": null, + "contractAddress": "0x92d904019a92b0cafce3492abb95577c285a68fc" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xb973bf", + "logs": [ + { + "address": "0x17e77f964538fed3adec3e8dbb6147da258206da", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0xbb8e954738175a8d942b2990220e9cedef03c18064e8c0c8707f604119ccb9bb", + "transactionIndex": "0x71", + "logIndex": "0x14a", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000800000000000000000000400000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0xbb8e954738175a8d942b2990220e9cedef03c18064e8c0c8707f604119ccb9bb", + "transactionIndex": "0x71", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "gasUsed": "0x1b7d51", + "effectiveGasPrice": "0x343b7660", + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": null, + "contractAddress": "0x17e77f964538fed3adec3e8dbb6147da258206da" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1833918", + "logs": [ + { + "address": "0x6b566cb6cddf7d140c59f84594756a151030a0c3", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x00000000000000000000000017e77f964538fed3adec3e8dbb6147da258206da" + ], + "data": "0x", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0x26d21ebbab7cf280edd83f7ef139380a50a45bc0abcb819bd2d08788d0f13f58", + "transactionIndex": "0x105", + "logIndex": "0x290", + "removed": false + }, + { + "address": "0x850d012115fb4d90711f53e86b2945019bf7f36c", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000bb73f8a5b0074b27c6df026c77fa08b0111d017a" + ], + "data": "0x", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0x26d21ebbab7cf280edd83f7ef139380a50a45bc0abcb819bd2d08788d0f13f58", + "transactionIndex": "0x105", + "logIndex": "0x291", + "removed": false + }, + { + "address": "0x6b566cb6cddf7d140c59f84594756a151030a0c3", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000850d012115fb4d90711f53e86b2945019bf7f36c", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0x26d21ebbab7cf280edd83f7ef139380a50a45bc0abcb819bd2d08788d0f13f58", + "transactionIndex": "0x105", + "logIndex": "0x292", + "removed": false + } + ], + "logsBloom": "0x00000008000000000000000000000000400000000000000000800000000000000000800000000000000000000000000000000000000000200000000000000000000000000000000000000000000002000001000000000000000000000000000000000000020000000000000000000800000000800000000000000000100000400000000000000000000000080000000010000000000000000000000000800000004000000000000001000000000000000000000000000000000000200040000000000020000000000000000000000000000000000400000000000000000020000000000000200008000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x26d21ebbab7cf280edd83f7ef139380a50a45bc0abcb819bd2d08788d0f13f58", + "transactionIndex": "0x105", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "gasUsed": "0x9ece4", + "effectiveGasPrice": "0x343b7660", + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": null, + "contractAddress": "0x6b566cb6cddf7d140c59f84594756a151030a0c3" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x19e11a2", + "logs": [ + { + "address": "0x84da5ab890b0a3314deed0bebd2463309a755eac", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0x25e972c3c81dfd1335e61bc387d22818f6a762c86f4cc212facb298a7fd58e09", + "transactionIndex": "0x106", + "logIndex": "0x293", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000200000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x25e972c3c81dfd1335e61bc387d22818f6a762c86f4cc212facb298a7fd58e09", + "transactionIndex": "0x106", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "gasUsed": "0x1ad88a", + "effectiveGasPrice": "0x343b7660", + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": null, + "contractAddress": "0x84da5ab890b0a3314deed0bebd2463309a755eac" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1a7fe86", + "logs": [ + { + "address": "0x323c933df2523d5b0c756210446eee0fb84270fd", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x00000000000000000000000084da5ab890b0a3314deed0bebd2463309a755eac" + ], + "data": "0x", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0xa006ce470e8c8d775255ad617303cede83aa069dbc6dd02fe5ca7805488f0587", + "transactionIndex": "0x107", + "logIndex": "0x294", + "removed": false + }, + { + "address": "0xdf92be359fb53846ccdac8fff1884314533949c7", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000bb73f8a5b0074b27c6df026c77fa08b0111d017a" + ], + "data": "0x", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0xa006ce470e8c8d775255ad617303cede83aa069dbc6dd02fe5ca7805488f0587", + "transactionIndex": "0x107", + "logIndex": "0x295", + "removed": false + }, + { + "address": "0x323c933df2523d5b0c756210446eee0fb84270fd", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000df92be359fb53846ccdac8fff1884314533949c7", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0xa006ce470e8c8d775255ad617303cede83aa069dbc6dd02fe5ca7805488f0587", + "transactionIndex": "0x107", + "logIndex": "0x296", + "removed": false + } + ], + "logsBloom": "0x80000000000000000000000000000080400000000000000000800000000000000000000000000000000000000000000400100000000000000000000000000000000000000000000000000000000002000001000000000000000000000000000000000000020000000000000000000800080000800000000000000000100041400000000000000000000000000000000000000000000000000000000000800000004000000200000000000000000000000000000000000000000000200000000000000020000000000000000000000000000000000400000800000000000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0xa006ce470e8c8d775255ad617303cede83aa069dbc6dd02fe5ca7805488f0587", + "transactionIndex": "0x107", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "gasUsed": "0x9ece4", + "effectiveGasPrice": "0x343b7660", + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": null, + "contractAddress": "0x323c933df2523d5b0c756210446eee0fb84270fd" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1acb80c", + "logs": [ + { + "address": "0x35ec69a77b79c255e5d47d5a3bdbefefe342630c", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d6975", + "0x000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d" + ], + "data": "0x", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0xab8f33792deef92facc6f61471fe9135c49e561f3e0fce4870ec37551020ca16", + "transactionIndex": "0x108", + "logIndex": "0x297", + "removed": false + }, + { + "address": "0x35ec69a77b79c255e5d47d5a3bdbefefe342630c", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a", + "0x000000000000000000000000a08f39d30dc865cc11a49b6e5cbd27630d6141c3", + "0x000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d" + ], + "data": "0x", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0xab8f33792deef92facc6f61471fe9135c49e561f3e0fce4870ec37551020ca16", + "transactionIndex": "0x108", + "logIndex": "0x298", + "removed": false + }, + { + "address": "0x35ec69a77b79c255e5d47d5a3bdbefefe342630c", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a", + "0x000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d6975", + "0x000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d" + ], + "data": "0x", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0xab8f33792deef92facc6f61471fe9135c49e561f3e0fce4870ec37551020ca16", + "transactionIndex": "0x108", + "logIndex": "0x299", + "removed": false + }, + { + "address": "0x35ec69a77b79c255e5d47d5a3bdbefefe342630c", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0xab8f33792deef92facc6f61471fe9135c49e561f3e0fce4870ec37551020ca16", + "transactionIndex": "0x108", + "logIndex": "0x29a", + "removed": false + } + ], + "logsBloom": "0x00000004000000000000000040000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000008000000000000000000008000000000010000800000000020000000000000000000800000000000000000000000000000000000000000000000000000800000000008000000000000080000000000001000000000000000000000000000000000000000000000000000000001000000000000000004000040000000000000000000020000000000004000100002000000020000000120000000000000000000008000000000400000000004000000000000000", + "type": "0x0", + "transactionHash": "0xab8f33792deef92facc6f61471fe9135c49e561f3e0fce4870ec37551020ca16", + "transactionIndex": "0x108", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "gasUsed": "0x4b986", + "effectiveGasPrice": "0x343b7660", + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": "0x35ec69a77b79c255e5d47d5a3bdbefefe342630c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1b41d3a", + "logs": [ + { + "address": "0x92d904019a92b0cafce3492abb95577c285a68fc", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d6975", + "0x000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d" + ], + "data": "0x", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0x837b92e5c2c222a4788552ff35a20602fc9e89c528ec5ae2a4fd1810178f525b", + "transactionIndex": "0x109", + "logIndex": "0x29b", + "removed": false + }, + { + "address": "0x92d904019a92b0cafce3492abb95577c285a68fc", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a", + "0x000000000000000000000000a08f39d30dc865cc11a49b6e5cbd27630d6141c3", + "0x000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d" + ], + "data": "0x", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0x837b92e5c2c222a4788552ff35a20602fc9e89c528ec5ae2a4fd1810178f525b", + "transactionIndex": "0x109", + "logIndex": "0x29c", + "removed": false + }, + { + "address": "0x92d904019a92b0cafce3492abb95577c285a68fc", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a", + "0x000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d6975", + "0x000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d" + ], + "data": "0x", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0x837b92e5c2c222a4788552ff35a20602fc9e89c528ec5ae2a4fd1810178f525b", + "transactionIndex": "0x109", + "logIndex": "0x29d", + "removed": false + }, + { + "address": "0x92d904019a92b0cafce3492abb95577c285a68fc", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xd804c5bf32ccb7c8f087c7a3be22668464f9b4302aec069f690a2c9ba96fc026", + "0x0000000000000000000000000573a7dafbc080064663623979287286bb65c1bd", + "0x000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d" + ], + "data": "0x", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0x837b92e5c2c222a4788552ff35a20602fc9e89c528ec5ae2a4fd1810178f525b", + "transactionIndex": "0x109", + "logIndex": "0x29e", + "removed": false + }, + { + "address": "0x92d904019a92b0cafce3492abb95577c285a68fc", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x5604e2fe54b4de17b81a5ded6f82357d742fd2722d67304e37ff20bd589b4f38", + "0x000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d6975", + "0x000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d" + ], + "data": "0x", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0x837b92e5c2c222a4788552ff35a20602fc9e89c528ec5ae2a4fd1810178f525b", + "transactionIndex": "0x109", + "logIndex": "0x29f", + "removed": false + }, + { + "address": "0x92d904019a92b0cafce3492abb95577c285a68fc", + "topics": [ + "0x5f6921933580ca0adbbb669ff049927ba73230114570507fc8e10f0758f1d804", + "0x0000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0", + "0x00000000000000000000000093c4b944d05dfe6df7645a86cd2206016c51564d" + ], + "data": "0x", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0x837b92e5c2c222a4788552ff35a20602fc9e89c528ec5ae2a4fd1810178f525b", + "transactionIndex": "0x109", + "logIndex": "0x2a0", + "removed": false + }, + { + "address": "0x92d904019a92b0cafce3492abb95577c285a68fc", + "topics": [ + "0x5f6921933580ca0adbbb669ff049927ba73230114570507fc8e10f0758f1d804", + "0x000000000000000000000000ac3e018457b222d93114458476f3e3416abbe38f", + "0x0000000000000000000000008ca7a5d6f3acd3a7a8bc468a8cd0fb14b6bd28b6" + ], + "data": "0x", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0x837b92e5c2c222a4788552ff35a20602fc9e89c528ec5ae2a4fd1810178f525b", + "transactionIndex": "0x109", + "logIndex": "0x2a1", + "removed": false + }, + { + "address": "0x92d904019a92b0cafce3492abb95577c285a68fc", + "topics": [ + "0x5f6921933580ca0adbbb669ff049927ba73230114570507fc8e10f0758f1d804", + "0x000000000000000000000000dcee70654261af21c44c093c300ed3bb97b78192", + "0x000000000000000000000000a4c637e0f704745d182e4d38cab7e7485321d059" + ], + "data": "0x", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0x837b92e5c2c222a4788552ff35a20602fc9e89c528ec5ae2a4fd1810178f525b", + "transactionIndex": "0x109", + "logIndex": "0x2a2", + "removed": false + }, + { + "address": "0x92d904019a92b0cafce3492abb95577c285a68fc", + "topics": [ + "0x5f6921933580ca0adbbb669ff049927ba73230114570507fc8e10f0758f1d804", + "0x000000000000000000000000d5f7838f5c461feff7fe49ea5ebaf7728bb0adfa", + "0x000000000000000000000000298afb19a105d59e74658c4c334ff360bade6dd2" + ], + "data": "0x", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0x837b92e5c2c222a4788552ff35a20602fc9e89c528ec5ae2a4fd1810178f525b", + "transactionIndex": "0x109", + "logIndex": "0x2a3", + "removed": false + }, + { + "address": "0x92d904019a92b0cafce3492abb95577c285a68fc", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0x837b92e5c2c222a4788552ff35a20602fc9e89c528ec5ae2a4fd1810178f525b", + "transactionIndex": "0x109", + "logIndex": "0x2a4", + "removed": false + } + ], + "logsBloom": "0x00000004000000000042000040000000000000008000000000000000000000000000000000000000000000000000004000000000000000000000200200000000000000000000000000000000000000000400008000000008000000000010000800000000060200000000000000080800000000000000000000001000000000008100000000000000000c000000000080000402000004900000000000010020000000040900800000000000200000000800000000000041000010100000000000000000002400000000000000100000a8000000000004000500002000000020000100120000000002000000000000000000000400004000024000040000000000", + "type": "0x0", + "transactionHash": "0x837b92e5c2c222a4788552ff35a20602fc9e89c528ec5ae2a4fd1810178f525b", + "transactionIndex": "0x109", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "gasUsed": "0x7652e", + "effectiveGasPrice": "0x343b7660", + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": "0x92d904019a92b0cafce3492abb95577c285a68fc", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1bb488e", + "logs": [ + { + "address": "0x323c933df2523d5b0c756210446eee0fb84270fd", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d6975", + "0x000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d" + ], + "data": "0x", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0xed94b56178ea20196288af91fca44ebb1942dedbb00c3cba39f242c3581c000d", + "transactionIndex": "0x10a", + "logIndex": "0x2a5", + "removed": false + }, + { + "address": "0x323c933df2523d5b0c756210446eee0fb84270fd", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a", + "0x000000000000000000000000a08f39d30dc865cc11a49b6e5cbd27630d6141c3", + "0x000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d" + ], + "data": "0x", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0xed94b56178ea20196288af91fca44ebb1942dedbb00c3cba39f242c3581c000d", + "transactionIndex": "0x10a", + "logIndex": "0x2a6", + "removed": false + }, + { + "address": "0x323c933df2523d5b0c756210446eee0fb84270fd", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a", + "0x000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d6975", + "0x000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d" + ], + "data": "0x", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0xed94b56178ea20196288af91fca44ebb1942dedbb00c3cba39f242c3581c000d", + "transactionIndex": "0x10a", + "logIndex": "0x2a7", + "removed": false + }, + { + "address": "0x323c933df2523d5b0c756210446eee0fb84270fd", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xb1fadd3142ab2ad7f1337ea4d97112bcc8337fc11ce5b20cb04ad038adf99819", + "0x000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d6975", + "0x000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d" + ], + "data": "0x", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0xed94b56178ea20196288af91fca44ebb1942dedbb00c3cba39f242c3581c000d", + "transactionIndex": "0x10a", + "logIndex": "0x2a8", + "removed": false + }, + { + "address": "0x323c933df2523d5b0c756210446eee0fb84270fd", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0xed94b56178ea20196288af91fca44ebb1942dedbb00c3cba39f242c3581c000d", + "transactionIndex": "0x10a", + "logIndex": "0x2a9", + "removed": false + } + ], + "logsBloom": "0x00000004000000000000000040000000000000000000000000000000000000000000040000000000000000000000004400000000000000000000000000000000000000000000000000000000000000000000000000000008000000000010000800000000020000000000000000000800000000000000000000000000200001000000000000000000000800000000008000000000000080000000000001000000000000000200000000000000000000000000000000000000001000000400000000000000040000000000000000000020000000000004000100002000000020000000120000000000000000000000000000000400000000004000000000000000", + "type": "0x0", + "transactionHash": "0xed94b56178ea20196288af91fca44ebb1942dedbb00c3cba39f242c3581c000d", + "transactionIndex": "0x10a", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "gasUsed": "0x72b54", + "effectiveGasPrice": "0x343b7660", + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": "0x323c933df2523d5b0c756210446eee0fb84270fd", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1c02542", + "logs": [ + { + "address": "0x6b566cb6cddf7d140c59f84594756a151030a0c3", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "0x000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d" + ], + "data": "0x", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0xe0fccc6e24cb0d7fb7dd4125cc5ddae1c38770d6f3e8e14d987201aa43e9165d", + "transactionIndex": "0x10b", + "logIndex": "0x2aa", + "removed": false + }, + { + "address": "0x6b566cb6cddf7d140c59f84594756a151030a0c3", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x24791c44c040514a5d2580696fc45e7d3cb6c9fa65bf3db2e4755362d6c155b5", + "0x000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "0x000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d" + ], + "data": "0x", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0xe0fccc6e24cb0d7fb7dd4125cc5ddae1c38770d6f3e8e14d987201aa43e9165d", + "transactionIndex": "0x10b", + "logIndex": "0x2ab", + "removed": false + }, + { + "address": "0x6b566cb6cddf7d140c59f84594756a151030a0c3", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x9cb3b45ba8017381348975633951e84d77cd512b58a6ebd2533f422ddd943890", + "0x000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d6975", + "0x000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d" + ], + "data": "0x", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0xe0fccc6e24cb0d7fb7dd4125cc5ddae1c38770d6f3e8e14d987201aa43e9165d", + "transactionIndex": "0x10b", + "logIndex": "0x2ac", + "removed": false + }, + { + "address": "0x6b566cb6cddf7d140c59f84594756a151030a0c3", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xc54b323804427575ac6f9f18bf0a027fc2cb84d5af10f03a09d54fd69842fde9", + "0x000000000000000000000000a08f39d30dc865cc11a49b6e5cbd27630d6141c3", + "0x000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d" + ], + "data": "0x", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0xe0fccc6e24cb0d7fb7dd4125cc5ddae1c38770d6f3e8e14d987201aa43e9165d", + "transactionIndex": "0x10b", + "logIndex": "0x2ad", + "removed": false + }, + { + "address": "0x6b566cb6cddf7d140c59f84594756a151030a0c3", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xd47f55d1ccb2b675ff4066bc639e489a7cb307c80ad9e87fc3104cf217c2b3ee", + "0x000000000000000000000000df51b7843817f76220c0970ef58ba726630028ef", + "0x000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d" + ], + "data": "0x", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0xe0fccc6e24cb0d7fb7dd4125cc5ddae1c38770d6f3e8e14d987201aa43e9165d", + "transactionIndex": "0x10b", + "logIndex": "0x2ae", + "removed": false + }, + { + "address": "0x6b566cb6cddf7d140c59f84594756a151030a0c3", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a", + "0x000000000000000000000000a08f39d30dc865cc11a49b6e5cbd27630d6141c3", + "0x000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d" + ], + "data": "0x", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0xe0fccc6e24cb0d7fb7dd4125cc5ddae1c38770d6f3e8e14d987201aa43e9165d", + "transactionIndex": "0x10b", + "logIndex": "0x2af", + "removed": false + }, + { + "address": "0x6b566cb6cddf7d140c59f84594756a151030a0c3", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a", + "0x000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d6975", + "0x000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d" + ], + "data": "0x", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0xe0fccc6e24cb0d7fb7dd4125cc5ddae1c38770d6f3e8e14d987201aa43e9165d", + "transactionIndex": "0x10b", + "logIndex": "0x2b0", + "removed": false + }, + { + "address": "0x6b566cb6cddf7d140c59f84594756a151030a0c3", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "transactionHash": "0xe0fccc6e24cb0d7fb7dd4125cc5ddae1c38770d6f3e8e14d987201aa43e9165d", + "transactionIndex": "0x10b", + "logIndex": "0x2b1", + "removed": false + } + ], + "logsBloom": "0x0000000c000000000000000040000000000000000000000000000000000000000000010000000000000000400000004000000000000000000000000000000000000000000000000000000000000000000000000804000008000000000010000800000000020000040000000800000800000000000000002000000000000000000000000000000000000800000000008000000000000081000000000001000000000000000000000100000000000000000000000000000000001001000040000000000000040000000000000000000020020000000004000100002000000020000000128000000008400002000000000000000400000000006000000000000000", + "type": "0x0", + "transactionHash": "0xe0fccc6e24cb0d7fb7dd4125cc5ddae1c38770d6f3e8e14d987201aa43e9165d", + "transactionIndex": "0x10b", + "blockHash": "0x37cf6625dadd3e8f7cd3f5e2a9c7b4cfe2eb3d36b9487c43dc5e7b320a0fb787", + "blockNumber": "0x1397ac3", + "gasUsed": "0x4dcb4", + "effectiveGasPrice": "0x343b7660", + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": "0x6b566cb6cddf7d140c59f84594756a151030a0c3", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x8e7cfe", + "logs": [ + { + "address": "0x57e1d090b1af526cd4174019d5b9702eebe236fa", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0x7fdc661632317151b29e1eb21fdb5d10aa3e9d78d4bcb3175dc22ff93a76139e", + "blockNumber": "0x1397acb", + "transactionHash": "0x8c59d5cfd5948aa262c50a195ccdc309102b4ed199478af3f1bae9f4c7b5d4c5", + "transactionIndex": "0x5e", + "logIndex": "0xea", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000800000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x8c59d5cfd5948aa262c50a195ccdc309102b4ed199478af3f1bae9f4c7b5d4c5", + "transactionIndex": "0x5e", + "blockHash": "0x7fdc661632317151b29e1eb21fdb5d10aa3e9d78d4bcb3175dc22ff93a76139e", + "blockNumber": "0x1397acb", + "gasUsed": "0x10652f", + "effectiveGasPrice": "0x343b7660", + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": null, + "contractAddress": "0x57e1d090b1af526cd4174019d5b9702eebe236fa" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x9285c4", + "logs": [ + { + "address": "0x64bfbaa763a8cfa96b313378d515e4576e5126bd", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000006b566cb6cddf7d140c59f84594756a151030a0c3" + ], + "data": "0x", + "blockHash": "0x7fdc661632317151b29e1eb21fdb5d10aa3e9d78d4bcb3175dc22ff93a76139e", + "blockNumber": "0x1397acb", + "transactionHash": "0x6eaa56be76a8f628ec0ef67f0fffee003f63e7c07c17eb5d88582e7a90ec1da1", + "transactionIndex": "0x5f", + "logIndex": "0xeb", + "removed": false + }, + { + "address": "0x64bfbaa763a8cfa96b313378d515e4576e5126bd", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x00000000000000000000000057e1d090b1af526cd4174019d5b9702eebe236fa" + ], + "data": "0x", + "blockHash": "0x7fdc661632317151b29e1eb21fdb5d10aa3e9d78d4bcb3175dc22ff93a76139e", + "blockNumber": "0x1397acb", + "transactionHash": "0x6eaa56be76a8f628ec0ef67f0fffee003f63e7c07c17eb5d88582e7a90ec1da1", + "transactionIndex": "0x5f", + "logIndex": "0xec", + "removed": false + }, + { + "address": "0x6b566cb6cddf7d140c59f84594756a151030a0c3", + "topics": [ + "0xd13f13f7d12bbc1ec3c2f99ed663d6b643f722a4654c11d4325b35ed88d9fb75" + ], + "data": "0x00000000000000000000000064bfbaa763a8cfa96b313378d515e4576e5126bd00000000000000000000000057e1d090b1af526cd4174019d5b9702eebe236fa", + "blockHash": "0x7fdc661632317151b29e1eb21fdb5d10aa3e9d78d4bcb3175dc22ff93a76139e", + "blockNumber": "0x1397acb", + "transactionHash": "0x6eaa56be76a8f628ec0ef67f0fffee003f63e7c07c17eb5d88582e7a90ec1da1", + "transactionIndex": "0x5f", + "logIndex": "0xed", + "removed": false + } + ], + "logsBloom": "0x00000008000000000000000000000000400000000000000000800000000000000000000000000000000000000000000000000000000000000080000000000000400000000000000000000000002002000001000000000000000000000000000000000000020000000000000000000800000000000000000000000010000000400000000000000000000000000000000000000000000080000000010000000000000000000000000000000000000020000000000000000000008000000040000000000020000000000000000000002010000000000000000000000000000020000000000400000008000000000000001000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x6eaa56be76a8f628ec0ef67f0fffee003f63e7c07c17eb5d88582e7a90ec1da1", + "transactionIndex": "0x5f", + "blockHash": "0x7fdc661632317151b29e1eb21fdb5d10aa3e9d78d4bcb3175dc22ff93a76139e", + "blockNumber": "0x1397acb", + "gasUsed": "0x408c6", + "effectiveGasPrice": "0x343b7660", + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": "0x6b566cb6cddf7d140c59f84594756a151030a0c3", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x936158", + "logs": [ + { + "address": "0x6b566cb6cddf7d140c59f84594756a151030a0c3", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d6975", + "0x000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d" + ], + "data": "0x", + "blockHash": "0x7fdc661632317151b29e1eb21fdb5d10aa3e9d78d4bcb3175dc22ff93a76139e", + "blockNumber": "0x1397acb", + "transactionHash": "0x28678c6d8d7ebc422fbdd262092352fd30c790d31ebb3f3ab0950f811b9280af", + "transactionIndex": "0x60", + "logIndex": "0xee", + "removed": false + } + ], + "logsBloom": "0x0000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000800000000020000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000040000000000000040000000000000000000000000000000000000100000000000020000000120000000008000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x28678c6d8d7ebc422fbdd262092352fd30c790d31ebb3f3ab0950f811b9280af", + "transactionIndex": "0x60", + "blockHash": "0x7fdc661632317151b29e1eb21fdb5d10aa3e9d78d4bcb3175dc22ff93a76139e", + "blockNumber": "0x1397acb", + "gasUsed": "0xdb94", + "effectiveGasPrice": "0x343b7660", + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": "0x6b566cb6cddf7d140c59f84594756a151030a0c3", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x943e6c", + "logs": [ + { + "address": "0x6b566cb6cddf7d140c59f84594756a151030a0c3", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x24791c44c040514a5d2580696fc45e7d3cb6c9fa65bf3db2e4755362d6c155b5", + "0x000000000000000000000000bb73f8a5b0074b27c6df026c77fa08b0111d017a", + "0x000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d" + ], + "data": "0x", + "blockHash": "0x7fdc661632317151b29e1eb21fdb5d10aa3e9d78d4bcb3175dc22ff93a76139e", + "blockNumber": "0x1397acb", + "transactionHash": "0x0fd580b863d3145f31ec9f18f4b79738944afc318d3eb1106490cd1031a709fb", + "transactionIndex": "0x61", + "logIndex": "0xef", + "removed": false + } + ], + "logsBloom": "0x0000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000001001200040000000000000040000000000000000000000000000000000000100000000000000000000120000000008000000000000000000000000000000002000000000000000", + "type": "0x0", + "transactionHash": "0x0fd580b863d3145f31ec9f18f4b79738944afc318d3eb1106490cd1031a709fb", + "transactionIndex": "0x61", + "blockHash": "0x7fdc661632317151b29e1eb21fdb5d10aa3e9d78d4bcb3175dc22ff93a76139e", + "blockNumber": "0x1397acb", + "gasUsed": "0xdd14", + "effectiveGasPrice": "0x343b7660", + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": "0x6b566cb6cddf7d140c59f84594756a151030a0c3", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xa3df9d", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x4cd13d9963d31a00d241de044cb646ec3495d5336f92289763e5ba0451a11df0", + "transactionIndex": "0x62", + "blockHash": "0x7fdc661632317151b29e1eb21fdb5d10aa3e9d78d4bcb3175dc22ff93a76139e", + "blockNumber": "0x1397acb", + "gasUsed": "0xfa131", + "effectiveGasPrice": "0x343b7660", + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": null, + "contractAddress": "0x5f8c55a5a33d63caa231c668a62f69aa862020e9" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xadcc81", + "logs": [ + { + "address": "0x9e72155d301a6555dc565315be72d295c76753c0", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x0000000000000000000000005f8c55a5a33d63caa231c668a62f69aa862020e9" + ], + "data": "0x", + "blockHash": "0x7fdc661632317151b29e1eb21fdb5d10aa3e9d78d4bcb3175dc22ff93a76139e", + "blockNumber": "0x1397acb", + "transactionHash": "0x56095cf36fd141a6f3fbf7bcbb247bb4540ed8ade1716377fbba5f07c68d7cba", + "transactionIndex": "0x63", + "logIndex": "0xf0", + "removed": false + }, + { + "address": "0x7d779806b0c6a0201984b82e57830b84a75c3c07", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000bb73f8a5b0074b27c6df026c77fa08b0111d017a" + ], + "data": "0x", + "blockHash": "0x7fdc661632317151b29e1eb21fdb5d10aa3e9d78d4bcb3175dc22ff93a76139e", + "blockNumber": "0x1397acb", + "transactionHash": "0x56095cf36fd141a6f3fbf7bcbb247bb4540ed8ade1716377fbba5f07c68d7cba", + "transactionIndex": "0x63", + "logIndex": "0xf1", + "removed": false + }, + { + "address": "0x9e72155d301a6555dc565315be72d295c76753c0", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000007d779806b0c6a0201984b82e57830b84a75c3c07", + "blockHash": "0x7fdc661632317151b29e1eb21fdb5d10aa3e9d78d4bcb3175dc22ff93a76139e", + "blockNumber": "0x1397acb", + "transactionHash": "0x56095cf36fd141a6f3fbf7bcbb247bb4540ed8ade1716377fbba5f07c68d7cba", + "transactionIndex": "0x63", + "logIndex": "0xf2", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000400000000000000200800000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000002000001000000000000000000000000000000000000020000000000000000000800000000800000000000000180100000400000000000000000000000000400000000000000000100000000000000800000004000000000000000000000000000000080000000000000000000200000000000000020000000000000000000000000000002000400000000000000000020000000000001000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x56095cf36fd141a6f3fbf7bcbb247bb4540ed8ade1716377fbba5f07c68d7cba", + "transactionIndex": "0x63", + "blockHash": "0x7fdc661632317151b29e1eb21fdb5d10aa3e9d78d4bcb3175dc22ff93a76139e", + "blockNumber": "0x1397acb", + "gasUsed": "0x9ece4", + "effectiveGasPrice": "0x343b7660", + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": null, + "contractAddress": "0x9e72155d301a6555dc565315be72d295c76753c0" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xb0e056", + "logs": [ + { + "address": "0x9e72155d301a6555dc565315be72d295c76753c0", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d6975", + "0x000000000000000000000000a1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d" + ], + "data": "0x", + "blockHash": "0x7fdc661632317151b29e1eb21fdb5d10aa3e9d78d4bcb3175dc22ff93a76139e", + "blockNumber": "0x1397acb", + "transactionHash": "0xbaf02cccfbec1639f0d6fa4148168d6d7af26262b866f2b46ec9a08650060018", + "transactionIndex": "0x64", + "logIndex": "0xf3", + "removed": false + }, + { + "address": "0x9e72155d301a6555dc565315be72d295c76753c0", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x7fdc661632317151b29e1eb21fdb5d10aa3e9d78d4bcb3175dc22ff93a76139e", + "blockNumber": "0x1397acb", + "transactionHash": "0xbaf02cccfbec1639f0d6fa4148168d6d7af26262b866f2b46ec9a08650060018", + "transactionIndex": "0x64", + "logIndex": "0xf4", + "removed": false + } + ], + "logsBloom": "0x00000004000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000800000000020000000000000000000800000000000000000000000100000000000000000000000000000800000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000040000000000000000000000000002000004000100000000000020000000120000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0xbaf02cccfbec1639f0d6fa4148168d6d7af26262b866f2b46ec9a08650060018", + "transactionIndex": "0x64", + "blockHash": "0x7fdc661632317151b29e1eb21fdb5d10aa3e9d78d4bcb3175dc22ff93a76139e", + "blockNumber": "0x1397acb", + "gasUsed": "0x313d5", + "effectiveGasPrice": "0x343b7660", + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": "0x9e72155d301a6555dc565315be72d295c76753c0", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xc05501", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0xb0cbaeebb127e2275f3c2a6fa37270a5d376ecbe4d7923dc8a4e44714af18c92", + "transactionIndex": "0x65", + "blockHash": "0x7fdc661632317151b29e1eb21fdb5d10aa3e9d78d4bcb3175dc22ff93a76139e", + "blockNumber": "0x1397acb", + "gasUsed": "0xf74ab", + "effectiveGasPrice": "0x343b7660", + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": null, + "contractAddress": "0x95046553147036da98aecc02b2526fcbc36f4306" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xca41e5", + "logs": [ + { + "address": "0x9b933d84fac0782f3b275d76b64a0dbf6fbef28f", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x00000000000000000000000095046553147036da98aecc02b2526fcbc36f4306" + ], + "data": "0x", + "blockHash": "0x7fdc661632317151b29e1eb21fdb5d10aa3e9d78d4bcb3175dc22ff93a76139e", + "blockNumber": "0x1397acb", + "transactionHash": "0xdd09f28eee2dc81bd7cef8e5aaba699b7868d6fa92544e8baad8651abd5cfacf", + "transactionIndex": "0x66", + "logIndex": "0xf5", + "removed": false + }, + { + "address": "0x40fbdd124e80ff168574fa7823440e574345307e", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000fcad670592a3b24869c0b51a6c6fded4f95d6975" + ], + "data": "0x", + "blockHash": "0x7fdc661632317151b29e1eb21fdb5d10aa3e9d78d4bcb3175dc22ff93a76139e", + "blockNumber": "0x1397acb", + "transactionHash": "0xdd09f28eee2dc81bd7cef8e5aaba699b7868d6fa92544e8baad8651abd5cfacf", + "transactionIndex": "0x66", + "logIndex": "0xf6", + "removed": false + }, + { + "address": "0x9b933d84fac0782f3b275d76b64a0dbf6fbef28f", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040fbdd124e80ff168574fa7823440e574345307e", + "blockHash": "0x7fdc661632317151b29e1eb21fdb5d10aa3e9d78d4bcb3175dc22ff93a76139e", + "blockNumber": "0x1397acb", + "transactionHash": "0xdd09f28eee2dc81bd7cef8e5aaba699b7868d6fa92544e8baad8651abd5cfacf", + "transactionIndex": "0x66", + "logIndex": "0xf7", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000400000000000000000800000000000000000001000000000040000000000000000000010000000000000000000000000000000000000000000000000000002000001000000000009000000000000000800000200020000000100000000000800000000800000000000000000000000400000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000400000000000000000020200000020000000000000000000000000020000000000100000000000000000000", + "type": "0x0", + "transactionHash": "0xdd09f28eee2dc81bd7cef8e5aaba699b7868d6fa92544e8baad8651abd5cfacf", + "transactionIndex": "0x66", + "blockHash": "0x7fdc661632317151b29e1eb21fdb5d10aa3e9d78d4bcb3175dc22ff93a76139e", + "blockNumber": "0x1397acb", + "gasUsed": "0x9ece4", + "effectiveGasPrice": "0x343b7660", + "from": "0xa1e340bd1e3ea09b3981164bbb4afeddf0e7ba0d", + "to": null, + "contractAddress": "0x9b933d84fac0782f3b275d76b64a0dbf6fbef28f" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1723848085, + "chain": 1, + "commit": "f8cbb4d" +} \ No newline at end of file diff --git a/deployments/v0.0.1-ynLSDe-17000-76e26697956bbf8dd0491c8d5ed3910a2c359178.json b/deployments/v0.0.1-ynLSDe-17000-76e26697956bbf8dd0491c8d5ed3910a2c359178.json new file mode 100644 index 000000000..935d238e8 --- /dev/null +++ b/deployments/v0.0.1-ynLSDe-17000-76e26697956bbf8dd0491c8d5ed3910a2c359178.json @@ -0,0 +1,2001 @@ +{ + "transactions": [ + { + "hash": "0x7ee75d34ceea955253464aec532a849b225fbad243a65dc375c4fac357ee3ca9", + "transactionType": "CREATE", + "contractName": "ContractAddresses", + "contractAddress": "0x96a3ed0365409ca284d52846717a33618a88175f", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0x26e4c2", + "value": "0x0", + "input": "0x60c06040526001608081905261426860a0819052908055600255348015610024575f80fd5b506040518060a00160405280604051806040016040528073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031681526020016f219ab540356cbb839cbe05303d7705fa6001600160a01b031681525081526020016040518060c001604052807391e677b07f7af907ec9a428aafa9fc14a0d3a3386001600160a01b031681526020017339053d51b77dc0d36036fc1fcc8cb819df8ef37a6001600160a01b0316815260200173369e6f597e22eab55ffb173c6d9cd234bd6991116001600160a01b0316815260200173858646372cc42e1a627fce94aa7a7033e7cf075a6001600160a01b0316815260200173be1685c81aa44ff9fb319dd389addd9374383e906001600160a01b03168152602001737fe7e9cc0f274d2435ad5d56d5fa73e47f6a23d86001600160a01b0316815250815260200160405180610140016040528073ac3e018457b222d93114458476f3e3416abbe38f6001600160a01b0316815260200173ae78736cd615f374d3085123a210448e74fc63936001600160a01b0316815260200173ae7ab96520de3a18e5e111b5eaab095312d7fe846001600160a01b03168152602001737f39c581f595b53c5cb19bd0b3f8da6c935e2ca06001600160a01b0316815260200173856c4efb76c1d1ae02e20ceb03a2a6a08b0b8dc36001600160a01b0316815260200173dcee70654261af21c44c093c300ed3bb97b781926001600160a01b03168152602001739858e47bcbbe6fbac040519b02d7cd4b2c470c666001600160a01b0316815260200173f951e335afb289353dc249e82926178eac7ded786001600160a01b0316815260200173d5f7838f5c461feff7fe49ea5ebaf7728bb0adfa6001600160a01b0316815260200173be9895146f7af43049ca1c1ae358b0541ea497046001600160a01b031681525081526020016040518060e00160405280731bee69b7dfffa4e2d53c2a2df135c388ad25dcd26001600160a01b031681526020017393c4b944d05dfe6df7645a86cd2206016c51564d6001600160a01b0316815260200173a4c637e0f704745d182e4d38cab7e7485321d0596001600160a01b03168152602001738ca7a5d6f3acd3a7a8bc468a8cd0fb14b6bd28b66001600160a01b03168152602001730fe4f44bee93503346a3ac9ee5a26b130a5796d66001600160a01b0316815260200173298afb19a105d59e74658c4c334ff360bade6dd26001600160a01b031681526020017354945180db7943c0ed0fee7edab2bd24620256bc6001600160a01b031681525081526020016040518060a001604052807309db87a538bd693e9d08544577d5ccfaa6373a486001600160a01b03168152602001738c33a1d6d062db7b51f79702355771d44359cd7d6001600160a01b031681526020017340d5ff3e218f54f4982661a0464a298cf66523516001600160a01b03168152602001731d6b2a11ffea5f9a8ed85a02581910b3d695c12b6001600160a01b0316815260200173e439fe4563f7666fcd7405bec24ae7b0d226536e6001600160a01b03168152508152505f8060015f015481526020019081526020015f205f820151815f015f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050506020820151816002015f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506080820151816004015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a0820151816005015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050506040820151816008015f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506080820151816004015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a0820151816005015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060c0820151816006015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e0820151816007015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550610100820151816008015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550610120820151816009015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050506060820151816012015f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506080820151816004015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a0820151816005015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060c0820151816006015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050506080820151816019015f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506080820151816004015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050509050505f600190506040518060a001604052806040518060400160405280846001600160a01b031681526020017342424242424242424242424242424242424242426001600160a01b031681525081526020016040518060c001604052807330770d7e3e71112d7a6b7259542d1f680a70e3156001600160a01b0316815260200173a44151489861fe9e3055d95adc98fbd462b948e76001600160a01b031681526020017328ade60640fdbdb2609d8d8734d1b5cbefc0c3486001600160a01b0316815260200173dfb5f6ce42aaa7830e94ecfccad411bef4d4d5b66001600160a01b031681526020017328ade60640fdbdb2609d8d8734d1b5cbefc0c3486001600160a01b0316815260200173642c646053eaf2254f088e9019acd73d9ae0fa326001600160a01b0316815250815260200160405180610140016040528073a63f56985f9c7f3bc9ffc5685535649e0c1a55f36001600160a01b03168152602001737322c24752f79c05ffd1e2a6fcb97020c1c264f16001600160a01b03168152602001733f1c547b21f65e10480de3ad8e19faac46c950346001600160a01b03168152602001738d09a4502cc8cf1547ad300e066060d043f6982d6001600160a01b031681526020017310b83fbce870642ee33f0877ffb7ea43530e473d6001600160a01b0316815260200173baacdcc565006b6429f57bc0f436dfaf14a526b16001600160a01b03168152602001739858e47bcbbe6fbac040519b02d7cd4b2c470c666001600160a01b0316815260200173f951e335afb289353dc249e82926178eac7ded786001600160a01b0316815260200173e3c063b1bee9de02eb28352b55d49d85514c67ff6001600160a01b03168152602001738720095fa5739ab051799211b146a2eee4dd8b376001600160a01b031681525081526020016040518060e00160405280733a8fbdf9e77dfc25d09741f51d3e181b25d0c4e06001600160a01b03168152602001737d704507b76571a51d9cae8addabbfd0ba0e63d36001600160a01b0316815260200173a4c637e0f704745d182e4d38cab7e7485321d0596001600160a01b03168152602001739281ff96637710cd9a5cacce9c6fad8c9f54631c6001600160a01b03168152602001730fe4f44bee93503346a3ac9ee5a26b130a5796d66001600160a01b0316815260200173accc5a86732be85b5012e8614af237801636f8e56001600160a01b031681526020017370eb4d3c164a6b4a5f908d4fbb5a9caffb66bab66001600160a01b031681525081526020016040518060a0016040528073d9029669bc74878bcb5be58c259ed0a277c5c16e6001600160a01b0316815260200173c2387ebb4ea66627e3543a771e260bd84218d6a16001600160a01b031681526020017382915eff62af9fcc0d0735b8681959e069e3f2d86001600160a01b0316815260200173a5e9e1ceb4cc1854d0e186a9b3e67158b84ad0726001600160a01b0316815260200173706eed02702ffe9cbefd6a65e63f3c2b59b7ef2d6001600160a01b03168152508152505f80600180015481526020019081526020015f205f820151815f015f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050506020820151816002015f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506080820151816004015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a0820151816005015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050506040820151816008015f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506080820151816004015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a0820151816005015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060c0820151816006015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e0820151816007015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550610100820151816008015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550610120820151816009015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050506060820151816012015f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015f61010082546001600160a01b039485169290910a91820291840219161790556080838101516004840180549184166001600160a01b031992831617905560a085015160058501805491851691831691909117905560c09094015160069093018054938316938516939093179092559381015180516019850180549187169185169190911790556020810151601a850180549187169185169190911790556040810151601b850180549187169185169190911790556060810151601c850180549187169185169190911790550151601d909201805492909316911617905550610825806113195f395ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c8063b04f9b5314610043578063edf26d9b1461006c578063fbe4b7c014610237575b5f80fd5b61005661005136600461052b565b61025a565b6040516100639190610713565b60405180910390f35b61022661007a36600461052b565b5f60208181529181526040908190208151808301835281546001600160a01b0390811682526001830154811682860152835160c080820186526002850154831682526003850154831682880152600485015483168287015260058501548316606080840191909152600686015484166080808501919091526007870154851660a080860191909152885161014081018a5260088901548716815260098901548716818c0152600a8901548716818b0152600b890154871681850152600c890154871681840152600d890154871681830152600e890154871681860152600f890154871660e08083019190915260108a0154881661010083015260118a015488166101208301528a519081018b5260128a01548816815260138a01548816818d015260148a01548816818c015260158a015488168186015260168a015488168185015260178a015488168184015260188a015488169581019590955289519182018a52601989015487168252601a89015487169a82019a909a52601b880154861698810198909852601c870154851691880191909152601d90950154909216938501939093529093919285565b604051610063959493929190610789565b600154600254610245919082565b60408051928352602083019190915201610063565b61036c6040805160e081019091525f60a0820181815260c0830191909152819081526040805160c0810182525f8082526020828101829052928201819052606082018190526080820181905260a0820152910190815260408051610140810182525f8082526020828101829052928201819052606082018190526080820181905260a0820181905260c0820181905260e08201819052610100820181905261012082015291019081526040805160e0810182525f8082526020828101829052928201819052606082018190526080820181905260a0820181905260c082015291019081526040805160a0810182525f808252602082810182905292820181905260608201819052608082015291015290565b505f9081526020818152604091829020825160e0808201855282546001600160a01b0390811660a08085019182526001860154831660c08087019190915291855287518083018952600287015484168152600387015484168189015260048701548416818a015260058701548416606080830191909152600688015485166080808401919091526007890154861683850152878a0192909252895161014081018b5260088901548616815260098901548616818b0152600a8901548616818c0152600b890154861681830152600c890154861681840152600d890154861681850152600e890154861681860152600f8901548616818801526010890154861661010082015260118901548616610120820152878b015289519586018a5260128801548516865260138801548516868a015260148801548516868b015260158801548516868201526016880154851686830152601788015485168684015260188801548516938601939093528286019490945287519081018852601986015483168152601a860154831696810196909652601b850154821696860196909652601c840154811695850195909552601d909201549093168282015282015290565b5f6020828403121561053b575f80fd5b5035919050565b80516001600160a01b03908116835260208083015182169084015260408083015182169084015260608083015182169084015260808083015182169084015260a09182015116910152565b80516001600160a01b0316825260208101516105b460208401826001600160a01b03169052565b5060408101516105cf60408401826001600160a01b03169052565b5060608101516105ea60608401826001600160a01b03169052565b50608081015161060560808401826001600160a01b03169052565b5060a081015161062060a08401826001600160a01b03169052565b5060c081015161063b60c08401826001600160a01b03169052565b5060e081015161065660e08401826001600160a01b03169052565b50610100818101516001600160a01b03908116918401919091526101209182015116910152565b80516001600160a01b03908116835260208083015182169084015260408083015182169084015260608083015182169084015260808083015182169084015260a08281015182169084015260c09182015116910152565b80516001600160a01b03908116835260208083015182169084015260408083015182169084015260608083015182169084015260809182015116910152565b815180516001600160a01b03908116835260209182015116908201526103c0810160208301516107466040840182610542565b50604083015161075a61010084018261058d565b50606083015161076e61024084018261067d565b5060808301516107826103208401826106d4565b5092915050565b6103c081016107ae828880516001600160a01b03908116835260209182015116910152565b6107bb6040830187610542565b6107c961010083018661058d565b6107d761024083018561067d565b6107e56103208301846106d4565b969550505050505056fea26469706673582212206c155ed827f0c506761feb921bbae6ab2a312f44902ff1406cc6a0a8de8375f764736f6c63430008180033", + "nonce": "0x660", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x055e4feb4451b04901798ca6ca9481225363ebe6c2e892d0191250eb6166eecb", + "transactionType": "CREATE", + "contractName": "TimelockController", + "contractAddress": "0x62173555c27c67644c5634e114e42a63a59cd7a5", + "function": null, + "arguments": [ + "900", + "[0x9Dd8F69b62ddFd990241530F47dcEd0Dad7f7d39]", + "[0x743b91CDB1C694D4F51bCDA3a4A59DcC0d02b913]", + "0x743b91CDB1C694D4F51bCDA3a4A59DcC0d02b913" + ], + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0x205992", + "value": "0x0", + "input": "0x608060405234801562000010575f80fd5b5060405162001d4c38038062001d4c833981016040819052620000339162000320565b6200003f5f3062000197565b506001600160a01b038116156200005e576200005c5f8262000197565b505b5f5b8351811015620000fd57620000b87fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1858381518110620000a457620000a4620003a2565b60200260200101516200019760201b60201c565b50620000f37ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783858381518110620000a457620000a4620003a2565b5060010162000060565b505f5b82518110156200014e57620001447fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63848381518110620000a457620000a4620003a2565b5060010162000100565b506002849055604080515f8152602081018690527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a150505050620003b6565b5f828152602081815260408083206001600160a01b038516845290915281205460ff166200023a575f838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055620001f13390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016200023d565b505f5b92915050565b634e487b7160e01b5f52604160045260245ffd5b80516001600160a01b03811681146200026e575f80fd5b919050565b5f82601f83011262000283575f80fd5b815160206001600160401b0380831115620002a257620002a262000243565b8260051b604051601f19603f83011681018181108482111715620002ca57620002ca62000243565b6040529384526020818701810194908101925087851115620002ea575f80fd5b6020870191505b848210156200031557620003058262000257565b83529183019190830190620002f1565b979650505050505050565b5f805f806080858703121562000334575f80fd5b845160208601519094506001600160401b038082111562000353575f80fd5b620003618883890162000273565b9450604087015191508082111562000377575f80fd5b50620003868782880162000273565b925050620003976060860162000257565b905092959194509250565b634e487b7160e01b5f52603260045260245ffd5b61198880620003c45f395ff3fe6080604052600436106101b2575f3560e01c80638065657f116100e7578063bc197c8111610087578063d547741f11610062578063d547741f14610546578063e38335e514610565578063f23a6e6114610578578063f27a0c92146105a3575f80fd5b8063bc197c81146104d1578063c4d252f5146104fc578063d45c44351461051b575f80fd5b806391d14854116100c257806391d148541461044d578063a217fddf1461046c578063b08e51c01461047f578063b1c5f427146104b2575f80fd5b80638065657f146103dc5780638f2a0bb0146103fb5780638f61f4f51461041a575f80fd5b80632ab0f5291161015257806336568abe1161012d57806336568abe14610353578063584b153e1461037257806364d62353146103915780637958004c146103b0575f80fd5b80632ab0f529146102f65780632f2ff15d1461031557806331d5075014610334575f80fd5b8063134008d31161018d578063134008d31461025357806313bc9f2014610266578063150b7a0214610285578063248a9ca3146102c8575f80fd5b806301d5062a146101bd57806301ffc9a7146101de57806307bd026514610212575f80fd5b366101b957005b5f80fd5b3480156101c8575f80fd5b506101dc6101d7366004611163565b6105b7565b005b3480156101e9575f80fd5b506101fd6101f83660046111d1565b61068b565b60405190151581526020015b60405180910390f35b34801561021d575f80fd5b506102457fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610209565b6101dc6102613660046111f8565b61069b565b348015610271575f80fd5b506101fd61028036600461125e565b61074d565b348015610290575f80fd5b506102af61029f366004611324565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610209565b3480156102d3575f80fd5b506102456102e236600461125e565b5f9081526020819052604090206001015490565b348015610301575f80fd5b506101fd61031036600461125e565b610772565b348015610320575f80fd5b506101dc61032f366004611387565b61077a565b34801561033f575f80fd5b506101fd61034e36600461125e565b6107a4565b34801561035e575f80fd5b506101dc61036d366004611387565b6107c8565b34801561037d575f80fd5b506101fd61038c36600461125e565b610800565b34801561039c575f80fd5b506101dc6103ab36600461125e565b610845565b3480156103bb575f80fd5b506103cf6103ca36600461125e565b6108b8565b60405161020991906113c5565b3480156103e7575f80fd5b506102456103f63660046111f8565b610900565b348015610406575f80fd5b506101dc61041536600461142b565b61093e565b348015610425575f80fd5b506102457fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610458575f80fd5b506101fd610467366004611387565b610aca565b348015610477575f80fd5b506102455f81565b34801561048a575f80fd5b506102457ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b3480156104bd575f80fd5b506102456104cc3660046114d3565b610af2565b3480156104dc575f80fd5b506102af6104eb3660046115ef565b63bc197c8160e01b95945050505050565b348015610507575f80fd5b506101dc61051636600461125e565b610b36565b348015610526575f80fd5b5061024561053536600461125e565b5f9081526001602052604090205490565b348015610551575f80fd5b506101dc610560366004611387565b610be0565b6101dc6105733660046114d3565b610c04565b348015610583575f80fd5b506102af610592366004611691565b63f23a6e6160e01b95945050505050565b3480156105ae575f80fd5b50600254610245565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16105e181610d85565b5f6105f0898989898989610900565b90506105fc8184610d92565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161063796959493929190611718565b60405180910390a3831561068057807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d03878560405161067791815260200190565b60405180910390a25b505050505050505050565b5f61069582610e23565b92915050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e636106c6815f610aca565b6106d4576106d48133610e47565b5f6106e3888888888888610900565b90506106ef8185610e84565b6106fb88888888610ed2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a6040516107329493929190611754565b60405180910390a361074381610f46565b5050505050505050565b5f60025b61075a836108b8565b600381111561076b5761076b6113b1565b1492915050565b5f6003610751565b5f8281526020819052604090206001015461079481610d85565b61079e8383610f71565b50505050565b5f806107af836108b8565b60038111156107c0576107c06113b1565b141592915050565b6001600160a01b03811633146107f15760405163334bd91960e11b815260040160405180910390fd5b6107fb8282611000565b505050565b5f8061080b836108b8565b90506001816003811115610821576108216113b1565b148061083e5750600281600381111561083c5761083c6113b1565b145b9392505050565b333081146108765760405163e2850c5960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b60025460408051918252602082018490527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a150600255565b5f81815260016020526040812054805f036108d557505f92915050565b600181036108e65750600392915050565b428111156108f75750600192915050565b50600292915050565b5f86868686868660405160200161091c96959493929190611718565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161096881610d85565b88871415806109775750888514155b156109a9576040516001624fcdef60e01b03198152600481018a9052602481018690526044810188905260640161086d565b5f6109ba8b8b8b8b8b8b8b8b610af2565b90506109c68184610d92565b5f5b8a811015610a7b5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610a0557610a05611785565b9050602002016020810190610a1a9190611799565b8d8d86818110610a2c57610a2c611785565b905060200201358c8c87818110610a4557610a45611785565b9050602002810190610a5791906117b2565b8c8b604051610a6b96959493929190611718565b60405180910390a36001016109c8565b508315610abd57807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d038785604051610ab491815260200190565b60405180910390a25b5050505050505050505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b5f8888888888888888604051602001610b12989796959493929190611885565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610b6081610d85565b610b6982610800565b610ba55781610b786002611069565b610b826001611069565b604051635ead8eb560e01b8152600481019390935217602482015260440161086d565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610bfa81610d85565b61079e8383611000565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63610c2f815f610aca565b610c3d57610c3d8133610e47565b8786141580610c4c5750878414155b15610c7e576040516001624fcdef60e01b0319815260048101899052602481018590526044810187905260640161086d565b5f610c8f8a8a8a8a8a8a8a8a610af2565b9050610c9b8185610e84565b5f5b89811015610d6f575f8b8b83818110610cb857610cb8611785565b9050602002016020810190610ccd9190611799565b90505f8a8a84818110610ce257610ce2611785565b905060200201359050365f8a8a86818110610cff57610cff611785565b9050602002810190610d1191906117b2565b91509150610d2184848484610ed2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b5886868686604051610d589493929190611754565b60405180910390a350505050806001019050610c9d565b50610d7981610f46565b50505050505050505050565b610d8f8133610e47565b50565b610d9b826107a4565b15610dcc5781610daa5f611069565b604051635ead8eb560e01b81526004810192909252602482015260440161086d565b5f610dd660025490565b905080821015610e0357604051635433660960e01b8152600481018390526024810182905260440161086d565b610e0d8242611924565b5f93845260016020526040909320929092555050565b5f6001600160e01b03198216630271189760e51b148061069557506106958261108b565b610e518282610aca565b610e805760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161086d565b5050565b610e8d8261074d565b610e9c5781610daa6002611069565b8015801590610eb15750610eaf81610772565b155b15610e805760405163121534c360e31b81526004810182905260240161086d565b5f80856001600160a01b0316858585604051610eef929190611943565b5f6040518083038185875af1925050503d805f8114610f29576040519150601f19603f3d011682016040523d82523d5f602084013e610f2e565b606091505b5091509150610f3d82826110bf565b50505050505050565b610f4f8161074d565b610f5e5780610daa6002611069565b5f90815260016020819052604090912055565b5f610f7c8383610aca565b610ff9575f838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610fb13390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610695565b505f610695565b5f61100b8383610aca565b15610ff9575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610695565b5f81600381111561107c5761107c6113b1565b600160ff919091161b92915050565b5f6001600160e01b03198216637965db0b60e01b148061069557506301ffc9a760e01b6001600160e01b0319831614610695565b6060826110d4576110cf826110db565b610695565b5080610695565b8051156110eb5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80356001600160a01b038116811461111a575f80fd5b919050565b5f8083601f84011261112f575f80fd5b5081356001600160401b03811115611145575f80fd5b60208301915083602082850101111561115c575f80fd5b9250929050565b5f805f805f805f60c0888a031215611179575f80fd5b61118288611104565b96506020880135955060408801356001600160401b038111156111a3575f80fd5b6111af8a828b0161111f565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f602082840312156111e1575f80fd5b81356001600160e01b03198116811461083e575f80fd5b5f805f805f8060a0878903121561120d575f80fd5b61121687611104565b95506020870135945060408701356001600160401b03811115611237575f80fd5b61124389828a0161111f565b979a9699509760608101359660809091013595509350505050565b5f6020828403121561126e575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156112b1576112b1611275565b604052919050565b5f82601f8301126112c8575f80fd5b81356001600160401b038111156112e1576112e1611275565b6112f4601f8201601f1916602001611289565b818152846020838601011115611308575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611337575f80fd5b61134085611104565b935061134e60208601611104565b92506040850135915060608501356001600160401b0381111561136f575f80fd5b61137b878288016112b9565b91505092959194509250565b5f8060408385031215611398575f80fd5b823591506113a860208401611104565b90509250929050565b634e487b7160e01b5f52602160045260245ffd5b60208101600483106113e557634e487b7160e01b5f52602160045260245ffd5b91905290565b5f8083601f8401126113fb575f80fd5b5081356001600160401b03811115611411575f80fd5b6020830191508360208260051b850101111561115c575f80fd5b5f805f805f805f805f60c08a8c031215611443575f80fd5b89356001600160401b0380821115611459575f80fd5b6114658d838e016113eb565b909b50995060208c013591508082111561147d575f80fd5b6114898d838e016113eb565b909950975060408c01359150808211156114a1575f80fd5b506114ae8c828d016113eb565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b0312156114ea575f80fd5b88356001600160401b0380821115611500575f80fd5b61150c8c838d016113eb565b909a50985060208b0135915080821115611524575f80fd5b6115308c838d016113eb565b909850965060408b0135915080821115611548575f80fd5b506115558b828c016113eb565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112611582575f80fd5b813560206001600160401b0382111561159d5761159d611275565b8160051b6115ac828201611289565b92835284810182019282810190878511156115c5575f80fd5b83870192505b848310156115e4578235825291830191908301906115cb565b979650505050505050565b5f805f805f60a08688031215611603575f80fd5b61160c86611104565b945061161a60208701611104565b935060408601356001600160401b0380821115611635575f80fd5b61164189838a01611573565b94506060880135915080821115611656575f80fd5b61166289838a01611573565b93506080880135915080821115611677575f80fd5b50611684888289016112b9565b9150509295509295909350565b5f805f805f60a086880312156116a5575f80fd5b6116ae86611104565b94506116bc60208701611104565b9350604086013592506060860135915060808601356001600160401b038111156116e4575f80fd5b611684888289016112b9565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60018060a01b038716815285602082015260a060408201525f61173f60a0830186886116f0565b60608301949094525060800152949350505050565b60018060a01b0385168152836020820152606060408201525f61177b6060830184866116f0565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156117a9575f80fd5b61083e82611104565b5f808335601e198436030181126117c7575f80fd5b8301803591506001600160401b038211156117e0575f80fd5b60200191503681900382131561115c575f80fd5b5f838385526020808601955060208560051b830101845f5b8781101561187857848303601f19018952813536889003601e19018112611831575f80fd5b870184810190356001600160401b0381111561184b575f80fd5b803603821315611859575f80fd5b6118648582846116f0565b9a86019a945050509083019060010161180c565b5090979650505050505050565b60a080825281018890525f8960c08301825b8b8110156118c5576001600160a01b036118b084611104565b16825260209283019290910190600101611897565b5083810360208501528881526001600160fb1b038911156118e4575f80fd5b8860051b9150818a6020830137018281036020908101604085015261190c90820187896117f4565b60608401959095525050608001529695505050505050565b8082018082111561069557634e487b7160e01b5f52601160045260245ffd5b818382375f910190815291905056fea26469706673582212205ff04196bf81cbed5f8524182f38cbab36c7a9db7b163e04e94c88bc4a60d05364736f6c634300081800330000000000000000000000000000000000000000000000000000000000000384000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b91300000000000000000000000000000000000000000000000000000000000000010000000000000000000000009dd8f69b62ddfd990241530f47dced0dad7f7d390000000000000000000000000000000000000000000000000000000000000001000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "nonce": "0x661", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x65955f7cdc46b71456c0d4074ef01acd3d3dd4fd4f2fce2a673b5dafcd138e81", + "transactionType": "CREATE", + "contractName": "ynEigen", + "contractAddress": "0xa6cf070663127faa41a2150bdadad8d84b876aeb", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0x2bc7aa", + "value": "0x0", + "input": "0x608060405234801562000010575f80fd5b506200001b62000021565b620000d5565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d25780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b61266d80620000e35f395ff3fe608060405234801561000f575f80fd5b506004361061021e575f3560e01c806370a082311161012a578063a9059cbb116100b4578063e0c784a611610079578063e0c784a6146104e9578063e63ab1e914610509578063f11b818814610530578063f45346dc1461054f578063fb1bb9de14610562575f80fd5b8063a9059cbb14610475578063b8f82b2614610488578063cd88e5581461049b578063d547741f146104c3578063dd62ed3e146104d6575f80fd5b806391d14854116100fa57806391d148541461040957806395d89b411461041c578063979d7e8614610424578063a1a25e6e14610437578063a217fddf1461046e575f80fd5b806370a08231146103a75780638936a91f146103db5780638d252393146103e35780638ffbf6db146103f6575f80fd5b8063313ce567116101ab57806352f94f981161017b57806352f94f981461033a5780635f4caf461461036557806360da3e831461037857806361fd0ae11461038c57806363d8882a1461039f575f80fd5b8063313ce567146102f257806336568abe1461030157806338bca6c8146103145780633e5541f114610327575f80fd5b8063095ea7b3116101f1578063095ea7b31461027f57806318160ddd1461029257806323b872dd146102b9578063248a9ca3146102cc5780632f2ff15d146102df575f80fd5b806301e1d1141461022257806301ffc9a71461023d578063021919801461026057806306fdde031461026a575b5f80fd5b61022a610576565b6040519081526020015b60405180910390f35b61025061024b366004611eef565b6105e5565b6040519015158152602001610234565b61026861061b565b005b61027261069f565b6040516102349190611f38565b61025061028d366004611f8e565b61075f565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025461022a565b6102506102c7366004611fb8565b610776565b61022a6102da366004611ff6565b61079b565b6102686102ed36600461200d565b6107bb565b60405160128152602001610234565b61026861030f36600461200d565b6107dd565b610268610322366004612083565b610815565b61022a610335366004611f8e565b610ae6565b60015461034d906001600160a01b031681565b6040516001600160a01b039091168152602001610234565b6102506103733660046120ea565b610ba0565b60025461025090600160a01b900460ff1681565b61026861039a366004612119565b610c0c565b610268610c31565b61022a6103b53660046120ea565b6001600160a01b03165f9081525f805160206125d8833981519152602052604090205490565b610268610c95565b6102686103f13660046121d9565b610d10565b610268610404366004612119565b611062565b61025061041736600461200d565b611084565b6102726110ba565b60025461034d906001600160a01b031681565b6102506104453660046120ea565b6001600160a01b03165f9081525f805160206125b8833981519152602052604090205460ff1690565b61022a5f81565b610250610483366004611f8e565b6110f8565b61022a610496366004611f8e565b611105565b61022a6104a93660046120ea565b6001600160a01b03165f9081526020819052604090205490565b6102686104d136600461200d565b611110565b61022a6104e4366004612211565b61112c565b6104fc6104f736600461223d565b611175565b604051610234919061227c565b61022a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b61022a61053e3660046120ea565b5f6020819052908152604090205481565b61022a61055d3660046122bf565b61123f565b61022a5f805160206125f883398151915281565b600254604080516278744560e21b815290515f926001600160a01b0316916301e1d1149160048083019260209291908290030181865afa1580156105bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105e091906122fe565b905090565b5f6001600160e01b03198216637965db0b60e01b148061061557506301ffc9a760e01b6001600160e01b03198316145b92915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610645816112aa565b6002805460ff60a01b1916600160a01b908117918290556040517f9723f28d4abaff5df0f62bfb2418f2aac4a739b259edf209b8dc9944fa85aa789261069492900460ff161515815260200190565b60405180910390a150565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f805160206125d8833981519152916106dd90612315565b80601f016020809104026020016040519081016040528092919081815260200182805461070990612315565b80156107545780601f1061072b57610100808354040283529160200191610754565b820191905f5260205f20905b81548152906001019060200180831161073757829003601f168201915b505050505091505090565b5f3361076c8185856112b7565b5060019392505050565b5f336107838582856112c4565b61078e858585611321565b60019150505b9392505050565b5f9081525f80516020612618833981519152602052604090206001015490565b6107c48261079b565b6107cd816112aa565b6107d7838361137e565b50505050565b6001600160a01b03811633146108065760405163334bd91960e11b815260040160405180910390fd5b610810828261141f565b505050565b6001546001600160a01b03163314610847576040516347ed65b360e11b81523360048201526024015b60405180910390fd5b8281811461087257604051637df4c78160e01b8152600481018290526024810183905260440161083e565b6001546001600160a01b03165f5b82811015610add575f87878381811061089b5761089b61234d565b90506020020160208101906108b091906120ea565b600254604051632fa657a360e11b81526001600160a01b038084166004830152929350911690635f4caf4690602401602060405180830381865afa1580156108fa573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091e9190612361565b6109465760405163ee84f40b60e01b81526001600160a01b038216600482015260240161083e565b6001600160a01b0381165f90815260208181526040918290208251918201909252905480825287878581811061097e5761097e61234d565b9050602002013511156109db57805182908888868181106109a1576109a161234d565b60405163a8c6953f60e01b81526001600160a01b03909516600486015260248501939093525060209091020135604482015260640161083e565b8686848181106109ed576109ed61234d565b905060200201355f80846001600160a01b03166001600160a01b031681526020019081526020015f205f015f828254610a269190612394565b90915550610a62905084888886818110610a4257610a4261234d565b90506020020135846001600160a01b03166114989092919063ffffffff16565b7f4104800de83c5a3ae29f33899a811406b39aa89930fcc75e60d84b411803368d82888886818110610a9657610a9661234d565b9050602002013586604051610acb939291906001600160a01b0393841681526020810192909252909116604082015260600190565b60405180910390a15050600101610880565b50505050505050565b5f610af083610ba0565b15610b7c57600254604051631cbf960d60e01b81526001600160a01b038581166004830152602482018590525f921690631cbf960d90604401602060405180830381865afa158015610b44573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6891906122fe565b9050610b74815f6114f7565b915050610615565b60405163ee84f40b60e01b81526001600160a01b038416600482015260240161083e565b600254604051632fa657a360e11b81526001600160a01b0383811660048301525f921690635f4caf4690602401602060405180830381865afa158015610be8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106159190612361565b5f805160206125f8833981519152610c23816112aa565b610c2d825f611554565b5050565b5f805160206125f8833981519152610c48816112aa565b6002805460ff60a01b1916908190556040517f9723f28d4abaff5df0f62bfb2418f2aac4a739b259edf209b8dc9944fa85aa789161069491600160a01b90910460ff161515815260200190565b5f805160206125f8833981519152610cac816112aa565b7f7e7ba5b20f89141f0255e9704ce6ce6e55f5f28e4fc0d626fc76bedba3053201805460ff191690556040515f805160206125b8833981519152907f5b1b646968864ea75fad546d8c819e0de710df0bf61f658f6ba54dc587472e7b905f90a15050565b610d2060608201604083016120ea565b6001600160a01b038116610d475760405163d92e233d60e01b815260040160405180910390fd5b610d5760a08301608084016120ea565b6001600160a01b038116610d7e5760405163d92e233d60e01b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f81158015610dc35750825b90505f8267ffffffffffffffff166001148015610ddf5750303b155b905081158015610ded575080155b15610e0b5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610e3557845460ff60401b1916600160401b1785555b610e3d6115ef565b610e456115f9565b610ecc610e5289806123a7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610e939250505060208b018b6123a7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061160992505050565b610ee55f610ee060a08b0160808c016120ea565b61137e565b50610f1a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610ee060c08b0160a08c016120ea565b50610f3c5f805160206125f8833981519152610ee060e08b0160c08c016120ea565b50610f4d6060890160408a016120ea565b600280546001600160a01b0319166001600160a01b0392909216919091179055610f7d6080890160608a016120ea565b600180546001600160a01b0319166001600160a01b03929092169190911781557f7e7ba5b20f89141f0255e9704ce6ce6e55f5f28e4fc0d626fc76bedba3053201805460ff19169091179055611012610fd960e08a018a6123ea565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525060019250611554915050565b831561105857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f805160206125f8833981519152611079816112aa565b610c2d826001611554565b5f9182525f80516020612618833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f805160206125d8833981519152916106dd90612315565b5f3361076c818585611321565b5f6107948383610ae6565b6111198261079b565b611122816112aa565b6107d7838361141f565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b6060818067ffffffffffffffff81111561119157611191612105565b6040519080825280602002602001820160405280156111ba578160200160208202803683370190505b5091505f5b81811015611237575f808686848181106111db576111db61234d565b90506020020160208101906111f091906120ea565b6001600160a01b03166001600160a01b031681526020019081526020015f205f01548382815181106112245761122461234d565b60209081029190910101526001016111bf565b505092915050565b5f61124861161b565b600254600160a01b900460ff1615611273576040516313d0ff5960e31b815260040160405180910390fd5b61127f84848433611665565b905061079460017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6112b4813361181b565b50565b6108108383836001611854565b5f6112cf848461112c565b90505f1981146107d7578181101561131357604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161083e565b6107d784848484035f611854565b6001600160a01b03831661134a57604051634b637e8f60e11b81525f600482015260240161083e565b6001600160a01b0382166113735760405163ec442f0560e01b81525f600482015260240161083e565b610810838383611938565b5f5f805160206126188339815191526113978484611084565b611416575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556113cc3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610615565b5f915050610615565b5f5f805160206126188339815191526114388484611084565b15611416575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610615565b6040516001600160a01b0383811660248301526044820183905261081091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506119e1565b5f806115217f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025490565b90505f61152c610576565b9050815f0361153f578492505050610615565b61154b85838387611a42565b95945050505050565b5f805160206125b88339815191525f5b83518110156107d7575f8482815181106115805761158061234d565b6020908102919091018101516001600160a01b0381165f818152868452604090819020805460ff19168915159081179091559051908152919350917fac6d52e87f8a8fc486e04600668caffa28c149f8286b136c0f327b4499b8c723910160405180910390a250600101611564565b6115f7611a8f565b565b611601611a8f565b6115f7611ad8565b611611611a8f565b610c2d8282611ae0565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161165f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f61166f85610ba0565b6116975760405163ee84f40b60e01b81526001600160a01b038616600482015260240161083e565b835f036116b757604051631f2a200560e01b815260040160405180910390fd5b6116cc6001600160a01b038616833087611af2565b600254604051631cbf960d60e01b81526001600160a01b038781166004830152602482018790525f921690631cbf960d90604401602060405180830381865afa15801561171b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061173f91906122fe565b905061174b815f6114f7565b9150815f0361176d57604051639811e0c760e01b815260040160405180910390fd5b6117778483611b2b565b6001600160a01b0386165f908152602081905260408120805487929061179e908490612430565b909155505060408051868152602081018490526001600160a01b0380871692908616917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a350949350505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6118258282611084565b610c2d5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161083e565b5f805160206125d88339815191526001600160a01b03851661188b5760405163e602df0560e01b81525f600482015260240161083e565b6001600160a01b0384166118b457604051634a1406b160e11b81525f600482015260240161083e565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561193157836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161192891815260200190565b60405180910390a35b5050505050565b7f7e7ba5b20f89141f0255e9704ce6ce6e55f5f28e4fc0d626fc76bedba3053201545f805160206125b88339815191529060ff16801561199057506001600160a01b0384165f9081526020829052604090205460ff16155b80156119a457506001600160a01b03841615155b80156119b857506001600160a01b03831615155b156119d657604051636ab17e0560e01b815260040160405180910390fd5b6107d7848484611b5f565b5f6119f56001600160a01b03841683611c98565b905080515f14158015611a19575080806020019051810190611a179190612361565b155b1561081057604051635274afe760e01b81526001600160a01b038416600482015260240161083e565b5f80611a4f868686611ca5565b9050611a5a83611d64565b8015611a7557505f8480611a7057611a70612443565b868809115b1561154b57611a85600182612430565b9695505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166115f757604051631afcd79f60e31b815260040160405180910390fd5b6117f5611a8f565b611ae8611a8f565b610c2d8282611d90565b6040516001600160a01b0384811660248301528381166044830152606482018390526107d79186918216906323b872dd906084016114c5565b6001600160a01b038216611b545760405163ec442f0560e01b81525f600482015260240161083e565b610c2d5f8383611938565b5f805160206125d88339815191526001600160a01b038416611b995781816002015f828254611b8e9190612430565b90915550611c099050565b6001600160a01b0384165f9081526020829052604090205482811015611beb5760405163391434e360e21b81526001600160a01b0386166004820152602481018290526044810184905260640161083e565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316611c27576002810180548390039055611c45565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611c8a91815260200190565b60405180910390a350505050565b606061079483835f611de0565b5f838302815f1985870982811083820303915050805f03611cd957838281611ccf57611ccf612443565b0492505050610794565b808411611cf95760405163227bc15360e01b815260040160405180910390fd5b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b5f6002826003811115611d7957611d79612457565b611d83919061246b565b60ff166001149050919050565b611d98611a8f565b5f805160206125d88339815191527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace03611dd184826124dc565b50600481016107d783826124dc565b606081471015611e055760405163cd78605960e01b815230600482015260240161083e565b5f80856001600160a01b03168486604051611e20919061259c565b5f6040518083038185875af1925050503d805f8114611e5a576040519150601f19603f3d011682016040523d82523d5f602084013e611e5f565b606091505b5091509150611a85868383606082611e7f57611e7a82611ec6565b610794565b8151158015611e9657506001600160a01b0384163b155b15611ebf57604051639996b31560e01b81526001600160a01b038516600482015260240161083e565b5080610794565b805115611ed65780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f60208284031215611eff575f80fd5b81356001600160e01b031981168114610794575f80fd5b5f5b83811015611f30578181015183820152602001611f18565b50505f910152565b602081525f8251806020840152611f56816040850160208701611f16565b601f01601f19169190910160400192915050565b6001600160a01b03811681146112b4575f80fd5b8035611f8981611f6a565b919050565b5f8060408385031215611f9f575f80fd5b8235611faa81611f6a565b946020939093013593505050565b5f805f60608486031215611fca575f80fd5b8335611fd581611f6a565b92506020840135611fe581611f6a565b929592945050506040919091013590565b5f60208284031215612006575f80fd5b5035919050565b5f806040838503121561201e575f80fd5b82359150602083013561203081611f6a565b809150509250929050565b5f8083601f84011261204b575f80fd5b50813567ffffffffffffffff811115612062575f80fd5b6020830191508360208260051b850101111561207c575f80fd5b9250929050565b5f805f8060408587031215612096575f80fd5b843567ffffffffffffffff808211156120ad575f80fd5b6120b98883890161203b565b909650945060208701359150808211156120d1575f80fd5b506120de8782880161203b565b95989497509550505050565b5f602082840312156120fa575f80fd5b813561079481611f6a565b634e487b7160e01b5f52604160045260245ffd5b5f602080838503121561212a575f80fd5b823567ffffffffffffffff80821115612141575f80fd5b818501915085601f830112612154575f80fd5b81358181111561216657612166612105565b8060051b604051601f19603f8301168101818110858211171561218b5761218b612105565b6040529182528482019250838101850191888311156121a8575f80fd5b938501935b828510156121cd576121be85611f7e565b845293850193928501926121ad565b98975050505050505050565b5f602082840312156121e9575f80fd5b813567ffffffffffffffff8111156121ff575f80fd5b82016101008185031215610794575f80fd5b5f8060408385031215612222575f80fd5b823561222d81611f6a565b9150602083013561203081611f6a565b5f806020838503121561224e575f80fd5b823567ffffffffffffffff811115612264575f80fd5b6122708582860161203b565b90969095509350505050565b602080825282518282018190525f9190848201906040850190845b818110156122b357835183529284019291840191600101612297565b50909695505050505050565b5f805f606084860312156122d1575f80fd5b83356122dc81611f6a565b92506020840135915060408401356122f381611f6a565b809150509250925092565b5f6020828403121561230e575f80fd5b5051919050565b600181811c9082168061232957607f821691505b60208210810361234757634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612371575f80fd5b81518015158114610794575f80fd5b634e487b7160e01b5f52601160045260245ffd5b8181038181111561061557610615612380565b5f808335601e198436030181126123bc575f80fd5b83018035915067ffffffffffffffff8211156123d6575f80fd5b60200191503681900382131561207c575f80fd5b5f808335601e198436030181126123ff575f80fd5b83018035915067ffffffffffffffff821115612419575f80fd5b6020019150600581901b360382131561207c575f80fd5b8082018082111561061557610615612380565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f60ff83168061248957634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b601f82111561081057805f5260205f20601f840160051c810160208510156124bd5750805b601f840160051c820191505b81811015611931575f81556001016124c9565b815167ffffffffffffffff8111156124f6576124f6612105565b61250a816125048454612315565b84612498565b602080601f83116001811461253d575f84156125265750858301515b5f19600386901b1c1916600185901b178555612594565b5f85815260208120601f198616915b8281101561256b5788860151825594840194600190910190840161254c565b508582101561258857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f82516125ad818460208701611f16565b919091019291505056fe7e7ba5b20f89141f0255e9704ce6ce6e55f5f28e4fc0d626fc76bedba305320052c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800a26469706673582212208e89f2c5cf80f7a366416cce46b52bf580e42efe22db9092f7f8424e78273ffa64736f6c63430008180033", + "nonce": "0x662", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x324c81e28386d85597e41f1dce13c5a5b5ceab62366a49346ba84a9fa03ac577", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x071bdc8edcdd66730f45a3d3a6f794faa37c75ed", + "function": null, + "arguments": [ + "0xA6cf070663127FAa41a2150BdadAD8D84b876AEb", + "0x62173555C27C67644C5634e114e42A63A59CD7A5", + "0x" + ], + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0xce728", + "value": "0x0", + "input": "0x60a060405260405162000e5038038062000e508339810160408190526200002691620003bc565b828162000034828262000099565b50508160405162000045906200035a565b6001600160a01b039091168152602001604051809103905ff0801580156200006f573d5f803e3d5ffd5b506001600160a01b0316608052620000906200008a60805190565b620000fe565b505050620004b3565b620000a4826200016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000f057620000eb8282620001ee565b505050565b620000fa62000267565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6200013f5f8051602062000e30833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16200016c8162000289565b50565b806001600160a01b03163b5f03620001aa57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516200020c919062000496565b5f60405180830381855af49150503d805f811462000246576040519150601f19603f3d011682016040523d82523d5f602084013e6200024b565b606091505b5090925090506200025e858383620002ca565b95945050505050565b3415620002875760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b038116620002b457604051633173bdd160e11b81525f6004820152602401620001a1565b805f8051602062000e30833981519152620001cd565b606082620002e357620002dd8262000330565b62000329565b8151158015620002fb57506001600160a01b0384163b155b156200032657604051639996b31560e01b81526001600160a01b0385166004820152602401620001a1565b50805b9392505050565b805115620003415780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6104fc806200093483390190565b80516001600160a01b03811681146200037f575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620003b45781810151838201526020016200039a565b50505f910152565b5f805f60608486031215620003cf575f80fd5b620003da8462000368565b9250620003ea6020850162000368565b60408501519092506001600160401b038082111562000407575f80fd5b818601915086601f8301126200041b575f80fd5b81518181111562000430576200043062000384565b604051601f8201601f19908116603f011681019083821181831017156200045b576200045b62000384565b8160405282815289602084870101111562000474575f80fd5b6200048783602083016020880162000398565b80955050505050509250925092565b5f8251620004a981846020870162000398565b9190910192915050565b608051610469620004cb5f395f601001526104695ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007a575f356001600160e01b03191663278f794360e11b14610070576040516334ad5dbb60e21b815260040160405180910390fd5b610078610082565b565b6100786100b0565b5f806100913660048184610303565b81019061009e919061033e565b915091506100ac82826100c0565b5050565b6100786100bb61011a565b610151565b6100c98261016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101125761010d82826101ea565b505050565b6100ac61025c565b5f61014c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e80801561016b573d5ff35b3d5ffd5b806001600160a01b03163b5f036101a957604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102069190610407565b5f60405180830381855af49150503d805f811461023e576040519150601f19603f3d011682016040523d82523d5f602084013e610243565b606091505b509150915061025385838361027b565b95945050505050565b34156100785760405163b398979f60e01b815260040160405180910390fd5b6060826102905761028b826102da565b6102d3565b81511580156102a757506001600160a01b0384163b155b156102d057604051639996b31560e01b81526001600160a01b03851660048201526024016101a0565b50805b9392505050565b8051156102ea5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610311575f80fd5b8386111561031d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561034f575f80fd5b82356001600160a01b0381168114610365575f80fd5b9150602083013567ffffffffffffffff80821115610381575f80fd5b818501915085601f830112610394575f80fd5b8135818111156103a6576103a661032a565b604051601f8201601f19908116603f011681019083821181831017156103ce576103ce61032a565b816040528281528860208487010111156103e6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610426576020818601810151858301520161040c565b505f92019182525091905056fea2646970667358221220e2efdc1b8b8352056043aec80c210e936ef943e06eb728a94ee6133503eb49ba64736f6c63430008180033608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea264697066735822122014115c860f57a54eed5f443866a2dc591c7925fc2fe52248ef9f9382627684fd64736f6c63430008180033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000a6cf070663127faa41a2150bdadad8d84b876aeb00000000000000000000000062173555c27c67644c5634e114e42a63a59cd7a500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x663", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0x31456eef519b7ab236e3638297ed392390bf304f", + "initCode": "0x608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea264697066735822122014115c860f57a54eed5f443866a2dc591c7925fc2fe52248ef9f9382627684fd64736f6c6343000818003300000000000000000000000062173555c27c67644c5634e114e42a63a59cd7a5" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xfad901b1cf62bec6eda957d8e17d028b07222955d01c6336741d97caf47673ef", + "transactionType": "CREATE", + "contractName": "HoleskyLSDRateProvider", + "contractAddress": "0x94009d1296dc2e6370aa34c94bedfed55f96a276", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0x72832", + "value": "0x0", + "input": "0x608060405234801561000f575f80fd5b5061058f8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610090575f3560e01c8063852ec88311610063578063852ec883146101235780639d8e21771461013e578063bd0aef491461014d578063e94fe81514610168578063ed100c3c14610183575f80fd5b80630ba9d8ca1461009457806318122e8a146100ba57806336d7dd67146100ed578063501a771014610108575b5f80fd5b6100a76100a23660046104d3565b61019e565b6040519081526020015b60405180910390f35b6100d5737322c24752f79c05ffd1e2a6fcb97020c1c264f181565b6040516001600160a01b0390911681526020016100b1565b6100d573baacdcc565006b6429f57bc0f436dfaf14a526b181565b6100d573e3c063b1bee9de02eb28352b55d49d85514c67ff81565b6100d573a63f56985f9c7f3bc9ffc5685535649e0c1a55f381565b6100a7670de0b6b3a764000081565b6100d573be16244eae9837219147384c8a7560ba1494626281565b6100d5738d09a4502cc8cf1547ad300e066060d043f6982d81565b6100d5733f1c547b21f65e10480de3ad8e19faac46c9503481565b5f738d09a4502cc8cf1547ad300e066060d043f6982c196001600160a01b0383160161024457604051630f451f7160e31b8152670de0b6b3a76400006004820152733f1c547b21f65e10480de3ad8e19faac46c9503490637a28fb88906024015b602060405180830381865afa15801561021a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061023e9190610500565b92915050565b73a63f56985f9c7f3bc9ffc5685535649e0c1a55f2196001600160a01b0383160161036e5773a63f56985f9c7f3bc9ffc5685535649e0c1a55f36001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102dd9190610500565b670de0b6b3a764000073a63f56985f9c7f3bc9ffc5685535649e0c1a55f36001600160a01b03166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa158015610336573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061035a9190610500565b6103649190610517565b61023e919061053a565b73baacdcc565006b6429f57bc0f436dfaf14a526b0196001600160a01b038316016103d25760405163266d6a8360e11b8152670de0b6b3a7640000600482015273baacdcc565006b6429f57bc0f436dfaf14a526b190634cdad506906024016101ff565b737322c24752f79c05ffd1e2a6fcb97020c1c264f0196001600160a01b0383160161044757737322c24752f79c05ffd1e2a6fcb97020c1c264f16001600160a01b031663e6aa216c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561021a573d5f803e3d5ffd5b73e3c063b1bee9de02eb28352b55d49d85514c67fe196001600160a01b038316016104ab57604051631624304760e21b8152670de0b6b3a7640000600482015273be16244eae9837219147384c8a7560ba1494626290635890c11c906024016101ff565b60405163ee84f40b60e01b81526001600160a01b038316600482015260240160405180910390fd5b5f602082840312156104e3575f80fd5b81356001600160a01b03811681146104f9575f80fd5b9392505050565b5f60208284031215610510575f80fd5b5051919050565b808202811582820484141761023e57634e487b7160e01b5f52601160045260245ffd5b5f8261055457634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212205469ed2f2befa6e9bdcdd85edd01fa214b44c00855324b5c6d7ab53762322f1064736f6c63430008180033", + "nonce": "0x664", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xe5a5f4e7ffb7371dfa0bb2572ffa5d39008b5bbd4411ee5c04c5f354aacedde7", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0xd68c29263f6dc2ff8d9307b3afacd6d6fdefbb3a", + "function": null, + "arguments": [ + "0x94009d1296dc2e6370Aa34c94BEDFeD55f96a276", + "0x62173555C27C67644C5634e114e42A63A59CD7A5", + "0x" + ], + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0xce718", + "value": "0x0", + "input": "0x60a060405260405162000e5038038062000e508339810160408190526200002691620003bc565b828162000034828262000099565b50508160405162000045906200035a565b6001600160a01b039091168152602001604051809103905ff0801580156200006f573d5f803e3d5ffd5b506001600160a01b0316608052620000906200008a60805190565b620000fe565b505050620004b3565b620000a4826200016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000f057620000eb8282620001ee565b505050565b620000fa62000267565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6200013f5f8051602062000e30833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16200016c8162000289565b50565b806001600160a01b03163b5f03620001aa57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516200020c919062000496565b5f60405180830381855af49150503d805f811462000246576040519150601f19603f3d011682016040523d82523d5f602084013e6200024b565b606091505b5090925090506200025e858383620002ca565b95945050505050565b3415620002875760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b038116620002b457604051633173bdd160e11b81525f6004820152602401620001a1565b805f8051602062000e30833981519152620001cd565b606082620002e357620002dd8262000330565b62000329565b8151158015620002fb57506001600160a01b0384163b155b156200032657604051639996b31560e01b81526001600160a01b0385166004820152602401620001a1565b50805b9392505050565b805115620003415780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6104fc806200093483390190565b80516001600160a01b03811681146200037f575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620003b45781810151838201526020016200039a565b50505f910152565b5f805f60608486031215620003cf575f80fd5b620003da8462000368565b9250620003ea6020850162000368565b60408501519092506001600160401b038082111562000407575f80fd5b818601915086601f8301126200041b575f80fd5b81518181111562000430576200043062000384565b604051601f8201601f19908116603f011681019083821181831017156200045b576200045b62000384565b8160405282815289602084870101111562000474575f80fd5b6200048783602083016020880162000398565b80955050505050509250925092565b5f8251620004a981846020870162000398565b9190910192915050565b608051610469620004cb5f395f601001526104695ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007a575f356001600160e01b03191663278f794360e11b14610070576040516334ad5dbb60e21b815260040160405180910390fd5b610078610082565b565b6100786100b0565b5f806100913660048184610303565b81019061009e919061033e565b915091506100ac82826100c0565b5050565b6100786100bb61011a565b610151565b6100c98261016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101125761010d82826101ea565b505050565b6100ac61025c565b5f61014c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e80801561016b573d5ff35b3d5ffd5b806001600160a01b03163b5f036101a957604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102069190610407565b5f60405180830381855af49150503d805f811461023e576040519150601f19603f3d011682016040523d82523d5f602084013e610243565b606091505b509150915061025385838361027b565b95945050505050565b34156100785760405163b398979f60e01b815260040160405180910390fd5b6060826102905761028b826102da565b6102d3565b81511580156102a757506001600160a01b0384163b155b156102d057604051639996b31560e01b81526001600160a01b03851660048201526024016101a0565b50805b9392505050565b8051156102ea5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610311575f80fd5b8386111561031d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561034f575f80fd5b82356001600160a01b0381168114610365575f80fd5b9150602083013567ffffffffffffffff80821115610381575f80fd5b818501915085601f830112610394575f80fd5b8135818111156103a6576103a661032a565b604051601f8201601f19908116603f011681019083821181831017156103ce576103ce61032a565b816040528281528860208487010111156103e6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610426576020818601810151858301520161040c565b505f92019182525091905056fea2646970667358221220e2efdc1b8b8352056043aec80c210e936ef943e06eb728a94ee6133503eb49ba64736f6c63430008180033608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea264697066735822122014115c860f57a54eed5f443866a2dc591c7925fc2fe52248ef9f9382627684fd64736f6c63430008180033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610300000000000000000000000094009d1296dc2e6370aa34c94bedfed55f96a27600000000000000000000000062173555c27c67644c5634e114e42a63a59cd7a500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x665", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0xd7e36d7f08ea756bb699b679b49f3095cb6f7ab8", + "initCode": "0x608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea264697066735822122014115c860f57a54eed5f443866a2dc591c7925fc2fe52248ef9f9382627684fd64736f6c6343000818003300000000000000000000000062173555c27c67644c5634e114e42a63a59cd7a5" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x187d2aca1c90491cfb211788f56b6e033489f09a5946dbfe66e31a5166f709ed", + "transactionType": "CREATE", + "contractName": "EigenStrategyManager", + "contractAddress": "0xc599064e66fb509fd49b5083896649a742066758", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0x29cf5c", + "value": "0x0", + "input": "0x608060405234801561000f575f80fd5b5061251c8061001d5f395ff3fe608060405234801561000f575f80fd5b50600436106101c6575f3560e01c806391d14854116100fe578063c1fe3e481161009e578063db7711c61161006e578063db7711c614610426578063e63ab1e914610439578063ea4d3c9b14610460578063fb1bb9de14610473575f80fd5b8063c1fe3e48146103da578063d547741f146103ed578063da5be02214610400578063daba667d14610413575f80fd5b8063a217fddf116100d9578063a217fddf14610380578063aa388af614610387578063af9ba225146103b4578063b9ceea0d146103c7575f80fd5b806391d14854146103475780639a2be4af1461035a5780639be323f41461036c575f80fd5b806339ebf823116101695780635ffcfdc7116101445780635ffcfdc7146102fb57806372cb5d971461030e57806374f2ca05146103215780637c0867af14610334575f80fd5b806339ebf823146102ad5780634aa07e64146102d55780634e6c9766146102e8575f80fd5b8063248a9ca3116101a4578063248a9ca3146102475780632f2ff15d1461025a57806336568abe1461026f57806339b70e3814610282575f80fd5b806301ffc9a7146101ca5780630b725136146101f25780630b74ce8c14610212575b5f80fd5b6101dd6101d8366004611e0c565b61049a565b60405190151581526020015b60405180910390f35b610205610200366004611e73565b6104d0565b6040516101e99190611eeb565b6102397f5604e2fe54b4de17b81a5ded6f82357d742fd2722d67304e37ff20bd589b4f3881565b6040519081526020016101e9565b610239610255366004611efd565b6106c0565b61026d610268366004611f28565b6106e0565b005b61026d61027d366004611f28565b610702565b600154610295906001600160a01b031681565b6040516001600160a01b0390911681526020016101e9565b6102956102bb366004611f56565b60046020525f90815260409020546001600160a01b031681565b600554610295906001600160a01b031681565b600754610295906001600160a01b031681565b61026d6103093660046120a8565b61073a565b61026d61031c36600461210f565b61078d565b61023961032f366004611f56565b61096a565b600354610295906001600160a01b031681565b6101dd610355366004611f28565b610a6e565b5f54610295906001600160a01b031681565b6102395f805160206124c783398151915281565b6102395f81565b6101dd610395366004611f56565b6001600160a01b039081165f9081526004602052604090205416151590565b6102396103c236600461213b565b610aa4565b61026d6103d5366004612165565b610b67565b600854610295906001600160a01b031681565b61026d6103fb366004611f28565b6112cb565b61026d61040e366004611e73565b6112e7565b600654610295906001600160a01b031681565b61023961043436600461213b565b611389565b6102397f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b600254610295906001600160a01b031681565b6102397f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a81565b5f6001600160e01b03198216637965db0b60e01b14806104ca57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060816001600160401b038111156104ea576104ea611f71565b604051908082528060200260200182016040528015610513578160200160208202803683370190505b5090505f60035f9054906101000a90046001600160a01b03166001600160a01b031663a1174e7d6040518163ffffffff1660e01b81526004015f60405180830381865afa158015610566573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261058d919081019061219c565b8051909150835f5b818110156106b6575f8787838181106105b0576105b0612230565b90506020020160208101906105c59190611f56565b90505f5b848110156106ac575f8682815181106105e4576105e4612230565b6020908102919091018101516001600160a01b038581165f9081526004938490526040808220549051630aa794bf60e31b81528385169581019590955292945092610676928792169063553ca5f8906024015b602060405180830381865afa158015610652573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104349190612244565b90508089868151811061068b5761068b612230565b6020026020010181815161069f919061225b565b90525050506001016105c9565b5050600101610595565b5050505092915050565b5f9081525f805160206124a7833981519152602052604090206001015490565b6106e9826106c0565b6106f281611460565b6106fc838361146d565b50505050565b6001600160a01b038116331461072b5760405163334bd91960e11b815260040160405180910390fd5b610735828261150e565b505050565b5f805160206124c783398151915261075181611460565b610759611587565b6107648484846115d1565b6106fc60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f5604e2fe54b4de17b81a5ded6f82357d742fd2722d67304e37ff20bd589b4f386107b781611460565b826001600160a01b0381166107df5760405163d92e233d60e01b815260040160405180910390fd5b826001600160a01b0381166108075760405163d92e233d60e01b815260040160405180910390fd5b846001600160a01b0316846001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa15801561084d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610871919061227a565b6001600160a01b0316146109115784846001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108e0919061227a565b60405163d779457160e01b81526001600160a01b039283166004820152911660248201526044015b60405180910390fd5b6001600160a01b038581165f8181526004602052604080822080546001600160a01b0319169489169485179055517f5f6921933580ca0adbbb669ff049927ba73230114570507fc8e10f0758f1d8049190a35050505050565b6001600160a01b038181165f908152600460205260408120549091166109ae5760405163508516b160e11b81526001600160a01b0383166004820152602401610908565b6003546040805163a1174e7d60e01b815290515f926001600160a01b03169163a1174e7d91600480830192869291908290030181865afa1580156109f4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610a1b919081019061219c565b80519091505f5b81811015610a66575f838281518110610a3d57610a3d612230565b60200260200101519050610a518682611a3f565b610a5b908661225b565b945050600101610a22565b505050919050565b5f9182525f805160206124a7833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6001600160a01b038281165f90815260046020526040812054909116610ae85760405163508516b160e11b81526001600160a01b0384166004820152602401610908565b600354604051630735424b60e11b8152600481018490525f916001600160a01b031690630e6a849690602401602060405180830381865afa158015610b2f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b53919061227a565b9050610b5f8482611a3f565b949350505050565b610b776080820160608301611f56565b6001600160a01b038116610b9e5760405163d92e233d60e01b815260040160405180910390fd5b610bae60e0830160c08401611f56565b6001600160a01b038116610bd55760405163d92e233d60e01b815260040160405180910390fd5b610be6610100840160e08501611f56565b6001600160a01b038116610c0d5760405163d92e233d60e01b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610c515750825b90505f826001600160401b03166001148015610c6c5750303b155b905081158015610c7a575080155b15610c985760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610cc257845460ff60401b1916600160401b1785555b610cca611a9a565b610ce35f610cde60e08c0160c08d01611f56565b61146d565b50610d1a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610cde6101408c016101208d01611f56565b50610d517f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a610cde6101208c016101008d01611f56565b50610d745f805160206124c7833981519152610cde6101008c0160e08d01611f56565b50610dab7f5604e2fe54b4de17b81a5ded6f82357d742fd2722d67304e37ff20bd589b4f38610cde6101608c016101408d01611f56565b505f5b610db88a80612295565b9050811015611055575f610dcc8b80612295565b83818110610ddc57610ddc612230565b9050602002016020810190610df19190611f56565b6001600160a01b03161480610e3f57505f610e0f60208c018c612295565b83818110610e1f57610e1f612230565b9050602002016020810190610e349190611f56565b6001600160a01b0316145b15610e5d5760405163d92e233d60e01b815260040160405180910390fd5b5f600481610e6b8d80612295565b85818110610e7b57610e7b612230565b9050602002016020810190610e909190611f56565b6001600160a01b03908116825260208201929092526040015f20541614610f0557610ebb8a80612295565b82818110610ecb57610ecb612230565b9050602002016020810190610ee09190611f56565b604051634af8dd4d60e11b81526001600160a01b039091166004820152602401610908565b610f1260208b018b612295565b82818110610f2257610f22612230565b9050602002016020810190610f379190611f56565b60045f610f448d80612295565b85818110610f5457610f54612230565b9050602002016020810190610f699190611f56565b6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550898060200190610fbb9190612295565b82818110610fcb57610fcb612230565b9050602002016020810190610fe09190611f56565b6001600160a01b0316610ff38b80612295565b8381811061100357611003612230565b90506020020160208101906110189190611f56565b6001600160a01b03167f5f6921933580ca0adbbb669ff049927ba73230114570507fc8e10f0758f1d80460405160405180910390a3600101610dae565b5061106660608a0160408b01611f56565b5f80546001600160a01b0319166001600160a01b039290921691909117905561109560808a0160608b01611f56565b600180546001600160a01b0319166001600160a01b03929092169190911790556110c560a08a0160808b01611f56565b600280546001600160a01b0319166001600160a01b03929092169190911790556110f560c08a0160a08b01611f56565b600380546001600160a01b0319166001600160a01b03929092169190911790556111276101808a016101608b01611f56565b600580546001600160a01b0319166001600160a01b03929092169190911790556111596101a08a016101808b01611f56565b600680546001600160a01b0319166001600160a01b039283161790556005546040805163183fc7c960e31b81529051919092169163c1fe3e489160048083019260209291908290030181865afa1580156111b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111d9919061227a565b600880546001600160a01b0319166001600160a01b03928316179055600654604080516338d52e0f60e01b8152905191909216916338d52e0f9160048083019260209291908290030181865afa158015611235573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611259919061227a565b600780546001600160a01b0319166001600160a01b039290921691909117905583156112c057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2906020015b60405180910390a15b505050505050505050565b6112d4826106c0565b6112dd81611460565b6106fc838361150e565b5f805160206124c78339815191526112fe81611460565b611306611587565b5f5b8281101561135f575f84848381811061132357611323612230565b905060200281019061133591906122da565b61133e906122f8565b9050611356815f0151826020015183604001516115d1565b50600101611308565b5061073560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6005545f906001600160a01b03908116908416036114135760055460405162b0e38960e81b8152600481018490526001600160a01b039091169063b0e38900906024015b602060405180830381865afa1580156113e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061140c9190612244565b90506104ca565b6006546001600160a01b039081169084160361145a5760065460405163ef8b30f760e01b8152600481018490526001600160a01b039091169063ef8b30f7906024016113cd565b50919050565b61146a8133611aa4565b50565b5f5f805160206124a78339815191526114868484610a6e565b611505575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556114bb3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506104ca565b5f9150506104ca565b5f5f805160206124a78339815191526115278484610a6e565b15611505575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506104ca565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016115cb57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b815181518082146115ff576040516355c5b3e360e11b81526004810183905260248101829052604401610908565b600354604051630735424b60e11b8152600481018790525f916001600160a01b031690630e6a849690602401602060405180830381865afa158015611646573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166a919061227a565b90506001600160a01b03811661169657604051630fd3716f60e01b815260048101879052602401610908565b5f836001600160401b038111156116af576116af611f71565b6040519080825280602002602001820160405280156116d8578160200160208202803683370190505b5090505f5b848110156117d0575f8782815181106116f8576116f8612230565b6020026020010151905086828151811061171457611714612230565b60200260200101515f036117585786828151811061173457611734612230565b602002602001015160405163fdea5f4d60e01b815260040161090891815260200190565b6001600160a01b038082165f90815260046020526040902054168061179b57604051634234b21b60e11b81526001600160a01b0383166004820152602401610908565b808484815181106117ae576117ae612230565b6001600160a01b039092166020928302919091019091015250506001016116dd565b505f5460405163071794d960e31b81526001600160a01b03909116906338bca6c89061180290899089906004016123bb565b5f604051808303815f87803b158015611819575f80fd5b505af115801561182b573d5f803e3d5ffd5b505050505f846001600160401b0381111561184857611848611f71565b604051908082528060200260200182016040528015611871578160200160208202803683370190505b5090505f846001600160401b0381111561188d5761188d611f71565b6040519080825280602002602001820160405280156118b6578160200160208202803683370190505b5090505f5b86811015611974575f806119018b84815181106118da576118da612230565b60200260200101518b85815181106118f4576118f4612230565b6020026020010151611ae1565b915091508185848151811061191857611918612230565b60200260200101906001600160a01b031690816001600160a01b0316815250508084848151811061194b5761194b612230565b602090810291909101015261196a6001600160a01b0383168883611bde565b50506001016118bb565b50887f73aaca990b709624ed7bf23319e478279075f1941e8b6546adedb985d67979b989896040516119a79291906123bb565b60405180910390a260405163b778bf7b60e01b81526001600160a01b0385169063b778bf7b906119df908590859088906004016123e8565b5f604051808303815f87803b1580156119f6575f80fd5b505af1158015611a08573d5f803e3d5ffd5b505050507f94baf291029a59fe5651fb679bc5b38c0924cda9db75126bc7ec9e84bf5b1c2e8282856040516112b7939291906123e8565b6001600160a01b038281165f908152600460208190526040808320549051630aa794bf60e31b81528585169281019290925291928392611a8e928792919091169063553ca5f890602401610637565b9050610b5f818361225b565b611aa2611c30565b565b611aae8282610a6e565b611add5760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610908565b5050565b6005545f9081906001600160a01b0390811690851603611b7657600854600554604051636f074d1f60e11b8152600481018690526001600160a01b03928316945091169063de0e9a3e906024015b6020604051808303815f875af1158015611b4b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b6f9190612244565b9050611bd7565b6006546001600160a01b0390811690851603611bd157600754600654604051635d043b2960e11b815260048101869052306024820181905260448201526001600160a01b03928316945091169063ba08765290606401611b2f565b50829050815b9250929050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610735908490611c79565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611aa257604051631afcd79f60e31b815260040160405180910390fd5b5f611c8d6001600160a01b03841683611cda565b905080515f14158015611cb1575080806020019051810190611caf919061245b565b155b1561073557604051635274afe760e01b81526001600160a01b0384166004820152602401610908565b6060611ce783835f611cee565b9392505050565b606081471015611d135760405163cd78605960e01b8152306004820152602401610908565b5f80856001600160a01b03168486604051611d2e919061247a565b5f6040518083038185875af1925050503d805f8114611d68576040519150601f19603f3d011682016040523d82523d5f602084013e611d6d565b606091505b5091509150611d7d868383611d87565b9695505050505050565b606082611d9c57611d9782611de3565b611ce7565b8151158015611db357506001600160a01b0384163b155b15611ddc57604051639996b31560e01b81526001600160a01b0385166004820152602401610908565b5080611ce7565b805115611df35780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f60208284031215611e1c575f80fd5b81356001600160e01b031981168114611ce7575f80fd5b5f8083601f840112611e43575f80fd5b5081356001600160401b03811115611e59575f80fd5b6020830191508360208260051b8501011115611bd7575f80fd5b5f8060208385031215611e84575f80fd5b82356001600160401b03811115611e99575f80fd5b611ea585828601611e33565b90969095509350505050565b5f815180845260208085019450602084015f5b83811015611ee057815187529582019590820190600101611ec4565b509495945050505050565b602081525f611ce76020830184611eb1565b5f60208284031215611f0d575f80fd5b5035919050565b6001600160a01b038116811461146a575f80fd5b5f8060408385031215611f39575f80fd5b823591506020830135611f4b81611f14565b809150509250929050565b5f60208284031215611f66575f80fd5b8135611ce781611f14565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715611fad57611fad611f71565b604052919050565b5f6001600160401b03821115611fcd57611fcd611f71565b5060051b60200190565b5f82601f830112611fe6575f80fd5b81356020611ffb611ff683611fb5565b611f85565b8083825260208201915060208460051b87010193508684111561201c575f80fd5b602086015b8481101561204157803561203481611f14565b8352918301918301612021565b509695505050505050565b5f82601f83011261205b575f80fd5b8135602061206b611ff683611fb5565b8083825260208201915060208460051b87010193508684111561208c575f80fd5b602086015b848110156120415780358352918301918301612091565b5f805f606084860312156120ba575f80fd5b8335925060208401356001600160401b03808211156120d7575f80fd5b6120e387838801611fd7565b935060408601359150808211156120f8575f80fd5b506121058682870161204c565b9150509250925092565b5f8060408385031215612120575f80fd5b823561212b81611f14565b91506020830135611f4b81611f14565b5f806040838503121561214c575f80fd5b823561215781611f14565b946020939093013593505050565b5f60208284031215612175575f80fd5b81356001600160401b0381111561218a575f80fd5b82016101a08185031215611ce7575f80fd5b5f60208083850312156121ad575f80fd5b82516001600160401b038111156121c2575f80fd5b8301601f810185136121d2575f80fd5b80516121e0611ff682611fb5565b81815260059190911b820183019083810190878311156121fe575f80fd5b928401925b8284101561222557835161221681611f14565b82529284019290840190612203565b979650505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612254575f80fd5b5051919050565b808201808211156104ca57634e487b7160e01b5f52601160045260245ffd5b5f6020828403121561228a575f80fd5b8151611ce781611f14565b5f808335601e198436030181126122aa575f80fd5b8301803591506001600160401b038211156122c3575f80fd5b6020019150600581901b3603821315611bd7575f80fd5b5f8235605e198336030181126122ee575f80fd5b9190910192915050565b5f60608236031215612308575f80fd5b604051606081016001600160401b03828210818311171561232b5761232b611f71565b81604052843583526020850135915080821115612346575f80fd5b61235236838701611fd7565b6020840152604085013591508082111561236a575f80fd5b506123773682860161204c565b60408301525092915050565b5f815180845260208085019450602084015f5b83811015611ee05781516001600160a01b031687529582019590820190600101612396565b604081525f6123cd6040830185612383565b82810360208401526123df8185611eb1565b95945050505050565b606081525f6123fa6060830186612383565b6020838203602085015261240e8287611eb1565b8481036040860152855180825260208088019450909101905f5b8181101561244d5784516001600160a01b031683529383019391830191600101612428565b509098975050505050505050565b5f6020828403121561246b575f80fd5b81518015158114611ce7575f80fd5b5f82515f5b81811015612499576020818601810151858301520161247f565b505f92019182525091905056fe02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800d804c5bf32ccb7c8f087c7a3be22668464f9b4302aec069f690a2c9ba96fc026a2646970667358221220abc51e1e10bc59c4461893f126e5d120d9ce46b4a57e3c6ab37927589cb4b19864736f6c63430008180033", + "nonce": "0x666", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xbcc7ac936bb3ed000af681f56d01f064818ca4d495f89a95e3dbe57ee4f33338", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0xa0a11a9b84bf87c0323bc183715a22ec7881b7fc", + "function": null, + "arguments": [ + "0xc599064e66FB509FD49B5083896649a742066758", + "0x62173555C27C67644C5634e114e42A63A59CD7A5", + "0x" + ], + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0xce728", + "value": "0x0", + "input": "0x60a060405260405162000e5038038062000e508339810160408190526200002691620003bc565b828162000034828262000099565b50508160405162000045906200035a565b6001600160a01b039091168152602001604051809103905ff0801580156200006f573d5f803e3d5ffd5b506001600160a01b0316608052620000906200008a60805190565b620000fe565b505050620004b3565b620000a4826200016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000f057620000eb8282620001ee565b505050565b620000fa62000267565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6200013f5f8051602062000e30833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16200016c8162000289565b50565b806001600160a01b03163b5f03620001aa57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516200020c919062000496565b5f60405180830381855af49150503d805f811462000246576040519150601f19603f3d011682016040523d82523d5f602084013e6200024b565b606091505b5090925090506200025e858383620002ca565b95945050505050565b3415620002875760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b038116620002b457604051633173bdd160e11b81525f6004820152602401620001a1565b805f8051602062000e30833981519152620001cd565b606082620002e357620002dd8262000330565b62000329565b8151158015620002fb57506001600160a01b0384163b155b156200032657604051639996b31560e01b81526001600160a01b0385166004820152602401620001a1565b50805b9392505050565b805115620003415780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6104fc806200093483390190565b80516001600160a01b03811681146200037f575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620003b45781810151838201526020016200039a565b50505f910152565b5f805f60608486031215620003cf575f80fd5b620003da8462000368565b9250620003ea6020850162000368565b60408501519092506001600160401b038082111562000407575f80fd5b818601915086601f8301126200041b575f80fd5b81518181111562000430576200043062000384565b604051601f8201601f19908116603f011681019083821181831017156200045b576200045b62000384565b8160405282815289602084870101111562000474575f80fd5b6200048783602083016020880162000398565b80955050505050509250925092565b5f8251620004a981846020870162000398565b9190910192915050565b608051610469620004cb5f395f601001526104695ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007a575f356001600160e01b03191663278f794360e11b14610070576040516334ad5dbb60e21b815260040160405180910390fd5b610078610082565b565b6100786100b0565b5f806100913660048184610303565b81019061009e919061033e565b915091506100ac82826100c0565b5050565b6100786100bb61011a565b610151565b6100c98261016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101125761010d82826101ea565b505050565b6100ac61025c565b5f61014c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e80801561016b573d5ff35b3d5ffd5b806001600160a01b03163b5f036101a957604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102069190610407565b5f60405180830381855af49150503d805f811461023e576040519150601f19603f3d011682016040523d82523d5f602084013e610243565b606091505b509150915061025385838361027b565b95945050505050565b34156100785760405163b398979f60e01b815260040160405180910390fd5b6060826102905761028b826102da565b6102d3565b81511580156102a757506001600160a01b0384163b155b156102d057604051639996b31560e01b81526001600160a01b03851660048201526024016101a0565b50805b9392505050565b8051156102ea5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610311575f80fd5b8386111561031d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561034f575f80fd5b82356001600160a01b0381168114610365575f80fd5b9150602083013567ffffffffffffffff80821115610381575f80fd5b818501915085601f830112610394575f80fd5b8135818111156103a6576103a661032a565b604051601f8201601f19908116603f011681019083821181831017156103ce576103ce61032a565b816040528281528860208487010111156103e6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610426576020818601810151858301520161040c565b505f92019182525091905056fea2646970667358221220e2efdc1b8b8352056043aec80c210e936ef943e06eb728a94ee6133503eb49ba64736f6c63430008180033608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea264697066735822122014115c860f57a54eed5f443866a2dc591c7925fc2fe52248ef9f9382627684fd64736f6c63430008180033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000c599064e66fb509fd49b5083896649a74206675800000000000000000000000062173555c27c67644c5634e114e42a63a59cd7a500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x667", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0x010c60d663fdddaa076f0ce63f6692f0b5605fe5", + "initCode": "0x608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea264697066735822122014115c860f57a54eed5f443866a2dc591c7925fc2fe52248ef9f9382627684fd64736f6c6343000818003300000000000000000000000062173555c27c67644c5634e114e42a63a59cd7a5" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x2d04d47dba29824736bd8f6fd51f30dd359ace8583a68f064f5c24487e6342e4", + "transactionType": "CREATE", + "contractName": "TokenStakingNodesManager", + "contractAddress": "0xad89fd40be78811e279c89ff15dc3b831785192d", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0x23bc82", + "value": "0x0", + "input": "0x608060405234801561000f575f80fd5b5061001861001d565b6100cf565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161561006d5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100cc5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b611f2e806100dc5f395ff3fe608060405234801562000010575f80fd5b5060043610620001f8575f3560e01c8063a217fddf1162000113578063d547741f11620000ab578063ea4d3c9b1162000077578063ea4d3c9b14620004b1578063f33de6c014620004c5578063f9645e7414620004ce578063fb1bb9de14620004e5575f80fd5b8063d547741f1462000425578063e6319b41146200043c578063e63ab1e91462000461578063e967f4b61462000489575f80fd5b8063cb70bd7911620000eb578063cb70bd7914620003e6578063ce8572d314620003f0578063d131585d1462000407578063d26095201462000411575f80fd5b8063a217fddf146200039f578063a39cebe914620003a7578063c4240d2514620003be575f80fd5b80632f2ff15d116200019357806361464d2d116200015f57806361464d2d14620003305780637eb694a8146200034757806391d14854146200036f578063a1174e7d1462000386575f80fd5b80632f2ff15d14620002db57806336568abe14620002f257806339b70e38146200030957806352f94f98146200031c575f80fd5b80630e6a849611620001d35780630e6a849614620002645780631c53c2801462000294578063248a9ca314620002ab5780632d321fc714620002c2575f80fd5b806301ffc9a714620001fc57806304f67aa1146200022857806306a78ba6146200024d575b5f80fd5b620002136200020d366004620013b1565b6200050d565b60405190151581526020015b60405180910390f35b6200023e5f8051602062001eb983398151915281565b6040519081526020016200021f565b620002136200025e366004620013f6565b62000544565b6200027b6200027536600462001414565b62000571565b6040516001600160a01b0390911681526020016200021f565b6200027b620002a536600462001414565b620005ce565b6200023e620002bc36600462001414565b620005f7565b620002d9620002d3366004620013f6565b62000618565b005b620002d9620002ec3660046200142c565b62000727565b620002d9620003033660046200142c565b6200074f565b5f546200027b906001600160a01b031681565b6002546200027b906001600160a01b031681565b620002d96200034136600462001414565b6200078a565b6200023e7f9cb3b45ba8017381348975633951e84d77cd512b58a6ebd2533f422ddd94389081565b62000213620003803660046200142c565b620007e0565b6200039062000817565b6040516200021f91906200145d565b6200023e5f81565b620002d9620003b8366004620013f6565b62000879565b6200023e7fc54b323804427575ac6f9f18bf0a027fc2cb84d5af10f03a09d54fd69842fde981565b6200023e60055481565b6200021362000401366004620013f6565b620009d9565b6200027b62000a06565b6003546200027b906001600160a01b031681565b620002d9620004363660046200142c565b62000b81565b620002136200044d366004620013f6565b6002546001600160a01b0391821691161490565b6200023e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6200023e7fd47f55d1ccb2b675ff4066bc639e489a7cb307c80ad9e87fc3104cf217c2b3ee81565b6001546200027b906001600160a01b031681565b6004546200023e565b620002d9620004df366004620014ab565b62000ba3565b6200023e7f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a81565b5f6001600160e01b03198216637965db0b60e01b14806200053e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f6200053e7f9cb3b45ba8017381348975633951e84d77cd512b58a6ebd2533f422ddd94389083620007e0565b6004545f9082106200059e57604051631ca9e25f60e01b8152600481018390526024015b60405180910390fd5b60048281548110620005b457620005b4620014c3565b5f918252602090912001546001600160a01b031692915050565b60048181548110620005de575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f9081525f8051602062001ed9833981519152602052604090206001015490565b5f8051602062001eb983398151915262000632816200102e565b816001600160a01b0381166200065b5760405163d92e233d60e01b815260040160405180910390fd5b6003546001600160a01b031615620006865760405163a81fbfef60e01b815260040160405180910390fd5b8230604051620006969062001395565b6001600160a01b03928316815291166020820152604001604051809103905ff080158015620006c7573d5f803e3d5ffd5b50600380546001600160a01b0319166001600160a01b039283169081179091556040805191825291851660208201527fd13f13f7d12bbc1ec3c2f99ed663d6b643f722a4654c11d4325b35ed88d9fb7591015b60405180910390a1505050565b6200073282620005f7565b6200073d816200102e565b6200074983836200103d565b50505050565b6001600160a01b0381163314620007795760405163334bd91960e11b815260040160405180910390fd5b620007858282620010e5565b505050565b5f8051602062001eb9833981519152620007a4816200102e565b60058290556040518281527f5179ce38a6079ec731d2e265edcf9e1635e8ac7fd689ad42c5e20a7571c054159060200160405180910390a15050565b5f9182525f8051602062001ed9833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060048054806020026020016040519081016040528092919081815260200182805480156200086f57602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831162000850575b5050505050905090565b5f8051602062001eb983398151915262000893816200102e565b816001600160a01b038116620008bc5760405163d92e233d60e01b815260040160405180910390fd5b6003546001600160a01b0316620008e657604051636aef646b60e11b815260040160405180910390fd5b600354604051631b2ce7f360e11b81526001600160a01b03858116600483015290911690633659cfe6906024015f604051808303815f87803b1580156200092b575f80fd5b505af11580156200093e573d5f803e3d5ffd5b505060045491505f90505b81811015620009905762000987600482815481106200096c576200096c620014c3565b5f918252602090912001546001600160a01b03168362001163565b60010162000949565b50604080516001600160a01b0386168152602081018390527f02c79c1e3f8b682a9487f84feb1ab388b1ebf7a5e85307e941ec19122d2ed14e910160405180910390a150505050565b5f6200053e7fd47f55d1ccb2b675ff4066bc639e489a7cb307c80ad9e87fc3104cf217c2b3ee83620007e0565b6003545f906001600160a01b03168062000a335760405163d92e233d60e01b815260040160405180910390fd5b7fc54b323804427575ac6f9f18bf0a027fc2cb84d5af10f03a09d54fd69842fde962000a5f816200102e565b600454600554811062000a8c57600554604051634ec828df60e11b81526004016200059591815260200190565b6003546040515f916001600160a01b03169062000aa990620013a3565b6001600160a01b0390911681526040602082018190525f90820152606001604051809103905ff08015801562000ae1573d5f803e3d5ffd5b5090508062000af1818462001163565b600480546001810182555f919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b0383169081179091556040805185815260208101929092527fbf09b194225fb976ecbedf24587fc7de2987992ad982f5321a563ce92221000b910160405180910390a194505050505090565b62000b8c82620005f7565b62000b97816200102e565b620007498383620010e5565b62000bb26020820182620013f6565b6001600160a01b03811662000bda5760405163d92e233d60e01b815260040160405180910390fd5b62000bec60a0830160808401620013f6565b6001600160a01b03811662000c145760405163d92e233d60e01b815260040160405180910390fd5b62000c27610100840160e08501620013f6565b6001600160a01b03811662000c4f5760405163d92e233d60e01b815260040160405180910390fd5b62000c6361012085016101008601620013f6565b6001600160a01b03811662000c8b5760405163d92e233d60e01b815260040160405180910390fd5b62000c9f61014086016101208701620013f6565b6001600160a01b03811662000cc75760405163d92e233d60e01b815260040160405180910390fd5b62000cdb61016087016101408801620013f6565b6001600160a01b03811662000d035760405163d92e233d60e01b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f8115801562000d495750825b90505f8267ffffffffffffffff16600114801562000d665750303b155b90508115801562000d75575080155b1562000d945760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831562000dbf57845460ff60401b1916600160401b1785555b62000dc9620012fe565b62000deb5f801b8d608001602081019062000de59190620013f6565b6200103d565b5062000e145f8051602062001eb98339815191528d60e001602081019062000de59190620013f6565b5062000e507f9cb3b45ba8017381348975633951e84d77cd512b58a6ebd2533f422ddd9438908d61010001602081019062000de59190620013f6565b5062000e8c7fc54b323804427575ac6f9f18bf0a027fc2cb84d5af10f03a09d54fd69842fde98d61012001602081019062000de59190620013f6565b5062000ec87fd47f55d1ccb2b675ff4066bc639e489a7cb307c80ad9e87fc3104cf217c2b3ee8d61014001602081019062000de59190620013f6565b5062000f037f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a8d60a001602081019062000de59190620013f6565b5062000f3e7f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a8d60c001602081019062000de59190620013f6565b5062000f4e60208d018d620013f6565b5f80546001600160a01b0319166001600160a01b039290921691909117905562000f7f60408d0160208e01620013f6565b600180546001600160a01b0319166001600160a01b039290921691909117905562000fb160608d0160408e01620013f6565b600280546001600160a01b0319166001600160a01b039290921691909117905560608c013560055583156200102057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050505050565b6200103a81336200130a565b50565b5f5f8051602062001ed9833981519152620010598484620007e0565b620010db575f848152602082815260408083206001600160a01b03871684529091529020805460ff19166001179055620010903390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506200053e565b5f9150506200053e565b5f5f8051602062001ed9833981519152620011018484620007e0565b15620010db575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506200053e565b5f826001600160a01b031663b3c650156040518163ffffffff1660e01b8152600401602060405180830381865afa158015620011a1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620011c79190620014d7565b90508067ffffffffffffffff165f0362000785576040805180820182523081526020810184815291516377b3492760e01b815290516001600160a01b03908116600483015291516024820152908416906377b34927906044015f604051808303815f87803b15801562001238575f80fd5b505af11580156200124b573d5f803e3d5ffd5b50505050826001600160a01b031663b3c650156040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200128c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620012b29190620014d7565b604080516001600160a01b038616815267ffffffffffffffff831660208201529192507fa070c83df7efc58b668afb64705222890e09b4090d56ee9981fc66ac1c552aa191016200071a565b620013086200134b565b565b620013168282620007e0565b620013475760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440162000595565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166200130857604051631afcd79f60e31b815260040160405180910390fd5b610421806200150183390190565b610597806200192283390190565b5f60208284031215620013c2575f80fd5b81356001600160e01b031981168114620013da575f80fd5b9392505050565b6001600160a01b03811681146200103a575f80fd5b5f6020828403121562001407575f80fd5b8135620013da81620013e1565b5f6020828403121562001425575f80fd5b5035919050565b5f80604083850312156200143e575f80fd5b8235915060208301356200145281620013e1565b809150509250929050565b602080825282518282018190525f9190848201906040850190845b818110156200149f5783516001600160a01b03168352928401929184019160010162001478565b50909695505050505050565b5f6101608284031215620014bd575f80fd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215620014e8575f80fd5b815167ffffffffffffffff81168114620013da575f80fdfe608060405234801561000f575f80fd5b5060405161042138038061042183398101604081905261002e9161015f565b806001600160a01b03811661005d57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61006681610077565b50610070826100c6565b5050610190565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b806001600160a01b03163b5f036100fb5760405163211eb15960e21b81526001600160a01b0382166004820152602401610054565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b80516001600160a01b038116811461015a575f80fd5b919050565b5f8060408385031215610170575f80fd5b61017983610144565b915061018760208401610144565b90509250929050565b6102848061019d5f395ff3fe608060405234801561000f575f80fd5b5060043610610055575f3560e01c80633659cfe6146100595780635c60da1b1461006e578063715018a6146100975780638da5cb5b1461009f578063f2fde38b146100af575b5f80fd5b61006c610067366004610221565b6100c2565b005b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b61006c6100d6565b5f546001600160a01b031661007b565b61006c6100bd366004610221565b6100e9565b6100ca610128565b6100d381610154565b50565b6100de610128565b6100e75f6101d2565b565b6100f1610128565b6001600160a01b03811661011f57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6100d3816101d2565b5f546001600160a01b031633146100e75760405163118cdaa760e01b8152336004820152602401610116565b806001600160a01b03163b5f036101895760405163211eb15960e21b81526001600160a01b0382166004820152602401610116565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610231575f80fd5b81356001600160a01b0381168114610247575f80fd5b939250505056fea264697066735822122051214021729642d85d8096f0480a633e01b568c7c6341aefa6d5d9ffda64c54b64736f6c6343000818003360a060405260405161059738038061059783398101604081905261002291610376565b61002c828261003e565b506001600160a01b0316608052610465565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e49190610431565b82610209565b505050565b6100f761027c565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d29190610431565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f80846001600160a01b031684604051610225919061044a565b5f60405180830381855af49150503d805f811461025d576040519150601f19603f3d011682016040523d82523d5f602084013e610262565b606091505b50909250905061027385838361029d565b95945050505050565b341561029b5760405163b398979f60e01b815260040160405180910390fd5b565b6060826102b2576102ad826102fc565b6102f5565b81511580156102c957506001600160a01b0384163b155b156102f257604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b50805b9392505050565b80511561030c5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461033b575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561036e578181015183820152602001610356565b50505f910152565b5f8060408385031215610387575f80fd5b61039083610325565b60208401519092506001600160401b03808211156103ac575f80fd5b818501915085601f8301126103bf575f80fd5b8151818111156103d1576103d1610340565b604051601f8201601f19908116603f011681019083821181831017156103f9576103f9610340565b81604052828152886020848701011115610411575f80fd5b610422836020830160208801610354565b80955050505050509250929050565b5f60208284031215610441575f80fd5b6102f582610325565b5f825161045b818460208701610354565b9190910192915050565b60805161011b61047c5f395f601d015261011b5ff3fe6080604052600a600c565b005b60186014601a565b609d565b565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156076573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906098919060ba565b905090565b365f80375f80365f845af43d5f803e80801560b6573d5ff35b3d5ffd5b5f6020828403121560c9575f80fd5b81516001600160a01b038116811460de575f80fd5b939250505056fea2646970667358221220e5c38403d34721212b2d89b09f482a1aa20ae8f5b480d62b544a36f85fd180c464736f6c6343000818003324791c44c040514a5d2580696fc45e7d3cb6c9fa65bf3db2e4755362d6c155b502dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800a2646970667358221220b5ef4c0c6b965c054cf686d480ad6ee2fc210f465713735ddcdaa47f49c1681d64736f6c63430008180033", + "nonce": "0x668", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xfe46b1270302f7af8e07c7db8e182d3cb34a8d712a0adaa6a1bc6057eae00554", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x5c20d1a85c7d9acb503135a498e26eb55d806552", + "function": null, + "arguments": [ + "0xAD89Fd40BE78811E279C89FF15DC3B831785192D", + "0x62173555C27C67644C5634e114e42A63A59CD7A5", + "0x" + ], + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0xce728", + "value": "0x0", + "input": "0x60a060405260405162000e5038038062000e508339810160408190526200002691620003bc565b828162000034828262000099565b50508160405162000045906200035a565b6001600160a01b039091168152602001604051809103905ff0801580156200006f573d5f803e3d5ffd5b506001600160a01b0316608052620000906200008a60805190565b620000fe565b505050620004b3565b620000a4826200016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000f057620000eb8282620001ee565b505050565b620000fa62000267565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6200013f5f8051602062000e30833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16200016c8162000289565b50565b806001600160a01b03163b5f03620001aa57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516200020c919062000496565b5f60405180830381855af49150503d805f811462000246576040519150601f19603f3d011682016040523d82523d5f602084013e6200024b565b606091505b5090925090506200025e858383620002ca565b95945050505050565b3415620002875760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b038116620002b457604051633173bdd160e11b81525f6004820152602401620001a1565b805f8051602062000e30833981519152620001cd565b606082620002e357620002dd8262000330565b62000329565b8151158015620002fb57506001600160a01b0384163b155b156200032657604051639996b31560e01b81526001600160a01b0385166004820152602401620001a1565b50805b9392505050565b805115620003415780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6104fc806200093483390190565b80516001600160a01b03811681146200037f575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620003b45781810151838201526020016200039a565b50505f910152565b5f805f60608486031215620003cf575f80fd5b620003da8462000368565b9250620003ea6020850162000368565b60408501519092506001600160401b038082111562000407575f80fd5b818601915086601f8301126200041b575f80fd5b81518181111562000430576200043062000384565b604051601f8201601f19908116603f011681019083821181831017156200045b576200045b62000384565b8160405282815289602084870101111562000474575f80fd5b6200048783602083016020880162000398565b80955050505050509250925092565b5f8251620004a981846020870162000398565b9190910192915050565b608051610469620004cb5f395f601001526104695ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007a575f356001600160e01b03191663278f794360e11b14610070576040516334ad5dbb60e21b815260040160405180910390fd5b610078610082565b565b6100786100b0565b5f806100913660048184610303565b81019061009e919061033e565b915091506100ac82826100c0565b5050565b6100786100bb61011a565b610151565b6100c98261016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101125761010d82826101ea565b505050565b6100ac61025c565b5f61014c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e80801561016b573d5ff35b3d5ffd5b806001600160a01b03163b5f036101a957604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102069190610407565b5f60405180830381855af49150503d805f811461023e576040519150601f19603f3d011682016040523d82523d5f602084013e610243565b606091505b509150915061025385838361027b565b95945050505050565b34156100785760405163b398979f60e01b815260040160405180910390fd5b6060826102905761028b826102da565b6102d3565b81511580156102a757506001600160a01b0384163b155b156102d057604051639996b31560e01b81526001600160a01b03851660048201526024016101a0565b50805b9392505050565b8051156102ea5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610311575f80fd5b8386111561031d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561034f575f80fd5b82356001600160a01b0381168114610365575f80fd5b9150602083013567ffffffffffffffff80821115610381575f80fd5b818501915085601f830112610394575f80fd5b8135818111156103a6576103a661032a565b604051601f8201601f19908116603f011681019083821181831017156103ce576103ce61032a565b816040528281528860208487010111156103e6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610426576020818601810151858301520161040c565b505f92019182525091905056fea2646970667358221220e2efdc1b8b8352056043aec80c210e936ef943e06eb728a94ee6133503eb49ba64736f6c63430008180033608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea264697066735822122014115c860f57a54eed5f443866a2dc591c7925fc2fe52248ef9f9382627684fd64736f6c63430008180033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000ad89fd40be78811e279c89ff15dc3b831785192d00000000000000000000000062173555c27c67644c5634e114e42a63a59cd7a500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x669", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0x18ed5129bcefa996b4cade4e614c8941de3126d2", + "initCode": "0x608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea264697066735822122014115c860f57a54eed5f443866a2dc591c7925fc2fe52248ef9f9382627684fd64736f6c6343000818003300000000000000000000000062173555c27c67644c5634e114e42a63a59cd7a5" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x89d77040b390908ad1878c0b3360a72c1d6d606326923be34791c55f255b9bb9", + "transactionType": "CREATE", + "contractName": "AssetRegistry", + "contractAddress": "0x7385f1dbf3b0ee3d85c89a38901aa87333d30946", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0x22e64d", + "value": "0x0", + "input": "0x608060405234801561000f575f80fd5b5061001861001d565b6100cf565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161561006d5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100cc5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b611e57806100dc5f395ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c806370807528116100f3578063c92110c311610093578063e63ab1e91161006e578063e63ab1e9146103cf578063efe0b29c146103f6578063fb1bb9de14610409578063fc1198c014610430575f80fd5b8063c92110c31461037a578063cf35bdd0146103a9578063d547741f146103bc575f80fd5b80639a2be4af116100ce5780639a2be4af14610344578063a217fddf14610357578063a4b32de81461035e578063c5f827e614610372575f80fd5b8063708075281461030657806391d1485414610319578063949db6581461032c575f80fd5b806336568abe1161015e5780635f4caf46116101395780635f4caf46146102bc578063613e85ff146102cf57806367e4ac2c146102e45780636be1fcc3146102f9575f80fd5b806336568abe1461025e57806339b70e381461027157806341fee44a1461029c575f80fd5b80631cbf960d116101995780631cbf960d14610212578063248a9ca314610225578063298410e5146102385780632f2ff15d1461024b575f80fd5b806301e1d114146101bf57806301ffc9a7146101da57806315e09f3c146101fd575b5f80fd5b6101c7610438565b6040519081526020015b60405180910390f35b6101ed6101e83660046118cd565b6104c2565b60405190151581526020016101d1565b61021061020b36600461190f565b6104f8565b005b6101c761022036600461192a565b6107e4565b6101c7610233366004611954565b610914565b61021061024636600461190f565b610934565b61021061025936600461196b565b610bd9565b61021061026c36600461196b565b610bfb565b600354610284906001600160a01b031681565b6040516001600160a01b0390911681526020016101d1565b6102af6102aa36600461190f565b610c33565b6040516101d191906119cd565b6101ed6102ca36600461190f565b610c93565b6102d7610cc9565b6040516101d191906119df565b6102ec610e83565b6040516101d19190611a22565b6002546101ed9060ff1681565b61021061031436600461190f565b610ee2565b6101ed61032736600461196b565b610fe9565b6002546102849061010090046001600160a01b031681565b600454610284906001600160a01b031681565b6101c75f81565b6101c75f80516020611de283398151915281565b61021061101f565b61039c61038836600461190f565b60016020525f908152604090205460ff1681565b6040516101d19190611a62565b6102846103b7366004611954565b611090565b6102106103ca36600461196b565b6110b7565b6101c77f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b610210610404366004611a70565b6110d3565b6101c77f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a81565b6102106115fe565b5f8080610443610cc9565b5f80549192505b818110156104b9575f6104a25f838154811061046857610468611aa8565b905f5260205f20015f9054906101000a90046001600160a01b031685848151811061049557610495611aa8565b60200260200101516107e4565b90506104ae8186611ad0565b94505060010161044a565b50919392505050565b5f6001600160e01b03198216637965db0b60e01b14806104f257506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f80516020611de283398151915261050f81611662565b816001600160a01b0381166105375760405163d92e233d60e01b815260040160405180910390fd5b60025460ff161561055b576040516313d0ff5960e31b815260040160405180910390fd5b60026001600160a01b0384165f9081526001602052604090205460ff16600281111561058957610589611999565b146105b757604051631005a45f60e21b81526001600160a01b03841660048201526024015b60405180910390fd5b600480546040516319b11cab60e31b81526001600160a01b03868116938201939093525f929091169063cd88e55890602401602060405180830381865afa158015610604573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106289190611ae3565b9050801561064c57604051631f17ea1d60e01b8152600481018290526024016105ae565b6003546040516374f2ca0560e01b81526001600160a01b0386811660048301525f9216906374f2ca0590602401602060405180830381865afa158015610694573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106b89190611ae3565b905080156106dc57604051636f024b5160e01b8152600481018290526024016105ae565b5f6106e68661166f565b5f8054919250906106f990600190611afa565b8154811061070957610709611aa8565b5f91825260208220015481546001600160a01b0390911691908390811061073257610732611aa8565b5f918252602082200180546001600160a01b0319166001600160a01b03939093169290921790915580548061076957610769611b0d565b5f82815260208082205f19908401810180546001600160a01b03191690559092019092556001600160a01b03881680835260018252604092839020805460ff1916905591518381527ff166ed9d03804d1c092d69ed29c647b801c58174de928eff484aa9c92f4d5134910160405180910390a2505050505050565b6002546040516305d4ec6560e11b81526001600160a01b0384811660048301525f92839261010090910490911690630ba9d8ca90602401602060405180830381865afa158015610836573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085a9190611ae3565b90505f846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610899573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108bd9190611b21565b90508060ff166012036108ec57670de0b6b3a76400006108dd8584611b41565b6108e79190611b58565b61090b565b6108f781600a611c57565b6109018584611b41565b61090b9190611b58565b95945050505050565b5f9081525f80516020611e02833981519152602052604090206001015490565b5f80516020611de283398151915261094b81611662565b816001600160a01b0381166109735760405163d92e233d60e01b815260040160405180910390fd5b60025460ff1615610997576040516313d0ff5960e31b815260040160405180910390fd5b6001600160a01b0383165f9081526001602052604081205460ff1660028111156109c3576109c3611999565b146109ec5760405163049437a360e21b81526001600160a01b03841660048201526024016105ae565b60035460405163551c457b60e11b81526001600160a01b0385811660048301529091169063aa388af690602401602060405180830381865afa158015610a34573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a589190611c65565b610a805760405163508516b160e11b81526001600160a01b03841660048201526024016105ae565b6002546040516305d4ec6560e11b81526001600160a01b03858116600483015261010090920490911690630ba9d8ca90602401602060405180830381865afa925050508015610aec575060408051601f3d908101601f19168201909252610ae991810190611ae3565b60015b610b1457604051633a798e4760e21b81526001600160a01b03841660048201526024016105ae565b505f8054600180820183557f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390910180546001600160a01b0319166001600160a01b0387169081179091556040805160208082018352848252928552918390529092208251815491929091839160ff1990911690836002811115610b9a57610b9a611999565b0217905550506040516001600160a01b03851691507f0e3c58ebfb2e7465fbb1c32e6b4f40c3c4f5ca77e8218a386aff8617831260d7905f90a2505050565b610be282610914565b610beb81611662565b610bf583836116e5565b50505050565b6001600160a01b0381163314610c245760405163334bd91960e11b815260040160405180910390fd5b610c2e8282611786565b505050565b60408051602080820183525f8083526001600160a01b0385168152600182528390208351918201909352825491929091829060ff166002811115610c7957610c79611999565b6002811115610c8a57610c8a611999565b90525092915050565b5f60016001600160a01b0383165f9081526001602052604090205460ff166002811115610cc257610cc2611999565b1492915050565b5f546060908067ffffffffffffffff811115610ce757610ce7611c84565b604051908082528060200260200182016040528015610d10578160200160208202803683370190505b5060048054604051637063c25360e11b81529294506001600160a01b03169163e0c784a691610d41915f9101611c98565b5f60405180830381865afa158015610d5b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d829190810190611cdb565b6003546040516305b9289b60e11b81529193505f916001600160a01b0390911690630b72513690610db7908490600401611c98565b5f60405180830381865afa158015610dd1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610df89190810190611cdb565b905081815114610e285780516040516355c5b3e360e11b81526105ae918491600401918252602082015260400190565b5f5b82811015610e7d57818181518110610e4457610e44611aa8565b6020026020010151848281518110610e5e57610e5e611aa8565b60200260200101818151610e729190611ad0565b905250600101610e2a565b50505090565b60605f805480602002602001604051908101604052809291908181526020018280548015610ed857602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610eba575b5050505050905090565b5f80516020611de2833981519152610ef981611662565b816001600160a01b038116610f215760405163d92e233d60e01b815260040160405180910390fd5b60025460ff1615610f45576040516313d0ff5960e31b815260040160405180910390fd5b60016001600160a01b0384165f9081526001602052604090205460ff166002811115610f7357610f73611999565b14610f9c57604051637f93962560e01b81526001600160a01b03841660048201526024016105ae565b6001600160a01b0383165f81815260016020526040808220805460ff19166002179055517ffc9274ad64ab0a7d8dedd8c9297fb4e25d7a17eb057457c6bcf2a8f13dc8859c9190a2505050565b5f9182525f80516020611e02833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61104981611662565b6002805460ff191660019081179091556040519081527f31311016d7204faff81880133e3db244ae8a8b9ce15e83e2432258226d15f942906020015b60405180910390a150565b5f818154811061109e575f80fd5b5f918252602090912001546001600160a01b0316905081565b6110c082610914565b6110c981611662565b610bf58383611786565b6110e3604082016020830161190f565b6001600160a01b03811661110a5760405163d92e233d60e01b815260040160405180910390fd5b61111a60a083016080840161190f565b6001600160a01b0381166111415760405163d92e233d60e01b815260040160405180910390fd5b61115160c0840160a0850161190f565b6001600160a01b0381166111785760405163d92e233d60e01b815260040160405180910390fd5b61118860e0850160c0860161190f565b6001600160a01b0381166111af5760405163d92e233d60e01b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f811580156111f45750825b90505f8267ffffffffffffffff1660011480156112105750303b155b90508115801561121e575080155b1561123c5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561126657845460ff60401b1916600160401b1785555b61126e6117ff565b611276611809565b61128f5f61128a60a08d0160808e0161190f565b6116e5565b506112c47f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61128a60c08d0160a08e0161190f565b506112f97f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a61128a60e08d0160c08e0161190f565b5061131c5f80516020611de283398151915261128a6101008d0160e08e0161190f565b5061132d60608b0160408c0161190f565b600380546001600160a01b0319166001600160a01b03929092169190911790555f6113588b80611d94565b905090505f5b81811015611543575f6113718d80611d94565b8381811061138157611381611aa8565b9050602002016020810190611396919061190f565b90506001600160a01b0381166113bf5760405163d92e233d60e01b815260040160405180910390fd5b60016001600160a01b0382165f9081526001602052604090205460ff1660028111156113ed576113ed611999565b0361141657604051630234bb3360e31b81526001600160a01b03821660048201526024016105ae565b60035460405163551c457b60e11b81526001600160a01b0383811660048301529091169063aa388af690602401602060405180830381865afa15801561145e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114829190611c65565b6114aa5760405163508516b160e11b81526001600160a01b03821660048201526024016105ae565b5f8054600180820183557f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390910180546001600160a01b0319166001600160a01b0385169081179091556040805160208082018352848252928552918390529092208251815491929091839160ff199091169083600281111561152f5761152f611999565b0217905550506001909201915061135e9050565b5061155460408c0160208d0161190f565b600280546001600160a01b039290921661010002610100600160a81b031990921691909117905561158b60808c0160608d0161190f565b600480546001600160a01b0319166001600160a01b03929092169190911790555083156115f257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b7f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a61162881611662565b6002805460ff191690556040515f81527f31311016d7204faff81880133e3db244ae8a8b9ce15e83e2432258226d15f94290602001611085565b61166c8133611819565b50565b5f8054815b818110156116c057836001600160a01b03165f828154811061169857611698611aa8565b5f918252602090912001546001600160a01b0316036116b8579392505050565b600101611674565b5060405163067c787f60e41b81526001600160a01b03841660048201526024016105ae565b5f5f80516020611e028339815191526116fe8484610fe9565b61177d575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556117333390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506104f2565b5f9150506104f2565b5f5f80516020611e0283398151915261179f8484610fe9565b1561177d575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506104f2565b611807611856565b565b611811611856565b61180761189f565b6118238282610fe9565b6118525760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016105ae565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661180757604051631afcd79f60e31b815260040160405180910390fd5b6118a7611856565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f602082840312156118dd575f80fd5b81356001600160e01b0319811681146118f4575f80fd5b9392505050565b6001600160a01b038116811461166c575f80fd5b5f6020828403121561191f575f80fd5b81356118f4816118fb565b5f806040838503121561193b575f80fd5b8235611946816118fb565b946020939093013593505050565b5f60208284031215611964575f80fd5b5035919050565b5f806040838503121561197c575f80fd5b82359150602083013561198e816118fb565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b600381106119c957634e487b7160e01b5f52602160045260245ffd5b9052565b5f6020820190506104f28284516119ad565b602080825282518282018190525f9190848201906040850190845b81811015611a16578351835292840192918401916001016119fa565b50909695505050505050565b602080825282518282018190525f9190848201906040850190845b81811015611a165783516001600160a01b031683529284019291840191600101611a3d565b602081016104f282846119ad565b5f60208284031215611a80575f80fd5b813567ffffffffffffffff811115611a96575f80fd5b820161010081850312156118f4575f80fd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156104f2576104f2611abc565b5f60208284031215611af3575f80fd5b5051919050565b818103818111156104f2576104f2611abc565b634e487b7160e01b5f52603160045260245ffd5b5f60208284031215611b31575f80fd5b815160ff811681146118f4575f80fd5b80820281158282048414176104f2576104f2611abc565b5f82611b7257634e487b7160e01b5f52601260045260245ffd5b500490565b600181815b80851115611bb157815f1904821115611b9757611b97611abc565b80851615611ba457918102915b93841c9390800290611b7c565b509250929050565b5f82611bc7575060016104f2565b81611bd357505f6104f2565b8160018114611be95760028114611bf357611c0f565b60019150506104f2565b60ff841115611c0457611c04611abc565b50506001821b6104f2565b5060208310610133831016604e8410600b8410161715611c32575081810a6104f2565b611c3c8383611b77565b805f1904821115611c4f57611c4f611abc565b029392505050565b5f6118f460ff841683611bb9565b5f60208284031215611c75575f80fd5b815180151581146118f4575f80fd5b634e487b7160e01b5f52604160045260245ffd5b602080825282548282018190525f8481528281209092916040850190845b81811015611a165783546001600160a01b031683526001938401939285019201611cb6565b5f6020808385031215611cec575f80fd5b825167ffffffffffffffff80821115611d03575f80fd5b818501915085601f830112611d16575f80fd5b815181811115611d2857611d28611c84565b8060051b604051601f19603f83011681018181108582111715611d4d57611d4d611c84565b604052918252848201925083810185019188831115611d6a575f80fd5b938501935b82851015611d8857845184529385019392850192611d6f565b98975050505050505050565b5f808335601e19843603018112611da9575f80fd5b83018035915067ffffffffffffffff821115611dc3575f80fd5b6020019150600581901b3603821315611dda575f80fd5b925092905056feb1fadd3142ab2ad7f1337ea4d97112bcc8337fc11ce5b20cb04ad038adf9981902dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800a264697066735822122073cde93b9212a16d98ee8011be9afbe57d036a54548f3ab3b5ea4a6b19b4db0e64736f6c63430008180033", + "nonce": "0x66a", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x7fb0561b5a5d010b97440274b3034ddb2c0dfa2d3ba6aaba6ba36e0964f30ef3", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0xad31546adbfe1ecd7137310508f112039a35b6f7", + "function": null, + "arguments": [ + "0x7385f1dBF3b0Ee3d85c89A38901Aa87333D30946", + "0x62173555C27C67644C5634e114e42A63A59CD7A5", + "0x" + ], + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0xce728", + "value": "0x0", + "input": "0x60a060405260405162000e5038038062000e508339810160408190526200002691620003bc565b828162000034828262000099565b50508160405162000045906200035a565b6001600160a01b039091168152602001604051809103905ff0801580156200006f573d5f803e3d5ffd5b506001600160a01b0316608052620000906200008a60805190565b620000fe565b505050620004b3565b620000a4826200016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000f057620000eb8282620001ee565b505050565b620000fa62000267565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6200013f5f8051602062000e30833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16200016c8162000289565b50565b806001600160a01b03163b5f03620001aa57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516200020c919062000496565b5f60405180830381855af49150503d805f811462000246576040519150601f19603f3d011682016040523d82523d5f602084013e6200024b565b606091505b5090925090506200025e858383620002ca565b95945050505050565b3415620002875760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b038116620002b457604051633173bdd160e11b81525f6004820152602401620001a1565b805f8051602062000e30833981519152620001cd565b606082620002e357620002dd8262000330565b62000329565b8151158015620002fb57506001600160a01b0384163b155b156200032657604051639996b31560e01b81526001600160a01b0385166004820152602401620001a1565b50805b9392505050565b805115620003415780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6104fc806200093483390190565b80516001600160a01b03811681146200037f575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620003b45781810151838201526020016200039a565b50505f910152565b5f805f60608486031215620003cf575f80fd5b620003da8462000368565b9250620003ea6020850162000368565b60408501519092506001600160401b038082111562000407575f80fd5b818601915086601f8301126200041b575f80fd5b81518181111562000430576200043062000384565b604051601f8201601f19908116603f011681019083821181831017156200045b576200045b62000384565b8160405282815289602084870101111562000474575f80fd5b6200048783602083016020880162000398565b80955050505050509250925092565b5f8251620004a981846020870162000398565b9190910192915050565b608051610469620004cb5f395f601001526104695ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007a575f356001600160e01b03191663278f794360e11b14610070576040516334ad5dbb60e21b815260040160405180910390fd5b610078610082565b565b6100786100b0565b5f806100913660048184610303565b81019061009e919061033e565b915091506100ac82826100c0565b5050565b6100786100bb61011a565b610151565b6100c98261016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101125761010d82826101ea565b505050565b6100ac61025c565b5f61014c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e80801561016b573d5ff35b3d5ffd5b806001600160a01b03163b5f036101a957604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102069190610407565b5f60405180830381855af49150503d805f811461023e576040519150601f19603f3d011682016040523d82523d5f602084013e610243565b606091505b509150915061025385838361027b565b95945050505050565b34156100785760405163b398979f60e01b815260040160405180910390fd5b6060826102905761028b826102da565b6102d3565b81511580156102a757506001600160a01b0384163b155b156102d057604051639996b31560e01b81526001600160a01b03851660048201526024016101a0565b50805b9392505050565b8051156102ea5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610311575f80fd5b8386111561031d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561034f575f80fd5b82356001600160a01b0381168114610365575f80fd5b9150602083013567ffffffffffffffff80821115610381575f80fd5b818501915085601f830112610394575f80fd5b8135818111156103a6576103a661032a565b604051601f8201601f19908116603f011681019083821181831017156103ce576103ce61032a565b816040528281528860208487010111156103e6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610426576020818601810151858301520161040c565b505f92019182525091905056fea2646970667358221220e2efdc1b8b8352056043aec80c210e936ef943e06eb728a94ee6133503eb49ba64736f6c63430008180033608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea264697066735822122014115c860f57a54eed5f443866a2dc591c7925fc2fe52248ef9f9382627684fd64736f6c63430008180033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000007385f1dbf3b0ee3d85c89a38901aa87333d3094600000000000000000000000062173555c27c67644c5634e114e42a63a59cd7a500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x66b", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0x4248392db8ee31aa579822207d059a28a38c4510", + "initCode": "0x608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea264697066735822122014115c860f57a54eed5f443866a2dc591c7925fc2fe52248ef9f9382627684fd64736f6c6343000818003300000000000000000000000062173555c27c67644c5634e114e42a63a59cd7a5" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xd055f46e5c1bf14a5a3e3f104563d2097424adabfa5470314ac61b81b38ebb59", + "transactionType": "CALL", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x071bdc8edcdd66730f45a3d3a6f794faa37c75ed", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0x071bdc8edcdd66730f45a3d3a6f794faa37c75ed", + "gas": "0x5e9cb", + "value": "0x0", + "input": "0x8d252393000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000ad31546adbfe1ecd7137310508f112039a35b6f7000000000000000000000000a0a11a9b84bf87c0323bc183715a22ec7881b7fc000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b91300000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000018456967656e6c61796572205969656c644e657374204c534400000000000000000000000000000000000000000000000000000000000000000000000000000006796e4c53446500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x66c", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x1c2dcb8cf1f5422160d0623c0512a044e8394915ba3094d62db0882ce1b33497", + "transactionType": "CALL", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0xa0a11a9b84bf87c0323bc183715a22ec7881b7fc", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0xa0a11a9b84bf87c0323bc183715a22ec7881b7fc", + "gas": "0xa41e8", + "value": "0x0", + "input": "0xb9ceea0d000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000240000000000000000000000000071bdc8edcdd66730f45a3d3a6f794faa37c75ed000000000000000000000000dfb5f6ce42aaa7830e94ecfccad411bef4d4d5b6000000000000000000000000a44151489861fe9e3055d95adc98fbd462b948e70000000000000000000000005c20d1a85c7d9acb503135a498e26eb55d806552000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b9130000000000000000000000001234567890123456789012345678901234567890000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b9130000000000000000000000008d09a4502cc8cf1547ad300e066060d043f6982d000000000000000000000000baacdcc565006b6429f57bc0f436dfaf14a526b100000000000000000000000000000000000000000000000000000000000000040000000000000000000000008d09a4502cc8cf1547ad300e066060d043f6982d000000000000000000000000a63f56985f9c7f3bc9ffc5685535649e0c1a55f30000000000000000000000007322c24752f79c05ffd1e2a6fcb97020c1c264f1000000000000000000000000e3c063b1bee9de02eb28352b55d49d85514c67ff00000000000000000000000000000000000000000000000000000000000000040000000000000000000000007d704507b76571a51d9cae8addabbfd0ba0e63d30000000000000000000000009281ff96637710cd9a5cacce9c6fad8c9f54631c0000000000000000000000003a8fbdf9e77dfc25d09741f51d3e181b25d0c4e0000000000000000000000000accc5a86732be85b5012e8614af237801636f8e5", + "nonce": "0x66d", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x4cbfd87b150743c50c6fd0cf3fe246c94e397f7ad86f67cc6dca3ccd3158a7b8", + "transactionType": "CALL", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0xad31546adbfe1ecd7137310508f112039a35b6f7", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0xad31546adbfe1ecd7137310508f112039a35b6f7", + "gas": "0x9e70b", + "value": "0x0", + "input": "0xefe0b29c00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000100000000000000000000000000d68c29263f6dc2ff8d9307b3afacd6d6fdefbb3a000000000000000000000000a0a11a9b84bf87c0323bc183715a22ec7881b7fc000000000000000000000000071bdc8edcdd66730f45a3d3a6f794faa37c75ed000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b91300000000000000000000000000000000000000000000000000000000000000040000000000000000000000008d09a4502cc8cf1547ad300e066060d043f6982d000000000000000000000000a63f56985f9c7f3bc9ffc5685535649e0c1a55f30000000000000000000000007322c24752f79c05ffd1e2a6fcb97020c1c264f1000000000000000000000000e3c063b1bee9de02eb28352b55d49d85514c67ff", + "nonce": "0x66e", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xfcab428ba97c23508af184c019d98a618fa4e9814bc0140b196af7aa097bb606", + "transactionType": "CALL", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x5c20d1a85c7d9acb503135a498e26eb55d806552", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0x5c20d1a85c7d9acb503135a498e26eb55d806552", + "gas": "0x6b74f", + "value": "0x0", + "input": "0xf9645e74000000000000000000000000dfb5f6ce42aaa7830e94ecfccad411bef4d4d5b6000000000000000000000000a44151489861fe9e3055d95adc98fbd462b948e7000000000000000000000000a0a11a9b84bf87c0323bc183715a22ec7881b7fc000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b91300000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a500000000000000000000000022345678901234567890123456789012345678900000000000000000000000009dd8f69b62ddfd990241530f47dced0dad7f7d39000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "nonce": "0x66f", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x09d2c8f2c6ade480c3fda90ec8ec53713074d0a35c720b3cf0994eff47e5706e", + "transactionType": "CREATE", + "contractName": "TokenStakingNode", + "contractAddress": "0xd1436c90205dc2f807c33d88f122dc9d06964200", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0x155056", + "value": "0x0", + "input": "0x608060405234801561000f575f80fd5b5061001861001d565b6100cf565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161561006d5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100cc5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6111f9806100dc5f395ff3fe608060405234801561000f575f80fd5b5060043610610085575f3560e01c80637c0867af116100585780637c0867af146100ed57806392ab89bb146100ff578063b3c6501514610107578063b778bf7b14610128575f80fd5b8063139d7fed146100895780635c60da1b146100a55780635d21e3da146100c557806377b34927146100da575b5f80fd5b61009260015481565b6040519081526020015b60405180910390f35b6100ad61013b565b6040516001600160a01b03909116815260200161009c565b6100d86100d3366004610db7565b6101dd565b005b6100d86100e8366004610e92565b610380565b5f546100ad906001600160a01b031681565b6100d86104df565b61010f610684565b60405167ffffffffffffffff909116815260200161009c565b6100d8610136366004610f12565b6106bc565b5f8061016860017fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d51610fa5565b5f1b90505f815490505f819050806001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d59190610fc4565b935050505090565b5f5460405163ce8572d360e01b81523360048201526001600160a01b039091169063ce8572d390602401602060405180830381865afa158015610222573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102469190610fdf565b61026357604051636e10383f60e11b815260040160405180910390fd5b5f805f9054906101000a90046001600160a01b03166001600160a01b031663ea4d3c9b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102d79190610fc4565b60405163eea9064b60e01b81529091506001600160a01b0382169063eea9064b9061030a90879087908790600401611020565b5f604051808303815f87803b158015610321575f80fd5b505af1158015610333573d5f803e3d5ffd5b50505050836001600160a01b03167fa6ca69be1634c9486160d4fa9f11c9bf604a6a4b1fd23c8336ffc5889ef4b5ab8360405161037291815260200190565b60405180910390a250505050565b80516001600160a01b0381166103a95760405163d92e233d60e01b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f811580156103ee5750825b90505f8267ffffffffffffffff16600114801561040a5750303b155b905081158015610418575080155b156104365760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561046057845460ff60401b1916600160401b1785555b610468610966565b86515f80546001600160a01b0319166001600160a01b03909216919091179055602087015160015583156104d657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f5460405163ce8572d360e01b81523360048201526001600160a01b039091169063ce8572d390602401602060405180830381865afa158015610524573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105489190610fdf565b61056557604051636e10383f60e11b815260040160405180910390fd5b5f805f9054906101000a90046001600160a01b03166001600160a01b031663ea4d3c9b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105d99190610fc4565b6040516336a2fa1960e21b81523060048201529091505f906001600160a01b0383169063da8be864906024015f604051808303815f875af1158015610620573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610647919081019061107e565b90507fffbd194689c4814f1672a47eaea1dd48a269b4b60b24c6d991dfe771cae1396081604051610678919061111f565b60405180910390a15050565b5f6106b77ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005467ffffffffffffffff1690565b905090565b6106c4610978565b5f5460405163e6319b4160e01b81523360048201526001600160a01b039091169063e6319b4190602401602060405180830381865afa158015610709573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072d9190610fdf565b61074a576040516308e8994960e11b815260040160405180910390fd5b5f805f9054906101000a90046001600160a01b03166001600160a01b03166339b70e386040518163ffffffff1660e01b8152600401602060405180830381865afa15801561079a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107be9190610fc4565b9050855f5b81811015610932575f8989838181106107de576107de611162565b90506020020160208101906107f39190611176565b90505f88888481811061080857610808611162565b9050602002013590505f87878581811061082457610824611162565b90506020020160208101906108399190611176565b905061084f6001600160a01b03841687846109c2565b6040516373d0285560e11b81526001600160a01b0382811660048301528481166024830152604482018490525f919088169063e7a050aa906064016020604051808303815f875af11580156108a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ca9190611191565b9050816001600160a01b0316846001600160a01b03167f501f0f7b8b32b1cd5e7b146b296f6118bd16a0575a150d8d19505dfd54fcbfe6858460405161091a929190918252602082015260400190565b60405180910390a35050600190920191506107c39050565b50505061095e60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050505050565b61096e610aa1565b610976610aea565b565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016109bc57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610a138482610af2565b610a7557604080516001600160a01b03851660248201525f6044808301919091528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610a6b908590610b95565b610a758482610b95565b50505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661097657604051631afcd79f60e31b815260040160405180910390fd5b610a7b610aa1565b5f805f846001600160a01b031684604051610b0d91906111a8565b5f604051808303815f865af19150503d805f8114610b46576040519150601f19603f3d011682016040523d82523d5f602084013e610b4b565b606091505b5091509150818015610b75575080511580610b75575080806020019051810190610b759190610fdf565b8015610b8a57505f856001600160a01b03163b115b925050505b92915050565b5f610ba96001600160a01b03841683610c00565b905080515f14158015610bcd575080806020019051810190610bcb9190610fdf565b155b15610bfb57604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b505050565b6060610c0d83835f610c14565b9392505050565b606081471015610c395760405163cd78605960e01b8152306004820152602401610bf2565b5f80856001600160a01b03168486604051610c5491906111a8565b5f6040518083038185875af1925050503d805f8114610c8e576040519150601f19603f3d011682016040523d82523d5f602084013e610c93565b606091505b5091509150610ca3868383610cad565b9695505050505050565b606082610cc257610cbd82610d09565b610c0d565b8151158015610cd957506001600160a01b0384163b155b15610d0257604051639996b31560e01b81526001600160a01b0385166004820152602401610bf2565b5080610c0d565b805115610d195780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50565b6001600160a01b0381168114610d32575f80fd5b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715610d8057610d80610d49565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610daf57610daf610d49565b604052919050565b5f805f60608486031215610dc9575f80fd5b8335610dd481610d35565b925060208481013567ffffffffffffffff80821115610df1575f80fd5b9086019060408289031215610e04575f80fd5b610e0c610d5d565b823582811115610e1a575f80fd5b8301601f81018a13610e2a575f80fd5b803583811115610e3c57610e3c610d49565b610e4e601f8201601f19168701610d86565b93508084528a86828401011115610e63575f80fd5b80868301878601375f908401860152509081529082013591810191909152929592945050506040919091013590565b5f60408284031215610ea2575f80fd5b610eaa610d5d565b8235610eb581610d35565b81526020928301359281019290925250919050565b5f8083601f840112610eda575f80fd5b50813567ffffffffffffffff811115610ef1575f80fd5b6020830191508360208260051b8501011115610f0b575f80fd5b9250929050565b5f805f805f8060608789031215610f27575f80fd5b863567ffffffffffffffff80821115610f3e575f80fd5b610f4a8a838b01610eca565b90985096506020890135915080821115610f62575f80fd5b610f6e8a838b01610eca565b90965094506040890135915080821115610f86575f80fd5b50610f9389828a01610eca565b979a9699509497509295939492505050565b81810381811115610b8f57634e487b7160e01b5f52601160045260245ffd5b5f60208284031215610fd4575f80fd5b8151610c0d81610d35565b5f60208284031215610fef575f80fd5b81518015158114610c0d575f80fd5b5f5b83811015611018578181015183820152602001611000565b50505f910152565b60018060a01b0384168152606060208201525f83516040606084015280518060a08501526110558160c0860160208501610ffe565b60209590950151608084015250506040810191909152601f91909101601f19160160c001919050565b5f602080838503121561108f575f80fd5b825167ffffffffffffffff808211156110a6575f80fd5b818501915085601f8301126110b9575f80fd5b8151818111156110cb576110cb610d49565b8060051b91506110dc848301610d86565b81815291830184019184810190888411156110f5575f80fd5b938501935b83851015611113578451825293850193908501906110fa565b98975050505050505050565b602080825282518282018190525f9190848201906040850190845b818110156111565783518352928401929184019160010161113a565b50909695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611186575f80fd5b8135610c0d81610d35565b5f602082840312156111a1575f80fd5b5051919050565b5f82516111b9818460208701610ffe565b919091019291505056fea2646970667358221220c772414e4ad1d129b4cdab0867166163d7d7fe7c24301b1ad93921be7bda578164736f6c63430008180033", + "nonce": "0x670", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xebaad80db1a2ba77de6f6692bffdb3e16816f29a8220f0db04642fbdb6e45bb8", + "transactionType": "CALL", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x5c20d1a85c7d9acb503135a498e26eb55d806552", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0x5c20d1a85c7d9acb503135a498e26eb55d806552", + "gas": "0x5e65c", + "value": "0x0", + "input": "0x2d321fc7000000000000000000000000d1436c90205dc2f807c33d88f122dc9d06964200", + "nonce": "0x671", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0x8cce36272ff5042d2658507222d632ebd9d42169", + "initCode": "0x608060405234801561000f575f80fd5b5060405161042138038061042183398101604081905261002e9161015f565b806001600160a01b03811661005d57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61006681610077565b50610070826100c6565b5050610190565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b806001600160a01b03163b5f036100fb5760405163211eb15960e21b81526001600160a01b0382166004820152602401610054565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b80516001600160a01b038116811461015a575f80fd5b919050565b5f8060408385031215610170575f80fd5b61017983610144565b915061018760208401610144565b90509250929050565b6102848061019d5f395ff3fe608060405234801561000f575f80fd5b5060043610610055575f3560e01c80633659cfe6146100595780635c60da1b1461006e578063715018a6146100975780638da5cb5b1461009f578063f2fde38b146100af575b5f80fd5b61006c610067366004610221565b6100c2565b005b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b61006c6100d6565b5f546001600160a01b031661007b565b61006c6100bd366004610221565b6100e9565b6100ca610128565b6100d381610154565b50565b6100de610128565b6100e75f6101d2565b565b6100f1610128565b6001600160a01b03811661011f57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6100d3816101d2565b5f546001600160a01b031633146100e75760405163118cdaa760e01b8152336004820152602401610116565b806001600160a01b03163b5f036101895760405163211eb15960e21b81526001600160a01b0382166004820152602401610116565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610231575f80fd5b81356001600160a01b0381168114610247575f80fd5b939250505056fea264697066735822122051214021729642d85d8096f0480a633e01b568c7c6341aefa6d5d9ffda64c54b64736f6c63430008180033000000000000000000000000d1436c90205dc2f807c33d88f122dc9d069642000000000000000000000000005c20d1a85c7d9acb503135a498e26eb55d806552" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x9cc991ecef61a347086e586863d4fd7d9367ac2330d1ce97cbce6f4a72c4c876", + "transactionType": "CALL", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x5c20d1a85c7d9acb503135a498e26eb55d806552", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0x5c20d1a85c7d9acb503135a498e26eb55d806552", + "gas": "0x12f4a", + "value": "0x0", + "input": "0x2f2ff15d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "nonce": "0x672", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x430f6701cf89b68e95c8673ac16b504f74179a72c46457060d8413eacffb7237", + "transactionType": "CALL", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x5c20d1a85c7d9acb503135a498e26eb55d806552", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0x5c20d1a85c7d9acb503135a498e26eb55d806552", + "gas": "0x1315c", + "value": "0x0", + "input": "0x2f2ff15d24791c44c040514a5d2580696fc45e7d3cb6c9fa65bf3db2e4755362d6c155b500000000000000000000000062173555c27c67644c5634e114e42a63a59cd7a5", + "nonce": "0x673", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x1316bc51848821af101f32a646c9c1dbccdb8ac9dc654ea2b37992e945a2cfd5", + "transactionType": "CREATE", + "contractName": "ynEigenDepositAdapter", + "contractAddress": "0x6a8a62bd2e8fd57477b73cdecdf03eea27bc27b9", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0x14519c", + "value": "0x0", + "input": "0x608060405234801561000f575f80fd5b5061118a8061001d5f395ff3fe608060405234801561000f575f80fd5b50600436106100f0575f3560e01c806391d1485411610093578063c1fe3e4811610063578063c1fe3e48146101f5578063d547741f14610208578063daba667d1461021b578063f45346dc1461022e575f80fd5b806391d14854146101b65780639a2be4af146101c9578063a1d0362e146101db578063a217fddf146101ee575f80fd5b80632f2ff15d116100ce5780632f2ff15d1461015257806336568abe146101655780634aa07e64146101785780634e6c9766146101a3575f80fd5b806301ffc9a7146100f45780630415cc151461011c578063248a9ca314610131575b5f80fd5b610107610102366004610f19565b610241565b60405190151581526020015b60405180910390f35b61012f61012a366004610f54565b610277565b005b61014461013f366004610fe3565b61058d565b604051908152602001610113565b61012f610160366004610ffa565b6105ad565b61012f610173366004610ffa565b6105cf565b60015461018b906001600160a01b031681565b6040516001600160a01b039091168152602001610113565b60045461018b906001600160a01b031681565b6101076101c4366004610ffa565b610607565b5f5461018b906001600160a01b031681565b6101446101e9366004611028565b61063d565b6101445f81565b60035461018b906001600160a01b031681565b61012f610216366004610ffa565b61072e565b60025461018b906001600160a01b031681565b61014461023c366004611078565b61074a565b5f6001600160e01b03198216637965db0b60e01b148061027157506301ffc9a760e01b6001600160e01b03198316145b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f811580156102bc5750825b90505f8267ffffffffffffffff1660011480156102d85750303b155b9050811580156102e6575080155b156103045760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561032e57845460ff60401b1916600160401b1785555b85516001600160a01b0381166103575760405163d92e233d60e01b815260040160405180910390fd5b60208701516001600160a01b0381166103835760405163d92e233d60e01b815260040160405180910390fd5b60408801516001600160a01b0381166103af5760405163d92e233d60e01b815260040160405180910390fd5b60608901516001600160a01b0381166103db5760405163d92e233d60e01b815260040160405180910390fd5b6103e3610815565b6103f35f801b8b6060015161081f565b5089515f80546001600160a01b039283166001600160a01b0319918216179091556020808d015160018054918516918416821790556040808f01516002805491909616941693909317909355815163183fc7c960e31b8152915163c1fe3e489260048082019392918290030181865afa158015610472573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061049691906110b7565b600380546001600160a01b0319166001600160a01b03928316179055600254604080516338d52e0f60e01b8152905191909216916338d52e0f9160048083019260209291908290030181865afa1580156104f2573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061051691906110b7565b60045f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050505050831561058557845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f9081525f80516020611135833981519152602052604090206001015490565b6105b68261058d565b6105bf816108c0565b6105c9838361081f565b50505050565b6001600160a01b03811633146105f85760405163334bd91960e11b815260040160405180910390fd5b61060282826108cd565b505050565b5f9182525f80516020611135833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f6001600160a01b0383166106655760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03821661068c5760405163d92e233d60e01b815260040160405180910390fd5b826001600160a01b0316826001600160a01b0316036106be57604051632af47b8760e11b815260040160405180910390fd5b6106c985858561074a565b60408051338152602081018790529081018290524260608201529091506001600160a01b0380841691878216918616907f5ec2325bfdc6696fa381751bb5a9994c005f28fabd0b7dc55488f18ce1a85ef19060800160405180910390a4949350505050565b6107378261058d565b610740816108c0565b6105c983836108cd565b6003545f906001600160a01b03908116908516036107735761076c8383610946565b905061080e565b6004546001600160a01b03908116908516036107935761076c8383610a8e565b5f54604051633d14d1b760e21b81526001600160a01b0386811660048301526024820186905284811660448301529091169063f45346dc906064016020604051808303815f875af11580156107ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061076c91906110d2565b9392505050565b61081d610b98565b565b5f5f805160206111358339815191526108388484610607565b6108b7575f848152602082815260408083206001600160a01b03871684529091529020805460ff1916600117905561086d3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610271565b5f915050610271565b6108ca8133610be1565b50565b5f5f805160206111358339815191526108e68484610607565b156108b7575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610271565b6003545f90610960906001600160a01b0316333086610c23565b60015460035461097d916001600160a01b03918216911685610c8a565b600154604051630ea598cb60e41b8152600481018590525f916001600160a01b03169063ea598cb0906024016020604051808303815f875af11580156109c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e991906110d2565b5f54600154919250610a08916001600160a01b03908116911683610c8a565b5f54600154604051633d14d1b760e21b81526001600160a01b03918216600482015260248101849052858216604482015291169063f45346dc906064015b6020604051808303815f875af1158015610a62573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a8691906110d2565b949350505050565b6004545f90610aa8906001600160a01b0316333086610c23565b600254600454610ac5916001600160a01b03918216911685610c8a565b600254604051636e553f6560e01b8152600481018590523060248201525f916001600160a01b031690636e553f65906044016020604051808303815f875af1158015610b13573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3791906110d2565b5f54600254919250610b56916001600160a01b03908116911683610c8a565b5f54600254604051633d14d1b760e21b81526001600160a01b03918216600482015260248101849052858216604482015291169063f45346dc90606401610a46565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661081d57604051631afcd79f60e31b815260040160405180910390fd5b610beb8282610607565b610c1f5760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044015b60405180910390fd5b5050565b6040516001600160a01b0384811660248301528381166044830152606482018390526105c99186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050610d15565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610cdb8482610d76565b6105c9576040516001600160a01b0384811660248301525f6044830152610d0f91869182169063095ea7b390606401610c58565b6105c984825b5f610d296001600160a01b03841683610e17565b905080515f14158015610d4d575080806020019051810190610d4b91906110e9565b155b1561060257604051635274afe760e01b81526001600160a01b0384166004820152602401610c16565b5f805f846001600160a01b031684604051610d919190611108565b5f604051808303815f865af19150503d805f8114610dca576040519150601f19603f3d011682016040523d82523d5f602084013e610dcf565b606091505b5091509150818015610df9575080511580610df9575080806020019051810190610df991906110e9565b8015610e0e57505f856001600160a01b03163b115b95945050505050565b606061080e83835f845f80856001600160a01b03168486604051610e3b9190611108565b5f6040518083038185875af1925050503d805f8114610e75576040519150601f19603f3d011682016040523d82523d5f602084013e610e7a565b606091505b5091509150610e8a868383610e94565b9695505050505050565b606082610ea957610ea482610ef0565b61080e565b8151158015610ec057506001600160a01b0384163b155b15610ee957604051639996b31560e01b81526001600160a01b0385166004820152602401610c16565b508061080e565b805115610f005780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f60208284031215610f29575f80fd5b81356001600160e01b03198116811461080e575f80fd5b6001600160a01b03811681146108ca575f80fd5b5f60808284031215610f64575f80fd5b6040516080810181811067ffffffffffffffff82111715610f9357634e487b7160e01b5f52604160045260245ffd5b6040528235610fa181610f40565b81526020830135610fb181610f40565b60208201526040830135610fc481610f40565b60408201526060830135610fd781610f40565b60608201529392505050565b5f60208284031215610ff3575f80fd5b5035919050565b5f806040838503121561100b575f80fd5b82359150602083013561101d81610f40565b809150509250929050565b5f805f806080858703121561103b575f80fd5b843561104681610f40565b935060208501359250604085013561105d81610f40565b9150606085013561106d81610f40565b939692955090935050565b5f805f6060848603121561108a575f80fd5b833561109581610f40565b92506020840135915060408401356110ac81610f40565b809150509250925092565b5f602082840312156110c7575f80fd5b815161080e81610f40565b5f602082840312156110e2575f80fd5b5051919050565b5f602082840312156110f9575f80fd5b8151801515811461080e575f80fd5b5f82515f5b81811015611127576020818601810151858301520161110d565b505f92019182525091905056fe02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800a2646970667358221220c6a71ff4123ca5a2635e42ca87aba6ee875e37bf46bd1e48f6d50370d371709364736f6c63430008180033", + "nonce": "0x674", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x85bac718a2f3cebdeacf758cf9a8f2f74bc828ae4e8d5cf441e5457a5e26407b", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x7d0c1f604571a1c015684e6c15f2ddec432c5e74", + "function": null, + "arguments": [ + "0x6A8A62bD2E8fd57477B73cdecdF03EeA27Bc27b9", + "0x62173555C27C67644C5634e114e42A63A59CD7A5", + "0x" + ], + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0xce728", + "value": "0x0", + "input": "0x60a060405260405162000e5038038062000e508339810160408190526200002691620003bc565b828162000034828262000099565b50508160405162000045906200035a565b6001600160a01b039091168152602001604051809103905ff0801580156200006f573d5f803e3d5ffd5b506001600160a01b0316608052620000906200008a60805190565b620000fe565b505050620004b3565b620000a4826200016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000f057620000eb8282620001ee565b505050565b620000fa62000267565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6200013f5f8051602062000e30833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16200016c8162000289565b50565b806001600160a01b03163b5f03620001aa57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516200020c919062000496565b5f60405180830381855af49150503d805f811462000246576040519150601f19603f3d011682016040523d82523d5f602084013e6200024b565b606091505b5090925090506200025e858383620002ca565b95945050505050565b3415620002875760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b038116620002b457604051633173bdd160e11b81525f6004820152602401620001a1565b805f8051602062000e30833981519152620001cd565b606082620002e357620002dd8262000330565b62000329565b8151158015620002fb57506001600160a01b0384163b155b156200032657604051639996b31560e01b81526001600160a01b0385166004820152602401620001a1565b50805b9392505050565b805115620003415780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6104fc806200093483390190565b80516001600160a01b03811681146200037f575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620003b45781810151838201526020016200039a565b50505f910152565b5f805f60608486031215620003cf575f80fd5b620003da8462000368565b9250620003ea6020850162000368565b60408501519092506001600160401b038082111562000407575f80fd5b818601915086601f8301126200041b575f80fd5b81518181111562000430576200043062000384565b604051601f8201601f19908116603f011681019083821181831017156200045b576200045b62000384565b8160405282815289602084870101111562000474575f80fd5b6200048783602083016020880162000398565b80955050505050509250925092565b5f8251620004a981846020870162000398565b9190910192915050565b608051610469620004cb5f395f601001526104695ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007a575f356001600160e01b03191663278f794360e11b14610070576040516334ad5dbb60e21b815260040160405180910390fd5b610078610082565b565b6100786100b0565b5f806100913660048184610303565b81019061009e919061033e565b915091506100ac82826100c0565b5050565b6100786100bb61011a565b610151565b6100c98261016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101125761010d82826101ea565b505050565b6100ac61025c565b5f61014c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e80801561016b573d5ff35b3d5ffd5b806001600160a01b03163b5f036101a957604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102069190610407565b5f60405180830381855af49150503d805f811461023e576040519150601f19603f3d011682016040523d82523d5f602084013e610243565b606091505b509150915061025385838361027b565b95945050505050565b34156100785760405163b398979f60e01b815260040160405180910390fd5b6060826102905761028b826102da565b6102d3565b81511580156102a757506001600160a01b0384163b155b156102d057604051639996b31560e01b81526001600160a01b03851660048201526024016101a0565b50805b9392505050565b8051156102ea5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610311575f80fd5b8386111561031d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561034f575f80fd5b82356001600160a01b0381168114610365575f80fd5b9150602083013567ffffffffffffffff80821115610381575f80fd5b818501915085601f830112610394575f80fd5b8135818111156103a6576103a661032a565b604051601f8201601f19908116603f011681019083821181831017156103ce576103ce61032a565b816040528281528860208487010111156103e6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610426576020818601810151858301520161040c565b505f92019182525091905056fea2646970667358221220e2efdc1b8b8352056043aec80c210e936ef943e06eb728a94ee6133503eb49ba64736f6c63430008180033608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea264697066735822122014115c860f57a54eed5f443866a2dc591c7925fc2fe52248ef9f9382627684fd64736f6c63430008180033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000006a8a62bd2e8fd57477b73cdecdf03eea27bc27b900000000000000000000000062173555c27c67644c5634e114e42a63a59cd7a500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x675", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0x9e9ce6d0fd72c7a31eb7d99d8ecea4b35a4fd088", + "initCode": "0x608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea264697066735822122014115c860f57a54eed5f443866a2dc591c7925fc2fe52248ef9f9382627684fd64736f6c6343000818003300000000000000000000000062173555c27c67644c5634e114e42a63a59cd7a5" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x82b080ee10a178ef72a1be778733dc109e98db447189efdeb331d1ea05ef2ab2", + "transactionType": "CALL", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x7d0c1f604571a1c015684e6c15f2ddec432c5e74", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0x7d0c1f604571a1c015684e6c15f2ddec432c5e74", + "gas": "0x44b26", + "value": "0x0", + "input": "0x0415cc15000000000000000000000000071bdc8edcdd66730f45a3d3a6f794faa37c75ed0000000000000000000000008d09a4502cc8cf1547ad300e066060d043f6982d000000000000000000000000baacdcc565006b6429f57bc0f436dfaf14a526b1000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "nonce": "0x676", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x6e53da9fad944152b23818f4cbaa8c0cc1104d24aff2f0e38a0b2e947aa0509b", + "transactionType": "CREATE", + "contractName": "ynEigenViewer", + "contractAddress": "0xe31dfe8f25bd0a3696205e0e5b000c71e8ed3b04", + "function": null, + "arguments": [ + "0xaD31546AdbfE1EcD7137310508f112039a35b6F7", + "0x071bdC8eDcdD66730f45a3D3A6F794FAA37C75ED", + "0x5c20D1a85C7d9acB503135a498E26Eb55d806552", + "0xd68C29263F6dC2Ff8D9307b3AfAcD6D6fDeFbB3A" + ], + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0xd0f9d", + "value": "0x0", + "input": "0x610100604052348015610010575f80fd5b50604051610bf5380380610bf583398101604081905261002f9161006c565b6001600160a01b0393841660805291831660a052821660c0521660e0526100bd565b80516001600160a01b0381168114610067575f80fd5b919050565b5f805f806080858703121561007f575f80fd5b61008885610051565b935061009660208601610051565b92506100a460408601610051565b91506100b260608601610051565b905092959194509250565b60805160a05160c05160e051610ae36101125f395f61013f01525f8181610118015261063a01525f818160d9015281816102a9015261037f01525f81816101660152818161019c01526103360152610ae35ff3fe608060405234801561000f575f80fd5b5060043610610085575f3560e01c80637c0867af116100585780637c0867af14610113578063949db6581461013a578063979d7e86146101615780639d8e217714610188575f80fd5b8063075c2b19146100895780632e0f2625146100a75780633ff36802146100bf57806363f7bad5146100d4575b5f80fd5b610091610197565b60405161009e919061070c565b60405180910390f35b6100b1620f424081565b60405190815260200161009e565b6100c7610636565b60405161009e91906107bc565b6100fb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161009e565b6100fb7f000000000000000000000000000000000000000000000000000000000000000081565b6100fb7f000000000000000000000000000000000000000000000000000000000000000081565b6100fb7f000000000000000000000000000000000000000000000000000000000000000081565b6100b1670de0b6b3a764000081565b60605f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166367e4ac2c6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156101f5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261021c9190810190610887565b80519091508067ffffffffffffffff81111561023a5761023a610808565b6040519080825280602002602001820160405280156102a357816020015b6102906040518060a001604052805f6001600160a01b0316815260200160608152602001606081526020015f81526020015f81525090565b8152602001906001900390816102585790505b5092505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa158015610303573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103279190610921565b90505f5b8281101561062f575f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631cbf960d86848151811061037557610375610938565b60200260200101517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663cd88e5588987815181106103be576103be610938565b60200260200101516040518263ffffffff1660e01b81526004016103f191906001600160a01b0391909116815260200190565b602060405180830381865afa15801561040c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104309190610921565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015610477573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061049b9190610921565b90506040518060a001604052808684815181106104ba576104ba610938565b60200260200101516001600160a01b031681526020018684815181106104e2576104e2610938565b60200260200101516001600160a01b03166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa158015610524573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261054b919081019061094c565b815260200186848151811061056257610562610938565b60200260200101516001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa1580156105a4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105cb919081019061094c565b81526020015f831180156105de57505f85115b6105e8575f610600565b846105f6620f4240856109db565b6106009190610a04565b81526020018281525086838151811061061b5761061b610938565b60209081029190910101525060010161032b565b5050505090565b60607f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a1174e7d6040518163ffffffff1660e01b81526004015f60405180830381865afa158015610693573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106ba9190810190610a23565b905090565b5f5b838110156106d95781810151838201526020016106c1565b50505f910152565b5f81518084526106f88160208601602086016106bf565b601f01601f19169290920160200192915050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b838110156107ae57888303603f19018552815180516001600160a01b031684528781015160a08986018190529061076c828701826106e1565b915050878201518582038987015261078482826106e1565b60608481015190880152608093840151939096019290925250509386019390860190600101610733565b509098975050505050505050565b602080825282518282018190525f9190848201906040850190845b818110156107fc5783516001600160a01b0316835292840192918401916001016107d7565b50909695505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561084557610845610808565b604052919050565b5f67ffffffffffffffff82111561086657610866610808565b5060051b60200190565b6001600160a01b0381168114610884575f80fd5b50565b5f6020808385031215610898575f80fd5b825167ffffffffffffffff8111156108ae575f80fd5b8301601f810185136108be575f80fd5b80516108d16108cc8261084d565b61081c565b81815260059190911b820183019083810190878311156108ef575f80fd5b928401925b8284101561091657835161090781610870565b825292840192908401906108f4565b979650505050505050565b5f60208284031215610931575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b5f6020828403121561095c575f80fd5b815167ffffffffffffffff80821115610973575f80fd5b818401915084601f830112610986575f80fd5b81518181111561099857610998610808565b6109ab601f8201601f191660200161081c565b91508082528560208285010111156109c1575f80fd5b6109d28160208401602086016106bf565b50949350505050565b80820281158282048414176109fe57634e487b7160e01b5f52601160045260245ffd5b92915050565b5f82610a1e57634e487b7160e01b5f52601260045260245ffd5b500490565b5f6020808385031215610a34575f80fd5b825167ffffffffffffffff811115610a4a575f80fd5b8301601f81018513610a5a575f80fd5b8051610a686108cc8261084d565b81815260059190911b82018301908381019087831115610a86575f80fd5b928401925b82841015610916578351610a9e81610870565b82529284019290840190610a8b56fea264697066735822122078dd334b966a080cfd6a80dd5d0ae0cf3874500ba0d8e37f9e763f6dcebffd6864736f6c63430008180033000000000000000000000000ad31546adbfe1ecd7137310508f112039a35b6f7000000000000000000000000071bdc8edcdd66730f45a3d3a6f794faa37c75ed0000000000000000000000005c20d1a85c7d9acb503135a498e26eb55d806552000000000000000000000000d68c29263f6dc2ff8d9307b3afacd6d6fdefbb3a", + "nonce": "0x677", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x1b70fe19cb892a93f0c76a0d477082000627db8721b6bb56cb17ab5da43c4ab8", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0xecce549926637e974ca5739a8827e612682415e7", + "function": null, + "arguments": [ + "0xE31Dfe8f25BD0a3696205e0E5B000C71E8ed3B04", + "0x62173555C27C67644C5634e114e42A63A59CD7A5", + "0x" + ], + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0xce718", + "value": "0x0", + "input": "0x60a060405260405162000e5038038062000e508339810160408190526200002691620003bc565b828162000034828262000099565b50508160405162000045906200035a565b6001600160a01b039091168152602001604051809103905ff0801580156200006f573d5f803e3d5ffd5b506001600160a01b0316608052620000906200008a60805190565b620000fe565b505050620004b3565b620000a4826200016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000f057620000eb8282620001ee565b505050565b620000fa62000267565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6200013f5f8051602062000e30833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16200016c8162000289565b50565b806001600160a01b03163b5f03620001aa57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516200020c919062000496565b5f60405180830381855af49150503d805f811462000246576040519150601f19603f3d011682016040523d82523d5f602084013e6200024b565b606091505b5090925090506200025e858383620002ca565b95945050505050565b3415620002875760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b038116620002b457604051633173bdd160e11b81525f6004820152602401620001a1565b805f8051602062000e30833981519152620001cd565b606082620002e357620002dd8262000330565b62000329565b8151158015620002fb57506001600160a01b0384163b155b156200032657604051639996b31560e01b81526001600160a01b0385166004820152602401620001a1565b50805b9392505050565b805115620003415780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6104fc806200093483390190565b80516001600160a01b03811681146200037f575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620003b45781810151838201526020016200039a565b50505f910152565b5f805f60608486031215620003cf575f80fd5b620003da8462000368565b9250620003ea6020850162000368565b60408501519092506001600160401b038082111562000407575f80fd5b818601915086601f8301126200041b575f80fd5b81518181111562000430576200043062000384565b604051601f8201601f19908116603f011681019083821181831017156200045b576200045b62000384565b8160405282815289602084870101111562000474575f80fd5b6200048783602083016020880162000398565b80955050505050509250925092565b5f8251620004a981846020870162000398565b9190910192915050565b608051610469620004cb5f395f601001526104695ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007a575f356001600160e01b03191663278f794360e11b14610070576040516334ad5dbb60e21b815260040160405180910390fd5b610078610082565b565b6100786100b0565b5f806100913660048184610303565b81019061009e919061033e565b915091506100ac82826100c0565b5050565b6100786100bb61011a565b610151565b6100c98261016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101125761010d82826101ea565b505050565b6100ac61025c565b5f61014c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e80801561016b573d5ff35b3d5ffd5b806001600160a01b03163b5f036101a957604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102069190610407565b5f60405180830381855af49150503d805f811461023e576040519150601f19603f3d011682016040523d82523d5f602084013e610243565b606091505b509150915061025385838361027b565b95945050505050565b34156100785760405163b398979f60e01b815260040160405180910390fd5b6060826102905761028b826102da565b6102d3565b81511580156102a757506001600160a01b0384163b155b156102d057604051639996b31560e01b81526001600160a01b03851660048201526024016101a0565b50805b9392505050565b8051156102ea5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610311575f80fd5b8386111561031d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561034f575f80fd5b82356001600160a01b0381168114610365575f80fd5b9150602083013567ffffffffffffffff80821115610381575f80fd5b818501915085601f830112610394575f80fd5b8135818111156103a6576103a661032a565b604051601f8201601f19908116603f011681019083821181831017156103ce576103ce61032a565b816040528281528860208487010111156103e6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610426576020818601810151858301520161040c565b505f92019182525091905056fea2646970667358221220e2efdc1b8b8352056043aec80c210e936ef943e06eb728a94ee6133503eb49ba64736f6c63430008180033608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea264697066735822122014115c860f57a54eed5f443866a2dc591c7925fc2fe52248ef9f9382627684fd64736f6c63430008180033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000e31dfe8f25bd0a3696205e0e5b000c71e8ed3b0400000000000000000000000062173555c27c67644c5634e114e42a63a59cd7a500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x678", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0x4879936e5822b936a9981f8f67844bc77096d433", + "initCode": "0x608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea264697066735822122014115c860f57a54eed5f443866a2dc591c7925fc2fe52248ef9f9382627684fd64736f6c6343000818003300000000000000000000000062173555c27c67644c5634e114e42a63a59cd7a5" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x4a6d56", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x7ee75d34ceea955253464aec532a849b225fbad243a65dc375c4fac357ee3ca9", + "transactionIndex": "0x19", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "gasUsed": "0x1deb0c", + "effectiveGasPrice": "0xf9aa0d5", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0x96a3ed0365409ca284d52846717a33618a88175f" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x76349b", + "logs": [ + { + "address": "0x62173555c27c67644c5634e114e42a63a59cd7a5", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000062173555c27c67644c5634e114e42a63a59cd7a5", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x055e4feb4451b04901798ca6ca9481225363ebe6c2e892d0191250eb6166eecb", + "transactionIndex": "0x1b", + "logIndex": "0xa3", + "removed": false + }, + { + "address": "0x62173555c27c67644c5634e114e42a63a59cd7a5", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x055e4feb4451b04901798ca6ca9481225363ebe6c2e892d0191250eb6166eecb", + "transactionIndex": "0x1b", + "logIndex": "0xa4", + "removed": false + }, + { + "address": "0x62173555c27c67644c5634e114e42a63a59cd7a5", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1", + "0x0000000000000000000000009dd8f69b62ddfd990241530f47dced0dad7f7d39", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x055e4feb4451b04901798ca6ca9481225363ebe6c2e892d0191250eb6166eecb", + "transactionIndex": "0x1b", + "logIndex": "0xa5", + "removed": false + }, + { + "address": "0x62173555c27c67644c5634e114e42a63a59cd7a5", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783", + "0x0000000000000000000000009dd8f69b62ddfd990241530f47dced0dad7f7d39", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x055e4feb4451b04901798ca6ca9481225363ebe6c2e892d0191250eb6166eecb", + "transactionIndex": "0x1b", + "logIndex": "0xa6", + "removed": false + }, + { + "address": "0x62173555c27c67644c5634e114e42a63a59cd7a5", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x055e4feb4451b04901798ca6ca9481225363ebe6c2e892d0191250eb6166eecb", + "transactionIndex": "0x1b", + "logIndex": "0xa7", + "removed": false + }, + { + "address": "0x62173555c27c67644c5634e114e42a63a59cd7a5", + "topics": [ + "0x11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000384", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x055e4feb4451b04901798ca6ca9481225363ebe6c2e892d0191250eb6166eecb", + "transactionIndex": "0x1b", + "logIndex": "0xa8", + "removed": false + } + ], + "logsBloom": "0x00000084000000000000000000080400020000000000000000000000000000000000000000000004000000800001000000000000000000010200000010200000000000000000000000000010400000000080000000000000000000040000000000000000020000000000000000004800000000000000000000020000000000000000000000000000000000000000000000000000000400080000000000000000000800000020000000000000000000000000000000000000001000000000002000000000000000004000400000000000000000000000000100000100200020000000000000000400000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x055e4feb4451b04901798ca6ca9481225363ebe6c2e892d0191250eb6166eecb", + "transactionIndex": "0x1b", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "gasUsed": "0x18e271", + "effectiveGasPrice": "0xf9aa0d5", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0x62173555c27c67644c5634e114e42a63a59cd7a5" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x97e1e3", + "logs": [ + { + "address": "0xa6cf070663127faa41a2150bdadad8d84b876aeb", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x65955f7cdc46b71456c0d4074ef01acd3d3dd4fd4f2fce2a673b5dafcd138e81", + "transactionIndex": "0x1c", + "logIndex": "0xa9", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000040000200000000000000000000000000000000000000000004000000000000000000000000000000000000080000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x65955f7cdc46b71456c0d4074ef01acd3d3dd4fd4f2fce2a673b5dafcd138e81", + "transactionIndex": "0x1c", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "gasUsed": "0x21ad48", + "effectiveGasPrice": "0xf9aa0d5", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0xa6cf070663127faa41a2150bdadad8d84b876aeb" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xa1cec7", + "logs": [ + { + "address": "0x071bdc8edcdd66730f45a3d3a6f794faa37c75ed", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000a6cf070663127faa41a2150bdadad8d84b876aeb" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x324c81e28386d85597e41f1dce13c5a5b5ceab62366a49346ba84a9fa03ac577", + "transactionIndex": "0x1d", + "logIndex": "0xaa", + "removed": false + }, + { + "address": "0x31456eef519b7ab236e3638297ed392390bf304f", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000062173555c27c67644c5634e114e42a63a59cd7a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x324c81e28386d85597e41f1dce13c5a5b5ceab62366a49346ba84a9fa03ac577", + "transactionIndex": "0x1d", + "logIndex": "0xab", + "removed": false + }, + { + "address": "0x071bdc8edcdd66730f45a3d3a6f794faa37c75ed", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000031456eef519b7ab236e3638297ed392390bf304f", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x324c81e28386d85597e41f1dce13c5a5b5ceab62366a49346ba84a9fa03ac577", + "transactionIndex": "0x1d", + "logIndex": "0xac", + "removed": false + } + ], + "logsBloom": "0x00000400010000000000000000080000400000000000000000800000000002000000000000000000000000800000000080000000000000000000000000008000000000000002001000000000000002000001000000000000000000000000000000000000020000000000000000000800000000800000000000000000800000400000000000000000000000000000000000000000001000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000020000000000000400000000000000000000400000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x324c81e28386d85597e41f1dce13c5a5b5ceab62366a49346ba84a9fa03ac577", + "transactionIndex": "0x1d", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "gasUsed": "0x9ece4", + "effectiveGasPrice": "0xf9aa0d5", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0x071bdc8edcdd66730f45a3d3a6f794faa37c75ed" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xa75029", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0xfad901b1cf62bec6eda957d8e17d028b07222955d01c6336741d97caf47673ef", + "transactionIndex": "0x1e", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "gasUsed": "0x58162", + "effectiveGasPrice": "0xf9aa0d5", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0x94009d1296dc2e6370aa34c94bedfed55f96a276" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xb13d01", + "logs": [ + { + "address": "0xd68c29263f6dc2ff8d9307b3afacd6d6fdefbb3a", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x00000000000000000000000094009d1296dc2e6370aa34c94bedfed55f96a276" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0xe5a5f4e7ffb7371dfa0bb2572ffa5d39008b5bbd4411ee5c04c5f354aacedde7", + "transactionIndex": "0x1f", + "logIndex": "0xad", + "removed": false + }, + { + "address": "0xd7e36d7f08ea756bb699b679b49f3095cb6f7ab8", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000062173555c27c67644c5634e114e42a63a59cd7a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0xe5a5f4e7ffb7371dfa0bb2572ffa5d39008b5bbd4411ee5c04c5f354aacedde7", + "transactionIndex": "0x1f", + "logIndex": "0xae", + "removed": false + }, + { + "address": "0xd68c29263f6dc2ff8d9307b3afacd6d6fdefbb3a", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d7e36d7f08ea756bb699b679b49f3095cb6f7ab8", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0xe5a5f4e7ffb7371dfa0bb2572ffa5d39008b5bbd4411ee5c04c5f354aacedde7", + "transactionIndex": "0x1f", + "logIndex": "0xaf", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000080000400000000000000000800000000000000010000000000020000000800000000000000080000000000002000000000000000000000000000000000000000002000001000000000000000000000000000000000000020000000000000000000800000000800000000000000000000000400000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000800000000000000020000000000000500000000000000000000400000000000000000020000000000000000000000000000000000000000000000000002000000200000004", + "type": "0x0", + "transactionHash": "0xe5a5f4e7ffb7371dfa0bb2572ffa5d39008b5bbd4411ee5c04c5f354aacedde7", + "transactionIndex": "0x1f", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "gasUsed": "0x9ecd8", + "effectiveGasPrice": "0xf9aa0d5", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0xd68c29263f6dc2ff8d9307b3afacd6d6fdefbb3a" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xd1665c", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x187d2aca1c90491cfb211788f56b6e033489f09a5946dbfe66e31a5166f709ed", + "transactionIndex": "0x20", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "gasUsed": "0x20295b", + "effectiveGasPrice": "0xf9aa0d5", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0xc599064e66fb509fd49b5083896649a742066758" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xdb5340", + "logs": [ + { + "address": "0xa0a11a9b84bf87c0323bc183715a22ec7881b7fc", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000c599064e66fb509fd49b5083896649a742066758" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0xbcc7ac936bb3ed000af681f56d01f064818ca4d495f89a95e3dbe57ee4f33338", + "transactionIndex": "0x21", + "logIndex": "0xb0", + "removed": false + }, + { + "address": "0x010c60d663fdddaa076f0ce63f6692f0b5605fe5", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000062173555c27c67644c5634e114e42a63a59cd7a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0xbcc7ac936bb3ed000af681f56d01f064818ca4d495f89a95e3dbe57ee4f33338", + "transactionIndex": "0x21", + "logIndex": "0xb1", + "removed": false + }, + { + "address": "0xa0a11a9b84bf87c0323bc183715a22ec7881b7fc", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c60d663fdddaa076f0ce63f6692f0b5605fe5", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0xbcc7ac936bb3ed000af681f56d01f064818ca4d495f89a95e3dbe57ee4f33338", + "transactionIndex": "0x21", + "logIndex": "0xb2", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000080000400000000000000040800000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000002000001000004000000000000400000000080000000020000000000000000000800000000800001000000000000000000400000000000000000000000000000000000000000000000020000000000800000000000000000000000000000000000000000000000010000000000000000000000000020000000000000400000000000000000000400000000008000000020000000000000000040000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0xbcc7ac936bb3ed000af681f56d01f064818ca4d495f89a95e3dbe57ee4f33338", + "transactionIndex": "0x21", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "gasUsed": "0x9ece4", + "effectiveGasPrice": "0xf9aa0d5", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0xa0a11a9b84bf87c0323bc183715a22ec7881b7fc" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xf8abb9", + "logs": [ + { + "address": "0xad89fd40be78811e279c89ff15dc3b831785192d", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x2d04d47dba29824736bd8f6fd51f30dd359ace8583a68f064f5c24487e6342e4", + "transactionIndex": "0x23", + "logIndex": "0xb4", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000080000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x2d04d47dba29824736bd8f6fd51f30dd359ace8583a68f064f5c24487e6342e4", + "transactionIndex": "0x23", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "gasUsed": "0x1b7d51", + "effectiveGasPrice": "0xf9aa0d5", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0xad89fd40be78811e279c89ff15dc3b831785192d" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x102989d", + "logs": [ + { + "address": "0x5c20d1a85c7d9acb503135a498e26eb55d806552", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000ad89fd40be78811e279c89ff15dc3b831785192d" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0xfe46b1270302f7af8e07c7db8e182d3cb34a8d712a0adaa6a1bc6057eae00554", + "transactionIndex": "0x24", + "logIndex": "0xb5", + "removed": false + }, + { + "address": "0x18ed5129bcefa996b4cade4e614c8941de3126d2", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000062173555c27c67644c5634e114e42a63a59cd7a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0xfe46b1270302f7af8e07c7db8e182d3cb34a8d712a0adaa6a1bc6057eae00554", + "transactionIndex": "0x24", + "logIndex": "0xb6", + "removed": false + }, + { + "address": "0x5c20d1a85c7d9acb503135a498e26eb55d806552", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018ed5129bcefa996b4cade4e614c8941de3126d2", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0xfe46b1270302f7af8e07c7db8e182d3cb34a8d712a0adaa6a1bc6057eae00554", + "transactionIndex": "0x24", + "logIndex": "0xb7", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000080000400000000000000000800000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000002000001000080020000000000000000000000000000020000000000000000080800000000800000000000000000000000420000000008000000010000000000000000000000000000000000000000800000000000000000000000000000000000000000000000100000000000000000000000000020000000000000400000000000000080000400000000000000000020000200000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0xfe46b1270302f7af8e07c7db8e182d3cb34a8d712a0adaa6a1bc6057eae00554", + "transactionIndex": "0x24", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "gasUsed": "0x9ece4", + "effectiveGasPrice": "0xf9aa0d5", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0x5c20d1a85c7d9acb503135a498e26eb55d806552" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x11d7127", + "logs": [ + { + "address": "0x7385f1dbf3b0ee3d85c89a38901aa87333d30946", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x89d77040b390908ad1878c0b3360a72c1d6d606326923be34791c55f255b9bb9", + "transactionIndex": "0x25", + "logIndex": "0xb8", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000080000000000000004000000000000000000400000000000000000000000000000080000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x89d77040b390908ad1878c0b3360a72c1d6d606326923be34791c55f255b9bb9", + "transactionIndex": "0x25", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "gasUsed": "0x1ad88a", + "effectiveGasPrice": "0xf9aa0d5", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0x7385f1dbf3b0ee3d85c89a38901aa87333d30946" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1275e0b", + "logs": [ + { + "address": "0xad31546adbfe1ecd7137310508f112039a35b6f7", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x0000000000000000000000007385f1dbf3b0ee3d85c89a38901aa87333d30946" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x7fb0561b5a5d010b97440274b3034ddb2c0dfa2d3ba6aaba6ba36e0964f30ef3", + "transactionIndex": "0x26", + "logIndex": "0xb9", + "removed": false + }, + { + "address": "0x4248392db8ee31aa579822207d059a28a38c4510", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000062173555c27c67644c5634e114e42a63a59cd7a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x7fb0561b5a5d010b97440274b3034ddb2c0dfa2d3ba6aaba6ba36e0964f30ef3", + "transactionIndex": "0x26", + "logIndex": "0xba", + "removed": false + }, + { + "address": "0xad31546adbfe1ecd7137310508f112039a35b6f7", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000004248392db8ee31aa579822207d059a28a38c4510", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x7fb0561b5a5d010b97440274b3034ddb2c0dfa2d3ba6aaba6ba36e0964f30ef3", + "transactionIndex": "0x26", + "logIndex": "0xbb", + "removed": false + } + ], + "logsBloom": "0x00100000000020000000000000080000400000000000000000800000000000000000000000000000000000800000000004000000100000000000000000000000000000000000000000000000000002000001000000000000000000000000000000000000020000400000000000000800000000800000000000000000000000400000000000000000000000000000000000000008000000000008400000800000400000000000000000000000000000000000000000000000000000000000000000000020000000000000400000000000000000000400000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x7fb0561b5a5d010b97440274b3034ddb2c0dfa2d3ba6aaba6ba36e0964f30ef3", + "transactionIndex": "0x26", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "gasUsed": "0x9ece4", + "effectiveGasPrice": "0xf9aa0d5", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0xad31546adbfe1ecd7137310508f112039a35b6f7" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x12b691e", + "logs": [ + { + "address": "0x071bdc8edcdd66730f45a3d3a6f794faa37c75ed", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0xd055f46e5c1bf14a5a3e3f104563d2097424adabfa5470314ac61b81b38ebb59", + "transactionIndex": "0x27", + "logIndex": "0xbc", + "removed": false + }, + { + "address": "0x071bdc8edcdd66730f45a3d3a6f794faa37c75ed", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0xd055f46e5c1bf14a5a3e3f104563d2097424adabfa5470314ac61b81b38ebb59", + "transactionIndex": "0x27", + "logIndex": "0xbd", + "removed": false + }, + { + "address": "0x071bdc8edcdd66730f45a3d3a6f794faa37c75ed", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0xd055f46e5c1bf14a5a3e3f104563d2097424adabfa5470314ac61b81b38ebb59", + "transactionIndex": "0x27", + "logIndex": "0xbe", + "removed": false + }, + { + "address": "0x071bdc8edcdd66730f45a3d3a6f794faa37c75ed", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0xd055f46e5c1bf14a5a3e3f104563d2097424adabfa5470314ac61b81b38ebb59", + "transactionIndex": "0x27", + "logIndex": "0xbf", + "removed": false + } + ], + "logsBloom": "0x00000404000000000000000000000000000000000000000000000000000000000000000000000004000000000000000080000000000000000000000000000000000000000000000000000000400000000080000000000000000000000010000000000000020000000000000000004800000000000000000000000000000000000000000000000000000800000000008000000000001480000000000001000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000020000000000004000100002000000020000000000000000400000000000000000000000400000000000000000000000000", + "type": "0x0", + "transactionHash": "0xd055f46e5c1bf14a5a3e3f104563d2097424adabfa5470314ac61b81b38ebb59", + "transactionIndex": "0x27", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "gasUsed": "0x40b13", + "effectiveGasPrice": "0xf9aa0d5", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0x071bdc8edcdd66730f45a3d3a6f794faa37c75ed", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x132d63b", + "logs": [ + { + "address": "0xa0a11a9b84bf87c0323bc183715a22ec7881b7fc", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x1c2dcb8cf1f5422160d0623c0512a044e8394915ba3094d62db0882ce1b33497", + "transactionIndex": "0x28", + "logIndex": "0xc0", + "removed": false + }, + { + "address": "0xa0a11a9b84bf87c0323bc183715a22ec7881b7fc", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x1c2dcb8cf1f5422160d0623c0512a044e8394915ba3094d62db0882ce1b33497", + "transactionIndex": "0x28", + "logIndex": "0xc1", + "removed": false + }, + { + "address": "0xa0a11a9b84bf87c0323bc183715a22ec7881b7fc", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x1c2dcb8cf1f5422160d0623c0512a044e8394915ba3094d62db0882ce1b33497", + "transactionIndex": "0x28", + "logIndex": "0xc2", + "removed": false + }, + { + "address": "0xa0a11a9b84bf87c0323bc183715a22ec7881b7fc", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xd804c5bf32ccb7c8f087c7a3be22668464f9b4302aec069f690a2c9ba96fc026", + "0x0000000000000000000000001234567890123456789012345678901234567890", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x1c2dcb8cf1f5422160d0623c0512a044e8394915ba3094d62db0882ce1b33497", + "transactionIndex": "0x28", + "logIndex": "0xc3", + "removed": false + }, + { + "address": "0xa0a11a9b84bf87c0323bc183715a22ec7881b7fc", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x5604e2fe54b4de17b81a5ded6f82357d742fd2722d67304e37ff20bd589b4f38", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x1c2dcb8cf1f5422160d0623c0512a044e8394915ba3094d62db0882ce1b33497", + "transactionIndex": "0x28", + "logIndex": "0xc4", + "removed": false + }, + { + "address": "0xa0a11a9b84bf87c0323bc183715a22ec7881b7fc", + "topics": [ + "0x5f6921933580ca0adbbb669ff049927ba73230114570507fc8e10f0758f1d804", + "0x0000000000000000000000008d09a4502cc8cf1547ad300e066060d043f6982d", + "0x0000000000000000000000007d704507b76571a51d9cae8addabbfd0ba0e63d3" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x1c2dcb8cf1f5422160d0623c0512a044e8394915ba3094d62db0882ce1b33497", + "transactionIndex": "0x28", + "logIndex": "0xc5", + "removed": false + }, + { + "address": "0xa0a11a9b84bf87c0323bc183715a22ec7881b7fc", + "topics": [ + "0x5f6921933580ca0adbbb669ff049927ba73230114570507fc8e10f0758f1d804", + "0x000000000000000000000000a63f56985f9c7f3bc9ffc5685535649e0c1a55f3", + "0x0000000000000000000000009281ff96637710cd9a5cacce9c6fad8c9f54631c" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x1c2dcb8cf1f5422160d0623c0512a044e8394915ba3094d62db0882ce1b33497", + "transactionIndex": "0x28", + "logIndex": "0xc6", + "removed": false + }, + { + "address": "0xa0a11a9b84bf87c0323bc183715a22ec7881b7fc", + "topics": [ + "0x5f6921933580ca0adbbb669ff049927ba73230114570507fc8e10f0758f1d804", + "0x0000000000000000000000007322c24752f79c05ffd1e2a6fcb97020c1c264f1", + "0x0000000000000000000000003a8fbdf9e77dfc25d09741f51d3e181b25d0c4e0" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x1c2dcb8cf1f5422160d0623c0512a044e8394915ba3094d62db0882ce1b33497", + "transactionIndex": "0x28", + "logIndex": "0xc7", + "removed": false + }, + { + "address": "0xa0a11a9b84bf87c0323bc183715a22ec7881b7fc", + "topics": [ + "0x5f6921933580ca0adbbb669ff049927ba73230114570507fc8e10f0758f1d804", + "0x000000000000000000000000e3c063b1bee9de02eb28352b55d49d85514c67ff", + "0x000000000000000000000000accc5a86732be85b5012e8614af237801636f8e5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x1c2dcb8cf1f5422160d0623c0512a044e8394915ba3094d62db0882ce1b33497", + "transactionIndex": "0x28", + "logIndex": "0xc8", + "removed": false + }, + { + "address": "0xa0a11a9b84bf87c0323bc183715a22ec7881b7fc", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x1c2dcb8cf1f5422160d0623c0512a044e8394915ba3094d62db0882ce1b33497", + "transactionIndex": "0x28", + "logIndex": "0xc9", + "removed": false + } + ], + "logsBloom": "0x00000004000002000000040002000000000000000020000000000000000000000000000080000084000000000000000001000000000000000000000208000000008000000080200000000000400000000088008000000000000000000010000000000000020200000000000000004800000000000000000200001100000000000000000000000000000800000000008000000000000490020000000001100200000000010000200000000100000000880000000040010000001000000000000000000000000000000000000010000020000000080044000100082000002020000000000000000442000000000000400000000400000000200000000000000000", + "type": "0x0", + "transactionHash": "0x1c2dcb8cf1f5422160d0623c0512a044e8394915ba3094d62db0882ce1b33497", + "transactionIndex": "0x28", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "gasUsed": "0x76d1d", + "effectiveGasPrice": "0xf9aa0d5", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0xa0a11a9b84bf87c0323bc183715a22ec7881b7fc", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x13a018f", + "logs": [ + { + "address": "0xad31546adbfe1ecd7137310508f112039a35b6f7", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x4cbfd87b150743c50c6fd0cf3fe246c94e397f7ad86f67cc6dca3ccd3158a7b8", + "transactionIndex": "0x29", + "logIndex": "0xca", + "removed": false + }, + { + "address": "0xad31546adbfe1ecd7137310508f112039a35b6f7", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x4cbfd87b150743c50c6fd0cf3fe246c94e397f7ad86f67cc6dca3ccd3158a7b8", + "transactionIndex": "0x29", + "logIndex": "0xcb", + "removed": false + }, + { + "address": "0xad31546adbfe1ecd7137310508f112039a35b6f7", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x4cbfd87b150743c50c6fd0cf3fe246c94e397f7ad86f67cc6dca3ccd3158a7b8", + "transactionIndex": "0x29", + "logIndex": "0xcc", + "removed": false + }, + { + "address": "0xad31546adbfe1ecd7137310508f112039a35b6f7", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xb1fadd3142ab2ad7f1337ea4d97112bcc8337fc11ce5b20cb04ad038adf99819", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x4cbfd87b150743c50c6fd0cf3fe246c94e397f7ad86f67cc6dca3ccd3158a7b8", + "transactionIndex": "0x29", + "logIndex": "0xcd", + "removed": false + }, + { + "address": "0xad31546adbfe1ecd7137310508f112039a35b6f7", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x4cbfd87b150743c50c6fd0cf3fe246c94e397f7ad86f67cc6dca3ccd3158a7b8", + "transactionIndex": "0x29", + "logIndex": "0xce", + "removed": false + } + ], + "logsBloom": "0x00000004000000000000000000000000000000000000000000000000000000000000040000000004000000000000000000000000100000000000000000000000000000000000000000000000400000000080000000000000000000000010000000000000020000000000000000004800000000000000000000000000200000000000000000000000000800000000008000000000000480000008400001000000000000000000000000000000000000000000000000000000001000000400000000000000000000000000000000000020000000000004000100002000000020000000000000000400000000000000000000000400000000000000000000000000", + "type": "0x0", + "transactionHash": "0x4cbfd87b150743c50c6fd0cf3fe246c94e397f7ad86f67cc6dca3ccd3158a7b8", + "transactionIndex": "0x29", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "gasUsed": "0x72b54", + "effectiveGasPrice": "0xf9aa0d5", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0xad31546adbfe1ecd7137310508f112039a35b6f7", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x13ede4f", + "logs": [ + { + "address": "0x5c20d1a85c7d9acb503135a498e26eb55d806552", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0xfcab428ba97c23508af184c019d98a618fa4e9814bc0140b196af7aa097bb606", + "transactionIndex": "0x2a", + "logIndex": "0xcf", + "removed": false + }, + { + "address": "0x5c20d1a85c7d9acb503135a498e26eb55d806552", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x24791c44c040514a5d2580696fc45e7d3cb6c9fa65bf3db2e4755362d6c155b5", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0xfcab428ba97c23508af184c019d98a618fa4e9814bc0140b196af7aa097bb606", + "transactionIndex": "0x2a", + "logIndex": "0xd0", + "removed": false + }, + { + "address": "0x5c20d1a85c7d9acb503135a498e26eb55d806552", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x9cb3b45ba8017381348975633951e84d77cd512b58a6ebd2533f422ddd943890", + "0x0000000000000000000000002234567890123456789012345678901234567890", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0xfcab428ba97c23508af184c019d98a618fa4e9814bc0140b196af7aa097bb606", + "transactionIndex": "0x2a", + "logIndex": "0xd1", + "removed": false + }, + { + "address": "0x5c20d1a85c7d9acb503135a498e26eb55d806552", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xc54b323804427575ac6f9f18bf0a027fc2cb84d5af10f03a09d54fd69842fde9", + "0x0000000000000000000000009dd8f69b62ddfd990241530f47dced0dad7f7d39", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0xfcab428ba97c23508af184c019d98a618fa4e9814bc0140b196af7aa097bb606", + "transactionIndex": "0x2a", + "logIndex": "0xd2", + "removed": false + }, + { + "address": "0x5c20d1a85c7d9acb503135a498e26eb55d806552", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xd47f55d1ccb2b675ff4066bc639e489a7cb307c80ad9e87fc3104cf217c2b3ee", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0xfcab428ba97c23508af184c019d98a618fa4e9814bc0140b196af7aa097bb606", + "transactionIndex": "0x2a", + "logIndex": "0xd3", + "removed": false + }, + { + "address": "0x5c20d1a85c7d9acb503135a498e26eb55d806552", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0xfcab428ba97c23508af184c019d98a618fa4e9814bc0140b196af7aa097bb606", + "transactionIndex": "0x2a", + "logIndex": "0xd4", + "removed": false + }, + { + "address": "0x5c20d1a85c7d9acb503135a498e26eb55d806552", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0xfcab428ba97c23508af184c019d98a618fa4e9814bc0140b196af7aa097bb606", + "transactionIndex": "0x2a", + "logIndex": "0xd5", + "removed": false + }, + { + "address": "0x5c20d1a85c7d9acb503135a498e26eb55d806552", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0xfcab428ba97c23508af184c019d98a618fa4e9814bc0140b196af7aa097bb606", + "transactionIndex": "0x2a", + "logIndex": "0xd6", + "removed": false + } + ], + "logsBloom": "0x00000084000000080000000000000400000000000000000000000000000000000000010000000004000000400000000000000000000000000000002000000000000000000000000000000000400000000080000884000000000000000010000000000000020000000000000800004800000000000000002000000000000000000000000000000000000800000000008000000000000480000000000001000000000800000000000100000000000000008000000000000000001001000000000000000000000000000000000000000020000080000004000100002000000020000200008000000400400002000000000000000400000000002000000000000000", + "type": "0x0", + "transactionHash": "0xfcab428ba97c23508af184c019d98a618fa4e9814bc0140b196af7aa097bb606", + "transactionIndex": "0x2a", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "gasUsed": "0x4dcc0", + "effectiveGasPrice": "0xf9aa0d5", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0x5c20d1a85c7d9acb503135a498e26eb55d806552", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x14f437e", + "logs": [ + { + "address": "0xd1436c90205dc2f807c33d88f122dc9d06964200", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x09d2c8f2c6ade480c3fda90ec8ec53713074d0a35c720b3cf0994eff47e5706e", + "transactionIndex": "0x2b", + "logIndex": "0xd7", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000800000001000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x09d2c8f2c6ade480c3fda90ec8ec53713074d0a35c720b3cf0994eff47e5706e", + "transactionIndex": "0x2b", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "gasUsed": "0x10652f", + "effectiveGasPrice": "0xf9aa0d5", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0xd1436c90205dc2f807c33d88f122dc9d06964200" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1534c38", + "logs": [ + { + "address": "0x8cce36272ff5042d2658507222d632ebd9d42169", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000005c20d1a85c7d9acb503135a498e26eb55d806552" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0xebaad80db1a2ba77de6f6692bffdb3e16816f29a8220f0db04642fbdb6e45bb8", + "transactionIndex": "0x2c", + "logIndex": "0xd8", + "removed": false + }, + { + "address": "0x8cce36272ff5042d2658507222d632ebd9d42169", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000d1436c90205dc2f807c33d88f122dc9d06964200" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0xebaad80db1a2ba77de6f6692bffdb3e16816f29a8220f0db04642fbdb6e45bb8", + "transactionIndex": "0x2c", + "logIndex": "0xd9", + "removed": false + }, + { + "address": "0x5c20d1a85c7d9acb503135a498e26eb55d806552", + "topics": [ + "0xd13f13f7d12bbc1ec3c2f99ed663d6b643f722a4654c11d4325b35ed88d9fb75" + ], + "data": "0x0000000000000000000000008cce36272ff5042d2658507222d632ebd9d42169000000000000000000000000d1436c90205dc2f807c33d88f122dc9d06964200", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0xebaad80db1a2ba77de6f6692bffdb3e16816f29a8220f0db04642fbdb6e45bb8", + "transactionIndex": "0x2c", + "logIndex": "0xda", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000400000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002002000001000080000008000000000000000000000000020000000000000000000800000000000000000000000000000000401000000000800000000000000000000000000000000100000000000000000100000000000000000000000000000400000000000004000000000000000000000000000020000000000000000000002010000080000004000000000000000020000200000800000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0xebaad80db1a2ba77de6f6692bffdb3e16816f29a8220f0db04642fbdb6e45bb8", + "transactionIndex": "0x2c", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "gasUsed": "0x408ba", + "effectiveGasPrice": "0xf9aa0d5", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0x5c20d1a85c7d9acb503135a498e26eb55d806552", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x15427cc", + "logs": [ + { + "address": "0x5c20d1a85c7d9acb503135a498e26eb55d806552", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x9cc991ecef61a347086e586863d4fd7d9367ac2330d1ce97cbce6f4a72c4c876", + "transactionIndex": "0x2d", + "logIndex": "0xdb", + "removed": false + } + ], + "logsBloom": "0x00000004000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000400000000080000080000000000000000000000000000000020000000000000000004800000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000080000000000100000000000020000200000000000400000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x9cc991ecef61a347086e586863d4fd7d9367ac2330d1ce97cbce6f4a72c4c876", + "transactionIndex": "0x2d", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "gasUsed": "0xdb94", + "effectiveGasPrice": "0xf9aa0d5", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0x5c20d1a85c7d9acb503135a498e26eb55d806552", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x15504e0", + "logs": [ + { + "address": "0x5c20d1a85c7d9acb503135a498e26eb55d806552", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x24791c44c040514a5d2580696fc45e7d3cb6c9fa65bf3db2e4755362d6c155b5", + "0x00000000000000000000000062173555c27c67644c5634e114e42a63a59cd7a5", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x430f6701cf89b68e95c8673ac16b504f74179a72c46457060d8413eacffb7237", + "transactionIndex": "0x2e", + "logIndex": "0xdc", + "removed": false + } + ], + "logsBloom": "0x00000004000000000000000000080000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000400000000000000080000000000000000000000000000000000000000000000800004000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000001001000000000000000000000000000000400000000000000080000000000100000000000000000200000000000000000000000000000000000000000000002000000000000000", + "type": "0x0", + "transactionHash": "0x430f6701cf89b68e95c8673ac16b504f74179a72c46457060d8413eacffb7237", + "transactionIndex": "0x2e", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "gasUsed": "0xdd14", + "effectiveGasPrice": "0xf9aa0d5", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0x5c20d1a85c7d9acb503135a498e26eb55d806552", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x164a61d", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x1316bc51848821af101f32a646c9c1dbccdb8ac9dc654ea2b37992e945a2cfd5", + "transactionIndex": "0x2f", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "gasUsed": "0xfa13d", + "effectiveGasPrice": "0xf9aa0d5", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0x6a8a62bd2e8fd57477b73cdecdf03eea27bc27b9" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x16ee509", + "logs": [ + { + "address": "0x7d0c1f604571a1c015684e6c15f2ddec432c5e74", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x0000000000000000000000006a8a62bd2e8fd57477b73cdecdf03eea27bc27b9" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x85bac718a2f3cebdeacf758cf9a8f2f74bc828ae4e8d5cf441e5457a5e26407b", + "transactionIndex": "0x31", + "logIndex": "0xdd", + "removed": false + }, + { + "address": "0x9e9ce6d0fd72c7a31eb7d99d8ecea4b35a4fd088", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000062173555c27c67644c5634e114e42a63a59cd7a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x85bac718a2f3cebdeacf758cf9a8f2f74bc828ae4e8d5cf441e5457a5e26407b", + "transactionIndex": "0x31", + "logIndex": "0xde", + "removed": false + }, + { + "address": "0x7d0c1f604571a1c015684e6c15f2ddec432c5e74", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e9ce6d0fd72c7a31eb7d99d8ecea4b35a4fd088", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x85bac718a2f3cebdeacf758cf9a8f2f74bc828ae4e8d5cf441e5457a5e26407b", + "transactionIndex": "0x31", + "logIndex": "0xdf", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000080000400000000000000000808000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000100001000000002000001000000000000000000000000000000020000020000000000000000000800000000800000000000000000000000400000000000000000000000020000000000000000000000000200000000800000000000000000000800000000000000000008000000000000000000000000000000000020000000000000400000000010000000000400000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x85bac718a2f3cebdeacf758cf9a8f2f74bc828ae4e8d5cf441e5457a5e26407b", + "transactionIndex": "0x31", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "gasUsed": "0x9ece4", + "effectiveGasPrice": "0xf9aa0d5", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0x7d0c1f604571a1c015684e6c15f2ddec432c5e74" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x17200cd", + "logs": [ + { + "address": "0x7d0c1f604571a1c015684e6c15f2ddec432c5e74", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x82b080ee10a178ef72a1be778733dc109e98db447189efdeb331d1ea05ef2ab2", + "transactionIndex": "0x32", + "logIndex": "0xe0", + "removed": false + }, + { + "address": "0x7d0c1f604571a1c015684e6c15f2ddec432c5e74", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x82b080ee10a178ef72a1be778733dc109e98db447189efdeb331d1ea05ef2ab2", + "transactionIndex": "0x32", + "logIndex": "0xe1", + "removed": false + } + ], + "logsBloom": "0x00000004000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000001000400000000080000000000000000000000000000000020000020000000000000000004800000000000000000000000000000000000000000000000000000800000000000000000000000480000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000004000100000000000020000000000000000400000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x82b080ee10a178ef72a1be778733dc109e98db447189efdeb331d1ea05ef2ab2", + "transactionIndex": "0x32", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "gasUsed": "0x31bc4", + "effectiveGasPrice": "0xf9aa0d5", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0x7d0c1f604571a1c015684e6c15f2ddec432c5e74", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x17c0cd0", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x6e53da9fad944152b23818f4cbaa8c0cc1104d24aff2f0e38a0b2e947aa0509b", + "transactionIndex": "0x33", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "gasUsed": "0xa0c03", + "effectiveGasPrice": "0xf9aa0d5", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0xe31dfe8f25bd0a3696205e0e5b000c71e8ed3b04" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x185f9a8", + "logs": [ + { + "address": "0xecce549926637e974ca5739a8827e612682415e7", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000e31dfe8f25bd0a3696205e0e5b000c71e8ed3b04" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x1b70fe19cb892a93f0c76a0d477082000627db8721b6bb56cb17ab5da43c4ab8", + "transactionIndex": "0x34", + "logIndex": "0xe2", + "removed": false + }, + { + "address": "0x4879936e5822b936a9981f8f67844bc77096d433", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000062173555c27c67644c5634e114e42a63a59cd7a5" + ], + "data": "0x", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x1b70fe19cb892a93f0c76a0d477082000627db8721b6bb56cb17ab5da43c4ab8", + "transactionIndex": "0x34", + "logIndex": "0xe3", + "removed": false + }, + { + "address": "0xecce549926637e974ca5739a8827e612682415e7", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000004879936e5822b936a9981f8f67844bc77096d433", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "transactionHash": "0x1b70fe19cb892a93f0c76a0d477082000627db8721b6bb56cb17ab5da43c4ab8", + "transactionIndex": "0x34", + "logIndex": "0xe4", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000040000080000400000000000000000800000000000000000000000000000000000800000000040000000000000000000000000000000000000000000000000000000000002000001000000000000000000000000000000000000020000000000000000000800000000800000000000000000000000400000000000000000000000000000000000000000000000000000020000800000000000000000000000000000000000000000002000000000000000000000000000000020000000001000400000000000000000000400000000000000000020000000000000000820400000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x1b70fe19cb892a93f0c76a0d477082000627db8721b6bb56cb17ab5da43c4ab8", + "transactionIndex": "0x34", + "blockHash": "0xe22e75266c6c80e664f3a5e337ee1ab3fdb790ef05d8cb16cf3af04584a56588", + "blockNumber": "0x1ff515", + "gasUsed": "0x9ecd8", + "effectiveGasPrice": "0xf9aa0d5", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0xecce549926637e974ca5739a8827e612682415e7" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1723148327, + "chain": 17000, + "commit": "ed61c21" +} \ No newline at end of file diff --git a/deployments/v0.0.1-ynLSDe-17000-90b02ccb11d6718ff3676ea6e70420afeda10e9a.json b/deployments/v0.0.1-ynLSDe-17000-90b02ccb11d6718ff3676ea6e70420afeda10e9a.json new file mode 100644 index 000000000..d275f3bbc --- /dev/null +++ b/deployments/v0.0.1-ynLSDe-17000-90b02ccb11d6718ff3676ea6e70420afeda10e9a.json @@ -0,0 +1,1539 @@ +{ + "transactions": [ + { + "hash": "0xcb668bde34c4e5df09c8e9288b085bf0574b3fdd240d0615e23511be7da94eaa", + "transactionType": "CREATE", + "contractName": "ContractAddresses", + "contractAddress": "0xa0db6fa31af51a65ce226741e0e7b8131ee5ce07", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0x26e4c2", + "value": "0x0", + "input": "0x60c06040526001608081905261426860a0819052908055600255348015610024575f80fd5b506040518060a00160405280604051806040016040528073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031681526020016f219ab540356cbb839cbe05303d7705fa6001600160a01b031681525081526020016040518060c001604052807391e677b07f7af907ec9a428aafa9fc14a0d3a3386001600160a01b031681526020017339053d51b77dc0d36036fc1fcc8cb819df8ef37a6001600160a01b0316815260200173369e6f597e22eab55ffb173c6d9cd234bd6991116001600160a01b0316815260200173858646372cc42e1a627fce94aa7a7033e7cf075a6001600160a01b0316815260200173be1685c81aa44ff9fb319dd389addd9374383e906001600160a01b03168152602001737fe7e9cc0f274d2435ad5d56d5fa73e47f6a23d86001600160a01b0316815250815260200160405180610140016040528073ac3e018457b222d93114458476f3e3416abbe38f6001600160a01b0316815260200173ae78736cd615f374d3085123a210448e74fc63936001600160a01b0316815260200173ae7ab96520de3a18e5e111b5eaab095312d7fe846001600160a01b03168152602001737f39c581f595b53c5cb19bd0b3f8da6c935e2ca06001600160a01b0316815260200173856c4efb76c1d1ae02e20ceb03a2a6a08b0b8dc36001600160a01b0316815260200173dcee70654261af21c44c093c300ed3bb97b781926001600160a01b03168152602001739858e47bcbbe6fbac040519b02d7cd4b2c470c666001600160a01b0316815260200173f951e335afb289353dc249e82926178eac7ded786001600160a01b0316815260200173d5f7838f5c461feff7fe49ea5ebaf7728bb0adfa6001600160a01b0316815260200173be9895146f7af43049ca1c1ae358b0541ea497046001600160a01b031681525081526020016040518060e00160405280731bee69b7dfffa4e2d53c2a2df135c388ad25dcd26001600160a01b031681526020017393c4b944d05dfe6df7645a86cd2206016c51564d6001600160a01b0316815260200173a4c637e0f704745d182e4d38cab7e7485321d0596001600160a01b03168152602001738ca7a5d6f3acd3a7a8bc468a8cd0fb14b6bd28b66001600160a01b03168152602001730fe4f44bee93503346a3ac9ee5a26b130a5796d66001600160a01b0316815260200173298afb19a105d59e74658c4c334ff360bade6dd26001600160a01b0316815260200173be9895146f7af43049ca1c1ae358b0541ea497046001600160a01b031681525081526020016040518060a001604052807309db87a538bd693e9d08544577d5ccfaa6373a486001600160a01b03168152602001738c33a1d6d062db7b51f79702355771d44359cd7d6001600160a01b031681526020017340d5ff3e218f54f4982661a0464a298cf66523516001600160a01b03168152602001731d6b2a11ffea5f9a8ed85a02581910b3d695c12b6001600160a01b0316815260200173e439fe4563f7666fcd7405bec24ae7b0d226536e6001600160a01b03168152508152505f8060015f015481526020019081526020015f205f820151815f015f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050506020820151816002015f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506080820151816004015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a0820151816005015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050506040820151816008015f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506080820151816004015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a0820151816005015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060c0820151816006015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e0820151816007015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550610100820151816008015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550610120820151816009015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050506060820151816012015f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506080820151816004015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a0820151816005015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060c0820151816006015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050506080820151816019015f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506080820151816004015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050509050505f600190506040518060a001604052806040518060400160405280846001600160a01b031681526020017342424242424242424242424242424242424242426001600160a01b031681525081526020016040518060c001604052807330770d7e3e71112d7a6b7259542d1f680a70e3156001600160a01b0316815260200173a44151489861fe9e3055d95adc98fbd462b948e76001600160a01b031681526020017328ade60640fdbdb2609d8d8734d1b5cbefc0c3486001600160a01b0316815260200173dfb5f6ce42aaa7830e94ecfccad411bef4d4d5b66001600160a01b031681526020017328ade60640fdbdb2609d8d8734d1b5cbefc0c3486001600160a01b0316815260200173642c646053eaf2254f088e9019acd73d9ae0fa326001600160a01b0316815250815260200160405180610140016040528073a63f56985f9c7f3bc9ffc5685535649e0c1a55f36001600160a01b03168152602001737322c24752f79c05ffd1e2a6fcb97020c1c264f16001600160a01b03168152602001733f1c547b21f65e10480de3ad8e19faac46c950346001600160a01b03168152602001738d09a4502cc8cf1547ad300e066060d043f6982d6001600160a01b031681526020017310b83fbce870642ee33f0877ffb7ea43530e473d6001600160a01b0316815260200173baacdcc565006b6429f57bc0f436dfaf14a526b16001600160a01b03168152602001739858e47bcbbe6fbac040519b02d7cd4b2c470c666001600160a01b0316815260200173f951e335afb289353dc249e82926178eac7ded786001600160a01b0316815260200173e3c063b1bee9de02eb28352b55d49d85514c67ff6001600160a01b03168152602001738720095fa5739ab051799211b146a2eee4dd8b376001600160a01b031681525081526020016040518060e00160405280733a8fbdf9e77dfc25d09741f51d3e181b25d0c4e06001600160a01b03168152602001737d704507b76571a51d9cae8addabbfd0ba0e63d36001600160a01b0316815260200173a4c637e0f704745d182e4d38cab7e7485321d0596001600160a01b03168152602001739281ff96637710cd9a5cacce9c6fad8c9f54631c6001600160a01b03168152602001730fe4f44bee93503346a3ac9ee5a26b130a5796d66001600160a01b0316815260200173accc5a86732be85b5012e8614af237801636f8e56001600160a01b031681526020017370eb4d3c164a6b4a5f908d4fbb5a9caffb66bab66001600160a01b031681525081526020016040518060a0016040528073d9029669bc74878bcb5be58c259ed0a277c5c16e6001600160a01b0316815260200173c2387ebb4ea66627e3543a771e260bd84218d6a16001600160a01b031681526020017382915eff62af9fcc0d0735b8681959e069e3f2d86001600160a01b0316815260200173a5e9e1ceb4cc1854d0e186a9b3e67158b84ad0726001600160a01b0316815260200173706eed02702ffe9cbefd6a65e63f3c2b59b7ef2d6001600160a01b03168152508152505f80600180015481526020019081526020015f205f820151815f015f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050506020820151816002015f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506080820151816004015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a0820151816005015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050506040820151816008015f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506080820151816004015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a0820151816005015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060c0820151816006015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e0820151816007015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550610100820151816008015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550610120820151816009015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050506060820151816012015f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015f61010082546001600160a01b039485169290910a91820291840219161790556080838101516004840180549184166001600160a01b031992831617905560a085015160058501805491851691831691909117905560c09094015160069093018054938316938516939093179092559381015180516019850180549187169185169190911790556020810151601a850180549187169185169190911790556040810151601b850180549187169185169190911790556060810151601c850180549187169185169190911790550151601d909201805492909316911617905550610825806113195f395ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c8063b04f9b5314610043578063edf26d9b1461006c578063fbe4b7c014610237575b5f80fd5b61005661005136600461052b565b61025a565b6040516100639190610713565b60405180910390f35b61022661007a36600461052b565b5f60208181529181526040908190208151808301835281546001600160a01b0390811682526001830154811682860152835160c080820186526002850154831682526003850154831682880152600485015483168287015260058501548316606080840191909152600686015484166080808501919091526007870154851660a080860191909152885161014081018a5260088901548716815260098901548716818c0152600a8901548716818b0152600b890154871681850152600c890154871681840152600d890154871681830152600e890154871681860152600f890154871660e08083019190915260108a0154881661010083015260118a015488166101208301528a519081018b5260128a01548816815260138a01548816818d015260148a01548816818c015260158a015488168186015260168a015488168185015260178a015488168184015260188a015488169581019590955289519182018a52601989015487168252601a89015487169a82019a909a52601b880154861698810198909852601c870154851691880191909152601d90950154909216938501939093529093919285565b604051610063959493929190610789565b600154600254610245919082565b60408051928352602083019190915201610063565b61036c6040805160e081019091525f60a0820181815260c0830191909152819081526040805160c0810182525f8082526020828101829052928201819052606082018190526080820181905260a0820152910190815260408051610140810182525f8082526020828101829052928201819052606082018190526080820181905260a0820181905260c0820181905260e08201819052610100820181905261012082015291019081526040805160e0810182525f8082526020828101829052928201819052606082018190526080820181905260a0820181905260c082015291019081526040805160a0810182525f808252602082810182905292820181905260608201819052608082015291015290565b505f9081526020818152604091829020825160e0808201855282546001600160a01b0390811660a08085019182526001860154831660c08087019190915291855287518083018952600287015484168152600387015484168189015260048701548416818a015260058701548416606080830191909152600688015485166080808401919091526007890154861683850152878a0192909252895161014081018b5260088901548616815260098901548616818b0152600a8901548616818c0152600b890154861681830152600c890154861681840152600d890154861681850152600e890154861681860152600f8901548616818801526010890154861661010082015260118901548616610120820152878b015289519586018a5260128801548516865260138801548516868a015260148801548516868b015260158801548516868201526016880154851686830152601788015485168684015260188801548516938601939093528286019490945287519081018852601986015483168152601a860154831696810196909652601b850154821696860196909652601c840154811695850195909552601d909201549093168282015282015290565b5f6020828403121561053b575f80fd5b5035919050565b80516001600160a01b03908116835260208083015182169084015260408083015182169084015260608083015182169084015260808083015182169084015260a09182015116910152565b80516001600160a01b0316825260208101516105b460208401826001600160a01b03169052565b5060408101516105cf60408401826001600160a01b03169052565b5060608101516105ea60608401826001600160a01b03169052565b50608081015161060560808401826001600160a01b03169052565b5060a081015161062060a08401826001600160a01b03169052565b5060c081015161063b60c08401826001600160a01b03169052565b5060e081015161065660e08401826001600160a01b03169052565b50610100818101516001600160a01b03908116918401919091526101209182015116910152565b80516001600160a01b03908116835260208083015182169084015260408083015182169084015260608083015182169084015260808083015182169084015260a08281015182169084015260c09182015116910152565b80516001600160a01b03908116835260208083015182169084015260408083015182169084015260608083015182169084015260809182015116910152565b815180516001600160a01b03908116835260209182015116908201526103c0810160208301516107466040840182610542565b50604083015161075a61010084018261058d565b50606083015161076e61024084018261067d565b5060808301516107826103208401826106d4565b5092915050565b6103c081016107ae828880516001600160a01b03908116835260209182015116910152565b6107bb6040830187610542565b6107c961010083018661058d565b6107d761024083018561067d565b6107e56103208301846106d4565b969550505050505056fea2646970667358221220f2fbc52f539c1144766ec7f2a4464d33cd7caba68bf0fd86ace9fb3b9fe7d7bd64736f6c63430008180033", + "nonce": "0x399", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xeb20f88d6b125889fad7cde67d3b4e3fd27a363460fdeccfb07b4362fbe3b147", + "transactionType": "CREATE", + "contractName": "ynEigen", + "contractAddress": "0x3130ccab4859986b0c20bf7c5d4c57d86e5c0298", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0x2bb3a1", + "value": "0x0", + "input": "0x608060405234801562000010575f80fd5b506200001b62000021565b620000d5565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d25780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b61265b80620000e35f395ff3fe608060405234801561000f575f80fd5b5060043610610208575f3560e01c806370a082311161011f578063b8f82b26116100a9578063e0c784a611610079578063e0c784a614610495578063e63ab1e9146104b5578063f11b8188146104dc578063f45346dc146104fb578063fb1bb9de1461050e575f80fd5b8063b8f82b2614610434578063cd88e55814610447578063d547741f1461046f578063dd62ed3e14610482575f80fd5b806391d14854116100ef57806391d14854146103c857806395d89b41146103db578063a1a25e6e146103e3578063a217fddf1461041a578063a9059cbb14610421575f80fd5b806370a08231146103665780638936a91f1461039a5780638d252393146103a25780638ffbf6db146103b5575f80fd5b80632f2ff15d116101a05780633e5541f1116101705780633e5541f1146103115780635f4caf461461032457806360da3e831461033757806361fd0ae11461034b57806363d8882a1461035e575f80fd5b80632f2ff15d146102c9578063313ce567146102dc57806336568abe146102eb57806338bca6c8146102fe575f80fd5b8063095ea7b3116101db578063095ea7b31461026957806318160ddd1461027c57806323b872dd146102a3578063248a9ca3146102b6575f80fd5b806301e1d1141461020c57806301ffc9a714610227578063021919801461024a57806306fdde0314610254575b5f80fd5b610214610522565b6040519081526020015b60405180910390f35b61023a610235366004611e88565b610591565b604051901515815260200161021e565b6102526105c7565b005b61025c61064b565b60405161021e9190611ed1565b61023a610277366004611f17565b61070b565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610214565b61023a6102b1366004611f41565b610722565b6102146102c4366004611f7f565b610747565b6102526102d7366004611f96565b610767565b6040516012815260200161021e565b6102526102f9366004611f96565b610789565b61025261030c36600461200b565b6107c1565b61021461031f366004611f17565b610a90565b61023a610332366004612071565b610b4a565b60025461023a90600160a01b900460ff1681565b6102526103593660046120f2565b610bb6565b610252610bdb565b610214610374366004612071565b6001600160a01b03165f9081525f805160206125c6833981519152602052604090205490565b610252610c3f565b6102526103b036600461218b565b610cba565b6102526103c33660046120f2565b61100a565b61023a6103d6366004611f96565b61102c565b61025c611062565b61023a6103f1366004612071565b6001600160a01b03165f9081525f805160206125a6833981519152602052604090205460ff1690565b6102145f81565b61023a61042f366004611f17565b6110a0565b610214610442366004611f17565b6110ad565b610214610455366004612071565b6001600160a01b03165f9081526020819052604090205490565b61025261047d366004611f96565b6110b8565b6102146104903660046121c2565b6110d4565b6104a86104a33660046121ee565b61111d565b60405161021e9190612277565b6102147f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6102146104ea366004612071565b5f6020819052908152604090205481565b6102146105093660046122ba565b6111d8565b6102145f805160206125e683398151915281565b600254604080516278744560e21b815290515f926001600160a01b0316916301e1d1149160048083019260209291908290030181865afa158015610568573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061058c91906122f9565b905090565b5f6001600160e01b03198216637965db0b60e01b14806105c157506301ffc9a760e01b6001600160e01b03198316145b92915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6105f181611243565b6002805460ff60a01b1916600160a01b908117918290556040517f9723f28d4abaff5df0f62bfb2418f2aac4a739b259edf209b8dc9944fa85aa789261064092900460ff161515815260200190565b60405180910390a150565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f805160206125c68339815191529161068990612310565b80601f01602080910402602001604051908101604052809291908181526020018280546106b590612310565b80156107005780601f106106d757610100808354040283529160200191610700565b820191905f5260205f20905b8154815290600101906020018083116106e357829003601f168201915b505050505091505090565b5f33610718818585611250565b5060019392505050565b5f3361072f85828561125d565b61073a8585856112ba565b60019150505b9392505050565b5f9081525f80516020612606833981519152602052604090206001015490565b61077082610747565b61077981611243565b6107838383611317565b50505050565b6001600160a01b03811633146107b25760405163334bd91960e11b815260040160405180910390fd5b6107bc82826113b8565b505050565b6001546001600160a01b031633146107f3576040516347ed65b360e11b81523360048201526024015b60405180910390fd5b82811461081d57604051637df4c78160e01b815260048101849052602481018290526044016107ea565b6001546001600160a01b03165f5b84811015610a88575f86868381811061084657610846612342565b905060200201602081019061085b9190612071565b600254604051632fa657a360e11b81526001600160a01b038084166004830152929350911690635f4caf4690602401602060405180830381865afa1580156108a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c99190612356565b6108f15760405163ee84f40b60e01b81526001600160a01b03821660048201526024016107ea565b6001600160a01b0381165f90815260208181526040918290208251918201909252905480825286868581811061092957610929612342565b905060200201351115610986578051829087878681811061094c5761094c612342565b60405163a8c6953f60e01b81526001600160a01b0390951660048601526024850193909352506020909102013560448201526064016107ea565b85858481811061099857610998612342565b905060200201355f80846001600160a01b03166001600160a01b031681526020019081526020015f205f015f8282546109d19190612389565b90915550610a0d9050848787868181106109ed576109ed612342565b90506020020135846001600160a01b03166114319092919063ffffffff16565b7f4104800de83c5a3ae29f33899a811406b39aa89930fcc75e60d84b411803368d82878786818110610a4157610a41612342565b9050602002013586604051610a76939291906001600160a01b0393841681526020810192909252909116604082015260600190565b60405180910390a1505060010161082b565b505050505050565b5f610a9a83610b4a565b15610b2657600254604051631cbf960d60e01b81526001600160a01b038581166004830152602482018590525f921690631cbf960d90604401602060405180830381865afa158015610aee573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b1291906122f9565b9050610b1e815f611490565b9150506105c1565b60405163ee84f40b60e01b81526001600160a01b03841660048201526024016107ea565b600254604051632fa657a360e11b81526001600160a01b0383811660048301525f921690635f4caf4690602401602060405180830381865afa158015610b92573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105c19190612356565b5f805160206125e6833981519152610bcd81611243565b610bd7825f6114ed565b5050565b5f805160206125e6833981519152610bf281611243565b6002805460ff60a01b1916908190556040517f9723f28d4abaff5df0f62bfb2418f2aac4a739b259edf209b8dc9944fa85aa789161064091600160a01b90910460ff161515815260200190565b5f805160206125e6833981519152610c5681611243565b7f7e7ba5b20f89141f0255e9704ce6ce6e55f5f28e4fc0d626fc76bedba3053201805460ff191690556040515f805160206125a6833981519152907f5b1b646968864ea75fad546d8c819e0de710df0bf61f658f6ba54dc587472e7b905f90a15050565b610cca6060820160408301612071565b6001600160a01b038116610cf15760405163d92e233d60e01b815260040160405180910390fd5b610d0160a0830160808401612071565b6001600160a01b038116610d285760405163d92e233d60e01b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610d6c5750825b90505f826001600160401b03166001148015610d875750303b155b905081158015610d95575080155b15610db35760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ddd57845460ff60401b1916600160401b1785555b610de5611588565b610ded611592565b610e74610dfa898061239c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610e3b9250505060208b018b61239c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506115a292505050565b610e8d5f610e8860a08b0160808c01612071565b611317565b50610ec27f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610e8860c08b0160a08c01612071565b50610ee45f805160206125e6833981519152610e8860e08b0160c08c01612071565b50610ef56060890160408a01612071565b600280546001600160a01b0319166001600160a01b0392909216919091179055610f256080890160608a01612071565b600180546001600160a01b0319166001600160a01b03929092169190911781557f7e7ba5b20f89141f0255e9704ce6ce6e55f5f28e4fc0d626fc76bedba3053201805460ff19169091179055610fba610f8160e08a018a6123de565b808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250600192506114ed915050565b831561100057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f805160206125e683398151915261102181611243565b610bd78260016114ed565b5f9182525f80516020612606833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f805160206125c68339815191529161068990612310565b5f336107188185856112ba565b5f6107408383610a90565b6110c182610747565b6110ca81611243565b61078383836113b8565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b606081516001600160401b038111156111385761113861208c565b604051908082528060200260200182016040528015611161578160200160208202803683370190505b5090505f5b82518110156111d2575f8084838151811061118357611183612342565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f01548282815181106111bf576111bf612342565b6020908102919091010152600101611166565b50919050565b5f6111e16115b4565b600254600160a01b900460ff161561120c576040516313d0ff5960e31b815260040160405180910390fd5b611218848484336115fe565b905061074060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61124d81336117b4565b50565b6107bc83838360016117ed565b5f61126884846110d4565b90505f19811461078357818110156112ac57604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016107ea565b61078384848484035f6117ed565b6001600160a01b0383166112e357604051634b637e8f60e11b81525f60048201526024016107ea565b6001600160a01b03821661130c5760405163ec442f0560e01b81525f60048201526024016107ea565b6107bc8383836118d1565b5f5f80516020612606833981519152611330848461102c565b6113af575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556113653390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506105c1565b5f9150506105c1565b5f5f805160206126068339815191526113d1848461102c565b156113af575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506105c1565b6040516001600160a01b038381166024830152604482018390526107bc91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061197a565b5f806114ba7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025490565b90505f6114c5610522565b9050815f036114d85784925050506105c1565b6114e4858383876119db565b95945050505050565b5f805160206125a68339815191525f5b8351811015610783575f84828151811061151957611519612342565b6020908102919091018101516001600160a01b0381165f818152868452604090819020805460ff19168915159081179091559051908152919350917fac6d52e87f8a8fc486e04600668caffa28c149f8286b136c0f327b4499b8c723910160405180910390a2506001016114fd565b611590611a28565b565b61159a611a28565b611590611a71565b6115aa611a28565b610bd78282611a79565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016115f857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f61160885610b4a565b6116305760405163ee84f40b60e01b81526001600160a01b03861660048201526024016107ea565b835f0361165057604051631f2a200560e01b815260040160405180910390fd5b6116656001600160a01b038616833087611a8b565b600254604051631cbf960d60e01b81526001600160a01b038781166004830152602482018790525f921690631cbf960d90604401602060405180830381865afa1580156116b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116d891906122f9565b90506116e4815f611490565b9150815f0361170657604051639811e0c760e01b815260040160405180910390fd5b6117108483611ac4565b6001600160a01b0386165f9081526020819052604081208054879290611737908490612423565b909155505060408051868152602081018490526001600160a01b0380871692908616917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a350949350505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6117be828261102c565b610bd75760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016107ea565b5f805160206125c68339815191526001600160a01b0385166118245760405163e602df0560e01b81525f60048201526024016107ea565b6001600160a01b03841661184d57604051634a1406b160e11b81525f60048201526024016107ea565b6001600160a01b038086165f908152600183016020908152604080832093881683529290522083905581156118ca57836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516118c191815260200190565b60405180910390a35b5050505050565b7f7e7ba5b20f89141f0255e9704ce6ce6e55f5f28e4fc0d626fc76bedba3053201545f805160206125a68339815191529060ff16801561192957506001600160a01b0384165f9081526020829052604090205460ff16155b801561193d57506001600160a01b03841615155b801561195157506001600160a01b03831615155b1561196f57604051636ab17e0560e01b815260040160405180910390fd5b610783848484611af8565b5f61198e6001600160a01b03841683611c31565b905080515f141580156119b25750808060200190518101906119b09190612356565b155b156107bc57604051635274afe760e01b81526001600160a01b03841660048201526024016107ea565b5f806119e8868686611c3e565b90506119f383611cfd565b8015611a0e57505f8480611a0957611a09612436565b868809115b156114e457611a1e600182612423565b9695505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661159057604051631afcd79f60e31b815260040160405180910390fd5b61178e611a28565b611a81611a28565b610bd78282611d29565b6040516001600160a01b0384811660248301528381166044830152606482018390526107839186918216906323b872dd9060840161145e565b6001600160a01b038216611aed5760405163ec442f0560e01b81525f60048201526024016107ea565b610bd75f83836118d1565b5f805160206125c68339815191526001600160a01b038416611b325781816002015f828254611b279190612423565b90915550611ba29050565b6001600160a01b0384165f9081526020829052604090205482811015611b845760405163391434e360e21b81526001600160a01b038616600482015260248101829052604481018490526064016107ea565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316611bc0576002810180548390039055611bde565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611c2391815260200190565b60405180910390a350505050565b606061074083835f611d79565b5f838302815f1985870982811083820303915050805f03611c7257838281611c6857611c68612436565b0492505050610740565b808411611c925760405163227bc15360e01b815260040160405180910390fd5b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b5f6002826003811115611d1257611d1261244a565b611d1c919061245e565b60ff166001149050919050565b611d31611a28565b5f805160206125c68339815191527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace03611d6a84826124cf565b506004810161078383826124cf565b606081471015611d9e5760405163cd78605960e01b81523060048201526024016107ea565b5f80856001600160a01b03168486604051611db9919061258a565b5f6040518083038185875af1925050503d805f8114611df3576040519150601f19603f3d011682016040523d82523d5f602084013e611df8565b606091505b5091509150611a1e868383606082611e1857611e1382611e5f565b610740565b8151158015611e2f57506001600160a01b0384163b155b15611e5857604051639996b31560e01b81526001600160a01b03851660048201526024016107ea565b5080610740565b805115611e6f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f60208284031215611e98575f80fd5b81356001600160e01b031981168114610740575f80fd5b5f5b83811015611ec9578181015183820152602001611eb1565b50505f910152565b602081525f8251806020840152611eef816040850160208701611eaf565b601f01601f19169190910160400192915050565b6001600160a01b038116811461124d575f80fd5b5f8060408385031215611f28575f80fd5b8235611f3381611f03565b946020939093013593505050565b5f805f60608486031215611f53575f80fd5b8335611f5e81611f03565b92506020840135611f6e81611f03565b929592945050506040919091013590565b5f60208284031215611f8f575f80fd5b5035919050565b5f8060408385031215611fa7575f80fd5b823591506020830135611fb981611f03565b809150509250929050565b5f8083601f840112611fd4575f80fd5b5081356001600160401b03811115611fea575f80fd5b6020830191508360208260051b8501011115612004575f80fd5b9250929050565b5f805f806040858703121561201e575f80fd5b84356001600160401b0380821115612034575f80fd5b61204088838901611fc4565b90965094506020870135915080821115612058575f80fd5b5061206587828801611fc4565b95989497509550505050565b5f60208284031215612081575f80fd5b813561074081611f03565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156120c8576120c861208c565b604052919050565b5f6001600160401b038211156120e8576120e861208c565b5060051b60200190565b5f6020808385031215612103575f80fd5b82356001600160401b03811115612118575f80fd5b8301601f81018513612128575f80fd5b803561213b612136826120d0565b6120a0565b81815260059190911b82018301908381019087831115612159575f80fd5b928401925b8284101561218057833561217181611f03565b8252928401929084019061215e565b979650505050505050565b5f6020828403121561219b575f80fd5b81356001600160401b038111156121b0575f80fd5b82016101008185031215610740575f80fd5b5f80604083850312156121d3575f80fd5b82356121de81611f03565b91506020830135611fb981611f03565b5f60208083850312156121ff575f80fd5b82356001600160401b03811115612214575f80fd5b8301601f81018513612224575f80fd5b8035612232612136826120d0565b81815260059190911b82018301908381019087831115612250575f80fd5b928401925b8284101561218057833561226881611f03565b82529284019290840190612255565b602080825282518282018190525f9190848201906040850190845b818110156122ae57835183529284019291840191600101612292565b50909695505050505050565b5f805f606084860312156122cc575f80fd5b83356122d781611f03565b92506020840135915060408401356122ee81611f03565b809150509250925092565b5f60208284031215612309575f80fd5b5051919050565b600181811c9082168061232457607f821691505b6020821081036111d257634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612366575f80fd5b81518015158114610740575f80fd5b634e487b7160e01b5f52601160045260245ffd5b818103818111156105c1576105c1612375565b5f808335601e198436030181126123b1575f80fd5b8301803591506001600160401b038211156123ca575f80fd5b602001915036819003821315612004575f80fd5b5f808335601e198436030181126123f3575f80fd5b8301803591506001600160401b0382111561240c575f80fd5b6020019150600581901b3603821315612004575f80fd5b808201808211156105c1576105c1612375565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f60ff83168061247c57634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b601f8211156107bc57805f5260205f20601f840160051c810160208510156124b05750805b601f840160051c820191505b818110156118ca575f81556001016124bc565b81516001600160401b038111156124e8576124e861208c565b6124fc816124f68454612310565b8461248b565b602080601f83116001811461252f575f84156125185750858301515b5f19600386901b1c1916600185901b178555610a88565b5f85815260208120601f198616915b8281101561255d5788860151825594840194600190910190840161253e565b508582101561257a57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f825161259b818460208701611eaf565b919091019291505056fe7e7ba5b20f89141f0255e9704ce6ce6e55f5f28e4fc0d626fc76bedba305320052c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800a2646970667358221220f4c9b253a3edaae772f3c11ad100709eb95c75b42310d31d17c5c15102c6918e64736f6c63430008180033", + "nonce": "0x39a", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x75408068ee7395ead3474819676c5daa715950ff43123bd4dd58f48487c1bef5", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x4f68ab830011e55c9f94a7165c832a41c38f1bcb", + "function": null, + "arguments": [ + "0x3130ccAb4859986B0c20bf7c5d4c57D86E5C0298", + "0x743b91CDB1C694D4F51bCDA3a4A59DcC0d02b913", + "0x" + ], + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0xce728", + "value": "0x0", + "input": "0x60a060405260405162000e5038038062000e508339810160408190526200002691620003bc565b828162000034828262000099565b50508160405162000045906200035a565b6001600160a01b039091168152602001604051809103905ff0801580156200006f573d5f803e3d5ffd5b506001600160a01b0316608052620000906200008a60805190565b620000fe565b505050620004b3565b620000a4826200016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000f057620000eb8282620001ee565b505050565b620000fa62000267565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6200013f5f8051602062000e30833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16200016c8162000289565b50565b806001600160a01b03163b5f03620001aa57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516200020c919062000496565b5f60405180830381855af49150503d805f811462000246576040519150601f19603f3d011682016040523d82523d5f602084013e6200024b565b606091505b5090925090506200025e858383620002ca565b95945050505050565b3415620002875760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b038116620002b457604051633173bdd160e11b81525f6004820152602401620001a1565b805f8051602062000e30833981519152620001cd565b606082620002e357620002dd8262000330565b62000329565b8151158015620002fb57506001600160a01b0384163b155b156200032657604051639996b31560e01b81526001600160a01b0385166004820152602401620001a1565b50805b9392505050565b805115620003415780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6104fc806200093483390190565b80516001600160a01b03811681146200037f575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620003b45781810151838201526020016200039a565b50505f910152565b5f805f60608486031215620003cf575f80fd5b620003da8462000368565b9250620003ea6020850162000368565b60408501519092506001600160401b038082111562000407575f80fd5b818601915086601f8301126200041b575f80fd5b81518181111562000430576200043062000384565b604051601f8201601f19908116603f011681019083821181831017156200045b576200045b62000384565b8160405282815289602084870101111562000474575f80fd5b6200048783602083016020880162000398565b80955050505050509250925092565b5f8251620004a981846020870162000398565b9190910192915050565b608051610469620004cb5f395f601001526104695ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007a575f356001600160e01b03191663278f794360e11b14610070576040516334ad5dbb60e21b815260040160405180910390fd5b610078610082565b565b6100786100b0565b5f806100913660048184610303565b81019061009e919061033e565b915091506100ac82826100c0565b5050565b6100786100bb61011a565b610151565b6100c98261016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101125761010d82826101ea565b505050565b6100ac61025c565b5f61014c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e80801561016b573d5ff35b3d5ffd5b806001600160a01b03163b5f036101a957604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102069190610407565b5f60405180830381855af49150503d805f811461023e576040519150601f19603f3d011682016040523d82523d5f602084013e610243565b606091505b509150915061025385838361027b565b95945050505050565b34156100785760405163b398979f60e01b815260040160405180910390fd5b6060826102905761028b826102da565b6102d3565b81511580156102a757506001600160a01b0384163b155b156102d057604051639996b31560e01b81526001600160a01b03851660048201526024016101a0565b50805b9392505050565b8051156102ea5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610311575f80fd5b8386111561031d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561034f575f80fd5b82356001600160a01b0381168114610365575f80fd5b9150602083013567ffffffffffffffff80821115610381575f80fd5b818501915085601f830112610394575f80fd5b8135818111156103a6576103a661032a565b604051601f8201601f19908116603f011681019083821181831017156103ce576103ce61032a565b816040528281528860208487010111156103e6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610426576020818601810151858301520161040c565b505f92019182525091905056fea2646970667358221220ce81bf4b3462d078169d011420ecba0f0fbaa2b07ad2219a077b118afe83d8be64736f6c63430008180033608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea2646970667358221220ea9f3702c419c9d24e1a9f83784afc7709e7b7ac4c523638c9c5d294aa0eb0fb64736f6c63430008180033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000003130ccab4859986b0c20bf7c5d4c57d86e5c0298000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b91300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x39b", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0xf23ae3d1a801895e73440fac1b2cec27172855ea", + "initCode": "0x608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea2646970667358221220ea9f3702c419c9d24e1a9f83784afc7709e7b7ac4c523638c9c5d294aa0eb0fb64736f6c63430008180033000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x4375c0eb2697c479597d08275d7d146c439a39d9967e823a5d0a9a63a9016893", + "transactionType": "CREATE", + "contractName": "HoleskyLSDRateProvider", + "contractAddress": "0xa870f20dbdebd248142931bbd998e4979bc89e96", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0x72832", + "value": "0x0", + "input": "0x608060405234801561000f575f80fd5b5061058f8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610090575f3560e01c8063852ec88311610063578063852ec883146101235780639d8e21771461013e578063bd0aef491461014d578063e94fe81514610168578063ed100c3c14610183575f80fd5b80630ba9d8ca1461009457806318122e8a146100ba57806336d7dd67146100ed578063501a771014610108575b5f80fd5b6100a76100a23660046104d3565b61019e565b6040519081526020015b60405180910390f35b6100d5737322c24752f79c05ffd1e2a6fcb97020c1c264f181565b6040516001600160a01b0390911681526020016100b1565b6100d573baacdcc565006b6429f57bc0f436dfaf14a526b181565b6100d573e3c063b1bee9de02eb28352b55d49d85514c67ff81565b6100d573a63f56985f9c7f3bc9ffc5685535649e0c1a55f381565b6100a7670de0b6b3a764000081565b6100d573be16244eae9837219147384c8a7560ba1494626281565b6100d5738d09a4502cc8cf1547ad300e066060d043f6982d81565b6100d5733f1c547b21f65e10480de3ad8e19faac46c9503481565b5f738d09a4502cc8cf1547ad300e066060d043f6982c196001600160a01b0383160161024457604051630f451f7160e31b8152670de0b6b3a76400006004820152733f1c547b21f65e10480de3ad8e19faac46c9503490637a28fb88906024015b602060405180830381865afa15801561021a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061023e9190610500565b92915050565b73a63f56985f9c7f3bc9ffc5685535649e0c1a55f2196001600160a01b0383160161036e5773a63f56985f9c7f3bc9ffc5685535649e0c1a55f36001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102dd9190610500565b670de0b6b3a764000073a63f56985f9c7f3bc9ffc5685535649e0c1a55f36001600160a01b03166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa158015610336573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061035a9190610500565b6103649190610517565b61023e919061053a565b73baacdcc565006b6429f57bc0f436dfaf14a526b0196001600160a01b038316016103d25760405163266d6a8360e11b8152670de0b6b3a7640000600482015273baacdcc565006b6429f57bc0f436dfaf14a526b190634cdad506906024016101ff565b737322c24752f79c05ffd1e2a6fcb97020c1c264f0196001600160a01b0383160161044757737322c24752f79c05ffd1e2a6fcb97020c1c264f16001600160a01b031663e6aa216c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561021a573d5f803e3d5ffd5b73e3c063b1bee9de02eb28352b55d49d85514c67fe196001600160a01b038316016104ab57604051631624304760e21b8152670de0b6b3a7640000600482015273be16244eae9837219147384c8a7560ba1494626290635890c11c906024016101ff565b60405163ee84f40b60e01b81526001600160a01b038316600482015260240160405180910390fd5b5f602082840312156104e3575f80fd5b81356001600160a01b03811681146104f9575f80fd5b9392505050565b5f60208284031215610510575f80fd5b5051919050565b808202811582820484141761023e57634e487b7160e01b5f52601160045260245ffd5b5f8261055457634e487b7160e01b5f52601260045260245ffd5b50049056fea264697066735822122078703393b2dec84b143802dbde47b9b97d93fd0168412715d20ddb87860cce4764736f6c63430008180033", + "nonce": "0x39c", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xc416d22295bba495c283763b6f102418fa9bf5ef4d1fe7aabc2b88eb7919e078", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x7dcb6a1ab53428b70e9748ce0fa69a94481aa50d", + "function": null, + "arguments": [ + "0xa870f20dbDEBd248142931Bbd998e4979BC89E96", + "0x743b91CDB1C694D4F51bCDA3a4A59DcC0d02b913", + "0x" + ], + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0xce728", + "value": "0x0", + "input": "0x60a060405260405162000e5038038062000e508339810160408190526200002691620003bc565b828162000034828262000099565b50508160405162000045906200035a565b6001600160a01b039091168152602001604051809103905ff0801580156200006f573d5f803e3d5ffd5b506001600160a01b0316608052620000906200008a60805190565b620000fe565b505050620004b3565b620000a4826200016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000f057620000eb8282620001ee565b505050565b620000fa62000267565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6200013f5f8051602062000e30833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16200016c8162000289565b50565b806001600160a01b03163b5f03620001aa57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516200020c919062000496565b5f60405180830381855af49150503d805f811462000246576040519150601f19603f3d011682016040523d82523d5f602084013e6200024b565b606091505b5090925090506200025e858383620002ca565b95945050505050565b3415620002875760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b038116620002b457604051633173bdd160e11b81525f6004820152602401620001a1565b805f8051602062000e30833981519152620001cd565b606082620002e357620002dd8262000330565b62000329565b8151158015620002fb57506001600160a01b0384163b155b156200032657604051639996b31560e01b81526001600160a01b0385166004820152602401620001a1565b50805b9392505050565b805115620003415780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6104fc806200093483390190565b80516001600160a01b03811681146200037f575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620003b45781810151838201526020016200039a565b50505f910152565b5f805f60608486031215620003cf575f80fd5b620003da8462000368565b9250620003ea6020850162000368565b60408501519092506001600160401b038082111562000407575f80fd5b818601915086601f8301126200041b575f80fd5b81518181111562000430576200043062000384565b604051601f8201601f19908116603f011681019083821181831017156200045b576200045b62000384565b8160405282815289602084870101111562000474575f80fd5b6200048783602083016020880162000398565b80955050505050509250925092565b5f8251620004a981846020870162000398565b9190910192915050565b608051610469620004cb5f395f601001526104695ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007a575f356001600160e01b03191663278f794360e11b14610070576040516334ad5dbb60e21b815260040160405180910390fd5b610078610082565b565b6100786100b0565b5f806100913660048184610303565b81019061009e919061033e565b915091506100ac82826100c0565b5050565b6100786100bb61011a565b610151565b6100c98261016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101125761010d82826101ea565b505050565b6100ac61025c565b5f61014c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e80801561016b573d5ff35b3d5ffd5b806001600160a01b03163b5f036101a957604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102069190610407565b5f60405180830381855af49150503d805f811461023e576040519150601f19603f3d011682016040523d82523d5f602084013e610243565b606091505b509150915061025385838361027b565b95945050505050565b34156100785760405163b398979f60e01b815260040160405180910390fd5b6060826102905761028b826102da565b6102d3565b81511580156102a757506001600160a01b0384163b155b156102d057604051639996b31560e01b81526001600160a01b03851660048201526024016101a0565b50805b9392505050565b8051156102ea5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610311575f80fd5b8386111561031d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561034f575f80fd5b82356001600160a01b0381168114610365575f80fd5b9150602083013567ffffffffffffffff80821115610381575f80fd5b818501915085601f830112610394575f80fd5b8135818111156103a6576103a661032a565b604051601f8201601f19908116603f011681019083821181831017156103ce576103ce61032a565b816040528281528860208487010111156103e6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610426576020818601810151858301520161040c565b505f92019182525091905056fea2646970667358221220ce81bf4b3462d078169d011420ecba0f0fbaa2b07ad2219a077b118afe83d8be64736f6c63430008180033608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea2646970667358221220ea9f3702c419c9d24e1a9f83784afc7709e7b7ac4c523638c9c5d294aa0eb0fb64736f6c63430008180033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000a870f20dbdebd248142931bbd998e4979bc89e96000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b91300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x39d", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0x88a591a4000a0c87512a4d6b3bc228c5d76e026f", + "initCode": "0x608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea2646970667358221220ea9f3702c419c9d24e1a9f83784afc7709e7b7ac4c523638c9c5d294aa0eb0fb64736f6c63430008180033000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xdffdd0758cbda3fa21d6e996a645f39cf9e048a335ac105e368bca15592cc2a4", + "transactionType": "CREATE", + "contractName": "EigenStrategyManager", + "contractAddress": "0x56d6da35a02082bc8afaa4502c19c957b32b07bd", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0x25d21c", + "value": "0x0", + "input": "0x608060405234801561000f575f80fd5b5061217a8061001d5f395ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c806391d14854116100f3578063c1fe3e4811610093578063db7711c61161006e578063db7711c61461041b578063e63ab1e91461042e578063ea4d3c9b14610455578063fb1bb9de14610468575f80fd5b8063c1fe3e48146103e2578063d547741f146103f5578063daba667d14610408575f80fd5b8063a217fddf116100ce578063a217fddf14610388578063aa388af61461038f578063af9ba225146103bc578063b9ceea0d146103cf575f80fd5b806391d148541461033c5780639a2be4af1461034f5780639be323f414610361575f80fd5b806339b70e381161015e5780634e6c9766116101395780634e6c9766146102f05780635ffcfdc71461030357806374f2ca05146103165780637c0867af14610329575f80fd5b806339b70e381461028a57806339ebf823146102b55780634aa07e64146102dd575f80fd5b80631806694311610199578063180669431461023c578063248a9ca3146102515780632f2ff15d1461026457806336568abe14610277575f80fd5b806301ffc9a7146101bf5780630b725136146101e75780630b74ce8c14610207575b5f80fd5b6101d26101cd366004611be8565b61048f565b60405190151581526020015b60405180910390f35b6101fa6101f5366004611c57565b6104c5565b6040516101de9190611cd0565b61022e7f5604e2fe54b4de17b81a5ded6f82357d742fd2722d67304e37ff20bd589b4f3881565b6040519081526020016101de565b61024f61024a366004611cf6565b6106b6565b005b61022e61025f366004611d2d565b6107d1565b61024f610272366004611d44565b6107f1565b61024f610285366004611d44565b610813565b60015461029d906001600160a01b031681565b6040516001600160a01b0390911681526020016101de565b61029d6102c3366004611d67565b60046020525f90815260409020546001600160a01b031681565b60055461029d906001600160a01b031681565b60075461029d906001600160a01b031681565b61024f610311366004611d82565b61084b565b61022e610324366004611d67565b610da7565b60035461029d906001600160a01b031681565b6101d261034a366004611d44565b610eab565b5f5461029d906001600160a01b031681565b61022e7fd804c5bf32ccb7c8f087c7a3be22668464f9b4302aec069f690a2c9ba96fc02681565b61022e5f81565b6101d261039d366004611d67565b6001600160a01b039081165f9081526004602052604090205416151590565b61022e6103ca366004611df6565b610ee1565b61024f6103dd366004611e20565b610fa4565b60085461029d906001600160a01b031681565b61024f610403366004611d44565b61171c565b60065461029d906001600160a01b031681565b61022e610429366004611df6565b611738565b61022e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60025461029d906001600160a01b031681565b61022e7f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a81565b5f6001600160e01b03198216637965db0b60e01b14806104bf57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60608167ffffffffffffffff8111156104e0576104e0611e58565b604051908082528060200260200182016040528015610509578160200160208202803683370190505b5090505f60035f9054906101000a90046001600160a01b03166001600160a01b031663a1174e7d6040518163ffffffff1660e01b81526004015f60405180830381865afa15801561055c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105839190810190611e7c565b8051909150835f5b818110156106ac575f8787838181106105a6576105a6611f3c565b90506020020160208101906105bb9190611d67565b90505f5b848110156106a2575f8682815181106105da576105da611f3c565b6020908102919091018101516001600160a01b038581165f9081526004938490526040808220549051630aa794bf60e31b8152838516958101959095529294509261066c928792169063553ca5f8906024015b602060405180830381865afa158015610648573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104299190611f50565b90508089868151811061068157610681611f3c565b602002602001018181516106959190611f67565b90525050506001016105bf565b505060010161058b565b5050505092915050565b7f5604e2fe54b4de17b81a5ded6f82357d742fd2722d67304e37ff20bd589b4f386106e08161180f565b826001600160a01b0381166107085760405163d92e233d60e01b815260040160405180910390fd5b826001600160a01b0381166107305760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038581165f90815260046020526040902054161561077857604051631d8bcb6560e01b81526001600160a01b03861660048201526024015b60405180910390fd5b6001600160a01b038581165f8181526004602052604080822080546001600160a01b0319169489169485179055517f5f6921933580ca0adbbb669ff049927ba73230114570507fc8e10f0758f1d8049190a35050505050565b5f9081525f80516020612125833981519152602052604090206001015490565b6107fa826107d1565b6108038161180f565b61080d838361181c565b50505050565b6001600160a01b038116331461083c5760405163334bd91960e11b815260040160405180910390fd5b61084682826118bd565b505050565b7fd804c5bf32ccb7c8f087c7a3be22668464f9b4302aec069f690a2c9ba96fc0266108758161180f565b61087d611936565b83828082146108a9576040516355c5b3e360e11b8152600481018390526024810182905260440161076f565b600354604051630735424b60e11b8152600481018a90525f916001600160a01b031690630e6a849690602401602060405180830381865afa1580156108f0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109149190611f86565b90506001600160a01b03811661094057604051630fd3716f60e01b8152600481018a905260240161076f565b5f8367ffffffffffffffff81111561095a5761095a611e58565b604051908082528060200260200182016040528015610983578160200160208202803683370190505b5090505f5b84811015610a86575f8a8a838181106109a3576109a3611f3c565b90506020020160208101906109b89190611d67565b90508888838181106109cc576109cc611f3c565b905060200201355f03610a0e578888838181106109eb576109eb611f3c565b9050602002013560405163fdea5f4d60e01b815260040161076f91815260200190565b6001600160a01b038082165f908152600460205260409020541680610a5157604051634234b21b60e11b81526001600160a01b038316600482015260240161076f565b80848481518110610a6457610a64611f3c565b6001600160a01b03909216602092830291909101909101525050600101610988565b505f5460405163071794d960e31b81526001600160a01b03909116906338bca6c890610abc908c908c908c908c90600401611fa1565b5f604051808303815f87803b158015610ad3575f80fd5b505af1158015610ae5573d5f803e3d5ffd5b505050505f8467ffffffffffffffff811115610b0357610b03611e58565b604051908082528060200260200182016040528015610b2c578160200160208202803683370190505b5090505f8467ffffffffffffffff811115610b4957610b49611e58565b604051908082528060200260200182016040528015610b72578160200160208202803683370190505b5090505f5b86811015610c99575f80610bc98e8e85818110610b9657610b96611f3c565b9050602002016020810190610bab9190611d67565b8d8d86818110610bbd57610bbd611f3c565b90506020020135611980565b9150915081858481518110610be057610be0611f3c565b60200260200101906001600160a01b031690816001600160a01b03168152505080848481518110610c1357610c13611f3c565b602090810291909101015260405163a9059cbb60e01b81526001600160a01b0388811660048301526024820183905283169063a9059cbb906044016020604051808303815f875af1158015610c6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c8e919061201d565b505050600101610b77565b508b7f73aaca990b709624ed7bf23319e478279075f1941e8b6546adedb985d67979b98c8c8c8c604051610cd09493929190611fa1565b60405180910390a260405163b778bf7b60e01b81526001600160a01b0385169063b778bf7b90610d089085908590889060040161203c565b5f604051808303815f87803b158015610d1f575f80fd5b505af1158015610d31573d5f803e3d5ffd5b505050507f94baf291029a59fe5651fb679bc5b38c0924cda9db75126bc7ec9e84bf5b1c2e828285604051610d689392919061203c565b60405180910390a1505050505050610d9f60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050505050565b6001600160a01b038181165f90815260046020526040812054909116610deb5760405163508516b160e11b81526001600160a01b038316600482015260240161076f565b6003546040805163a1174e7d60e01b815290515f926001600160a01b03169163a1174e7d91600480830192869291908290030181865afa158015610e31573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e589190810190611e7c565b80519091505f5b81811015610ea3575f838281518110610e7a57610e7a611f3c565b60200260200101519050610e8e8682611a7d565b610e989086611f67565b945050600101610e5f565b505050919050565b5f9182525f80516020612125833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6001600160a01b038281165f90815260046020526040812054909116610f255760405163508516b160e11b81526001600160a01b038416600482015260240161076f565b600354604051630735424b60e11b8152600481018490525f916001600160a01b031690630e6a849690602401602060405180830381865afa158015610f6c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f909190611f86565b9050610f9c8482611a7d565b949350505050565b610fb46080820160608301611d67565b6001600160a01b038116610fdb5760405163d92e233d60e01b815260040160405180910390fd5b610feb60e0830160c08401611d67565b6001600160a01b0381166110125760405163d92e233d60e01b815260040160405180910390fd5b611023610100840160e08501611d67565b6001600160a01b03811661104a5760405163d92e233d60e01b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f8115801561108f5750825b90505f8267ffffffffffffffff1660011480156110ab5750303b155b9050811580156110b9575080155b156110d75760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561110157845460ff60401b1916600160401b1785555b611109611b58565b6111225f61111d60e08c0160c08d01611d67565b61181c565b506111597f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61111d6101408c016101208d01611d67565b506111907f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a61111d6101208c016101008d01611d67565b506111c67fd804c5bf32ccb7c8f087c7a3be22668464f9b4302aec069f690a2c9ba96fc02661111d6101008c0160e08d01611d67565b506111fd7f5604e2fe54b4de17b81a5ded6f82357d742fd2722d67304e37ff20bd589b4f3861111d6101608c016101408d01611d67565b505f5b61120a8a806120de565b90508110156114a7575f61121e8b806120de565b8381811061122e5761122e611f3c565b90506020020160208101906112439190611d67565b6001600160a01b0316148061129157505f61126160208c018c6120de565b8381811061127157611271611f3c565b90506020020160208101906112869190611d67565b6001600160a01b0316145b156112af5760405163d92e233d60e01b815260040160405180910390fd5b5f6004816112bd8d806120de565b858181106112cd576112cd611f3c565b90506020020160208101906112e29190611d67565b6001600160a01b03908116825260208201929092526040015f205416146113575761130d8a806120de565b8281811061131d5761131d611f3c565b90506020020160208101906113329190611d67565b604051634af8dd4d60e11b81526001600160a01b03909116600482015260240161076f565b61136460208b018b6120de565b8281811061137457611374611f3c565b90506020020160208101906113899190611d67565b60045f6113968d806120de565b858181106113a6576113a6611f3c565b90506020020160208101906113bb9190611d67565b6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555089806020019061140d91906120de565b8281811061141d5761141d611f3c565b90506020020160208101906114329190611d67565b6001600160a01b03166114458b806120de565b8381811061145557611455611f3c565b905060200201602081019061146a9190611d67565b6001600160a01b03167f5f6921933580ca0adbbb669ff049927ba73230114570507fc8e10f0758f1d80460405160405180910390a3600101611200565b506114b860608a0160408b01611d67565b5f80546001600160a01b0319166001600160a01b03929092169190911790556114e760808a0160608b01611d67565b600180546001600160a01b0319166001600160a01b039290921691909117905561151760a08a0160808b01611d67565b600280546001600160a01b0319166001600160a01b039290921691909117905561154760c08a0160a08b01611d67565b600380546001600160a01b0319166001600160a01b03929092169190911790556115796101808a016101608b01611d67565b600580546001600160a01b0319166001600160a01b03929092169190911790556115ab6101a08a016101808b01611d67565b600680546001600160a01b0319166001600160a01b039283161790556005546040805163183fc7c960e31b81529051919092169163c1fe3e489160048083019260209291908290030181865afa158015611607573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061162b9190611f86565b600880546001600160a01b0319166001600160a01b03928316179055600654604080516338d52e0f60e01b8152905191909216916338d52e0f9160048083019260209291908290030181865afa158015611687573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116ab9190611f86565b600780546001600160a01b0319166001600160a01b0392909216919091179055831561171157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b611725826107d1565b61172e8161180f565b61080d83836118bd565b6005545f906001600160a01b03908116908416036117c25760055460405162b0e38960e81b8152600481018490526001600160a01b039091169063b0e38900906024015b602060405180830381865afa158015611797573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117bb9190611f50565b90506104bf565b6006546001600160a01b03908116908416036118095760065460405163ef8b30f760e01b8152600481018490526001600160a01b039091169063ef8b30f79060240161177c565b50919050565b6118198133611b62565b50565b5f5f805160206121258339815191526118358484610eab565b6118b4575f848152602082815260408083206001600160a01b03871684529091529020805460ff1916600117905561186a3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506104bf565b5f9150506104bf565b5f5f805160206121258339815191526118d68484610eab565b156118b4575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506104bf565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161197a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b6005545f9081906001600160a01b0390811690851603611a1557600854600554604051636f074d1f60e11b8152600481018690526001600160a01b03928316945091169063de0e9a3e906024015b6020604051808303815f875af11580156119ea573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a0e9190611f50565b9050611a76565b6006546001600160a01b0390811690851603611a7057600754600654604051635d043b2960e11b815260048101869052306024820181905260448201526001600160a01b03928316945091169063ba087652906064016119ce565b50829050815b9250929050565b6040516370a0823160e01b81526001600160a01b0382811660048301525f9182918516906370a0823190602401602060405180830381865afa158015611ac5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ae99190611f50565b9050611af58183611f67565b6001600160a01b038581165f908152600460208190526040808320549051630aa794bf60e31b8152888516928101929092529395509092611b4392889291169063553ca5f89060240161062d565b9050611b4f8184611f67565b95945050505050565b611b60611b9f565b565b611b6c8282610eab565b611b9b5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161076f565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611b6057604051631afcd79f60e31b815260040160405180910390fd5b5f60208284031215611bf8575f80fd5b81356001600160e01b031981168114611c0f575f80fd5b9392505050565b5f8083601f840112611c26575f80fd5b50813567ffffffffffffffff811115611c3d575f80fd5b6020830191508360208260051b8501011115611a76575f80fd5b5f8060208385031215611c68575f80fd5b823567ffffffffffffffff811115611c7e575f80fd5b611c8a85828601611c16565b90969095509350505050565b5f815180845260208085019450602084015f5b83811015611cc557815187529582019590820190600101611ca9565b509495945050505050565b602081525f611c0f6020830184611c96565b6001600160a01b0381168114611819575f80fd5b5f8060408385031215611d07575f80fd5b8235611d1281611ce2565b91506020830135611d2281611ce2565b809150509250929050565b5f60208284031215611d3d575f80fd5b5035919050565b5f8060408385031215611d55575f80fd5b823591506020830135611d2281611ce2565b5f60208284031215611d77575f80fd5b8135611c0f81611ce2565b5f805f805f60608688031215611d96575f80fd5b85359450602086013567ffffffffffffffff80821115611db4575f80fd5b611dc089838a01611c16565b90965094506040880135915080821115611dd8575f80fd5b50611de588828901611c16565b969995985093965092949392505050565b5f8060408385031215611e07575f80fd5b8235611e1281611ce2565b946020939093013593505050565b5f60208284031215611e30575f80fd5b813567ffffffffffffffff811115611e46575f80fd5b82016101a08185031215611c0f575f80fd5b634e487b7160e01b5f52604160045260245ffd5b8051611e7781611ce2565b919050565b5f6020808385031215611e8d575f80fd5b825167ffffffffffffffff80821115611ea4575f80fd5b818501915085601f830112611eb7575f80fd5b815181811115611ec957611ec9611e58565b8060051b604051601f19603f83011681018181108582111715611eee57611eee611e58565b604052918252848201925083810185019188831115611f0b575f80fd5b938501935b82851015611f3057611f2185611e6c565b84529385019392850192611f10565b98975050505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611f60575f80fd5b5051919050565b808201808211156104bf57634e487b7160e01b5f52601160045260245ffd5b5f60208284031215611f96575f80fd5b8151611c0f81611ce2565b604080825281018490525f8560608301825b87811015611fe3578235611fc681611ce2565b6001600160a01b0316825260209283019290910190600101611fb3565b5083810360208501528481526001600160fb1b03851115612002575f80fd5b8460051b915081866020830137016020019695505050505050565b5f6020828403121561202d575f80fd5b81518015158114611c0f575f80fd5b606080825284519082018190525f906020906080840190828801845b8281101561207f5781516001600160a01b0316845260208401935090840190600101612058565b505050838103828501526120938187611c96565b848103604086015285518082528387019250908301905f5b818110156120d05783516001600160a01b0316835292840192918401916001016120ab565b509098975050505050505050565b5f808335601e198436030181126120f3575f80fd5b83018035915067ffffffffffffffff82111561210d575f80fd5b6020019150600581901b3603821315611a76575f80fdfe02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800a26469706673582212207b1a58d70a6a787d638ce5f8f974f72a1ff4df4c542d335beabde9f0351dbb7c64736f6c63430008180033", + "nonce": "0x39e", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xe8ca67becc3d5037caea603db4c8c98ec8f2e8f303854080ec89080d873c6e5b", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x143e3364cb771d980c3972efd4a13e73131c9114", + "function": null, + "arguments": [ + "0x56d6da35A02082BC8afaa4502c19c957b32B07bD", + "0x743b91CDB1C694D4F51bCDA3a4A59DcC0d02b913", + "0x" + ], + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0xce728", + "value": "0x0", + "input": "0x60a060405260405162000e5038038062000e508339810160408190526200002691620003bc565b828162000034828262000099565b50508160405162000045906200035a565b6001600160a01b039091168152602001604051809103905ff0801580156200006f573d5f803e3d5ffd5b506001600160a01b0316608052620000906200008a60805190565b620000fe565b505050620004b3565b620000a4826200016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000f057620000eb8282620001ee565b505050565b620000fa62000267565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6200013f5f8051602062000e30833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16200016c8162000289565b50565b806001600160a01b03163b5f03620001aa57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516200020c919062000496565b5f60405180830381855af49150503d805f811462000246576040519150601f19603f3d011682016040523d82523d5f602084013e6200024b565b606091505b5090925090506200025e858383620002ca565b95945050505050565b3415620002875760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b038116620002b457604051633173bdd160e11b81525f6004820152602401620001a1565b805f8051602062000e30833981519152620001cd565b606082620002e357620002dd8262000330565b62000329565b8151158015620002fb57506001600160a01b0384163b155b156200032657604051639996b31560e01b81526001600160a01b0385166004820152602401620001a1565b50805b9392505050565b805115620003415780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6104fc806200093483390190565b80516001600160a01b03811681146200037f575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620003b45781810151838201526020016200039a565b50505f910152565b5f805f60608486031215620003cf575f80fd5b620003da8462000368565b9250620003ea6020850162000368565b60408501519092506001600160401b038082111562000407575f80fd5b818601915086601f8301126200041b575f80fd5b81518181111562000430576200043062000384565b604051601f8201601f19908116603f011681019083821181831017156200045b576200045b62000384565b8160405282815289602084870101111562000474575f80fd5b6200048783602083016020880162000398565b80955050505050509250925092565b5f8251620004a981846020870162000398565b9190910192915050565b608051610469620004cb5f395f601001526104695ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007a575f356001600160e01b03191663278f794360e11b14610070576040516334ad5dbb60e21b815260040160405180910390fd5b610078610082565b565b6100786100b0565b5f806100913660048184610303565b81019061009e919061033e565b915091506100ac82826100c0565b5050565b6100786100bb61011a565b610151565b6100c98261016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101125761010d82826101ea565b505050565b6100ac61025c565b5f61014c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e80801561016b573d5ff35b3d5ffd5b806001600160a01b03163b5f036101a957604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102069190610407565b5f60405180830381855af49150503d805f811461023e576040519150601f19603f3d011682016040523d82523d5f602084013e610243565b606091505b509150915061025385838361027b565b95945050505050565b34156100785760405163b398979f60e01b815260040160405180910390fd5b6060826102905761028b826102da565b6102d3565b81511580156102a757506001600160a01b0384163b155b156102d057604051639996b31560e01b81526001600160a01b03851660048201526024016101a0565b50805b9392505050565b8051156102ea5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610311575f80fd5b8386111561031d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561034f575f80fd5b82356001600160a01b0381168114610365575f80fd5b9150602083013567ffffffffffffffff80821115610381575f80fd5b818501915085601f830112610394575f80fd5b8135818111156103a6576103a661032a565b604051601f8201601f19908116603f011681019083821181831017156103ce576103ce61032a565b816040528281528860208487010111156103e6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610426576020818601810151858301520161040c565b505f92019182525091905056fea2646970667358221220ce81bf4b3462d078169d011420ecba0f0fbaa2b07ad2219a077b118afe83d8be64736f6c63430008180033608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea2646970667358221220ea9f3702c419c9d24e1a9f83784afc7709e7b7ac4c523638c9c5d294aa0eb0fb64736f6c63430008180033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610300000000000000000000000056d6da35a02082bc8afaa4502c19c957b32b07bd000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b91300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x39f", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0x93ec4ad6e769362a206abaafb7e1ddb555de56ed", + "initCode": "0x608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea2646970667358221220ea9f3702c419c9d24e1a9f83784afc7709e7b7ac4c523638c9c5d294aa0eb0fb64736f6c63430008180033000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xea7889d00ac74f8564e93ee5bef488447535e3f58e8ec71dd3b17ce47e5c2ac6", + "transactionType": "CREATE", + "contractName": "TokenStakingNodesManager", + "contractAddress": "0xe69e39077f591ef4c9e29d154dddd92dd17d89f5", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0x23994e", + "value": "0x0", + "input": "0x608060405234801561000f575f80fd5b5061001861001d565b6100cf565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161561006d5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100cc5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b611f0e806100dc5f395ff3fe608060405234801562000010575f80fd5b5060043610620001ec575f3560e01c8063a217fddf1162000113578063d547741f11620000ab578063ea4d3c9b1162000077578063ea4d3c9b1462000491578063f33de6c014620004a5578063f9645e7414620004ae578063fb1bb9de14620004c5575f80fd5b8063d547741f1462000405578063e6319b41146200041c578063e63ab1e91462000441578063e967f4b61462000469575f80fd5b8063cb70bd7911620000eb578063cb70bd7914620003c6578063ce8572d314620003d0578063d131585d14620003e7578063d260952014620003f1575f80fd5b8063a217fddf146200037f578063b5441ab31462000387578063c4240d25146200039e575f80fd5b806336568abe116200018757806378717824116200015f5780637871782414620003105780637eb694a8146200032757806391d14854146200034f578063a1174e7d1462000366575f80fd5b806336568abe14620002cf57806339b70e3814620002e657806361464d2d14620002f9575f80fd5b80630e6a849611620001c75780630e6a849614620002585780631c53c2801462000288578063248a9ca3146200029f5780632f2ff15d14620002b6575f80fd5b806301ffc9a714620001f057806304f67aa1146200021c57806306a78ba61462000241575b5f80fd5b620002076200020136600462001391565b620004ed565b60405190151581526020015b60405180910390f35b620002325f8051602062001e9983398151915281565b60405190815260200162000213565b6200020762000252366004620013d6565b62000524565b6200026f62000269366004620013f4565b62000551565b6040516001600160a01b03909116815260200162000213565b6200026f62000299366004620013f4565b620005ae565b62000232620002b0366004620013f4565b620005d7565b620002cd620002c73660046200140c565b620005f8565b005b620002cd620002e03660046200140c565b62000620565b5f546200026f906001600160a01b031681565b620002cd6200030a366004620013f4565b6200065b565b620002cd62000321366004620013d6565b620006b1565b620002327f9cb3b45ba8017381348975633951e84d77cd512b58a6ebd2533f422ddd94389081565b62000207620003603660046200140c565b620007c0565b62000370620007f7565b6040516200021391906200143d565b620002325f81565b620002cd62000398366004620013d6565b62000859565b620002327fc54b323804427575ac6f9f18bf0a027fc2cb84d5af10f03a09d54fd69842fde981565b6200023260055481565b62000207620003e1366004620013d6565b620009b9565b6200026f620009e6565b6003546200026f906001600160a01b031681565b620002cd620004163660046200140c565b62000b61565b620002076200042d366004620013d6565b6002546001600160a01b0391821691161490565b620002327f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b620002327fd47f55d1ccb2b675ff4066bc639e489a7cb307c80ad9e87fc3104cf217c2b3ee81565b6001546200026f906001600160a01b031681565b60045462000232565b620002cd620004bf3660046200148b565b62000b83565b620002327f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a81565b5f6001600160e01b03198216637965db0b60e01b14806200051e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f6200051e7f9cb3b45ba8017381348975633951e84d77cd512b58a6ebd2533f422ddd94389083620007c0565b6004545f9082106200057e57604051631ca9e25f60e01b8152600481018390526024015b60405180910390fd5b60048281548110620005945762000594620014a3565b5f918252602090912001546001600160a01b031692915050565b60048181548110620005be575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f9081525f8051602062001eb9833981519152602052604090206001015490565b6200060382620005d7565b6200060e816200100e565b6200061a83836200101d565b50505050565b6001600160a01b03811633146200064a5760405163334bd91960e11b815260040160405180910390fd5b620006568282620010c5565b505050565b5f8051602062001e9983398151915262000675816200100e565b60058290556040518281527f5179ce38a6079ec731d2e265edcf9e1635e8ac7fd689ad42c5e20a7571c054159060200160405180910390a15050565b5f8051602062001e99833981519152620006cb816200100e565b816001600160a01b038116620006f45760405163d92e233d60e01b815260040160405180910390fd5b6003546001600160a01b0316156200071f5760405163a81fbfef60e01b815260040160405180910390fd5b82306040516200072f9062001375565b6001600160a01b03928316815291166020820152604001604051809103905ff08015801562000760573d5f803e3d5ffd5b50600380546001600160a01b0319166001600160a01b039283169081179091556040805191825291851660208201527fd13f13f7d12bbc1ec3c2f99ed663d6b643f722a4654c11d4325b35ed88d9fb7591015b60405180910390a1505050565b5f9182525f8051602062001eb9833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060048054806020026020016040519081016040528092919081815260200182805480156200084f57602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831162000830575b5050505050905090565b5f8051602062001e9983398151915262000873816200100e565b816001600160a01b0381166200089c5760405163d92e233d60e01b815260040160405180910390fd5b6003546001600160a01b0316620008c657604051636aef646b60e11b815260040160405180910390fd5b600354604051631b2ce7f360e11b81526001600160a01b03858116600483015290911690633659cfe6906024015f604051808303815f87803b1580156200090b575f80fd5b505af11580156200091e573d5f803e3d5ffd5b505060045491505f90505b81811015620009705762000967600482815481106200094c576200094c620014a3565b5f918252602090912001546001600160a01b03168362001143565b60010162000929565b50604080516001600160a01b0386168152602081018390527f02c79c1e3f8b682a9487f84feb1ab388b1ebf7a5e85307e941ec19122d2ed14e910160405180910390a150505050565b5f6200051e7fd47f55d1ccb2b675ff4066bc639e489a7cb307c80ad9e87fc3104cf217c2b3ee83620007c0565b6003545f906001600160a01b03168062000a135760405163d92e233d60e01b815260040160405180910390fd5b7fc54b323804427575ac6f9f18bf0a027fc2cb84d5af10f03a09d54fd69842fde962000a3f816200100e565b600454600554811062000a6c57600554604051634ec828df60e11b81526004016200057591815260200190565b6003546040515f916001600160a01b03169062000a899062001383565b6001600160a01b0390911681526040602082018190525f90820152606001604051809103905ff08015801562000ac1573d5f803e3d5ffd5b5090508062000ad1818462001143565b600480546001810182555f919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b0383169081179091556040805185815260208101929092527fbf09b194225fb976ecbedf24587fc7de2987992ad982f5321a563ce92221000b910160405180910390a194505050505090565b62000b6c82620005d7565b62000b77816200100e565b6200061a8383620010c5565b62000b926020820182620013d6565b6001600160a01b03811662000bba5760405163d92e233d60e01b815260040160405180910390fd5b62000bcc60a0830160808401620013d6565b6001600160a01b03811662000bf45760405163d92e233d60e01b815260040160405180910390fd5b62000c07610100840160e08501620013d6565b6001600160a01b03811662000c2f5760405163d92e233d60e01b815260040160405180910390fd5b62000c4361012085016101008601620013d6565b6001600160a01b03811662000c6b5760405163d92e233d60e01b815260040160405180910390fd5b62000c7f61014086016101208701620013d6565b6001600160a01b03811662000ca75760405163d92e233d60e01b815260040160405180910390fd5b62000cbb61016087016101408801620013d6565b6001600160a01b03811662000ce35760405163d92e233d60e01b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f8115801562000d295750825b90505f8267ffffffffffffffff16600114801562000d465750303b155b90508115801562000d55575080155b1562000d745760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831562000d9f57845460ff60401b1916600160401b1785555b62000da9620012de565b62000dcb5f801b8d608001602081019062000dc59190620013d6565b6200101d565b5062000df45f8051602062001e998339815191528d60e001602081019062000dc59190620013d6565b5062000e307f9cb3b45ba8017381348975633951e84d77cd512b58a6ebd2533f422ddd9438908d61010001602081019062000dc59190620013d6565b5062000e6c7fc54b323804427575ac6f9f18bf0a027fc2cb84d5af10f03a09d54fd69842fde98d61012001602081019062000dc59190620013d6565b5062000ea87fd47f55d1ccb2b675ff4066bc639e489a7cb307c80ad9e87fc3104cf217c2b3ee8d61014001602081019062000dc59190620013d6565b5062000ee37f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a8d60a001602081019062000dc59190620013d6565b5062000f1e7f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a8d60c001602081019062000dc59190620013d6565b5062000f2e60208d018d620013d6565b5f80546001600160a01b0319166001600160a01b039290921691909117905562000f5f60408d0160208e01620013d6565b600180546001600160a01b0319166001600160a01b039290921691909117905562000f9160608d0160408e01620013d6565b600280546001600160a01b0319166001600160a01b039290921691909117905560608c013560055583156200100057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050505050565b6200101a8133620012ea565b50565b5f5f8051602062001eb9833981519152620010398484620007c0565b620010bb575f848152602082815260408083206001600160a01b03871684529091529020805460ff19166001179055620010703390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506200051e565b5f9150506200051e565b5f5f8051602062001eb9833981519152620010e18484620007c0565b15620010bb575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506200051e565b5f826001600160a01b031663b3c650156040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001181573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620011a79190620014b7565b90508067ffffffffffffffff165f0362000656576040805180820182523081526020810184815291516377b3492760e01b815290516001600160a01b03908116600483015291516024820152908416906377b34927906044015f604051808303815f87803b15801562001218575f80fd5b505af11580156200122b573d5f803e3d5ffd5b50505050826001600160a01b031663b3c650156040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200126c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620012929190620014b7565b604080516001600160a01b038616815267ffffffffffffffff831660208201529192507fa070c83df7efc58b668afb64705222890e09b4090d56ee9981fc66ac1c552aa19101620007b3565b620012e86200132b565b565b620012f68282620007c0565b620013275760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440162000575565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16620012e857604051631afcd79f60e31b815260040160405180910390fd5b61042180620014e183390190565b610597806200190283390190565b5f60208284031215620013a2575f80fd5b81356001600160e01b031981168114620013ba575f80fd5b9392505050565b6001600160a01b03811681146200101a575f80fd5b5f60208284031215620013e7575f80fd5b8135620013ba81620013c1565b5f6020828403121562001405575f80fd5b5035919050565b5f80604083850312156200141e575f80fd5b8235915060208301356200143281620013c1565b809150509250929050565b602080825282518282018190525f9190848201906040850190845b818110156200147f5783516001600160a01b03168352928401929184019160010162001458565b50909695505050505050565b5f61016082840312156200149d575f80fd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215620014c8575f80fd5b815167ffffffffffffffff81168114620013ba575f80fdfe608060405234801561000f575f80fd5b5060405161042138038061042183398101604081905261002e9161015f565b806001600160a01b03811661005d57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61006681610077565b50610070826100c6565b5050610190565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b806001600160a01b03163b5f036100fb5760405163211eb15960e21b81526001600160a01b0382166004820152602401610054565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b80516001600160a01b038116811461015a575f80fd5b919050565b5f8060408385031215610170575f80fd5b61017983610144565b915061018760208401610144565b90509250929050565b6102848061019d5f395ff3fe608060405234801561000f575f80fd5b5060043610610055575f3560e01c80633659cfe6146100595780635c60da1b1461006e578063715018a6146100975780638da5cb5b1461009f578063f2fde38b146100af575b5f80fd5b61006c610067366004610221565b6100c2565b005b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b61006c6100d6565b5f546001600160a01b031661007b565b61006c6100bd366004610221565b6100e9565b6100ca610128565b6100d381610154565b50565b6100de610128565b6100e75f6101d2565b565b6100f1610128565b6001600160a01b03811661011f57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6100d3816101d2565b5f546001600160a01b031633146100e75760405163118cdaa760e01b8152336004820152602401610116565b806001600160a01b03163b5f036101895760405163211eb15960e21b81526001600160a01b0382166004820152602401610116565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610231575f80fd5b81356001600160a01b0381168114610247575f80fd5b939250505056fea264697066735822122059bc2fe6a847d320591ce8ae9540d57a05407dc1cad5806f8b9b812ebbe8595564736f6c6343000818003360a060405260405161059738038061059783398101604081905261002291610376565b61002c828261003e565b506001600160a01b0316608052610465565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e49190610431565b82610209565b505050565b6100f761027c565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d29190610431565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f80846001600160a01b031684604051610225919061044a565b5f60405180830381855af49150503d805f811461025d576040519150601f19603f3d011682016040523d82523d5f602084013e610262565b606091505b50909250905061027385838361029d565b95945050505050565b341561029b5760405163b398979f60e01b815260040160405180910390fd5b565b6060826102b2576102ad826102fc565b6102f5565b81511580156102c957506001600160a01b0384163b155b156102f257604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b50805b9392505050565b80511561030c5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461033b575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561036e578181015183820152602001610356565b50505f910152565b5f8060408385031215610387575f80fd5b61039083610325565b60208401519092506001600160401b03808211156103ac575f80fd5b818501915085601f8301126103bf575f80fd5b8151818111156103d1576103d1610340565b604051601f8201601f19908116603f011681019083821181831017156103f9576103f9610340565b81604052828152886020848701011115610411575f80fd5b610422836020830160208801610354565b80955050505050509250929050565b5f60208284031215610441575f80fd5b6102f582610325565b5f825161045b818460208701610354565b9190910192915050565b60805161011b61047c5f395f601d015261011b5ff3fe6080604052600a600c565b005b60186014601a565b609d565b565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156076573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906098919060ba565b905090565b365f80375f80365f845af43d5f803e80801560b6573d5ff35b3d5ffd5b5f6020828403121560c9575f80fd5b81516001600160a01b038116811460de575f80fd5b939250505056fea26469706673582212200d1b524e33760038e648d1a76ef14717092cab835c5a6d306ec99f56955f4e6964736f6c6343000818003324791c44c040514a5d2580696fc45e7d3cb6c9fa65bf3db2e4755362d6c155b502dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800a2646970667358221220437de3efdc007f5f1a53050bd607aebd0d8ed4bb545041dcc398b8747091344664736f6c63430008180033", + "nonce": "0x3a0", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xe6567dffc618020bb89d69650af1165e07e423fed484d37703582e458803fa65", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x424680c6d4f6af015183b293fdecce8d6ef8d36f", + "function": null, + "arguments": [ + "0xe69E39077F591EF4C9E29D154DdDd92dd17D89F5", + "0x743b91CDB1C694D4F51bCDA3a4A59DcC0d02b913", + "0x" + ], + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0xce728", + "value": "0x0", + "input": "0x60a060405260405162000e5038038062000e508339810160408190526200002691620003bc565b828162000034828262000099565b50508160405162000045906200035a565b6001600160a01b039091168152602001604051809103905ff0801580156200006f573d5f803e3d5ffd5b506001600160a01b0316608052620000906200008a60805190565b620000fe565b505050620004b3565b620000a4826200016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000f057620000eb8282620001ee565b505050565b620000fa62000267565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6200013f5f8051602062000e30833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16200016c8162000289565b50565b806001600160a01b03163b5f03620001aa57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516200020c919062000496565b5f60405180830381855af49150503d805f811462000246576040519150601f19603f3d011682016040523d82523d5f602084013e6200024b565b606091505b5090925090506200025e858383620002ca565b95945050505050565b3415620002875760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b038116620002b457604051633173bdd160e11b81525f6004820152602401620001a1565b805f8051602062000e30833981519152620001cd565b606082620002e357620002dd8262000330565b62000329565b8151158015620002fb57506001600160a01b0384163b155b156200032657604051639996b31560e01b81526001600160a01b0385166004820152602401620001a1565b50805b9392505050565b805115620003415780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6104fc806200093483390190565b80516001600160a01b03811681146200037f575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620003b45781810151838201526020016200039a565b50505f910152565b5f805f60608486031215620003cf575f80fd5b620003da8462000368565b9250620003ea6020850162000368565b60408501519092506001600160401b038082111562000407575f80fd5b818601915086601f8301126200041b575f80fd5b81518181111562000430576200043062000384565b604051601f8201601f19908116603f011681019083821181831017156200045b576200045b62000384565b8160405282815289602084870101111562000474575f80fd5b6200048783602083016020880162000398565b80955050505050509250925092565b5f8251620004a981846020870162000398565b9190910192915050565b608051610469620004cb5f395f601001526104695ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007a575f356001600160e01b03191663278f794360e11b14610070576040516334ad5dbb60e21b815260040160405180910390fd5b610078610082565b565b6100786100b0565b5f806100913660048184610303565b81019061009e919061033e565b915091506100ac82826100c0565b5050565b6100786100bb61011a565b610151565b6100c98261016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101125761010d82826101ea565b505050565b6100ac61025c565b5f61014c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e80801561016b573d5ff35b3d5ffd5b806001600160a01b03163b5f036101a957604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102069190610407565b5f60405180830381855af49150503d805f811461023e576040519150601f19603f3d011682016040523d82523d5f602084013e610243565b606091505b509150915061025385838361027b565b95945050505050565b34156100785760405163b398979f60e01b815260040160405180910390fd5b6060826102905761028b826102da565b6102d3565b81511580156102a757506001600160a01b0384163b155b156102d057604051639996b31560e01b81526001600160a01b03851660048201526024016101a0565b50805b9392505050565b8051156102ea5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610311575f80fd5b8386111561031d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561034f575f80fd5b82356001600160a01b0381168114610365575f80fd5b9150602083013567ffffffffffffffff80821115610381575f80fd5b818501915085601f830112610394575f80fd5b8135818111156103a6576103a661032a565b604051601f8201601f19908116603f011681019083821181831017156103ce576103ce61032a565b816040528281528860208487010111156103e6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610426576020818601810151858301520161040c565b505f92019182525091905056fea2646970667358221220ce81bf4b3462d078169d011420ecba0f0fbaa2b07ad2219a077b118afe83d8be64736f6c63430008180033608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea2646970667358221220ea9f3702c419c9d24e1a9f83784afc7709e7b7ac4c523638c9c5d294aa0eb0fb64736f6c63430008180033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000e69e39077f591ef4c9e29d154dddd92dd17d89f5000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b91300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x3a1", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0x51f3f1dc8536acb83c4648179e14b684f8d26282", + "initCode": "0x608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea2646970667358221220ea9f3702c419c9d24e1a9f83784afc7709e7b7ac4c523638c9c5d294aa0eb0fb64736f6c63430008180033000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x41311a6f4debf2f23711eba2e5352cb1d9516f08a2fec78d35120272f96de7fe", + "transactionType": "CREATE", + "contractName": "AssetRegistry", + "contractAddress": "0x446db5baa728fb8f6118d805efa89681eb0471b1", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0x22d163", + "value": "0x0", + "input": "0x608060405234801561000f575f80fd5b5061001861001d565b6100cf565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161561006d5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100cc5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b611e44806100dc5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c80636be1fcc3116100f3578063c92110c311610093578063e63ab1e91161006e578063e63ab1e9146103a2578063efe0b29c146103c9578063fb1bb9de146103dc578063fc1198c014610403575f80fd5b8063c92110c31461034d578063cf35bdd01461037c578063d547741f1461038f575f80fd5b8063949db658116100ce578063949db65814610312578063a217fddf1461032a578063a4b32de814610331578063c5f827e614610345575f80fd5b80636be1fcc3146102df57806370807528146102ec57806391d14854146102ff575f80fd5b80632f2ff15d1161015e57806341fee44a1161013957806341fee44a146102825780635f4caf46146102a2578063613e85ff146102b557806367e4ac2c146102ca575f80fd5b80632f2ff15d1461023157806336568abe1461024457806339b70e3814610257575f80fd5b806301e1d114146101a557806301ffc9a7146101c057806315e09f3c146101e35780631cbf960d146101f8578063248a9ca31461020b578063298410e51461021e575b5f80fd5b6101ad61040b565b6040519081526020015b60405180910390f35b6101d36101ce3660046118ba565b610495565b60405190151581526020016101b7565b6101f66101f13660046118fc565b6104cb565b005b6101ad610206366004611917565b6107b7565b6101ad610219366004611941565b6108e7565b6101f661022c3660046118fc565b610907565b6101f661023f366004611958565b610bac565b6101f6610252366004611958565b610bce565b60035461026a906001600160a01b031681565b6040516001600160a01b0390911681526020016101b7565b6102956102903660046118fc565b610c06565b6040516101b791906119ba565b6101d36102b03660046118fc565b610c66565b6102bd610c9c565b6040516101b791906119cc565b6102d2610e56565b6040516101b79190611a0f565b6002546101d39060ff1681565b6101f66102fa3660046118fc565b610eb5565b6101d361030d366004611958565b610fbc565b60025461026a9061010090046001600160a01b031681565b6101ad5f81565b6101ad5f80516020611dcf83398151915281565b6101f6610ff2565b61036f61035b3660046118fc565b60016020525f908152604090205460ff1681565b6040516101b79190611a4f565b61026a61038a366004611941565b611063565b6101f661039d366004611958565b61108a565b6101ad7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6101f66103d7366004611a5d565b6110a6565b6101ad7f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a81565b6101f66115eb565b5f8080610416610c9c565b5f80549192505b8181101561048c575f6104755f838154811061043b5761043b611a95565b905f5260205f20015f9054906101000a90046001600160a01b031685848151811061046857610468611a95565b60200260200101516107b7565b90506104818186611abd565b94505060010161041d565b50919392505050565b5f6001600160e01b03198216637965db0b60e01b14806104c557506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f80516020611dcf8339815191526104e28161164f565b816001600160a01b03811661050a5760405163d92e233d60e01b815260040160405180910390fd5b60025460ff161561052e576040516313d0ff5960e31b815260040160405180910390fd5b60026001600160a01b0384165f9081526001602052604090205460ff16600281111561055c5761055c611986565b1461058a57604051631005a45f60e21b81526001600160a01b03841660048201526024015b60405180910390fd5b600480546040516319b11cab60e31b81526001600160a01b03868116938201939093525f929091169063cd88e55890602401602060405180830381865afa1580156105d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105fb9190611ad0565b9050801561061f57604051631f17ea1d60e01b815260048101829052602401610581565b6003546040516374f2ca0560e01b81526001600160a01b0386811660048301525f9216906374f2ca0590602401602060405180830381865afa158015610667573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061068b9190611ad0565b905080156106af57604051636f024b5160e01b815260048101829052602401610581565b5f6106b98661165c565b5f8054919250906106cc90600190611ae7565b815481106106dc576106dc611a95565b5f91825260208220015481546001600160a01b0390911691908390811061070557610705611a95565b5f918252602082200180546001600160a01b0319166001600160a01b03939093169290921790915580548061073c5761073c611afa565b5f82815260208082205f19908401810180546001600160a01b03191690559092019092556001600160a01b03881680835260018252604092839020805460ff1916905591518381527ff166ed9d03804d1c092d69ed29c647b801c58174de928eff484aa9c92f4d5134910160405180910390a2505050505050565b6002546040516305d4ec6560e11b81526001600160a01b0384811660048301525f92839261010090910490911690630ba9d8ca90602401602060405180830381865afa158015610809573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082d9190611ad0565b90505f846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561086c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108909190611b0e565b90508060ff166012036108bf57670de0b6b3a76400006108b08584611b2e565b6108ba9190611b45565b6108de565b6108ca81600a611c44565b6108d48584611b2e565b6108de9190611b45565b95945050505050565b5f9081525f80516020611def833981519152602052604090206001015490565b5f80516020611dcf83398151915261091e8161164f565b816001600160a01b0381166109465760405163d92e233d60e01b815260040160405180910390fd5b60025460ff161561096a576040516313d0ff5960e31b815260040160405180910390fd5b6001600160a01b0383165f9081526001602052604081205460ff16600281111561099657610996611986565b146109bf5760405163049437a360e21b81526001600160a01b0384166004820152602401610581565b60035460405163551c457b60e11b81526001600160a01b0385811660048301529091169063aa388af690602401602060405180830381865afa158015610a07573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a2b9190611c52565b610a535760405163508516b160e11b81526001600160a01b0384166004820152602401610581565b6002546040516305d4ec6560e11b81526001600160a01b03858116600483015261010090920490911690630ba9d8ca90602401602060405180830381865afa925050508015610abf575060408051601f3d908101601f19168201909252610abc91810190611ad0565b60015b610ae757604051633a798e4760e21b81526001600160a01b0384166004820152602401610581565b505f8054600180820183557f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390910180546001600160a01b0319166001600160a01b0387169081179091556040805160208082018352848252928552918390529092208251815491929091839160ff1990911690836002811115610b6d57610b6d611986565b0217905550506040516001600160a01b03851691507f0e3c58ebfb2e7465fbb1c32e6b4f40c3c4f5ca77e8218a386aff8617831260d7905f90a2505050565b610bb5826108e7565b610bbe8161164f565b610bc883836116d2565b50505050565b6001600160a01b0381163314610bf75760405163334bd91960e11b815260040160405180910390fd5b610c018282611773565b505050565b60408051602080820183525f8083526001600160a01b0385168152600182528390208351918201909352825491929091829060ff166002811115610c4c57610c4c611986565b6002811115610c5d57610c5d611986565b90525092915050565b5f60016001600160a01b0383165f9081526001602052604090205460ff166002811115610c9557610c95611986565b1492915050565b5f546060908067ffffffffffffffff811115610cba57610cba611c71565b604051908082528060200260200182016040528015610ce3578160200160208202803683370190505b5060048054604051637063c25360e11b81529294506001600160a01b03169163e0c784a691610d14915f9101611c85565b5f60405180830381865afa158015610d2e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d559190810190611cc8565b6003546040516305b9289b60e11b81529193505f916001600160a01b0390911690630b72513690610d8a908490600401611c85565b5f60405180830381865afa158015610da4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610dcb9190810190611cc8565b905081815114610dfb5780516040516355c5b3e360e11b8152610581918491600401918252602082015260400190565b5f5b82811015610e5057818181518110610e1757610e17611a95565b6020026020010151848281518110610e3157610e31611a95565b60200260200101818151610e459190611abd565b905250600101610dfd565b50505090565b60605f805480602002602001604051908101604052809291908181526020018280548015610eab57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610e8d575b5050505050905090565b5f80516020611dcf833981519152610ecc8161164f565b816001600160a01b038116610ef45760405163d92e233d60e01b815260040160405180910390fd5b60025460ff1615610f18576040516313d0ff5960e31b815260040160405180910390fd5b60016001600160a01b0384165f9081526001602052604090205460ff166002811115610f4657610f46611986565b14610f6f57604051637f93962560e01b81526001600160a01b0384166004820152602401610581565b6001600160a01b0383165f81815260016020526040808220805460ff19166002179055517ffc9274ad64ab0a7d8dedd8c9297fb4e25d7a17eb057457c6bcf2a8f13dc8859c9190a2505050565b5f9182525f80516020611def833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61101c8161164f565b6002805460ff191660019081179091556040519081527f31311016d7204faff81880133e3db244ae8a8b9ce15e83e2432258226d15f942906020015b60405180910390a150565b5f8181548110611071575f80fd5b5f918252602090912001546001600160a01b0316905081565b611093826108e7565b61109c8161164f565b610bc88383611773565b6110b660408201602083016118fc565b6001600160a01b0381166110dd5760405163d92e233d60e01b815260040160405180910390fd5b6110ed60a08301608084016118fc565b6001600160a01b0381166111145760405163d92e233d60e01b815260040160405180910390fd5b61112460c0840160a085016118fc565b6001600160a01b03811661114b5760405163d92e233d60e01b815260040160405180910390fd5b61115b60e0850160c086016118fc565b6001600160a01b0381166111825760405163d92e233d60e01b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f811580156111c75750825b90505f8267ffffffffffffffff1660011480156111e35750303b155b9050811580156111f1575080155b1561120f5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561123957845460ff60401b1916600160401b1785555b6112416117ec565b6112496117f6565b6112625f61125d60a08d0160808e016118fc565b6116d2565b506112977f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61125d60c08d0160a08e016118fc565b506112cc7f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a61125d60e08d0160c08e016118fc565b506112ef5f80516020611dcf83398151915261125d6101008d0160e08e016118fc565b505f6112fb8b80611d81565b905090505f5b81811015611500575f6113148d80611d81565b8381811061132457611324611a95565b905060200201602081019061133991906118fc565b6001600160a01b0316036113605760405163d92e233d60e01b815260040160405180910390fd5b6001805f61136e8f80611d81565b8581811061137e5761137e611a95565b905060200201602081019061139391906118fc565b6001600160a01b0316815260208101919091526040015f205460ff1660028111156113c0576113c0611986565b03611419576113cf8c80611d81565b828181106113df576113df611a95565b90506020020160208101906113f491906118fc565b604051630234bb3360e31b81526001600160a01b039091166004820152602401610581565b5f6114248d80611d81565b8381811061143457611434611a95565b905060200201602081019061144991906118fc565b8154600180820184555f93845260209384902090910180546001600160a01b0319166001600160a01b039390931692909217909155604080519283019052815260015f6114968f80611d81565b858181106114a6576114a6611a95565b90506020020160208101906114bb91906118fc565b6001600160a01b0316815260208101919091526040015f2081518154829060ff191660018360028111156114f1576114f1611986565b02179055505050600101611301565b5061151160408c0160208d016118fc565b600280546001600160a01b039290921661010002610100600160a81b031990921691909117905561154860608c0160408d016118fc565b600380546001600160a01b0319166001600160a01b039290921691909117905561157860808c0160608d016118fc565b600480546001600160a01b0319166001600160a01b03929092169190911790555083156115df57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b7f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a6116158161164f565b6002805460ff191690556040515f81527f31311016d7204faff81880133e3db244ae8a8b9ce15e83e2432258226d15f94290602001611058565b6116598133611806565b50565b5f8054815b818110156116ad57836001600160a01b03165f828154811061168557611685611a95565b5f918252602090912001546001600160a01b0316036116a5579392505050565b600101611661565b5060405163067c787f60e41b81526001600160a01b0384166004820152602401610581565b5f5f80516020611def8339815191526116eb8484610fbc565b61176a575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556117203390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506104c5565b5f9150506104c5565b5f5f80516020611def83398151915261178c8484610fbc565b1561176a575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506104c5565b6117f4611843565b565b6117fe611843565b6117f461188c565b6118108282610fbc565b61183f5760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610581565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166117f457604051631afcd79f60e31b815260040160405180910390fd5b611894611843565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f602082840312156118ca575f80fd5b81356001600160e01b0319811681146118e1575f80fd5b9392505050565b6001600160a01b0381168114611659575f80fd5b5f6020828403121561190c575f80fd5b81356118e1816118e8565b5f8060408385031215611928575f80fd5b8235611933816118e8565b946020939093013593505050565b5f60208284031215611951575f80fd5b5035919050565b5f8060408385031215611969575f80fd5b82359150602083013561197b816118e8565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b600381106119b657634e487b7160e01b5f52602160045260245ffd5b9052565b5f6020820190506104c582845161199a565b602080825282518282018190525f9190848201906040850190845b81811015611a03578351835292840192918401916001016119e7565b50909695505050505050565b602080825282518282018190525f9190848201906040850190845b81811015611a035783516001600160a01b031683529284019291840191600101611a2a565b602081016104c5828461199a565b5f60208284031215611a6d575f80fd5b813567ffffffffffffffff811115611a83575f80fd5b820161010081850312156118e1575f80fd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156104c5576104c5611aa9565b5f60208284031215611ae0575f80fd5b5051919050565b818103818111156104c5576104c5611aa9565b634e487b7160e01b5f52603160045260245ffd5b5f60208284031215611b1e575f80fd5b815160ff811681146118e1575f80fd5b80820281158282048414176104c5576104c5611aa9565b5f82611b5f57634e487b7160e01b5f52601260045260245ffd5b500490565b600181815b80851115611b9e57815f1904821115611b8457611b84611aa9565b80851615611b9157918102915b93841c9390800290611b69565b509250929050565b5f82611bb4575060016104c5565b81611bc057505f6104c5565b8160018114611bd65760028114611be057611bfc565b60019150506104c5565b60ff841115611bf157611bf1611aa9565b50506001821b6104c5565b5060208310610133831016604e8410600b8410161715611c1f575081810a6104c5565b611c298383611b64565b805f1904821115611c3c57611c3c611aa9565b029392505050565b5f6118e160ff841683611ba6565b5f60208284031215611c62575f80fd5b815180151581146118e1575f80fd5b634e487b7160e01b5f52604160045260245ffd5b602080825282548282018190525f8481528281209092916040850190845b81811015611a035783546001600160a01b031683526001938401939285019201611ca3565b5f6020808385031215611cd9575f80fd5b825167ffffffffffffffff80821115611cf0575f80fd5b818501915085601f830112611d03575f80fd5b815181811115611d1557611d15611c71565b8060051b604051601f19603f83011681018181108582111715611d3a57611d3a611c71565b604052918252848201925083810185019188831115611d57575f80fd5b938501935b82851015611d7557845184529385019392850192611d5c565b98975050505050505050565b5f808335601e19843603018112611d96575f80fd5b83018035915067ffffffffffffffff821115611db0575f80fd5b6020019150600581901b3603821315611dc7575f80fd5b925092905056feb1fadd3142ab2ad7f1337ea4d97112bcc8337fc11ce5b20cb04ad038adf9981902dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800a2646970667358221220c993b4b38cdaf05e88ce0f3956017dbfcb6536b46867262d80fd2894e1a7452b64736f6c63430008180033", + "nonce": "0x3a2", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xc99094a48f6a7d9c23590b7edef10fc5e5b16746adf9f8c6518b0b1bb1579fde", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x0e1f914a4895598bfdf4e2b90edd8a06f82fd2cf", + "function": null, + "arguments": [ + "0x446db5Baa728fb8f6118D805EFa89681eB0471b1", + "0x743b91CDB1C694D4F51bCDA3a4A59DcC0d02b913", + "0x" + ], + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0xce728", + "value": "0x0", + "input": "0x60a060405260405162000e5038038062000e508339810160408190526200002691620003bc565b828162000034828262000099565b50508160405162000045906200035a565b6001600160a01b039091168152602001604051809103905ff0801580156200006f573d5f803e3d5ffd5b506001600160a01b0316608052620000906200008a60805190565b620000fe565b505050620004b3565b620000a4826200016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000f057620000eb8282620001ee565b505050565b620000fa62000267565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6200013f5f8051602062000e30833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16200016c8162000289565b50565b806001600160a01b03163b5f03620001aa57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516200020c919062000496565b5f60405180830381855af49150503d805f811462000246576040519150601f19603f3d011682016040523d82523d5f602084013e6200024b565b606091505b5090925090506200025e858383620002ca565b95945050505050565b3415620002875760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b038116620002b457604051633173bdd160e11b81525f6004820152602401620001a1565b805f8051602062000e30833981519152620001cd565b606082620002e357620002dd8262000330565b62000329565b8151158015620002fb57506001600160a01b0384163b155b156200032657604051639996b31560e01b81526001600160a01b0385166004820152602401620001a1565b50805b9392505050565b805115620003415780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6104fc806200093483390190565b80516001600160a01b03811681146200037f575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620003b45781810151838201526020016200039a565b50505f910152565b5f805f60608486031215620003cf575f80fd5b620003da8462000368565b9250620003ea6020850162000368565b60408501519092506001600160401b038082111562000407575f80fd5b818601915086601f8301126200041b575f80fd5b81518181111562000430576200043062000384565b604051601f8201601f19908116603f011681019083821181831017156200045b576200045b62000384565b8160405282815289602084870101111562000474575f80fd5b6200048783602083016020880162000398565b80955050505050509250925092565b5f8251620004a981846020870162000398565b9190910192915050565b608051610469620004cb5f395f601001526104695ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007a575f356001600160e01b03191663278f794360e11b14610070576040516334ad5dbb60e21b815260040160405180910390fd5b610078610082565b565b6100786100b0565b5f806100913660048184610303565b81019061009e919061033e565b915091506100ac82826100c0565b5050565b6100786100bb61011a565b610151565b6100c98261016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101125761010d82826101ea565b505050565b6100ac61025c565b5f61014c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e80801561016b573d5ff35b3d5ffd5b806001600160a01b03163b5f036101a957604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102069190610407565b5f60405180830381855af49150503d805f811461023e576040519150601f19603f3d011682016040523d82523d5f602084013e610243565b606091505b509150915061025385838361027b565b95945050505050565b34156100785760405163b398979f60e01b815260040160405180910390fd5b6060826102905761028b826102da565b6102d3565b81511580156102a757506001600160a01b0384163b155b156102d057604051639996b31560e01b81526001600160a01b03851660048201526024016101a0565b50805b9392505050565b8051156102ea5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610311575f80fd5b8386111561031d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561034f575f80fd5b82356001600160a01b0381168114610365575f80fd5b9150602083013567ffffffffffffffff80821115610381575f80fd5b818501915085601f830112610394575f80fd5b8135818111156103a6576103a661032a565b604051601f8201601f19908116603f011681019083821181831017156103ce576103ce61032a565b816040528281528860208487010111156103e6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610426576020818601810151858301520161040c565b505f92019182525091905056fea2646970667358221220ce81bf4b3462d078169d011420ecba0f0fbaa2b07ad2219a077b118afe83d8be64736f6c63430008180033608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea2646970667358221220ea9f3702c419c9d24e1a9f83784afc7709e7b7ac4c523638c9c5d294aa0eb0fb64736f6c63430008180033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000446db5baa728fb8f6118d805efa89681eb0471b1000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b91300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x3a3", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0xe9b841b3d77fe0da96bc1f635a23b26e861906d1", + "initCode": "0x608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea2646970667358221220ea9f3702c419c9d24e1a9f83784afc7709e7b7ac4c523638c9c5d294aa0eb0fb64736f6c63430008180033000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0xc6698352962753b05462b9d3a238d6b248fd6a7c26c2d12ba5c46a1ce2d6a64a", + "transactionType": "CALL", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x4f68ab830011e55c9f94a7165c832a41c38f1bcb", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0x4f68ab830011e55c9f94a7165c832a41c38f1bcb", + "gas": "0x5ea57", + "value": "0x0", + "input": "0x8d2523930000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000e1f914a4895598bfdf4e2b90edd8a06f82fd2cf000000000000000000000000143e3364cb771d980c3972efd4a13e73131c9114000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b91300000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000018456967656e6c61796572205969656c644e657374204c534400000000000000000000000000000000000000000000000000000000000000000000000000000006796e4c53446500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x3a4", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x50bfa78a32363867988cb987f505398a080ecb63417ecde46044cedbf91f0468", + "transactionType": "CALL", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x0e1f914a4895598bfdf4e2b90edd8a06f82fd2cf", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0x0e1f914a4895598bfdf4e2b90edd8a06f82fd2cf", + "gas": "0x98ee7", + "value": "0x0", + "input": "0xefe0b29c000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001000000000000000000000000007dcb6a1ab53428b70e9748ce0fa69a94481aa50d000000000000000000000000143e3364cb771d980c3972efd4a13e73131c91140000000000000000000000004f68ab830011e55c9f94a7165c832a41c38f1bcb000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b91300000000000000000000000000000000000000000000000000000000000000040000000000000000000000008d09a4502cc8cf1547ad300e066060d043f6982d000000000000000000000000a63f56985f9c7f3bc9ffc5685535649e0c1a55f30000000000000000000000007322c24752f79c05ffd1e2a6fcb97020c1c264f1000000000000000000000000e3c063b1bee9de02eb28352b55d49d85514c67ff", + "nonce": "0x3a5", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x79f010f5dbda34c9fc302436f0e367620105d4d9931e4df1bcb08f1fea61185d", + "transactionType": "CALL", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x143e3364cb771d980c3972efd4a13e73131c9114", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0x143e3364cb771d980c3972efd4a13e73131c9114", + "gas": "0xa3f56", + "value": "0x0", + "input": "0xb9ceea0d000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002400000000000000000000000004f68ab830011e55c9f94a7165c832a41c38f1bcb000000000000000000000000dfb5f6ce42aaa7830e94ecfccad411bef4d4d5b6000000000000000000000000a44151489861fe9e3055d95adc98fbd462b948e7000000000000000000000000424680c6d4f6af015183b293fdecce8d6ef8d36f000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b9130000000000000000000000001234567890123456789012345678901234567890000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b9130000000000000000000000008d09a4502cc8cf1547ad300e066060d043f6982d000000000000000000000000baacdcc565006b6429f57bc0f436dfaf14a526b100000000000000000000000000000000000000000000000000000000000000040000000000000000000000008d09a4502cc8cf1547ad300e066060d043f6982d000000000000000000000000a63f56985f9c7f3bc9ffc5685535649e0c1a55f30000000000000000000000007322c24752f79c05ffd1e2a6fcb97020c1c264f1000000000000000000000000e3c063b1bee9de02eb28352b55d49d85514c67ff00000000000000000000000000000000000000000000000000000000000000040000000000000000000000007d704507b76571a51d9cae8addabbfd0ba0e63d30000000000000000000000009281ff96637710cd9a5cacce9c6fad8c9f54631c0000000000000000000000003a8fbdf9e77dfc25d09741f51d3e181b25d0c4e0000000000000000000000000accc5a86732be85b5012e8614af237801636f8e5", + "nonce": "0x3a6", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x68760b305983fb0fd8be8bfd15be950d6758cdd66c961fb9835ca89f2f23e0e3", + "transactionType": "CALL", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x424680c6d4f6af015183b293fdecce8d6ef8d36f", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0x424680c6d4f6af015183b293fdecce8d6ef8d36f", + "gas": "0x6b74f", + "value": "0x0", + "input": "0xf9645e74000000000000000000000000dfb5f6ce42aaa7830e94ecfccad411bef4d4d5b6000000000000000000000000a44151489861fe9e3055d95adc98fbd462b948e7000000000000000000000000143e3364cb771d980c3972efd4a13e73131c9114000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b91300000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a500000000000000000000000022345678901234567890123456789012345678900000000000000000000000009dd8f69b62ddfd990241530f47dced0dad7f7d39000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "nonce": "0x3a7", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x840d44e0fff168f1711f1173de87ab9f4e372c89383d08fd315b77af4bba63f9", + "transactionType": "CREATE", + "contractName": "TokenStakingNode", + "contractAddress": "0xd6cbb7ede5bc8b6baed31e456f00eb2e9dd7b88e", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0x16109c", + "value": "0x0", + "input": "0x608060405234801561000f575f80fd5b5061001861001d565b6100cf565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161561006d5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100cc5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6112a8806100dc5f395ff3fe608060405234801561000f575f80fd5b5060043610610085575f3560e01c80637c0867af116100585780637c0867af146100ed57806392ab89bb146100ff578063b3c6501514610107578063b778bf7b14610128575f80fd5b8063139d7fed146100895780635c60da1b146100a55780635d21e3da146100c557806377b34927146100da575b5f80fd5b61009260015481565b6040519081526020015b60405180910390f35b6100ad61013b565b6040516001600160a01b03909116815260200161009c565b6100d86100d3366004610d9f565b6101dd565b005b6100d86100e8366004610e7a565b610380565b5f546100ad906001600160a01b031681565b6100d86104df565b61010f610684565b60405167ffffffffffffffff909116815260200161009c565b6100d8610136366004610fa6565b6106bc565b5f8061016860017fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d51611084565b5f1b90505f815490505f819050806001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d591906110a3565b935050505090565b5f5460405163ce8572d360e01b81523360048201526001600160a01b039091169063ce8572d390602401602060405180830381865afa158015610222573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061024691906110be565b61026357604051636e10383f60e11b815260040160405180910390fd5b5f805f9054906101000a90046001600160a01b03166001600160a01b031663ea4d3c9b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102d791906110a3565b60405163eea9064b60e01b81529091506001600160a01b0382169063eea9064b9061030a908790879087906004016110ff565b5f604051808303815f87803b158015610321575f80fd5b505af1158015610333573d5f803e3d5ffd5b50505050836001600160a01b03167fa6ca69be1634c9486160d4fa9f11c9bf604a6a4b1fd23c8336ffc5889ef4b5ab5f60405161037291815260200190565b60405180910390a250505050565b80516001600160a01b0381166103a95760405163d92e233d60e01b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f811580156103ee5750825b90505f8267ffffffffffffffff16600114801561040a5750303b155b905081158015610418575080155b156104365760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561046057845460ff60401b1916600160401b1785555b610468610953565b86515f80546001600160a01b0319166001600160a01b03909216919091179055602087015160015583156104d657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f5460405163ce8572d360e01b81523360048201526001600160a01b039091169063ce8572d390602401602060405180830381865afa158015610524573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061054891906110be565b61056557604051636e10383f60e11b815260040160405180910390fd5b5f805f9054906101000a90046001600160a01b03166001600160a01b031663ea4d3c9b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105d991906110a3565b6040516336a2fa1960e21b81523060048201529091505f906001600160a01b0383169063da8be864906024015f604051808303815f875af1158015610620573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610647919081019061115d565b90507fffbd194689c4814f1672a47eaea1dd48a269b4b60b24c6d991dfe771cae139608160405161067891906111e9565b60405180910390a15050565b5f6106b77ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005467ffffffffffffffff1690565b905090565b6106c4610965565b5f5460405163e6319b4160e01b81523360048201526001600160a01b039091169063e6319b4190602401602060405180830381865afa158015610709573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072d91906110be565b61074a576040516308e8994960e11b815260040160405180910390fd5b5f805f9054906101000a90046001600160a01b03166001600160a01b03166339b70e386040518163ffffffff1660e01b8152600401602060405180830381865afa15801561079a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107be91906110a3565b90505f5b8451811015610923575f8582815181106107de576107de61122c565b602002602001015190505f8583815181106107fb576107fb61122c565b602002602001015190505f8584815181106108185761081861122c565b602002602001015190506108408583856001600160a01b03166109af9092919063ffffffff16565b6040516373d0285560e11b81526001600160a01b0382811660048301528481166024830152604482018490525f919087169063e7a050aa906064016020604051808303815f875af1158015610897573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108bb9190611240565b9050816001600160a01b0316846001600160a01b03167f501f0f7b8b32b1cd5e7b146b296f6118bd16a0575a150d8d19505dfd54fcbfe6858460405161090b929190918252602082015260400190565b60405180910390a35050600190920191506107c29050565b505061094e60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b61095b610a8e565b610963610ad7565b565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016109a957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610a008482610adf565b610a6257604080516001600160a01b03851660248201525f6044808301919091528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610a58908590610b82565b610a628482610b82565b50505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661096357604051631afcd79f60e31b815260040160405180910390fd5b610a68610a8e565b5f805f846001600160a01b031684604051610afa9190611257565b5f604051808303815f865af19150503d805f8114610b33576040519150601f19603f3d011682016040523d82523d5f602084013e610b38565b606091505b5091509150818015610b62575080511580610b62575080806020019051810190610b6291906110be565b8015610b7757505f856001600160a01b03163b115b925050505b92915050565b5f610b966001600160a01b03841683610be8565b905080515f14158015610bba575080806020019051810190610bb891906110be565b155b1561094e57604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6060610bf583835f610bfc565b9392505050565b606081471015610c215760405163cd78605960e01b8152306004820152602401610bdf565b5f80856001600160a01b03168486604051610c3c9190611257565b5f6040518083038185875af1925050503d805f8114610c76576040519150601f19603f3d011682016040523d82523d5f602084013e610c7b565b606091505b5091509150610c8b868383610c95565b9695505050505050565b606082610caa57610ca582610cf1565b610bf5565b8151158015610cc157506001600160a01b0384163b155b15610cea57604051639996b31560e01b81526001600160a01b0385166004820152602401610bdf565b5080610bf5565b805115610d015780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50565b6001600160a01b0381168114610d1a575f80fd5b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715610d6857610d68610d31565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610d9757610d97610d31565b604052919050565b5f805f60608486031215610db1575f80fd5b8335610dbc81610d1d565b925060208481013567ffffffffffffffff80821115610dd9575f80fd5b9086019060408289031215610dec575f80fd5b610df4610d45565b823582811115610e02575f80fd5b8301601f81018a13610e12575f80fd5b803583811115610e2457610e24610d31565b610e36601f8201601f19168701610d6e565b93508084528a86828401011115610e4b575f80fd5b80868301878601375f908401860152509081529082013591810191909152929592945050506040919091013590565b5f60408284031215610e8a575f80fd5b610e92610d45565b8235610e9d81610d1d565b81526020928301359281019290925250919050565b5f67ffffffffffffffff821115610ecb57610ecb610d31565b5060051b60200190565b5f82601f830112610ee4575f80fd5b81356020610ef9610ef483610eb2565b610d6e565b8083825260208201915060208460051b870101935086841115610f1a575f80fd5b602086015b84811015610f365780358352918301918301610f1f565b509695505050505050565b5f82601f830112610f50575f80fd5b81356020610f60610ef483610eb2565b8083825260208201915060208460051b870101935086841115610f81575f80fd5b602086015b84811015610f36578035610f9981610d1d565b8352918301918301610f86565b5f805f60608486031215610fb8575f80fd5b833567ffffffffffffffff80821115610fcf575f80fd5b818601915086601f830112610fe2575f80fd5b81356020610ff2610ef483610eb2565b82815260059290921b8401810191818101908a841115611010575f80fd5b948201945b8386101561103757853561102881610d1d565b82529482019490820190611015565b9750508701359250508082111561104c575f80fd5b61105887838801610ed5565b9350604086013591508082111561106d575f80fd5b5061107a86828701610f41565b9150509250925092565b81810381811115610b7c57634e487b7160e01b5f52601160045260245ffd5b5f602082840312156110b3575f80fd5b8151610bf581610d1d565b5f602082840312156110ce575f80fd5b81518015158114610bf5575f80fd5b5f5b838110156110f75781810151838201526020016110df565b50505f910152565b60018060a01b0384168152606060208201525f83516040606084015280518060a08501526111348160c08601602085016110dd565b60209590950151608084015250506040810191909152601f91909101601f19160160c001919050565b5f602080838503121561116e575f80fd5b825167ffffffffffffffff811115611184575f80fd5b8301601f81018513611194575f80fd5b80516111a2610ef482610eb2565b81815260059190911b820183019083810190878311156111c0575f80fd5b928401925b828410156111de578351825292840192908401906111c5565b979650505050505050565b602080825282518282018190525f9190848201906040850190845b8181101561122057835183529284019291840191600101611204565b50909695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611250575f80fd5b5051919050565b5f82516112688184602087016110dd565b919091019291505056fea26469706673582212200ad209687ce86aa656d26032051de2bf6b4260ae2dbb1b25fef1e2c86126ca7c64736f6c63430008180033", + "nonce": "0x3a8", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x8347f78563d795298cdb1dbe6d69e7f73deaa34b088285af82d89dc449e6d643", + "transactionType": "CALL", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x424680c6d4f6af015183b293fdecce8d6ef8d36f", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0x424680c6d4f6af015183b293fdecce8d6ef8d36f", + "gas": "0x59217", + "value": "0x0", + "input": "0x78717824000000000000000000000000d6cbb7ede5bc8b6baed31e456f00eb2e9dd7b88e", + "nonce": "0x3a9", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0x02c1070da5eb3e4d69f15bf595a238419e813f61", + "initCode": "0x608060405234801561000f575f80fd5b5060405161042138038061042183398101604081905261002e9161015f565b806001600160a01b03811661005d57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61006681610077565b50610070826100c6565b5050610190565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b806001600160a01b03163b5f036100fb5760405163211eb15960e21b81526001600160a01b0382166004820152602401610054565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b80516001600160a01b038116811461015a575f80fd5b919050565b5f8060408385031215610170575f80fd5b61017983610144565b915061018760208401610144565b90509250929050565b6102848061019d5f395ff3fe608060405234801561000f575f80fd5b5060043610610055575f3560e01c80633659cfe6146100595780635c60da1b1461006e578063715018a6146100975780638da5cb5b1461009f578063f2fde38b146100af575b5f80fd5b61006c610067366004610221565b6100c2565b005b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b61006c6100d6565b5f546001600160a01b031661007b565b61006c6100bd366004610221565b6100e9565b6100ca610128565b6100d381610154565b50565b6100de610128565b6100e75f6101d2565b565b6100f1610128565b6001600160a01b03811661011f57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6100d3816101d2565b5f546001600160a01b031633146100e75760405163118cdaa760e01b8152336004820152602401610116565b806001600160a01b03163b5f036101895760405163211eb15960e21b81526001600160a01b0382166004820152602401610116565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610231575f80fd5b81356001600160a01b0381168114610247575f80fd5b939250505056fea264697066735822122059bc2fe6a847d320591ce8ae9540d57a05407dc1cad5806f8b9b812ebbe8595564736f6c63430008180033000000000000000000000000d6cbb7ede5bc8b6baed31e456f00eb2e9dd7b88e000000000000000000000000424680c6d4f6af015183b293fdecce8d6ef8d36f" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x0f63760a984bd47bee44c25d1041fab6d4f98ea4f2bd21395e14b72eac640ab6", + "transactionType": "CALL", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x424680c6d4f6af015183b293fdecce8d6ef8d36f", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0x424680c6d4f6af015183b293fdecce8d6ef8d36f", + "gas": "0x12fa5", + "value": "0x0", + "input": "0x2f2ff15d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "nonce": "0x3aa", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xe6dc810fdcb8e05f67fe71f2a3fcb978d93dc58dc7f3e7e4ce3548cce6a741ff", + "transactionType": "CALL", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x424680c6d4f6af015183b293fdecce8d6ef8d36f", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0x424680c6d4f6af015183b293fdecce8d6ef8d36f", + "gas": "0x131b7", + "value": "0x0", + "input": "0x2f2ff15d24791c44c040514a5d2580696fc45e7d3cb6c9fa65bf3db2e4755362d6c155b5000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "nonce": "0x3ab", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x61ad89", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xcb668bde34c4e5df09c8e9288b085bf0574b3fdd240d0615e23511be7da94eaa", + "transactionIndex": "0xf", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "gasUsed": "0x1deb0c", + "effectiveGasPrice": "0x13eb65f", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0xa0db6fa31af51a65ce226741e0e7b8131ee5ce07" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x83b0f4", + "logs": [ + { + "address": "0x3130ccab4859986b0c20bf7c5d4c57d86e5c0298", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0xeb20f88d6b125889fad7cde67d3b4e3fd27a363460fdeccfb07b4362fbe3b147", + "transactionIndex": "0x11", + "logIndex": "0x21", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000080000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000", + "type": "0x2", + "transactionHash": "0xeb20f88d6b125889fad7cde67d3b4e3fd27a363460fdeccfb07b4362fbe3b147", + "transactionIndex": "0x11", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "gasUsed": "0x219ddf", + "effectiveGasPrice": "0x13eb65f", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0x3130ccab4859986b0c20bf7c5d4c57d86e5c0298" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x8d9dd8", + "logs": [ + { + "address": "0x4f68ab830011e55c9f94a7165c832a41c38f1bcb", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x0000000000000000000000003130ccab4859986b0c20bf7c5d4c57d86e5c0298" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0x75408068ee7395ead3474819676c5daa715950ff43123bd4dd58f48487c1bef5", + "transactionIndex": "0x12", + "logIndex": "0x22", + "removed": false + }, + { + "address": "0xf23ae3d1a801895e73440fac1b2cec27172855ea", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0x75408068ee7395ead3474819676c5daa715950ff43123bd4dd58f48487c1bef5", + "transactionIndex": "0x12", + "logIndex": "0x23", + "removed": false + }, + { + "address": "0x4f68ab830011e55c9f94a7165c832a41c38f1bcb", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f23ae3d1a801895e73440fac1b2cec27172855ea", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0x75408068ee7395ead3474819676c5daa715950ff43123bd4dd58f48487c1bef5", + "transactionIndex": "0x12", + "logIndex": "0x24", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000400000000400000000800000000000000000000000000004000000000000000000000000000002000000000000000000000000000000000000000000000002000081000000000000000000000000000000000000020000000000000000400800000000800000000000000000000000400000000000000000000000000000000000000000002000000000000000800000000000000000000000000000000000000000000000000000204000000000000000000020000000080000000000000000000000000400000000000000000020000000000000000400000000000000000000000000200000000000000000000001", + "type": "0x2", + "transactionHash": "0x75408068ee7395ead3474819676c5daa715950ff43123bd4dd58f48487c1bef5", + "transactionIndex": "0x12", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "gasUsed": "0x9ece4", + "effectiveGasPrice": "0x13eb65f", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0x4f68ab830011e55c9f94a7165c832a41c38f1bcb" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x931f3a", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x4375c0eb2697c479597d08275d7d146c439a39d9967e823a5d0a9a63a9016893", + "transactionIndex": "0x13", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "gasUsed": "0x58162", + "effectiveGasPrice": "0x13eb65f", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0xa870f20dbdebd248142931bbd998e4979bc89e96" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x9d0c1e", + "logs": [ + { + "address": "0x7dcb6a1ab53428b70e9748ce0fa69a94481aa50d", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000a870f20dbdebd248142931bbd998e4979bc89e96" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0xc416d22295bba495c283763b6f102418fa9bf5ef4d1fe7aabc2b88eb7919e078", + "transactionIndex": "0x14", + "logIndex": "0x25", + "removed": false + }, + { + "address": "0x88a591a4000a0c87512a4d6b3bc228c5d76e026f", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0xc416d22295bba495c283763b6f102418fa9bf5ef4d1fe7aabc2b88eb7919e078", + "transactionIndex": "0x14", + "logIndex": "0x26", + "removed": false + }, + { + "address": "0x7dcb6a1ab53428b70e9748ce0fa69a94481aa50d", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088a591a4000a0c87512a4d6b3bc228c5d76e026f", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0xc416d22295bba495c283763b6f102418fa9bf5ef4d1fe7aabc2b88eb7919e078", + "transactionIndex": "0x14", + "logIndex": "0x27", + "removed": false + } + ], + "logsBloom": "0x00000000000000000040000000000000400000000000000000800000000000000200000000000004000000000000000000000000000000000000000000000000000000000000000000000000000002200081000000004000000000000000000000000000020000000000000000000800000000800000000000400000000000400000000000000000000000000000000000000000000000000000000000800000000000000000000000040000000000000000000000000000000000000080000000000020000000000000000000000000000000000400000000000100000020000000000000000400000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xc416d22295bba495c283763b6f102418fa9bf5ef4d1fe7aabc2b88eb7919e078", + "transactionIndex": "0x14", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "gasUsed": "0x9ece4", + "effectiveGasPrice": "0x13eb65f", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0x7dcb6a1ab53428b70e9748ce0fa69a94481aa50d" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xba23e5", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xdffdd0758cbda3fa21d6e996a645f39cf9e048a335ac105e368bca15592cc2a4", + "transactionIndex": "0x15", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "gasUsed": "0x1d17c7", + "effectiveGasPrice": "0x13eb65f", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0x56d6da35a02082bc8afaa4502c19c957b32b07bd" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xc410c9", + "logs": [ + { + "address": "0x143e3364cb771d980c3972efd4a13e73131c9114", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x00000000000000000000000056d6da35a02082bc8afaa4502c19c957b32b07bd" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0xe8ca67becc3d5037caea603db4c8c98ec8f2e8f303854080ec89080d873c6e5b", + "transactionIndex": "0x16", + "logIndex": "0x28", + "removed": false + }, + { + "address": "0x93ec4ad6e769362a206abaafb7e1ddb555de56ed", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0xe8ca67becc3d5037caea603db4c8c98ec8f2e8f303854080ec89080d873c6e5b", + "transactionIndex": "0x16", + "logIndex": "0x29", + "removed": false + }, + { + "address": "0x143e3364cb771d980c3972efd4a13e73131c9114", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093ec4ad6e769362a206abaafb7e1ddb555de56ed", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0xe8ca67becc3d5037caea603db4c8c98ec8f2e8f303854080ec89080d873c6e5b", + "transactionIndex": "0x16", + "logIndex": "0x2a", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000400000000000400000000000000000800000000000000000000000002004000000000010000000000000000000000000000000000000000000000000000000000000000002000081000000000000000000000000000000000000020000000000000000000800000000800000000000000000000000400002000000000000000000000200000000000000040000000000000000800000000000000000000000400100000000000000000000000000000000000000000000000020000000000000000000000000100000000400000000000000000020000000000000000400000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xe8ca67becc3d5037caea603db4c8c98ec8f2e8f303854080ec89080d873c6e5b", + "transactionIndex": "0x16", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "gasUsed": "0x9ece4", + "effectiveGasPrice": "0x13eb65f", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0x143e3364cb771d980c3972efd4a13e73131c9114" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xdf7305", + "logs": [ + { + "address": "0xe69e39077f591ef4c9e29d154dddd92dd17d89f5", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0xea7889d00ac74f8564e93ee5bef488447535e3f58e8ec71dd3b17ce47e5c2ac6", + "transactionIndex": "0x17", + "logIndex": "0x2b", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000060000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xea7889d00ac74f8564e93ee5bef488447535e3f58e8ec71dd3b17ce47e5c2ac6", + "transactionIndex": "0x17", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "gasUsed": "0x1b623c", + "effectiveGasPrice": "0x13eb65f", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0xe69e39077f591ef4c9e29d154dddd92dd17d89f5" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xe95fe9", + "logs": [ + { + "address": "0x424680c6d4f6af015183b293fdecce8d6ef8d36f", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000e69e39077f591ef4c9e29d154dddd92dd17d89f5" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0xe6567dffc618020bb89d69650af1165e07e423fed484d37703582e458803fa65", + "transactionIndex": "0x18", + "logIndex": "0x2c", + "removed": false + }, + { + "address": "0x51f3f1dc8536acb83c4648179e14b684f8d26282", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0xe6567dffc618020bb89d69650af1165e07e423fed484d37703582e458803fa65", + "transactionIndex": "0x18", + "logIndex": "0x2d", + "removed": false + }, + { + "address": "0x424680c6d4f6af015183b293fdecce8d6ef8d36f", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000051f3f1dc8536acb83c4648179e14b684f8d26282", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0xe6567dffc618020bb89d69650af1165e07e423fed484d37703582e458803fa65", + "transactionIndex": "0x18", + "logIndex": "0x2e", + "removed": false + } + ], + "logsBloom": "0x00000000000000008000000000000000400000000000000000800000000000000000000001000004000000000000000000000000000000000000000000000002000000000000000000000000000002000081000000000000000000000000000040000000020000080000020000000800040000800000000000000000000200400000000000000000000000000000000000000002000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000400000000000000000020000000000000000400000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xe6567dffc618020bb89d69650af1165e07e423fed484d37703582e458803fa65", + "transactionIndex": "0x18", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "gasUsed": "0x9ece4", + "effectiveGasPrice": "0x13eb65f", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0x424680c6d4f6af015183b293fdecce8d6ef8d36f" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x104285d", + "logs": [ + { + "address": "0x446db5baa728fb8f6118d805efa89681eb0471b1", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0x41311a6f4debf2f23711eba2e5352cb1d9516f08a2fec78d35120272f96de7fe", + "transactionIndex": "0x19", + "logIndex": "0x2f", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000040200000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x41311a6f4debf2f23711eba2e5352cb1d9516f08a2fec78d35120272f96de7fe", + "transactionIndex": "0x19", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "gasUsed": "0x1ac874", + "effectiveGasPrice": "0x13eb65f", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0x446db5baa728fb8f6118d805efa89681eb0471b1" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x10e1541", + "logs": [ + { + "address": "0x0e1f914a4895598bfdf4e2b90edd8a06f82fd2cf", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000446db5baa728fb8f6118d805efa89681eb0471b1" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0xc99094a48f6a7d9c23590b7edef10fc5e5b16746adf9f8c6518b0b1bb1579fde", + "transactionIndex": "0x1a", + "logIndex": "0x30", + "removed": false + }, + { + "address": "0xe9b841b3d77fe0da96bc1f635a23b26e861906d1", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0xc99094a48f6a7d9c23590b7edef10fc5e5b16746adf9f8c6518b0b1bb1579fde", + "transactionIndex": "0x1a", + "logIndex": "0x31", + "removed": false + }, + { + "address": "0x0e1f914a4895598bfdf4e2b90edd8a06f82fd2cf", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e9b841b3d77fe0da96bc1f635a23b26e861906d1", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0xc99094a48f6a7d9c23590b7edef10fc5e5b16746adf9f8c6518b0b1bb1579fde", + "transactionIndex": "0x1a", + "logIndex": "0x32", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000400000000000000000800000000000000010000000000006000000000000400000000000000000000000000000000000000100000000000000000000000002000081000000000000000000000000000000000000020000000000000000000800000000800000000000000000000004400000000000000000000000000000000000000000000000000000000020a00000000000000000000000000000000000000000100000000000000000000000000000000020000000000000000000000000000000000400000000000000001020000000000000000400000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xc99094a48f6a7d9c23590b7edef10fc5e5b16746adf9f8c6518b0b1bb1579fde", + "transactionIndex": "0x1a", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "gasUsed": "0x9ece4", + "effectiveGasPrice": "0x13eb65f", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0x0e1f914a4895598bfdf4e2b90edd8a06f82fd2cf" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x11220b4", + "logs": [ + { + "address": "0x4f68ab830011e55c9f94a7165c832a41c38f1bcb", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0xc6698352962753b05462b9d3a238d6b248fd6a7c26c2d12ba5c46a1ce2d6a64a", + "transactionIndex": "0x1b", + "logIndex": "0x33", + "removed": false + }, + { + "address": "0x4f68ab830011e55c9f94a7165c832a41c38f1bcb", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0xc6698352962753b05462b9d3a238d6b248fd6a7c26c2d12ba5c46a1ce2d6a64a", + "transactionIndex": "0x1b", + "logIndex": "0x34", + "removed": false + }, + { + "address": "0x4f68ab830011e55c9f94a7165c832a41c38f1bcb", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0xc6698352962753b05462b9d3a238d6b248fd6a7c26c2d12ba5c46a1ce2d6a64a", + "transactionIndex": "0x1b", + "logIndex": "0x35", + "removed": false + }, + { + "address": "0x4f68ab830011e55c9f94a7165c832a41c38f1bcb", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0xc6698352962753b05462b9d3a238d6b248fd6a7c26c2d12ba5c46a1ce2d6a64a", + "transactionIndex": "0x1b", + "logIndex": "0x36", + "removed": false + } + ], + "logsBloom": "0x00000004000000000000000000000000000000000400000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000400000000080000000000000000000000010000000000000020000000000000000004800000000000000000000000000000000000000000000000000000800000000008000000000002480000000000001000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000020000000000004000100002000000020000000000000000400000000000000000000000400200000000000000000000000", + "type": "0x2", + "transactionHash": "0xc6698352962753b05462b9d3a238d6b248fd6a7c26c2d12ba5c46a1ce2d6a64a", + "transactionIndex": "0x1b", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "gasUsed": "0x40b73", + "effectiveGasPrice": "0x13eb65f", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0x4f68ab830011e55c9f94a7165c832a41c38f1bcb", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1190c38", + "logs": [ + { + "address": "0x0e1f914a4895598bfdf4e2b90edd8a06f82fd2cf", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0x50bfa78a32363867988cb987f505398a080ecb63417ecde46044cedbf91f0468", + "transactionIndex": "0x1c", + "logIndex": "0x37", + "removed": false + }, + { + "address": "0x0e1f914a4895598bfdf4e2b90edd8a06f82fd2cf", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0x50bfa78a32363867988cb987f505398a080ecb63417ecde46044cedbf91f0468", + "transactionIndex": "0x1c", + "logIndex": "0x38", + "removed": false + }, + { + "address": "0x0e1f914a4895598bfdf4e2b90edd8a06f82fd2cf", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0x50bfa78a32363867988cb987f505398a080ecb63417ecde46044cedbf91f0468", + "transactionIndex": "0x1c", + "logIndex": "0x39", + "removed": false + }, + { + "address": "0x0e1f914a4895598bfdf4e2b90edd8a06f82fd2cf", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xb1fadd3142ab2ad7f1337ea4d97112bcc8337fc11ce5b20cb04ad038adf99819", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0x50bfa78a32363867988cb987f505398a080ecb63417ecde46044cedbf91f0468", + "transactionIndex": "0x1c", + "logIndex": "0x3a", + "removed": false + }, + { + "address": "0x0e1f914a4895598bfdf4e2b90edd8a06f82fd2cf", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0x50bfa78a32363867988cb987f505398a080ecb63417ecde46044cedbf91f0468", + "transactionIndex": "0x1c", + "logIndex": "0x3b", + "removed": false + } + ], + "logsBloom": "0x00000004000000000000000000000000000000000000000000000000000000000010040000000004000000000000000000000000000000000000000000000000000000000000000000000000400000000080000000000000000000000010000000000000020000000000000000004800000000000000000000000000200004000000000000000000000800000000008000000000000480000000000001000000000000000000000000000000000000000000000000000000001000000400000000000000000000000000000000000020000000000004000100002000001020000000000000000400000000000000000000000400000000000000000000000000", + "type": "0x2", + "transactionHash": "0x50bfa78a32363867988cb987f505398a080ecb63417ecde46044cedbf91f0468", + "transactionIndex": "0x1c", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "gasUsed": "0x6eb84", + "effectiveGasPrice": "0x13eb65f", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0x0e1f914a4895598bfdf4e2b90edd8a06f82fd2cf", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1207778", + "logs": [ + { + "address": "0x143e3364cb771d980c3972efd4a13e73131c9114", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0x79f010f5dbda34c9fc302436f0e367620105d4d9931e4df1bcb08f1fea61185d", + "transactionIndex": "0x1d", + "logIndex": "0x3c", + "removed": false + }, + { + "address": "0x143e3364cb771d980c3972efd4a13e73131c9114", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0x79f010f5dbda34c9fc302436f0e367620105d4d9931e4df1bcb08f1fea61185d", + "transactionIndex": "0x1d", + "logIndex": "0x3d", + "removed": false + }, + { + "address": "0x143e3364cb771d980c3972efd4a13e73131c9114", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0x79f010f5dbda34c9fc302436f0e367620105d4d9931e4df1bcb08f1fea61185d", + "transactionIndex": "0x1d", + "logIndex": "0x3e", + "removed": false + }, + { + "address": "0x143e3364cb771d980c3972efd4a13e73131c9114", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xd804c5bf32ccb7c8f087c7a3be22668464f9b4302aec069f690a2c9ba96fc026", + "0x0000000000000000000000001234567890123456789012345678901234567890", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0x79f010f5dbda34c9fc302436f0e367620105d4d9931e4df1bcb08f1fea61185d", + "transactionIndex": "0x1d", + "logIndex": "0x3f", + "removed": false + }, + { + "address": "0x143e3364cb771d980c3972efd4a13e73131c9114", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x5604e2fe54b4de17b81a5ded6f82357d742fd2722d67304e37ff20bd589b4f38", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0x79f010f5dbda34c9fc302436f0e367620105d4d9931e4df1bcb08f1fea61185d", + "transactionIndex": "0x1d", + "logIndex": "0x40", + "removed": false + }, + { + "address": "0x143e3364cb771d980c3972efd4a13e73131c9114", + "topics": [ + "0x5f6921933580ca0adbbb669ff049927ba73230114570507fc8e10f0758f1d804", + "0x0000000000000000000000008d09a4502cc8cf1547ad300e066060d043f6982d", + "0x0000000000000000000000007d704507b76571a51d9cae8addabbfd0ba0e63d3" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0x79f010f5dbda34c9fc302436f0e367620105d4d9931e4df1bcb08f1fea61185d", + "transactionIndex": "0x1d", + "logIndex": "0x41", + "removed": false + }, + { + "address": "0x143e3364cb771d980c3972efd4a13e73131c9114", + "topics": [ + "0x5f6921933580ca0adbbb669ff049927ba73230114570507fc8e10f0758f1d804", + "0x000000000000000000000000a63f56985f9c7f3bc9ffc5685535649e0c1a55f3", + "0x0000000000000000000000009281ff96637710cd9a5cacce9c6fad8c9f54631c" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0x79f010f5dbda34c9fc302436f0e367620105d4d9931e4df1bcb08f1fea61185d", + "transactionIndex": "0x1d", + "logIndex": "0x42", + "removed": false + }, + { + "address": "0x143e3364cb771d980c3972efd4a13e73131c9114", + "topics": [ + "0x5f6921933580ca0adbbb669ff049927ba73230114570507fc8e10f0758f1d804", + "0x0000000000000000000000007322c24752f79c05ffd1e2a6fcb97020c1c264f1", + "0x0000000000000000000000003a8fbdf9e77dfc25d09741f51d3e181b25d0c4e0" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0x79f010f5dbda34c9fc302436f0e367620105d4d9931e4df1bcb08f1fea61185d", + "transactionIndex": "0x1d", + "logIndex": "0x43", + "removed": false + }, + { + "address": "0x143e3364cb771d980c3972efd4a13e73131c9114", + "topics": [ + "0x5f6921933580ca0adbbb669ff049927ba73230114570507fc8e10f0758f1d804", + "0x000000000000000000000000e3c063b1bee9de02eb28352b55d49d85514c67ff", + "0x000000000000000000000000accc5a86732be85b5012e8614af237801636f8e5" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0x79f010f5dbda34c9fc302436f0e367620105d4d9931e4df1bcb08f1fea61185d", + "transactionIndex": "0x1d", + "logIndex": "0x44", + "removed": false + }, + { + "address": "0x143e3364cb771d980c3972efd4a13e73131c9114", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0x79f010f5dbda34c9fc302436f0e367620105d4d9931e4df1bcb08f1fea61185d", + "transactionIndex": "0x1d", + "logIndex": "0x45", + "removed": false + } + ], + "logsBloom": "0x00000004000002000000040002000000000000000020000000000000000000000000000080000084000000000000000001000000000000000000000208000000008000000080200000000000400000000088008000000000000000000010000000000000020200000000000000004800000000000000000200001100000000000002000000000000000800000000008000000000000490000000000001100200000000010000200000000100000000880000000040000000001000000000000000000000000000000000000010000020100000080044000100082000002020000000000000000402000000000000400000000400000000200000000000000000", + "type": "0x2", + "transactionHash": "0x79f010f5dbda34c9fc302436f0e367620105d4d9931e4df1bcb08f1fea61185d", + "transactionIndex": "0x1d", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "gasUsed": "0x76b40", + "effectiveGasPrice": "0x13eb65f", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0x143e3364cb771d980c3972efd4a13e73131c9114", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1255438", + "logs": [ + { + "address": "0x424680c6d4f6af015183b293fdecce8d6ef8d36f", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0x68760b305983fb0fd8be8bfd15be950d6758cdd66c961fb9835ca89f2f23e0e3", + "transactionIndex": "0x1e", + "logIndex": "0x46", + "removed": false + }, + { + "address": "0x424680c6d4f6af015183b293fdecce8d6ef8d36f", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x24791c44c040514a5d2580696fc45e7d3cb6c9fa65bf3db2e4755362d6c155b5", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0x68760b305983fb0fd8be8bfd15be950d6758cdd66c961fb9835ca89f2f23e0e3", + "transactionIndex": "0x1e", + "logIndex": "0x47", + "removed": false + }, + { + "address": "0x424680c6d4f6af015183b293fdecce8d6ef8d36f", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x9cb3b45ba8017381348975633951e84d77cd512b58a6ebd2533f422ddd943890", + "0x0000000000000000000000002234567890123456789012345678901234567890", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0x68760b305983fb0fd8be8bfd15be950d6758cdd66c961fb9835ca89f2f23e0e3", + "transactionIndex": "0x1e", + "logIndex": "0x48", + "removed": false + }, + { + "address": "0x424680c6d4f6af015183b293fdecce8d6ef8d36f", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xc54b323804427575ac6f9f18bf0a027fc2cb84d5af10f03a09d54fd69842fde9", + "0x0000000000000000000000009dd8f69b62ddfd990241530f47dced0dad7f7d39", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0x68760b305983fb0fd8be8bfd15be950d6758cdd66c961fb9835ca89f2f23e0e3", + "transactionIndex": "0x1e", + "logIndex": "0x49", + "removed": false + }, + { + "address": "0x424680c6d4f6af015183b293fdecce8d6ef8d36f", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xd47f55d1ccb2b675ff4066bc639e489a7cb307c80ad9e87fc3104cf217c2b3ee", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0x68760b305983fb0fd8be8bfd15be950d6758cdd66c961fb9835ca89f2f23e0e3", + "transactionIndex": "0x1e", + "logIndex": "0x4a", + "removed": false + }, + { + "address": "0x424680c6d4f6af015183b293fdecce8d6ef8d36f", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0x68760b305983fb0fd8be8bfd15be950d6758cdd66c961fb9835ca89f2f23e0e3", + "transactionIndex": "0x1e", + "logIndex": "0x4b", + "removed": false + }, + { + "address": "0x424680c6d4f6af015183b293fdecce8d6ef8d36f", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0x68760b305983fb0fd8be8bfd15be950d6758cdd66c961fb9835ca89f2f23e0e3", + "transactionIndex": "0x1e", + "logIndex": "0x4c", + "removed": false + }, + { + "address": "0x424680c6d4f6af015183b293fdecce8d6ef8d36f", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "transactionHash": "0x68760b305983fb0fd8be8bfd15be950d6758cdd66c961fb9835ca89f2f23e0e3", + "transactionIndex": "0x1e", + "logIndex": "0x4d", + "removed": false + } + ], + "logsBloom": "0x00000084000000080000000000000400000000000000000000000000000000000000010000000004000000400000000000000000000000000000002000000002000000000000000000000000400000000080000804000000000000000010000040000000020000000000000800004800000000000000002000000000000000000000000000000000000800000000008000000002000480000000000001000000000800000000000100000000000000008000000000000000001001000000000000000000000000000000000000000020000000000004000100002000000020000000008000000400400002000000000000000400000000002000000000000000", + "type": "0x2", + "transactionHash": "0x68760b305983fb0fd8be8bfd15be950d6758cdd66c961fb9835ca89f2f23e0e3", + "transactionIndex": "0x1e", + "blockHash": "0x803d9015fabe345fe9ed74d5c65b843e35c7a5fed3c2b7cdef76be997963b5df", + "blockNumber": "0x1ed972", + "gasUsed": "0x4dcc0", + "effectiveGasPrice": "0x13eb65f", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0x424680c6d4f6af015183b293fdecce8d6ef8d36f", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1d50a9", + "logs": [ + { + "address": "0xd6cbb7ede5bc8b6baed31e456f00eb2e9dd7b88e", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0x4343ede2308da37c79d536cb3fc8da4b0449fe7648951b5687ef91251e8a62e3", + "blockNumber": "0x1ed973", + "transactionHash": "0x840d44e0fff168f1711f1173de87ab9f4e372c89383d08fd315b77af4bba63f9", + "transactionIndex": "0xb", + "logIndex": "0x5", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000080080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000800000000000000000", + "type": "0x2", + "transactionHash": "0x840d44e0fff168f1711f1173de87ab9f4e372c89383d08fd315b77af4bba63f9", + "transactionIndex": "0xb", + "blockHash": "0x4343ede2308da37c79d536cb3fc8da4b0449fe7648951b5687ef91251e8a62e3", + "blockNumber": "0x1ed973", + "gasUsed": "0x10f916", + "effectiveGasPrice": "0x13eb660", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0xd6cbb7ede5bc8b6baed31e456f00eb2e9dd7b88e" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x215920", + "logs": [ + { + "address": "0x02c1070da5eb3e4d69f15bf595a238419e813f61", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000424680c6d4f6af015183b293fdecce8d6ef8d36f" + ], + "data": "0x", + "blockHash": "0x4343ede2308da37c79d536cb3fc8da4b0449fe7648951b5687ef91251e8a62e3", + "blockNumber": "0x1ed973", + "transactionHash": "0x8347f78563d795298cdb1dbe6d69e7f73deaa34b088285af82d89dc449e6d643", + "transactionIndex": "0xc", + "logIndex": "0x6", + "removed": false + }, + { + "address": "0x02c1070da5eb3e4d69f15bf595a238419e813f61", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000d6cbb7ede5bc8b6baed31e456f00eb2e9dd7b88e" + ], + "data": "0x", + "blockHash": "0x4343ede2308da37c79d536cb3fc8da4b0449fe7648951b5687ef91251e8a62e3", + "blockNumber": "0x1ed973", + "transactionHash": "0x8347f78563d795298cdb1dbe6d69e7f73deaa34b088285af82d89dc449e6d643", + "transactionIndex": "0xc", + "logIndex": "0x7", + "removed": false + }, + { + "address": "0x424680c6d4f6af015183b293fdecce8d6ef8d36f", + "topics": [ + "0xd13f13f7d12bbc1ec3c2f99ed663d6b643f722a4654c11d4325b35ed88d9fb75" + ], + "data": "0x00000000000000000000000002c1070da5eb3e4d69f15bf595a238419e813f61000000000000000000000000d6cbb7ede5bc8b6baed31e456f00eb2e9dd7b88e", + "blockHash": "0x4343ede2308da37c79d536cb3fc8da4b0449fe7648951b5687ef91251e8a62e3", + "blockNumber": "0x1ed973", + "transactionHash": "0x8347f78563d795298cdb1dbe6d69e7f73deaa34b088285af82d89dc449e6d643", + "transactionIndex": "0xc", + "logIndex": "0x8", + "removed": false + } + ], + "logsBloom": "0x00000002000000000000000000000000400000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000002000000002002000003002000000000000000000000000040000000020000000000002000000808000000000000000000000000000000400000000000000000000000000000000000000002000000000000000000000000000000000002000000000000000000000000000000000000000000040000000000000020000000000000010000002010000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x8347f78563d795298cdb1dbe6d69e7f73deaa34b088285af82d89dc449e6d643", + "transactionIndex": "0xc", + "blockHash": "0x4343ede2308da37c79d536cb3fc8da4b0449fe7648951b5687ef91251e8a62e3", + "blockNumber": "0x1ed973", + "gasUsed": "0x40877", + "effectiveGasPrice": "0x13eb660", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0x424680c6d4f6af015183b293fdecce8d6ef8d36f", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x2234f6", + "logs": [ + { + "address": "0x424680c6d4f6af015183b293fdecce8d6ef8d36f", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0x4343ede2308da37c79d536cb3fc8da4b0449fe7648951b5687ef91251e8a62e3", + "blockNumber": "0x1ed973", + "transactionHash": "0x0f63760a984bd47bee44c25d1041fab6d4f98ea4f2bd21395e14b72eac640ab6", + "transactionIndex": "0xd", + "logIndex": "0x9", + "removed": false + } + ], + "logsBloom": "0x00000004000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000002000000000000000000000000400000000080000000000000000000000000000040000000020000000000000000004800000000000000000000000000000000000000000000000000000000000000000000000002000400000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000100000000000020000000000000000400000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x0f63760a984bd47bee44c25d1041fab6d4f98ea4f2bd21395e14b72eac640ab6", + "transactionIndex": "0xd", + "blockHash": "0x4343ede2308da37c79d536cb3fc8da4b0449fe7648951b5687ef91251e8a62e3", + "blockNumber": "0x1ed973", + "gasUsed": "0xdbd6", + "effectiveGasPrice": "0x13eb660", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0x424680c6d4f6af015183b293fdecce8d6ef8d36f", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x23124c", + "logs": [ + { + "address": "0x424680c6d4f6af015183b293fdecce8d6ef8d36f", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x24791c44c040514a5d2580696fc45e7d3cb6c9fa65bf3db2e4755362d6c155b5", + "0x000000000000000000000000743b91cdb1c694d4f51bcda3a4a59dcc0d02b913", + "0x00000000000000000000000072fdbd51085bda5eeed3b55d1a46e2e92f0837a5" + ], + "data": "0x", + "blockHash": "0x4343ede2308da37c79d536cb3fc8da4b0449fe7648951b5687ef91251e8a62e3", + "blockNumber": "0x1ed973", + "transactionHash": "0xe6dc810fdcb8e05f67fe71f2a3fcb978d93dc58dc7f3e7e4ce3548cce6a741ff", + "transactionIndex": "0xe", + "logIndex": "0xa", + "removed": false + } + ], + "logsBloom": "0x00000004000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000002000000000000000000000000400000000080000000000000000000000000000040000000000000000000000800004000000000000000000000000000000000000000000000000000000000000000000000000002000400000000000000000000000000000000000000000000000000000000000000000000001001000000000000000000000000000000000000000000000000000000000100000000000000000000000000000400000000000000000000000000000000002000000000000000", + "type": "0x2", + "transactionHash": "0xe6dc810fdcb8e05f67fe71f2a3fcb978d93dc58dc7f3e7e4ce3548cce6a741ff", + "transactionIndex": "0xe", + "blockHash": "0x4343ede2308da37c79d536cb3fc8da4b0449fe7648951b5687ef91251e8a62e3", + "blockNumber": "0x1ed973", + "gasUsed": "0xdd56", + "effectiveGasPrice": "0x13eb660", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": "0x424680c6d4f6af015183b293fdecce8d6ef8d36f", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1722205518, + "chain": 17000, + "commit": "90b02cc" +} \ No newline at end of file diff --git a/deployments/v0.0.2-HoleskyLSDRateProvider-17000-c8be5346766c1f3c02f5ac4344b42bb343fe8ac7.json b/deployments/v0.0.2-HoleskyLSDRateProvider-17000-c8be5346766c1f3c02f5ac4344b42bb343fe8ac7.json new file mode 100644 index 000000000..e93ed0cb4 --- /dev/null +++ b/deployments/v0.0.2-HoleskyLSDRateProvider-17000-c8be5346766c1f3c02f5ac4344b42bb343fe8ac7.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0x6d03eb32f45eec79362d275be71316dd0ad20419c302b9c316f80c096e62d7b7", + "transactionType": "CREATE", + "contractName": "HoleskyLSDRateProvider", + "contractAddress": "0x0ca50907b8b5fdc6b0b1d5f23195209ad0457113", + "function": null, + "arguments": null, + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "gas": "0x8c1d5", + "value": "0x0", + "input": "0x608060405234801561000f575f80fd5b506107048061001d5f395ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c80636967ff521161006e5780636967ff5214610154578063852ec8831461016f5780639d8e21771461018a578063bd0aef4914610199578063e94fe815146101b4578063ed100c3c146101cf575f80fd5b80630ba9d8ca146100aa57806318122e8a146100d057806336d7dd67146101035780633871d0f11461011e578063501a771014610139575b5f80fd5b6100bd6100b83660046105e9565b6101ea565b6040519081526020015b60405180910390f35b6100eb737322c24752f79c05ffd1e2a6fcb97020c1c264f181565b6040516001600160a01b0390911681526020016100c7565b6100eb73baacdcc565006b6429f57bc0f436dfaf14a526b181565b6100eb7390ed1c6563e99ea284f7940b1b443ce0bc4fc3e481565b6100eb73e3c063b1bee9de02eb28352b55d49d85514c67ff81565b6100eb73b4f5fc289a778b80392b86fa70a7111e5be0f85981565b6100eb73a63f56985f9c7f3bc9ffc5685535649e0c1a55f381565b6100bd670de0b6b3a764000081565b6100eb73be16244eae9837219147384c8a7560ba1494626281565b6100eb738d09a4502cc8cf1547ad300e066060d043f6982d81565b6100eb733f1c547b21f65e10480de3ad8e19faac46c9503481565b5f738d09a4502cc8cf1547ad300e066060d043f6982c196001600160a01b0383160161029057604051630f451f7160e31b8152670de0b6b3a76400006004820152733f1c547b21f65e10480de3ad8e19faac46c9503490637a28fb88906024015b602060405180830381865afa158015610266573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061028a919061060f565b92915050565b73a63f56985f9c7f3bc9ffc5685535649e0c1a55f2196001600160a01b038316016103ba5773a63f56985f9c7f3bc9ffc5685535649e0c1a55f36001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610305573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610329919061060f565b670de0b6b3a764000073a63f56985f9c7f3bc9ffc5685535649e0c1a55f36001600160a01b03166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa158015610382573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a6919061060f565b6103b09190610626565b61028a9190610649565b73baacdcc565006b6429f57bc0f436dfaf14a526b0196001600160a01b0383160161041e5760405163266d6a8360e11b8152670de0b6b3a7640000600482015273baacdcc565006b6429f57bc0f436dfaf14a526b190634cdad5069060240161024b565b737322c24752f79c05ffd1e2a6fcb97020c1c264f0196001600160a01b0383160161049357737322c24752f79c05ffd1e2a6fcb97020c1c264f16001600160a01b031663e6aa216c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610266573d5f803e3d5ffd5b73e3c063b1bee9de02eb28352b55d49d85514c67fe196001600160a01b038316016104f757604051631624304760e21b8152670de0b6b3a7640000600482015273be16244eae9837219147384c8a7560ba1494626290635890c11c9060240161024b565b73b4f5fc289a778b80392b86fa70a7111e5be0f858196001600160a01b038316016105c1575f7390ed1c6563e99ea284f7940b1b443ce0bc4fc3e46001600160a01b031663e6aa216c6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561056d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105919190610668565b90508060400151670de0b6b3a764000082602001516105b09190610626565b6105ba9190610649565b9392505050565b60405163ee84f40b60e01b81526001600160a01b038316600482015260240160405180910390fd5b5f602082840312156105f9575f80fd5b81356001600160a01b03811681146105ba575f80fd5b5f6020828403121561061f575f80fd5b5051919050565b808202811582820484141761028a57634e487b7160e01b5f52601160045260245ffd5b5f8261066357634e487b7160e01b5f52601260045260245ffd5b500490565b5f60608284031215610678575f80fd5b6040516060810181811067ffffffffffffffff821117156106a757634e487b7160e01b5f52604160045260245ffd5b8060405250825181526020830151602082015260408301516040820152809150509291505056fea26469706673582212203ba804146d75c689019638e09d283ac2ebfa459e49666a390b186268d177395f64736f6c63430008180033", + "nonce": "0x6d9", + "chainId": "0x4268", + "accessList": null, + "type": null + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0xaf7a08", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x6d03eb32f45eec79362d275be71316dd0ad20419c302b9c316f80c096e62d7b7", + "transactionIndex": "0x45", + "blockHash": "0xf60903998035c66b1408777fd2eea3f70ec9c7870ae98e8a2e8d5e51f1c438df", + "blockNumber": "0x208353", + "gasUsed": "0x6bc7d", + "effectiveGasPrice": "0x5fac6", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0x0ca50907b8b5fdc6b0b1d5f23195209ad0457113" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1723631143, + "chain": 17000, + "commit": "c8be534" +} \ No newline at end of file diff --git a/deployments/v0.0.2-ynEigenDepositAdapter-1-ede0ac0eb7bb276398849dd43adf2083f6cb97e7.json b/deployments/v0.0.2-ynEigenDepositAdapter-1-ede0ac0eb7bb276398849dd43adf2083f6cb97e7.json new file mode 100644 index 000000000..72aa7419c --- /dev/null +++ b/deployments/v0.0.2-ynEigenDepositAdapter-1-ede0ac0eb7bb276398849dd43adf2083f6cb97e7.json @@ -0,0 +1,94 @@ +{ + "transactions": [ + { + "hash": "0x9e1981c0c8c40689f8e83b6540368472d937f9d04b41d4da34b2921226c8e983", + "transactionType": "CREATE", + "contractName": "ynEigen", + "contractAddress": "0x92df7b6001ef4cfe40b6b425bc4a358c05f27624", + "function": null, + "arguments": null, + "transaction": { + "from": "0xd7d4a7f14265b0a69ae482b85b0a8496c3f99fb9", + "gas": "0x2bcbfe", + "value": "0x0", + "input": "0x608060405234801562000010575f80fd5b506200001b62000021565b620000d5565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d25780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b61267180620000e35f395ff3fe608060405234801561000f575f80fd5b506004361061021e575f3560e01c806370a082311161012a578063a9059cbb116100b4578063e0c784a611610079578063e0c784a6146104e9578063e63ab1e914610509578063f11b818814610530578063f45346dc1461054f578063fb1bb9de14610562575f80fd5b8063a9059cbb14610475578063b8f82b2614610488578063cd88e5581461049b578063d547741f146104c3578063dd62ed3e146104d6575f80fd5b806391d14854116100fa57806391d148541461040957806395d89b411461041c578063979d7e8614610424578063a1a25e6e14610437578063a217fddf1461046e575f80fd5b806370a08231146103a75780638936a91f146103db5780638d252393146103e35780638ffbf6db146103f6575f80fd5b8063313ce567116101ab57806352f94f981161017b57806352f94f981461033a5780635f4caf461461036557806360da3e831461037857806361fd0ae11461038c57806363d8882a1461039f575f80fd5b8063313ce567146102f257806336568abe1461030157806338bca6c8146103145780633e5541f114610327575f80fd5b8063095ea7b3116101f1578063095ea7b31461027f57806318160ddd1461029257806323b872dd146102b9578063248a9ca3146102cc5780632f2ff15d146102df575f80fd5b806301e1d1141461022257806301ffc9a71461023d578063021919801461026057806306fdde031461026a575b5f80fd5b61022a610576565b6040519081526020015b60405180910390f35b61025061024b366004611ef3565b6105e5565b6040519015158152602001610234565b61026861061b565b005b61027261069f565b6040516102349190611f3c565b61025061028d366004611f92565b61075f565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025461022a565b6102506102c7366004611fbc565b610776565b61022a6102da366004611ffa565b61079b565b6102686102ed366004612011565b6107bb565b60405160128152602001610234565b61026861030f366004612011565b6107dd565b610268610322366004612087565b610815565b61022a610335366004611f92565b610ae6565b60015461034d906001600160a01b031681565b6040516001600160a01b039091168152602001610234565b6102506103733660046120ee565b610ba0565b60025461025090600160a01b900460ff1681565b61026861039a36600461211d565b610c0c565b610268610c31565b61022a6103b53660046120ee565b6001600160a01b03165f9081525f805160206125dc833981519152602052604090205490565b610268610c95565b6102686103f13660046121dd565b610d10565b61026861040436600461211d565b611062565b610250610417366004612011565b611084565b6102726110ba565b60025461034d906001600160a01b031681565b6102506104453660046120ee565b6001600160a01b03165f9081525f805160206125bc833981519152602052604090205460ff1690565b61022a5f81565b610250610483366004611f92565b6110f8565b61022a610496366004611f92565b611105565b61022a6104a93660046120ee565b6001600160a01b03165f9081526020819052604090205490565b6102686104d1366004612011565b611110565b61022a6104e4366004612215565b61112c565b6104fc6104f7366004612241565b611175565b6040516102349190612280565b61022a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b61022a61053e3660046120ee565b5f6020819052908152604090205481565b61022a61055d3660046122c3565b61123f565b61022a5f805160206125fc83398151915281565b600254604080516278744560e21b815290515f926001600160a01b0316916301e1d1149160048083019260209291908290030181865afa1580156105bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105e09190612302565b905090565b5f6001600160e01b03198216637965db0b60e01b148061061557506301ffc9a760e01b6001600160e01b03198316145b92915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610645816112aa565b6002805460ff60a01b1916600160a01b908117918290556040517f9723f28d4abaff5df0f62bfb2418f2aac4a739b259edf209b8dc9944fa85aa789261069492900460ff161515815260200190565b60405180910390a150565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f805160206125dc833981519152916106dd90612319565b80601f016020809104026020016040519081016040528092919081815260200182805461070990612319565b80156107545780601f1061072b57610100808354040283529160200191610754565b820191905f5260205f20905b81548152906001019060200180831161073757829003601f168201915b505050505091505090565b5f3361076c8185856112b7565b5060019392505050565b5f336107838582856112c4565b61078e858585611321565b60019150505b9392505050565b5f9081525f8051602061261c833981519152602052604090206001015490565b6107c48261079b565b6107cd816112aa565b6107d7838361137e565b50505050565b6001600160a01b03811633146108065760405163334bd91960e11b815260040160405180910390fd5b610810828261141f565b505050565b6001546001600160a01b03163314610847576040516347ed65b360e11b81523360048201526024015b60405180910390fd5b8281811461087257604051637df4c78160e01b8152600481018290526024810183905260440161083e565b6001546001600160a01b03165f5b82811015610add575f87878381811061089b5761089b612351565b90506020020160208101906108b091906120ee565b600254604051632fa657a360e11b81526001600160a01b038084166004830152929350911690635f4caf4690602401602060405180830381865afa1580156108fa573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091e9190612365565b6109465760405163ee84f40b60e01b81526001600160a01b038216600482015260240161083e565b6001600160a01b0381165f90815260208181526040918290208251918201909252905480825287878581811061097e5761097e612351565b9050602002013511156109db57805182908888868181106109a1576109a1612351565b60405163a8c6953f60e01b81526001600160a01b03909516600486015260248501939093525060209091020135604482015260640161083e565b8686848181106109ed576109ed612351565b905060200201355f80846001600160a01b03166001600160a01b031681526020019081526020015f205f015f828254610a269190612398565b90915550610a62905084888886818110610a4257610a42612351565b90506020020135846001600160a01b03166114989092919063ffffffff16565b7f4104800de83c5a3ae29f33899a811406b39aa89930fcc75e60d84b411803368d82888886818110610a9657610a96612351565b9050602002013586604051610acb939291906001600160a01b0393841681526020810192909252909116604082015260600190565b60405180910390a15050600101610880565b50505050505050565b5f610af083610ba0565b15610b7c57600254604051631cbf960d60e01b81526001600160a01b038581166004830152602482018590525f921690631cbf960d90604401602060405180830381865afa158015610b44573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b689190612302565b9050610b74815f6114f7565b915050610615565b60405163ee84f40b60e01b81526001600160a01b038416600482015260240161083e565b600254604051632fa657a360e11b81526001600160a01b0383811660048301525f921690635f4caf4690602401602060405180830381865afa158015610be8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106159190612365565b5f805160206125fc833981519152610c23816112aa565b610c2d825f611554565b5050565b5f805160206125fc833981519152610c48816112aa565b6002805460ff60a01b1916908190556040517f9723f28d4abaff5df0f62bfb2418f2aac4a739b259edf209b8dc9944fa85aa789161069491600160a01b90910460ff161515815260200190565b5f805160206125fc833981519152610cac816112aa565b7f7e7ba5b20f89141f0255e9704ce6ce6e55f5f28e4fc0d626fc76bedba3053201805460ff191690556040515f805160206125bc833981519152907f5b1b646968864ea75fad546d8c819e0de710df0bf61f658f6ba54dc587472e7b905f90a15050565b610d2060608201604083016120ee565b6001600160a01b038116610d475760405163d92e233d60e01b815260040160405180910390fd5b610d5760a08301608084016120ee565b6001600160a01b038116610d7e5760405163d92e233d60e01b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f81158015610dc35750825b90505f8267ffffffffffffffff166001148015610ddf5750303b155b905081158015610ded575080155b15610e0b5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610e3557845460ff60401b1916600160401b1785555b610e3d6115ef565b610e456115f9565b610ecc610e5289806123ab565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610e939250505060208b018b6123ab565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061160992505050565b610ee55f610ee060a08b0160808c016120ee565b61137e565b50610f1a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610ee060c08b0160a08c016120ee565b50610f3c5f805160206125fc833981519152610ee060e08b0160c08c016120ee565b50610f4d6060890160408a016120ee565b600280546001600160a01b0319166001600160a01b0392909216919091179055610f7d6080890160608a016120ee565b600180546001600160a01b0319166001600160a01b03929092169190911781557f7e7ba5b20f89141f0255e9704ce6ce6e55f5f28e4fc0d626fc76bedba3053201805460ff19169091179055611012610fd960e08a018a6123ee565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525060019250611554915050565b831561105857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f805160206125fc833981519152611079816112aa565b610c2d826001611554565b5f9182525f8051602061261c833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f805160206125dc833981519152916106dd90612319565b5f3361076c818585611321565b5f6107948383610ae6565b6111198261079b565b611122816112aa565b6107d7838361141f565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b6060818067ffffffffffffffff81111561119157611191612109565b6040519080825280602002602001820160405280156111ba578160200160208202803683370190505b5091505f5b81811015611237575f808686848181106111db576111db612351565b90506020020160208101906111f091906120ee565b6001600160a01b03166001600160a01b031681526020019081526020015f205f015483828151811061122457611224612351565b60209081029190910101526001016111bf565b505092915050565b5f61124861161b565b600254600160a01b900460ff1615611273576040516313d0ff5960e31b815260040160405180910390fd5b61127f84848433611665565b905061079460017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6112b4813361181f565b50565b6108108383836001611858565b5f6112cf848461112c565b90505f1981146107d7578181101561131357604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161083e565b6107d784848484035f611858565b6001600160a01b03831661134a57604051634b637e8f60e11b81525f600482015260240161083e565b6001600160a01b0382166113735760405163ec442f0560e01b81525f600482015260240161083e565b61081083838361193c565b5f5f8051602061261c8339815191526113978484611084565b611416575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556113cc3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610615565b5f915050610615565b5f5f8051602061261c8339815191526114388484611084565b15611416575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610615565b6040516001600160a01b0383811660248301526044820183905261081091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506119e5565b5f806115217f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025490565b90505f61152c610576565b9050815f0361153f578492505050610615565b61154b85838387611a46565b95945050505050565b5f805160206125bc8339815191525f5b83518110156107d7575f84828151811061158057611580612351565b6020908102919091018101516001600160a01b0381165f818152868452604090819020805460ff19168915159081179091559051908152919350917fac6d52e87f8a8fc486e04600668caffa28c149f8286b136c0f327b4499b8c723910160405180910390a250600101611564565b6115f7611a93565b565b611601611a93565b6115f7611adc565b611611611a93565b610c2d8282611ae4565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161165f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f61166f85610ba0565b6116975760405163ee84f40b60e01b81526001600160a01b038616600482015260240161083e565b835f036116b757604051631f2a200560e01b815260040160405180910390fd5b6116cc6001600160a01b038616833087611af6565b600254604051631cbf960d60e01b81526001600160a01b038781166004830152602482018790525f921690631cbf960d90604401602060405180830381865afa15801561171b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061173f9190612302565b905061174b815f6114f7565b9150815f0361176d57604051639811e0c760e01b815260040160405180910390fd5b6117778483611b2f565b6001600160a01b0386165f908152602081905260408120805487929061179e908490612434565b909155505060408051868152602081018490526001600160a01b038089169287821692918716917feea1b3e3bf222477bec881b3d636cfbe1adfcf316ad14d2090fc98fdd2774c02910160405180910390a450949350505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6118298282611084565b610c2d5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161083e565b5f805160206125dc8339815191526001600160a01b03851661188f5760405163e602df0560e01b81525f600482015260240161083e565b6001600160a01b0384166118b857604051634a1406b160e11b81525f600482015260240161083e565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561193557836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161192c91815260200190565b60405180910390a35b5050505050565b7f7e7ba5b20f89141f0255e9704ce6ce6e55f5f28e4fc0d626fc76bedba3053201545f805160206125bc8339815191529060ff16801561199457506001600160a01b0384165f9081526020829052604090205460ff16155b80156119a857506001600160a01b03841615155b80156119bc57506001600160a01b03831615155b156119da57604051636ab17e0560e01b815260040160405180910390fd5b6107d7848484611b63565b5f6119f96001600160a01b03841683611c9c565b905080515f14158015611a1d575080806020019051810190611a1b9190612365565b155b1561081057604051635274afe760e01b81526001600160a01b038416600482015260240161083e565b5f80611a53868686611ca9565b9050611a5e83611d68565b8015611a7957505f8480611a7457611a74612447565b868809115b1561154b57611a89600182612434565b9695505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166115f757604051631afcd79f60e31b815260040160405180910390fd5b6117f9611a93565b611aec611a93565b610c2d8282611d94565b6040516001600160a01b0384811660248301528381166044830152606482018390526107d79186918216906323b872dd906084016114c5565b6001600160a01b038216611b585760405163ec442f0560e01b81525f600482015260240161083e565b610c2d5f838361193c565b5f805160206125dc8339815191526001600160a01b038416611b9d5781816002015f828254611b929190612434565b90915550611c0d9050565b6001600160a01b0384165f9081526020829052604090205482811015611bef5760405163391434e360e21b81526001600160a01b0386166004820152602481018290526044810184905260640161083e565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316611c2b576002810180548390039055611c49565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611c8e91815260200190565b60405180910390a350505050565b606061079483835f611de4565b5f838302815f1985870982811083820303915050805f03611cdd57838281611cd357611cd3612447565b0492505050610794565b808411611cfd5760405163227bc15360e01b815260040160405180910390fd5b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b5f6002826003811115611d7d57611d7d61245b565b611d87919061246f565b60ff166001149050919050565b611d9c611a93565b5f805160206125dc8339815191527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace03611dd584826124e0565b50600481016107d783826124e0565b606081471015611e095760405163cd78605960e01b815230600482015260240161083e565b5f80856001600160a01b03168486604051611e2491906125a0565b5f6040518083038185875af1925050503d805f8114611e5e576040519150601f19603f3d011682016040523d82523d5f602084013e611e63565b606091505b5091509150611a89868383606082611e8357611e7e82611eca565b610794565b8151158015611e9a57506001600160a01b0384163b155b15611ec357604051639996b31560e01b81526001600160a01b038516600482015260240161083e565b5080610794565b805115611eda5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f60208284031215611f03575f80fd5b81356001600160e01b031981168114610794575f80fd5b5f5b83811015611f34578181015183820152602001611f1c565b50505f910152565b602081525f8251806020840152611f5a816040850160208701611f1a565b601f01601f19169190910160400192915050565b6001600160a01b03811681146112b4575f80fd5b8035611f8d81611f6e565b919050565b5f8060408385031215611fa3575f80fd5b8235611fae81611f6e565b946020939093013593505050565b5f805f60608486031215611fce575f80fd5b8335611fd981611f6e565b92506020840135611fe981611f6e565b929592945050506040919091013590565b5f6020828403121561200a575f80fd5b5035919050565b5f8060408385031215612022575f80fd5b82359150602083013561203481611f6e565b809150509250929050565b5f8083601f84011261204f575f80fd5b50813567ffffffffffffffff811115612066575f80fd5b6020830191508360208260051b8501011115612080575f80fd5b9250929050565b5f805f806040858703121561209a575f80fd5b843567ffffffffffffffff808211156120b1575f80fd5b6120bd8883890161203f565b909650945060208701359150808211156120d5575f80fd5b506120e28782880161203f565b95989497509550505050565b5f602082840312156120fe575f80fd5b813561079481611f6e565b634e487b7160e01b5f52604160045260245ffd5b5f602080838503121561212e575f80fd5b823567ffffffffffffffff80821115612145575f80fd5b818501915085601f830112612158575f80fd5b81358181111561216a5761216a612109565b8060051b604051601f19603f8301168101818110858211171561218f5761218f612109565b6040529182528482019250838101850191888311156121ac575f80fd5b938501935b828510156121d1576121c285611f82565b845293850193928501926121b1565b98975050505050505050565b5f602082840312156121ed575f80fd5b813567ffffffffffffffff811115612203575f80fd5b82016101008185031215610794575f80fd5b5f8060408385031215612226575f80fd5b823561223181611f6e565b9150602083013561203481611f6e565b5f8060208385031215612252575f80fd5b823567ffffffffffffffff811115612268575f80fd5b6122748582860161203f565b90969095509350505050565b602080825282518282018190525f9190848201906040850190845b818110156122b75783518352928401929184019160010161229b565b50909695505050505050565b5f805f606084860312156122d5575f80fd5b83356122e081611f6e565b92506020840135915060408401356122f781611f6e565b809150509250925092565b5f60208284031215612312575f80fd5b5051919050565b600181811c9082168061232d57607f821691505b60208210810361234b57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612375575f80fd5b81518015158114610794575f80fd5b634e487b7160e01b5f52601160045260245ffd5b8181038181111561061557610615612384565b5f808335601e198436030181126123c0575f80fd5b83018035915067ffffffffffffffff8211156123da575f80fd5b602001915036819003821315612080575f80fd5b5f808335601e19843603018112612403575f80fd5b83018035915067ffffffffffffffff82111561241d575f80fd5b6020019150600581901b3603821315612080575f80fd5b8082018082111561061557610615612384565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f60ff83168061248d57634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b601f82111561081057805f5260205f20601f840160051c810160208510156124c15750805b601f840160051c820191505b81811015611935575f81556001016124cd565b815167ffffffffffffffff8111156124fa576124fa612109565b61250e816125088454612319565b8461249c565b602080601f831160018114612541575f841561252a5750858301515b5f19600386901b1c1916600185901b178555612598565b5f85815260208120601f198616915b8281101561256f57888601518255948401946001909101908401612550565b508582101561258c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f82516125b1818460208701611f1a565b919091019291505056fe7e7ba5b20f89141f0255e9704ce6ce6e55f5f28e4fc0d626fc76bedba305320052c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800a26469706673582212205e3f00d9302af34494396d694fb10a98f93e186f2892d4c06828e0936b52600764736f6c63430008180033", + "nonce": "0x35", + "chainId": "0x4268" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xb4b9d3cd799c7257b431c3026257df78b039a48a5bdd0aaea801ec504bfb2b5d", + "transactionType": "CREATE", + "contractName": "ynEigenDepositAdapter", + "contractAddress": "0x7af5cc12cee35dee9ccd0aa4d5e1772eb45b2046", + "function": null, + "arguments": null, + "transaction": { + "from": "0xd7d4a7f14265b0a69ae482b85b0a8496c3f99fb9", + "gas": "0x184613", + "value": "0x0", + "input": "0x608060405234801561000f575f80fd5b506115248061001d5f395ff3fe608060405234801561000f575f80fd5b50600436106100fb575f3560e01c80639a2be4af11610093578063c1fe3e4811610063578063c1fe3e4814610213578063d547741f14610226578063daba667d14610239578063f45346dc1461024c575f80fd5b80639a2be4af146101d4578063a1d0362e146101e6578063a217fddf146101f9578063b8f82b2614610200575f80fd5b806336568abe116100ce57806336568abe146101705780634aa07e64146101835780634e6c9766146101ae57806391d14854146101c1575f80fd5b806301ffc9a7146100ff5780630415cc1514610127578063248a9ca31461013c5780632f2ff15d1461015d575b5f80fd5b61011261010d366004611289565b61025f565b60405190151581526020015b60405180910390f35b61013a6101353660046112c4565b610295565b005b61014f61014a366004611353565b6105ab565b60405190815260200161011e565b61013a61016b36600461136a565b6105cb565b61013a61017e36600461136a565b6105ed565b600154610196906001600160a01b031681565b6040516001600160a01b03909116815260200161011e565b600454610196906001600160a01b031681565b6101126101cf36600461136a565b610625565b5f54610196906001600160a01b031681565b61014f6101f4366004611398565b61065b565b61014f5f81565b61014f61020e3660046113e8565b61074c565b600354610196906001600160a01b031681565b61013a61023436600461136a565b610983565b600254610196906001600160a01b031681565b61014f61025a366004611412565b61099f565b5f6001600160e01b03198216637965db0b60e01b148061028f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f811580156102da5750825b90505f8267ffffffffffffffff1660011480156102f65750303b155b905081158015610304575080155b156103225760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561034c57845460ff60401b1916600160401b1785555b85516001600160a01b0381166103755760405163d92e233d60e01b815260040160405180910390fd5b60208701516001600160a01b0381166103a15760405163d92e233d60e01b815260040160405180910390fd5b60408801516001600160a01b0381166103cd5760405163d92e233d60e01b815260040160405180910390fd5b60608901516001600160a01b0381166103f95760405163d92e233d60e01b815260040160405180910390fd5b610401610a98565b6104115f801b8b60600151610aa2565b5089515f80546001600160a01b039283166001600160a01b0319918216179091556020808d015160018054918516918416821790556040808f01516002805491909616941693909317909355815163183fc7c960e31b8152915163c1fe3e489260048082019392918290030181865afa158015610490573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104b49190611451565b600380546001600160a01b0319166001600160a01b03928316179055600254604080516338d52e0f60e01b8152905191909216916338d52e0f9160048083019260209291908290030181865afa158015610510573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105349190611451565b60045f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050505083156105a357845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f9081525f805160206114cf833981519152602052604090206001015490565b6105d4826105ab565b6105dd81610b43565b6105e78383610aa2565b50505050565b6001600160a01b03811633146106165760405163334bd91960e11b815260040160405180910390fd5b6106208282610b50565b505050565b5f9182525f805160206114cf833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f6001600160a01b0383166106835760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0382166106aa5760405163d92e233d60e01b815260040160405180910390fd5b826001600160a01b0316826001600160a01b0316036106dc57604051632af47b8760e11b815260040160405180910390fd5b6106e785858561099f565b60408051338152602081018790529081018290524260608201529091506001600160a01b0380841691878216918616907f5ec2325bfdc6696fa381751bb5a9994c005f28fabd0b7dc55488f18ce1a85ef19060800160405180910390a4949350505050565b6004545f906001600160a01b039081169084160361084e576002546040516363737ac960e11b8152600481018490525f916001600160a01b03169063c6e6f59290602401602060405180830381865afa1580156107ab573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107cf919061146c565b5f54600254604051635c7c159360e11b81526001600160a01b03918216600482015260248101849052929350169063b8f82b26906044015b602060405180830381865afa158015610822573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610846919061146c565b91505061028f565b6003546001600160a01b039081169084160361090a5760015460405162b0e38960e81b8152600481018490525f916001600160a01b03169063b0e3890090602401602060405180830381865afa1580156108aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ce919061146c565b5f54600154604051635c7c159360e11b81526001600160a01b03918216600482015260248101849052929350169063b8f82b2690604401610807565b5f54604051635c7c159360e11b81526001600160a01b038581166004830152602482018590529091169063b8f82b2690604401602060405180830381865afa158015610958573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061097c919061146c565b905061028f565b61098c826105ab565b61099581610b43565b6105e78383610b50565b6003545f906001600160a01b03908116908516036109c8576109c18383610bc9565b9050610a91565b6004546001600160a01b03908116908516036109e8576109c18383610d69565b6109fd6001600160a01b038516333086610f04565b5f54610a16906001600160a01b03868116911685610f6b565b5f54604051633d14d1b760e21b81526001600160a01b0386811660048301526024820186905284811660448301529091169063f45346dc906064016020604051808303815f875af1158015610a6d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c1919061146c565b9392505050565b610aa0610ffa565b565b5f5f805160206114cf833981519152610abb8484610625565b610b3a575f848152602082815260408083206001600160a01b03871684529091529020805460ff19166001179055610af03390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4600191505061028f565b5f91505061028f565b610b4d8133611043565b50565b5f5f805160206114cf833981519152610b698484610625565b15610b3a575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4600191505061028f565b6003545f90610be3906001600160a01b0316333086610f04565b600154600354610c00916001600160a01b03918216911685610f6b565b600154604051630ea598cb60e41b8152600481018590525f916001600160a01b03169063ea598cb0906024016020604051808303815f875af1158015610c48573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c6c919061146c565b5f54600154919250610c8b916001600160a01b03908116911683610f6b565b5f54600154604051633d14d1b760e21b81526001600160a01b03918216600482015260248101849052858216604482015291169063f45346dc906064016020604051808303815f875af1158015610ce4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d08919061146c565b60035460408051878152602081018590529081018390529193506001600160a01b03908116919085169033907ff54c2631d8cb114d7a2dcd916b8d4bed6baae85cdf5444217c179e324cb2b907906060015b60405180910390a45092915050565b6004545f90610d83906001600160a01b0316333086610f04565b600254600454610da0916001600160a01b03918216911685610f6b565b600254604051636e553f6560e01b8152600481018590523060248201525f916001600160a01b031690636e553f65906044016020604051808303815f875af1158015610dee573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e12919061146c565b5f54600254919250610e31916001600160a01b03908116911683610f6b565b5f54600254604051633d14d1b760e21b81526001600160a01b03918216600482015260248101849052858216604482015291169063f45346dc906064016020604051808303815f875af1158015610e8a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eae919061146c565b60045460408051878152602081018590529081018390529193506001600160a01b03908116919085169033907ff54c2631d8cb114d7a2dcd916b8d4bed6baae85cdf5444217c179e324cb2b90790606001610d5a565b6040516001600160a01b0384811660248301528381166044830152606482018390526105e79186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050611085565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610fbc84826110e6565b6105e7576040516001600160a01b0384811660248301525f6044830152610ff091869182169063095ea7b390606401610f39565b6105e78482611085565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610aa057604051631afcd79f60e31b815260040160405180910390fd5b61104d8282610625565b6110815760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044015b60405180910390fd5b5050565b5f6110996001600160a01b03841683611187565b905080515f141580156110bd5750808060200190518101906110bb9190611483565b155b1561062057604051635274afe760e01b81526001600160a01b0384166004820152602401611078565b5f805f846001600160a01b03168460405161110191906114a2565b5f604051808303815f865af19150503d805f811461113a576040519150601f19603f3d011682016040523d82523d5f602084013e61113f565b606091505b50915091508180156111695750805115806111695750808060200190518101906111699190611483565b801561117e57505f856001600160a01b03163b115b95945050505050565b6060610a9183835f845f80856001600160a01b031684866040516111ab91906114a2565b5f6040518083038185875af1925050503d805f81146111e5576040519150601f19603f3d011682016040523d82523d5f602084013e6111ea565b606091505b50915091506111fa868383611204565b9695505050505050565b6060826112195761121482611260565b610a91565b815115801561123057506001600160a01b0384163b155b1561125957604051639996b31560e01b81526001600160a01b0385166004820152602401611078565b5080610a91565b8051156112705780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f60208284031215611299575f80fd5b81356001600160e01b031981168114610a91575f80fd5b6001600160a01b0381168114610b4d575f80fd5b5f608082840312156112d4575f80fd5b6040516080810181811067ffffffffffffffff8211171561130357634e487b7160e01b5f52604160045260245ffd5b6040528235611311816112b0565b81526020830135611321816112b0565b60208201526040830135611334816112b0565b60408201526060830135611347816112b0565b60608201529392505050565b5f60208284031215611363575f80fd5b5035919050565b5f806040838503121561137b575f80fd5b82359150602083013561138d816112b0565b809150509250929050565b5f805f80608085870312156113ab575f80fd5b84356113b6816112b0565b93506020850135925060408501356113cd816112b0565b915060608501356113dd816112b0565b939692955090935050565b5f80604083850312156113f9575f80fd5b8235611404816112b0565b946020939093013593505050565b5f805f60608486031215611424575f80fd5b833561142f816112b0565b9250602084013591506040840135611446816112b0565b809150509250925092565b5f60208284031215611461575f80fd5b8151610a91816112b0565b5f6020828403121561147c575f80fd5b5051919050565b5f60208284031215611493575f80fd5b81518015158114610a91575f80fd5b5f82515f5b818110156114c157602081860181015185830152016114a7565b505f92019182525091905056fe02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800a26469706673582212209005c2aa50d317167d9a57d6f7f779d15628a5f2ac854a543a8d4e28911b93c564736f6c63430008180033", + "nonce": "0x36", + "chainId": "0x4268" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x50ea3e", + "logs": [ + { + "address": "0x92df7b6001ef4cfe40b6b425bc4a358c05f27624", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0xd80e7ba79e90d6718f194a1b2522a0e59aa11e148186a8ade653a39ef509ac8b", + "blockNumber": "0x21233f", + "transactionHash": "0x9e1981c0c8c40689f8e83b6540368472d937f9d04b41d4da34b2921226c8e983", + "transactionIndex": "0x15", + "logIndex": "0x45", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000800000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x9e1981c0c8c40689f8e83b6540368472d937f9d04b41d4da34b2921226c8e983", + "transactionIndex": "0x15", + "blockHash": "0xd80e7ba79e90d6718f194a1b2522a0e59aa11e148186a8ade653a39ef509ac8b", + "blockNumber": "0x21233f", + "gasUsed": "0x21b09c", + "effectiveGasPrice": "0xeeb17", + "from": "0xd7d4a7f14265b0a69ae482b85b0a8496c3f99fb9", + "to": null, + "contractAddress": "0x92df7b6001ef4cfe40b6b425bc4a358c05f27624" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x63964d", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0xb4b9d3cd799c7257b431c3026257df78b039a48a5bdd0aaea801ec504bfb2b5d", + "transactionIndex": "0x16", + "blockHash": "0xd80e7ba79e90d6718f194a1b2522a0e59aa11e148186a8ade653a39ef509ac8b", + "blockNumber": "0x21233f", + "gasUsed": "0x12ac0f", + "effectiveGasPrice": "0xeeb17", + "from": "0xd7d4a7f14265b0a69ae482b85b0a8496c3f99fb9", + "to": null, + "contractAddress": "0x7af5cc12cee35dee9ccd0aa4d5e1772eb45b2046" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1724177457, + "chain": 17000, + "commit": "ede0ac0" +} \ No newline at end of file diff --git a/deployments/v0.0.2-ynEigenDepositAdapter-17000-ede0ac0eb7bb276398849dd43adf2083f6cb97e7.json b/deployments/v0.0.2-ynEigenDepositAdapter-17000-ede0ac0eb7bb276398849dd43adf2083f6cb97e7.json new file mode 100644 index 000000000..72aa7419c --- /dev/null +++ b/deployments/v0.0.2-ynEigenDepositAdapter-17000-ede0ac0eb7bb276398849dd43adf2083f6cb97e7.json @@ -0,0 +1,94 @@ +{ + "transactions": [ + { + "hash": "0x9e1981c0c8c40689f8e83b6540368472d937f9d04b41d4da34b2921226c8e983", + "transactionType": "CREATE", + "contractName": "ynEigen", + "contractAddress": "0x92df7b6001ef4cfe40b6b425bc4a358c05f27624", + "function": null, + "arguments": null, + "transaction": { + "from": "0xd7d4a7f14265b0a69ae482b85b0a8496c3f99fb9", + "gas": "0x2bcbfe", + "value": "0x0", + "input": "0x608060405234801562000010575f80fd5b506200001b62000021565b620000d5565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d25780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b61267180620000e35f395ff3fe608060405234801561000f575f80fd5b506004361061021e575f3560e01c806370a082311161012a578063a9059cbb116100b4578063e0c784a611610079578063e0c784a6146104e9578063e63ab1e914610509578063f11b818814610530578063f45346dc1461054f578063fb1bb9de14610562575f80fd5b8063a9059cbb14610475578063b8f82b2614610488578063cd88e5581461049b578063d547741f146104c3578063dd62ed3e146104d6575f80fd5b806391d14854116100fa57806391d148541461040957806395d89b411461041c578063979d7e8614610424578063a1a25e6e14610437578063a217fddf1461046e575f80fd5b806370a08231146103a75780638936a91f146103db5780638d252393146103e35780638ffbf6db146103f6575f80fd5b8063313ce567116101ab57806352f94f981161017b57806352f94f981461033a5780635f4caf461461036557806360da3e831461037857806361fd0ae11461038c57806363d8882a1461039f575f80fd5b8063313ce567146102f257806336568abe1461030157806338bca6c8146103145780633e5541f114610327575f80fd5b8063095ea7b3116101f1578063095ea7b31461027f57806318160ddd1461029257806323b872dd146102b9578063248a9ca3146102cc5780632f2ff15d146102df575f80fd5b806301e1d1141461022257806301ffc9a71461023d578063021919801461026057806306fdde031461026a575b5f80fd5b61022a610576565b6040519081526020015b60405180910390f35b61025061024b366004611ef3565b6105e5565b6040519015158152602001610234565b61026861061b565b005b61027261069f565b6040516102349190611f3c565b61025061028d366004611f92565b61075f565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025461022a565b6102506102c7366004611fbc565b610776565b61022a6102da366004611ffa565b61079b565b6102686102ed366004612011565b6107bb565b60405160128152602001610234565b61026861030f366004612011565b6107dd565b610268610322366004612087565b610815565b61022a610335366004611f92565b610ae6565b60015461034d906001600160a01b031681565b6040516001600160a01b039091168152602001610234565b6102506103733660046120ee565b610ba0565b60025461025090600160a01b900460ff1681565b61026861039a36600461211d565b610c0c565b610268610c31565b61022a6103b53660046120ee565b6001600160a01b03165f9081525f805160206125dc833981519152602052604090205490565b610268610c95565b6102686103f13660046121dd565b610d10565b61026861040436600461211d565b611062565b610250610417366004612011565b611084565b6102726110ba565b60025461034d906001600160a01b031681565b6102506104453660046120ee565b6001600160a01b03165f9081525f805160206125bc833981519152602052604090205460ff1690565b61022a5f81565b610250610483366004611f92565b6110f8565b61022a610496366004611f92565b611105565b61022a6104a93660046120ee565b6001600160a01b03165f9081526020819052604090205490565b6102686104d1366004612011565b611110565b61022a6104e4366004612215565b61112c565b6104fc6104f7366004612241565b611175565b6040516102349190612280565b61022a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b61022a61053e3660046120ee565b5f6020819052908152604090205481565b61022a61055d3660046122c3565b61123f565b61022a5f805160206125fc83398151915281565b600254604080516278744560e21b815290515f926001600160a01b0316916301e1d1149160048083019260209291908290030181865afa1580156105bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105e09190612302565b905090565b5f6001600160e01b03198216637965db0b60e01b148061061557506301ffc9a760e01b6001600160e01b03198316145b92915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610645816112aa565b6002805460ff60a01b1916600160a01b908117918290556040517f9723f28d4abaff5df0f62bfb2418f2aac4a739b259edf209b8dc9944fa85aa789261069492900460ff161515815260200190565b60405180910390a150565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f805160206125dc833981519152916106dd90612319565b80601f016020809104026020016040519081016040528092919081815260200182805461070990612319565b80156107545780601f1061072b57610100808354040283529160200191610754565b820191905f5260205f20905b81548152906001019060200180831161073757829003601f168201915b505050505091505090565b5f3361076c8185856112b7565b5060019392505050565b5f336107838582856112c4565b61078e858585611321565b60019150505b9392505050565b5f9081525f8051602061261c833981519152602052604090206001015490565b6107c48261079b565b6107cd816112aa565b6107d7838361137e565b50505050565b6001600160a01b03811633146108065760405163334bd91960e11b815260040160405180910390fd5b610810828261141f565b505050565b6001546001600160a01b03163314610847576040516347ed65b360e11b81523360048201526024015b60405180910390fd5b8281811461087257604051637df4c78160e01b8152600481018290526024810183905260440161083e565b6001546001600160a01b03165f5b82811015610add575f87878381811061089b5761089b612351565b90506020020160208101906108b091906120ee565b600254604051632fa657a360e11b81526001600160a01b038084166004830152929350911690635f4caf4690602401602060405180830381865afa1580156108fa573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091e9190612365565b6109465760405163ee84f40b60e01b81526001600160a01b038216600482015260240161083e565b6001600160a01b0381165f90815260208181526040918290208251918201909252905480825287878581811061097e5761097e612351565b9050602002013511156109db57805182908888868181106109a1576109a1612351565b60405163a8c6953f60e01b81526001600160a01b03909516600486015260248501939093525060209091020135604482015260640161083e565b8686848181106109ed576109ed612351565b905060200201355f80846001600160a01b03166001600160a01b031681526020019081526020015f205f015f828254610a269190612398565b90915550610a62905084888886818110610a4257610a42612351565b90506020020135846001600160a01b03166114989092919063ffffffff16565b7f4104800de83c5a3ae29f33899a811406b39aa89930fcc75e60d84b411803368d82888886818110610a9657610a96612351565b9050602002013586604051610acb939291906001600160a01b0393841681526020810192909252909116604082015260600190565b60405180910390a15050600101610880565b50505050505050565b5f610af083610ba0565b15610b7c57600254604051631cbf960d60e01b81526001600160a01b038581166004830152602482018590525f921690631cbf960d90604401602060405180830381865afa158015610b44573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b689190612302565b9050610b74815f6114f7565b915050610615565b60405163ee84f40b60e01b81526001600160a01b038416600482015260240161083e565b600254604051632fa657a360e11b81526001600160a01b0383811660048301525f921690635f4caf4690602401602060405180830381865afa158015610be8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106159190612365565b5f805160206125fc833981519152610c23816112aa565b610c2d825f611554565b5050565b5f805160206125fc833981519152610c48816112aa565b6002805460ff60a01b1916908190556040517f9723f28d4abaff5df0f62bfb2418f2aac4a739b259edf209b8dc9944fa85aa789161069491600160a01b90910460ff161515815260200190565b5f805160206125fc833981519152610cac816112aa565b7f7e7ba5b20f89141f0255e9704ce6ce6e55f5f28e4fc0d626fc76bedba3053201805460ff191690556040515f805160206125bc833981519152907f5b1b646968864ea75fad546d8c819e0de710df0bf61f658f6ba54dc587472e7b905f90a15050565b610d2060608201604083016120ee565b6001600160a01b038116610d475760405163d92e233d60e01b815260040160405180910390fd5b610d5760a08301608084016120ee565b6001600160a01b038116610d7e5760405163d92e233d60e01b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f81158015610dc35750825b90505f8267ffffffffffffffff166001148015610ddf5750303b155b905081158015610ded575080155b15610e0b5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610e3557845460ff60401b1916600160401b1785555b610e3d6115ef565b610e456115f9565b610ecc610e5289806123ab565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610e939250505060208b018b6123ab565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061160992505050565b610ee55f610ee060a08b0160808c016120ee565b61137e565b50610f1a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610ee060c08b0160a08c016120ee565b50610f3c5f805160206125fc833981519152610ee060e08b0160c08c016120ee565b50610f4d6060890160408a016120ee565b600280546001600160a01b0319166001600160a01b0392909216919091179055610f7d6080890160608a016120ee565b600180546001600160a01b0319166001600160a01b03929092169190911781557f7e7ba5b20f89141f0255e9704ce6ce6e55f5f28e4fc0d626fc76bedba3053201805460ff19169091179055611012610fd960e08a018a6123ee565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525060019250611554915050565b831561105857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f805160206125fc833981519152611079816112aa565b610c2d826001611554565b5f9182525f8051602061261c833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f805160206125dc833981519152916106dd90612319565b5f3361076c818585611321565b5f6107948383610ae6565b6111198261079b565b611122816112aa565b6107d7838361141f565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b6060818067ffffffffffffffff81111561119157611191612109565b6040519080825280602002602001820160405280156111ba578160200160208202803683370190505b5091505f5b81811015611237575f808686848181106111db576111db612351565b90506020020160208101906111f091906120ee565b6001600160a01b03166001600160a01b031681526020019081526020015f205f015483828151811061122457611224612351565b60209081029190910101526001016111bf565b505092915050565b5f61124861161b565b600254600160a01b900460ff1615611273576040516313d0ff5960e31b815260040160405180910390fd5b61127f84848433611665565b905061079460017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6112b4813361181f565b50565b6108108383836001611858565b5f6112cf848461112c565b90505f1981146107d7578181101561131357604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161083e565b6107d784848484035f611858565b6001600160a01b03831661134a57604051634b637e8f60e11b81525f600482015260240161083e565b6001600160a01b0382166113735760405163ec442f0560e01b81525f600482015260240161083e565b61081083838361193c565b5f5f8051602061261c8339815191526113978484611084565b611416575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556113cc3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610615565b5f915050610615565b5f5f8051602061261c8339815191526114388484611084565b15611416575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610615565b6040516001600160a01b0383811660248301526044820183905261081091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506119e5565b5f806115217f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025490565b90505f61152c610576565b9050815f0361153f578492505050610615565b61154b85838387611a46565b95945050505050565b5f805160206125bc8339815191525f5b83518110156107d7575f84828151811061158057611580612351565b6020908102919091018101516001600160a01b0381165f818152868452604090819020805460ff19168915159081179091559051908152919350917fac6d52e87f8a8fc486e04600668caffa28c149f8286b136c0f327b4499b8c723910160405180910390a250600101611564565b6115f7611a93565b565b611601611a93565b6115f7611adc565b611611611a93565b610c2d8282611ae4565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161165f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f61166f85610ba0565b6116975760405163ee84f40b60e01b81526001600160a01b038616600482015260240161083e565b835f036116b757604051631f2a200560e01b815260040160405180910390fd5b6116cc6001600160a01b038616833087611af6565b600254604051631cbf960d60e01b81526001600160a01b038781166004830152602482018790525f921690631cbf960d90604401602060405180830381865afa15801561171b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061173f9190612302565b905061174b815f6114f7565b9150815f0361176d57604051639811e0c760e01b815260040160405180910390fd5b6117778483611b2f565b6001600160a01b0386165f908152602081905260408120805487929061179e908490612434565b909155505060408051868152602081018490526001600160a01b038089169287821692918716917feea1b3e3bf222477bec881b3d636cfbe1adfcf316ad14d2090fc98fdd2774c02910160405180910390a450949350505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6118298282611084565b610c2d5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161083e565b5f805160206125dc8339815191526001600160a01b03851661188f5760405163e602df0560e01b81525f600482015260240161083e565b6001600160a01b0384166118b857604051634a1406b160e11b81525f600482015260240161083e565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561193557836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161192c91815260200190565b60405180910390a35b5050505050565b7f7e7ba5b20f89141f0255e9704ce6ce6e55f5f28e4fc0d626fc76bedba3053201545f805160206125bc8339815191529060ff16801561199457506001600160a01b0384165f9081526020829052604090205460ff16155b80156119a857506001600160a01b03841615155b80156119bc57506001600160a01b03831615155b156119da57604051636ab17e0560e01b815260040160405180910390fd5b6107d7848484611b63565b5f6119f96001600160a01b03841683611c9c565b905080515f14158015611a1d575080806020019051810190611a1b9190612365565b155b1561081057604051635274afe760e01b81526001600160a01b038416600482015260240161083e565b5f80611a53868686611ca9565b9050611a5e83611d68565b8015611a7957505f8480611a7457611a74612447565b868809115b1561154b57611a89600182612434565b9695505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166115f757604051631afcd79f60e31b815260040160405180910390fd5b6117f9611a93565b611aec611a93565b610c2d8282611d94565b6040516001600160a01b0384811660248301528381166044830152606482018390526107d79186918216906323b872dd906084016114c5565b6001600160a01b038216611b585760405163ec442f0560e01b81525f600482015260240161083e565b610c2d5f838361193c565b5f805160206125dc8339815191526001600160a01b038416611b9d5781816002015f828254611b929190612434565b90915550611c0d9050565b6001600160a01b0384165f9081526020829052604090205482811015611bef5760405163391434e360e21b81526001600160a01b0386166004820152602481018290526044810184905260640161083e565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316611c2b576002810180548390039055611c49565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611c8e91815260200190565b60405180910390a350505050565b606061079483835f611de4565b5f838302815f1985870982811083820303915050805f03611cdd57838281611cd357611cd3612447565b0492505050610794565b808411611cfd5760405163227bc15360e01b815260040160405180910390fd5b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b5f6002826003811115611d7d57611d7d61245b565b611d87919061246f565b60ff166001149050919050565b611d9c611a93565b5f805160206125dc8339815191527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace03611dd584826124e0565b50600481016107d783826124e0565b606081471015611e095760405163cd78605960e01b815230600482015260240161083e565b5f80856001600160a01b03168486604051611e2491906125a0565b5f6040518083038185875af1925050503d805f8114611e5e576040519150601f19603f3d011682016040523d82523d5f602084013e611e63565b606091505b5091509150611a89868383606082611e8357611e7e82611eca565b610794565b8151158015611e9a57506001600160a01b0384163b155b15611ec357604051639996b31560e01b81526001600160a01b038516600482015260240161083e565b5080610794565b805115611eda5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f60208284031215611f03575f80fd5b81356001600160e01b031981168114610794575f80fd5b5f5b83811015611f34578181015183820152602001611f1c565b50505f910152565b602081525f8251806020840152611f5a816040850160208701611f1a565b601f01601f19169190910160400192915050565b6001600160a01b03811681146112b4575f80fd5b8035611f8d81611f6e565b919050565b5f8060408385031215611fa3575f80fd5b8235611fae81611f6e565b946020939093013593505050565b5f805f60608486031215611fce575f80fd5b8335611fd981611f6e565b92506020840135611fe981611f6e565b929592945050506040919091013590565b5f6020828403121561200a575f80fd5b5035919050565b5f8060408385031215612022575f80fd5b82359150602083013561203481611f6e565b809150509250929050565b5f8083601f84011261204f575f80fd5b50813567ffffffffffffffff811115612066575f80fd5b6020830191508360208260051b8501011115612080575f80fd5b9250929050565b5f805f806040858703121561209a575f80fd5b843567ffffffffffffffff808211156120b1575f80fd5b6120bd8883890161203f565b909650945060208701359150808211156120d5575f80fd5b506120e28782880161203f565b95989497509550505050565b5f602082840312156120fe575f80fd5b813561079481611f6e565b634e487b7160e01b5f52604160045260245ffd5b5f602080838503121561212e575f80fd5b823567ffffffffffffffff80821115612145575f80fd5b818501915085601f830112612158575f80fd5b81358181111561216a5761216a612109565b8060051b604051601f19603f8301168101818110858211171561218f5761218f612109565b6040529182528482019250838101850191888311156121ac575f80fd5b938501935b828510156121d1576121c285611f82565b845293850193928501926121b1565b98975050505050505050565b5f602082840312156121ed575f80fd5b813567ffffffffffffffff811115612203575f80fd5b82016101008185031215610794575f80fd5b5f8060408385031215612226575f80fd5b823561223181611f6e565b9150602083013561203481611f6e565b5f8060208385031215612252575f80fd5b823567ffffffffffffffff811115612268575f80fd5b6122748582860161203f565b90969095509350505050565b602080825282518282018190525f9190848201906040850190845b818110156122b75783518352928401929184019160010161229b565b50909695505050505050565b5f805f606084860312156122d5575f80fd5b83356122e081611f6e565b92506020840135915060408401356122f781611f6e565b809150509250925092565b5f60208284031215612312575f80fd5b5051919050565b600181811c9082168061232d57607f821691505b60208210810361234b57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612375575f80fd5b81518015158114610794575f80fd5b634e487b7160e01b5f52601160045260245ffd5b8181038181111561061557610615612384565b5f808335601e198436030181126123c0575f80fd5b83018035915067ffffffffffffffff8211156123da575f80fd5b602001915036819003821315612080575f80fd5b5f808335601e19843603018112612403575f80fd5b83018035915067ffffffffffffffff82111561241d575f80fd5b6020019150600581901b3603821315612080575f80fd5b8082018082111561061557610615612384565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f60ff83168061248d57634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b601f82111561081057805f5260205f20601f840160051c810160208510156124c15750805b601f840160051c820191505b81811015611935575f81556001016124cd565b815167ffffffffffffffff8111156124fa576124fa612109565b61250e816125088454612319565b8461249c565b602080601f831160018114612541575f841561252a5750858301515b5f19600386901b1c1916600185901b178555612598565b5f85815260208120601f198616915b8281101561256f57888601518255948401946001909101908401612550565b508582101561258c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f82516125b1818460208701611f1a565b919091019291505056fe7e7ba5b20f89141f0255e9704ce6ce6e55f5f28e4fc0d626fc76bedba305320052c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800a26469706673582212205e3f00d9302af34494396d694fb10a98f93e186f2892d4c06828e0936b52600764736f6c63430008180033", + "nonce": "0x35", + "chainId": "0x4268" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xb4b9d3cd799c7257b431c3026257df78b039a48a5bdd0aaea801ec504bfb2b5d", + "transactionType": "CREATE", + "contractName": "ynEigenDepositAdapter", + "contractAddress": "0x7af5cc12cee35dee9ccd0aa4d5e1772eb45b2046", + "function": null, + "arguments": null, + "transaction": { + "from": "0xd7d4a7f14265b0a69ae482b85b0a8496c3f99fb9", + "gas": "0x184613", + "value": "0x0", + "input": "0x608060405234801561000f575f80fd5b506115248061001d5f395ff3fe608060405234801561000f575f80fd5b50600436106100fb575f3560e01c80639a2be4af11610093578063c1fe3e4811610063578063c1fe3e4814610213578063d547741f14610226578063daba667d14610239578063f45346dc1461024c575f80fd5b80639a2be4af146101d4578063a1d0362e146101e6578063a217fddf146101f9578063b8f82b2614610200575f80fd5b806336568abe116100ce57806336568abe146101705780634aa07e64146101835780634e6c9766146101ae57806391d14854146101c1575f80fd5b806301ffc9a7146100ff5780630415cc1514610127578063248a9ca31461013c5780632f2ff15d1461015d575b5f80fd5b61011261010d366004611289565b61025f565b60405190151581526020015b60405180910390f35b61013a6101353660046112c4565b610295565b005b61014f61014a366004611353565b6105ab565b60405190815260200161011e565b61013a61016b36600461136a565b6105cb565b61013a61017e36600461136a565b6105ed565b600154610196906001600160a01b031681565b6040516001600160a01b03909116815260200161011e565b600454610196906001600160a01b031681565b6101126101cf36600461136a565b610625565b5f54610196906001600160a01b031681565b61014f6101f4366004611398565b61065b565b61014f5f81565b61014f61020e3660046113e8565b61074c565b600354610196906001600160a01b031681565b61013a61023436600461136a565b610983565b600254610196906001600160a01b031681565b61014f61025a366004611412565b61099f565b5f6001600160e01b03198216637965db0b60e01b148061028f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f811580156102da5750825b90505f8267ffffffffffffffff1660011480156102f65750303b155b905081158015610304575080155b156103225760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561034c57845460ff60401b1916600160401b1785555b85516001600160a01b0381166103755760405163d92e233d60e01b815260040160405180910390fd5b60208701516001600160a01b0381166103a15760405163d92e233d60e01b815260040160405180910390fd5b60408801516001600160a01b0381166103cd5760405163d92e233d60e01b815260040160405180910390fd5b60608901516001600160a01b0381166103f95760405163d92e233d60e01b815260040160405180910390fd5b610401610a98565b6104115f801b8b60600151610aa2565b5089515f80546001600160a01b039283166001600160a01b0319918216179091556020808d015160018054918516918416821790556040808f01516002805491909616941693909317909355815163183fc7c960e31b8152915163c1fe3e489260048082019392918290030181865afa158015610490573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104b49190611451565b600380546001600160a01b0319166001600160a01b03928316179055600254604080516338d52e0f60e01b8152905191909216916338d52e0f9160048083019260209291908290030181865afa158015610510573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105349190611451565b60045f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050505083156105a357845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f9081525f805160206114cf833981519152602052604090206001015490565b6105d4826105ab565b6105dd81610b43565b6105e78383610aa2565b50505050565b6001600160a01b03811633146106165760405163334bd91960e11b815260040160405180910390fd5b6106208282610b50565b505050565b5f9182525f805160206114cf833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f6001600160a01b0383166106835760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0382166106aa5760405163d92e233d60e01b815260040160405180910390fd5b826001600160a01b0316826001600160a01b0316036106dc57604051632af47b8760e11b815260040160405180910390fd5b6106e785858561099f565b60408051338152602081018790529081018290524260608201529091506001600160a01b0380841691878216918616907f5ec2325bfdc6696fa381751bb5a9994c005f28fabd0b7dc55488f18ce1a85ef19060800160405180910390a4949350505050565b6004545f906001600160a01b039081169084160361084e576002546040516363737ac960e11b8152600481018490525f916001600160a01b03169063c6e6f59290602401602060405180830381865afa1580156107ab573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107cf919061146c565b5f54600254604051635c7c159360e11b81526001600160a01b03918216600482015260248101849052929350169063b8f82b26906044015b602060405180830381865afa158015610822573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610846919061146c565b91505061028f565b6003546001600160a01b039081169084160361090a5760015460405162b0e38960e81b8152600481018490525f916001600160a01b03169063b0e3890090602401602060405180830381865afa1580156108aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ce919061146c565b5f54600154604051635c7c159360e11b81526001600160a01b03918216600482015260248101849052929350169063b8f82b2690604401610807565b5f54604051635c7c159360e11b81526001600160a01b038581166004830152602482018590529091169063b8f82b2690604401602060405180830381865afa158015610958573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061097c919061146c565b905061028f565b61098c826105ab565b61099581610b43565b6105e78383610b50565b6003545f906001600160a01b03908116908516036109c8576109c18383610bc9565b9050610a91565b6004546001600160a01b03908116908516036109e8576109c18383610d69565b6109fd6001600160a01b038516333086610f04565b5f54610a16906001600160a01b03868116911685610f6b565b5f54604051633d14d1b760e21b81526001600160a01b0386811660048301526024820186905284811660448301529091169063f45346dc906064016020604051808303815f875af1158015610a6d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c1919061146c565b9392505050565b610aa0610ffa565b565b5f5f805160206114cf833981519152610abb8484610625565b610b3a575f848152602082815260408083206001600160a01b03871684529091529020805460ff19166001179055610af03390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4600191505061028f565b5f91505061028f565b610b4d8133611043565b50565b5f5f805160206114cf833981519152610b698484610625565b15610b3a575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4600191505061028f565b6003545f90610be3906001600160a01b0316333086610f04565b600154600354610c00916001600160a01b03918216911685610f6b565b600154604051630ea598cb60e41b8152600481018590525f916001600160a01b03169063ea598cb0906024016020604051808303815f875af1158015610c48573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c6c919061146c565b5f54600154919250610c8b916001600160a01b03908116911683610f6b565b5f54600154604051633d14d1b760e21b81526001600160a01b03918216600482015260248101849052858216604482015291169063f45346dc906064016020604051808303815f875af1158015610ce4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d08919061146c565b60035460408051878152602081018590529081018390529193506001600160a01b03908116919085169033907ff54c2631d8cb114d7a2dcd916b8d4bed6baae85cdf5444217c179e324cb2b907906060015b60405180910390a45092915050565b6004545f90610d83906001600160a01b0316333086610f04565b600254600454610da0916001600160a01b03918216911685610f6b565b600254604051636e553f6560e01b8152600481018590523060248201525f916001600160a01b031690636e553f65906044016020604051808303815f875af1158015610dee573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e12919061146c565b5f54600254919250610e31916001600160a01b03908116911683610f6b565b5f54600254604051633d14d1b760e21b81526001600160a01b03918216600482015260248101849052858216604482015291169063f45346dc906064016020604051808303815f875af1158015610e8a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eae919061146c565b60045460408051878152602081018590529081018390529193506001600160a01b03908116919085169033907ff54c2631d8cb114d7a2dcd916b8d4bed6baae85cdf5444217c179e324cb2b90790606001610d5a565b6040516001600160a01b0384811660248301528381166044830152606482018390526105e79186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050611085565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610fbc84826110e6565b6105e7576040516001600160a01b0384811660248301525f6044830152610ff091869182169063095ea7b390606401610f39565b6105e78482611085565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610aa057604051631afcd79f60e31b815260040160405180910390fd5b61104d8282610625565b6110815760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044015b60405180910390fd5b5050565b5f6110996001600160a01b03841683611187565b905080515f141580156110bd5750808060200190518101906110bb9190611483565b155b1561062057604051635274afe760e01b81526001600160a01b0384166004820152602401611078565b5f805f846001600160a01b03168460405161110191906114a2565b5f604051808303815f865af19150503d805f811461113a576040519150601f19603f3d011682016040523d82523d5f602084013e61113f565b606091505b50915091508180156111695750805115806111695750808060200190518101906111699190611483565b801561117e57505f856001600160a01b03163b115b95945050505050565b6060610a9183835f845f80856001600160a01b031684866040516111ab91906114a2565b5f6040518083038185875af1925050503d805f81146111e5576040519150601f19603f3d011682016040523d82523d5f602084013e6111ea565b606091505b50915091506111fa868383611204565b9695505050505050565b6060826112195761121482611260565b610a91565b815115801561123057506001600160a01b0384163b155b1561125957604051639996b31560e01b81526001600160a01b0385166004820152602401611078565b5080610a91565b8051156112705780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f60208284031215611299575f80fd5b81356001600160e01b031981168114610a91575f80fd5b6001600160a01b0381168114610b4d575f80fd5b5f608082840312156112d4575f80fd5b6040516080810181811067ffffffffffffffff8211171561130357634e487b7160e01b5f52604160045260245ffd5b6040528235611311816112b0565b81526020830135611321816112b0565b60208201526040830135611334816112b0565b60408201526060830135611347816112b0565b60608201529392505050565b5f60208284031215611363575f80fd5b5035919050565b5f806040838503121561137b575f80fd5b82359150602083013561138d816112b0565b809150509250929050565b5f805f80608085870312156113ab575f80fd5b84356113b6816112b0565b93506020850135925060408501356113cd816112b0565b915060608501356113dd816112b0565b939692955090935050565b5f80604083850312156113f9575f80fd5b8235611404816112b0565b946020939093013593505050565b5f805f60608486031215611424575f80fd5b833561142f816112b0565b9250602084013591506040840135611446816112b0565b809150509250925092565b5f60208284031215611461575f80fd5b8151610a91816112b0565b5f6020828403121561147c575f80fd5b5051919050565b5f60208284031215611493575f80fd5b81518015158114610a91575f80fd5b5f82515f5b818110156114c157602081860181015185830152016114a7565b505f92019182525091905056fe02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800a26469706673582212209005c2aa50d317167d9a57d6f7f779d15628a5f2ac854a543a8d4e28911b93c564736f6c63430008180033", + "nonce": "0x36", + "chainId": "0x4268" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x50ea3e", + "logs": [ + { + "address": "0x92df7b6001ef4cfe40b6b425bc4a358c05f27624", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0xd80e7ba79e90d6718f194a1b2522a0e59aa11e148186a8ade653a39ef509ac8b", + "blockNumber": "0x21233f", + "transactionHash": "0x9e1981c0c8c40689f8e83b6540368472d937f9d04b41d4da34b2921226c8e983", + "transactionIndex": "0x15", + "logIndex": "0x45", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000800000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x9e1981c0c8c40689f8e83b6540368472d937f9d04b41d4da34b2921226c8e983", + "transactionIndex": "0x15", + "blockHash": "0xd80e7ba79e90d6718f194a1b2522a0e59aa11e148186a8ade653a39ef509ac8b", + "blockNumber": "0x21233f", + "gasUsed": "0x21b09c", + "effectiveGasPrice": "0xeeb17", + "from": "0xd7d4a7f14265b0a69ae482b85b0a8496c3f99fb9", + "to": null, + "contractAddress": "0x92df7b6001ef4cfe40b6b425bc4a358c05f27624" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x63964d", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0xb4b9d3cd799c7257b431c3026257df78b039a48a5bdd0aaea801ec504bfb2b5d", + "transactionIndex": "0x16", + "blockHash": "0xd80e7ba79e90d6718f194a1b2522a0e59aa11e148186a8ade653a39ef509ac8b", + "blockNumber": "0x21233f", + "gasUsed": "0x12ac0f", + "effectiveGasPrice": "0xeeb17", + "from": "0xd7d4a7f14265b0a69ae482b85b0a8496c3f99fb9", + "to": null, + "contractAddress": "0x7af5cc12cee35dee9ccd0aa4d5e1772eb45b2046" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1724177457, + "chain": 17000, + "commit": "ede0ac0" +} \ No newline at end of file diff --git a/deployments/v0.0.2-ynEigenViewer-17000-a3475434f19a3174081e6e24f9c1adf811d0b387.json b/deployments/v0.0.2-ynEigenViewer-17000-a3475434f19a3174081e6e24f9c1adf811d0b387.json new file mode 100644 index 000000000..17bb1cc2e --- /dev/null +++ b/deployments/v0.0.2-ynEigenViewer-17000-a3475434f19a3174081e6e24f9c1adf811d0b387.json @@ -0,0 +1,51 @@ +{ + "transactions": [ + { + "hash": "0x4cb00128460f19b7807c6e1fbdea3e7caa6a367cef72c4cd93ec2de00b31bd59", + "transactionType": "CREATE", + "contractName": "ynEigenViewer", + "contractAddress": "0x85bb85b81db2f9b446e9100057420ae5de7232e4", + "function": null, + "arguments": [ + "0xaD31546AdbfE1EcD7137310508f112039a35b6F7", + "0x071bdC8eDcdD66730f45a3D3A6F794FAA37C75ED", + "0x5c20D1a85C7d9acB503135a498E26Eb55d806552", + "0xd68C29263F6dC2Ff8D9307b3AfAcD6D6fDeFbB3A" + ], + "transaction": { + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "gas": "0x1417ab", + "value": "0x0", + "input": "0x61010060405234801562000011575f80fd5b506040516200129e3803806200129e833981016040819052620000349162000073565b6001600160a01b0393841660805291831660a052821660c0521660e052620000cd565b80516001600160a01b03811681146200006e575f80fd5b919050565b5f805f806080858703121562000087575f80fd5b620000928562000057565b9350620000a26020860162000057565b9250620000b26040860162000057565b9150620000c26060860162000057565b905092959194509250565b60805160a05160c05160e0516111516200014d5f395f61015d01525f8181610136015261066b01525f818160ef015281816102da015281816103b0015281816106f4015281816107770152818161083f01528181610af601528181610c190152610c7001525f8181610184015281816101cd015261036701526111515ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c80637c0867af116100635780637c0867af14610131578063949db65814610158578063979d7e861461017f5780639d8e2177146101a6578063b8f82b26146101b5575f80fd5b8063075c2b191461009f5780632e0f2625146100bd5780633ff36802146100d557806363f7bad5146100ea578063679aefce14610129575b5f80fd5b6100a76101c8565b6040516100b49190610d34565b60405180910390f35b6100c7620f424081565b6040519081526020016100b4565b6100dd610667565b6040516100b49190610de4565b6101117f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100b4565b6100c76106f0565b6101117f000000000000000000000000000000000000000000000000000000000000000081565b6101117f000000000000000000000000000000000000000000000000000000000000000081565b6101117f000000000000000000000000000000000000000000000000000000000000000081565b6100c7670de0b6b3a764000081565b6100c76101c3366004610e47565b61083b565b60605f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166367e4ac2c6040518163ffffffff1660e01b81526004015f60405180830381865afa158015610226573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261024d9190810190610ed9565b80519091508067ffffffffffffffff81111561026b5761026b610e71565b6040519080825280602002602001820160405280156102d457816020015b6102c16040518060a001604052805f6001600160a01b0316815260200160608152602001606081526020015f81526020015f81525090565b8152602001906001900390816102895790505b5092505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa158015610334573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103589190610f73565b90505f5b82811015610660575f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631cbf960d8684815181106103a6576103a6610f8a565b60200260200101517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663cd88e5588987815181106103ef576103ef610f8a565b60200260200101516040518263ffffffff1660e01b815260040161042291906001600160a01b0391909116815260200190565b602060405180830381865afa15801561043d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104619190610f73565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa1580156104a8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104cc9190610f73565b90506040518060a001604052808684815181106104eb576104eb610f8a565b60200260200101516001600160a01b0316815260200186848151811061051357610513610f8a565b60200260200101516001600160a01b03166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa158015610555573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261057c9190810190610f9e565b815260200186848151811061059357610593610f8a565b60200260200101516001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa1580156105d5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105fc9190810190610f9e565b81526020015f8311801561060f57505f85115b610619575f610631565b84610627620f42408561102d565b6106319190611050565b81526020018281525086838151811061064c5761064c610f8a565b60209081029190910101525060010161035c565b5050505090565b60607f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a1174e7d6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156106c4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106eb919081019061106f565b905090565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561074e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107729190610f73565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107d1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f59190610f73565b9050811580610802575080155b1561081757670de0b6b3a76400009250505090565b8161082a82670de0b6b3a764000061102d565b6108349190611050565b9250505090565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166352f94f986040518163ffffffff1660e01b8152600401602060405180830381865afa158015610899573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108bd91906110f9565b90505f816001600160a01b0316634e6c97666040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108fc573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061092091906110f9565b90505f826001600160a01b031663c1fe3e486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561095f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061098391906110f9565b90505f836001600160a01b031663daba667d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e691906110f9565b90505f846001600160a01b0316634aa07e646040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a25573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4991906110f9565b9050836001600160a01b0316886001600160a01b031603610b6f576040516363737ac960e11b8152600481018890525f906001600160a01b0384169063c6e6f59290602401602060405180830381865afa158015610aa9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610acd9190610f73565b604051635c7c159360e11b81526001600160a01b038581166004830152602482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063b8f82b26906044015b602060405180830381865afa158015610b3e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b629190610f73565b9650505050505050610ce1565b826001600160a01b0316886001600160a01b031603610c4a5760405162b0e38960e81b8152600481018890525f906001600160a01b0383169063b0e3890090602401602060405180830381865afa158015610bcc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf09190610f73565b604051635c7c159360e11b81526001600160a01b038481166004830152602482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063b8f82b2690604401610b23565b604051635c7c159360e11b81526001600160a01b038981166004830152602482018990527f0000000000000000000000000000000000000000000000000000000000000000169063b8f82b2690604401602060405180830381865afa158015610cb5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cd99190610f73565b955050505050505b92915050565b5f5b83811015610d01578181015183820152602001610ce9565b50505f910152565b5f8151808452610d20816020860160208601610ce7565b601f01601f19169290920160200192915050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b83811015610dd657888303603f19018552815180516001600160a01b031684528781015160a089860181905290610d9482870182610d09565b9150508782015185820389870152610dac8282610d09565b60608481015190880152608093840151939096019290925250509386019390860190600101610d5b565b509098975050505050505050565b602080825282518282018190525f9190848201906040850190845b81811015610e245783516001600160a01b031683529284019291840191600101610dff565b50909695505050505050565b6001600160a01b0381168114610e44575f80fd5b50565b5f8060408385031215610e58575f80fd5b8235610e6381610e30565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610eae57610eae610e71565b604052919050565b5f67ffffffffffffffff821115610ecf57610ecf610e71565b5060051b60200190565b5f6020808385031215610eea575f80fd5b825167ffffffffffffffff811115610f00575f80fd5b8301601f81018513610f10575f80fd5b8051610f23610f1e82610eb6565b610e85565b81815260059190911b82018301908381019087831115610f41575f80fd5b928401925b82841015610f68578351610f5981610e30565b82529284019290840190610f46565b979650505050505050565b5f60208284031215610f83575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610fae575f80fd5b815167ffffffffffffffff80821115610fc5575f80fd5b818401915084601f830112610fd8575f80fd5b815181811115610fea57610fea610e71565b610ffd601f8201601f1916602001610e85565b9150808252856020828501011115611013575f80fd5b611024816020840160208601610ce7565b50949350505050565b8082028115828204841417610ce157634e487b7160e01b5f52601160045260245ffd5b5f8261106a57634e487b7160e01b5f52601260045260245ffd5b500490565b5f6020808385031215611080575f80fd5b825167ffffffffffffffff811115611096575f80fd5b8301601f810185136110a6575f80fd5b80516110b4610f1e82610eb6565b81815260059190911b820183019083810190878311156110d2575f80fd5b928401925b82841015610f685783516110ea81610e30565b825292840192908401906110d7565b5f60208284031215611109575f80fd5b815161111481610e30565b939250505056fea26469706673582212206522a30666c5a46c623b3de5b690b575abea162dfd94cbeabdff4d619491165864736f6c63430008180033000000000000000000000000ad31546adbfe1ecd7137310508f112039a35b6f7000000000000000000000000071bdc8edcdd66730f45a3d3a6f794faa37c75ed0000000000000000000000005c20d1a85c7d9acb503135a498e26eb55d806552000000000000000000000000d68c29263f6dc2ff8d9307b3afacd6d6fdefbb3a", + "nonce": "0x702", + "chainId": "0x4268" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x8cead5", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x4cb00128460f19b7807c6e1fbdea3e7caa6a367cef72c4cd93ec2de00b31bd59", + "transactionIndex": "0x1b", + "blockHash": "0x403defbfb5bdfcb71994396ee09b0044fa0829f15f86ac91058ae168569ca198", + "blockNumber": "0x20f48f", + "gasUsed": "0xf74ab", + "effectiveGasPrice": "0x6847106", + "from": "0x72fdbd51085bda5eeed3b55d1a46e2e92f0837a5", + "to": null, + "contractAddress": "0x85bb85b81db2f9b446e9100057420ae5de7232e4" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1724018789, + "chain": 17000, + "commit": "a347543" +} \ No newline at end of file diff --git a/foundry.toml b/foundry.toml index c15427b27..4540663ba 100644 --- a/foundry.toml +++ b/foundry.toml @@ -3,13 +3,17 @@ src = 'src' out = 'out' libs = ['lib'] test = 'test' -cache_path = 'cache' +cache_path = 'cache' -fs_permissions = [{ access = "read-write", path = "./deployments"}, { access = "read", path = "./"}] +fs_permissions = [ + { access = "read-write", path = "./deployments" }, + { access = "read", path = "./" }, +] optimizer = true optimizer-runs = 200 evm_version = "cancun" solc_version = "0.8.24" +prompt_timeout = 120 -ignored_error_codes = [5159,2018,5574,3860] \ No newline at end of file +ignored_error_codes = [5159, 2018, 5574, 3860] diff --git a/lib/forge-std b/lib/forge-std index 2f1126975..58d305198 160000 --- a/lib/forge-std +++ b/lib/forge-std @@ -1 +1 @@ -Subproject commit 2f112697506eab12d433a65fdc31a639548fe365 +Subproject commit 58d30519826c313ce47345abedfdc07679e944d1 diff --git a/script/Actors.sol b/script/Actors.sol index 2fcaaa069..7ab83f22f 100644 --- a/script/Actors.sol +++ b/script/Actors.sol @@ -4,6 +4,7 @@ contract ActorAddresses { struct EOAActors { address DEFAULT_SIGNER; address DEPOSIT_BOOTSTRAPPER; + address MOCK_CONTROLLER; } struct AdminActors { @@ -15,16 +16,19 @@ contract ActorAddresses { address ORACLE_ADMIN; address STAKING_NODES_DELEGATOR; address UNPAUSE_ADMIN; + address ASSET_MANAGER; + address EIGEN_STRATEGY_ADMIN; } struct OpsActors { address STAKING_NODES_OPERATOR; address VALIDATOR_MANAGER; - address LSD_RESTAKING_MANAGER; address STAKING_NODE_CREATOR; address POOLED_DEPOSITS_OWNER; address PAUSE_ADMIN; address REFERRAL_PUBLISHER; + address STRATEGY_CONTROLLER; + address TOKEN_STAKING_NODE_OPERATOR; } struct Wallets { @@ -32,6 +36,8 @@ contract ActorAddresses { address YNDelegator; address YNDev; address YNValidatorService; + address YNStrategyController; + address YNTokenStakingNodeOperator; } struct Actors { @@ -45,51 +51,66 @@ contract ActorAddresses { constructor() { - Wallets memory holeskyWallets = Wallets({ - YNSecurityCouncil: 0x743b91CDB1C694D4F51bCDA3a4A59DcC0d02b913, - YNDelegator: 0x743b91CDB1C694D4F51bCDA3a4A59DcC0d02b913, - YNDev: 0x9Dd8F69b62ddFd990241530F47dcEd0Dad7f7d39, - YNValidatorService: 0x9Dd8F69b62ddFd990241530F47dcEd0Dad7f7d39 - }); + { + Wallets memory holeskyWallets = Wallets({ + YNSecurityCouncil: 0x743b91CDB1C694D4F51bCDA3a4A59DcC0d02b913, + YNDelegator: 0x743b91CDB1C694D4F51bCDA3a4A59DcC0d02b913, + YNDev: 0x9Dd8F69b62ddFd990241530F47dcEd0Dad7f7d39, + YNValidatorService: 0x9Dd8F69b62ddFd990241530F47dcEd0Dad7f7d39, + // TODO: replace with concrete deployment + YNStrategyController: 0x1234567890123456789012345678901234567890, + // TODO: replace with concrete deployment + YNTokenStakingNodeOperator: 0x2234567890123456789012345678901234567890 + }); - actors[17000] = Actors({ - eoa: EOAActors({ - DEFAULT_SIGNER: 0x72fdBD51085bDa5eEEd3b55D1a46E2e92f0837a5, - DEPOSIT_BOOTSTRAPPER: 0x72fdBD51085bDa5eEEd3b55D1a46E2e92f0837a5 - }), - admin: AdminActors({ - ADMIN: holeskyWallets.YNSecurityCouncil, - STAKING_ADMIN: holeskyWallets.YNSecurityCouncil, - PROXY_ADMIN_OWNER: holeskyWallets.YNSecurityCouncil, - REWARDS_ADMIN: holeskyWallets.YNSecurityCouncil, - FEE_RECEIVER: holeskyWallets.YNSecurityCouncil, - ORACLE_ADMIN: holeskyWallets.YNSecurityCouncil, - STAKING_NODES_DELEGATOR: holeskyWallets.YNDelegator, - UNPAUSE_ADMIN: holeskyWallets.YNSecurityCouncil - }), - ops: OpsActors({ - STAKING_NODES_OPERATOR: holeskyWallets.YNDev, - VALIDATOR_MANAGER: holeskyWallets.YNValidatorService, - LSD_RESTAKING_MANAGER: holeskyWallets.YNDev, - STAKING_NODE_CREATOR: holeskyWallets.YNDev, - POOLED_DEPOSITS_OWNER: holeskyWallets.YNDev, - PAUSE_ADMIN: holeskyWallets.YNSecurityCouncil, - REFERRAL_PUBLISHER: holeskyWallets.YNDev - }), - wallets: holeskyWallets - }); + actors[17000] = Actors({ + eoa: EOAActors({ + DEFAULT_SIGNER: 0x72fdBD51085bDa5eEEd3b55D1a46E2e92f0837a5, + DEPOSIT_BOOTSTRAPPER: 0x72fdBD51085bDa5eEEd3b55D1a46E2e92f0837a5, + MOCK_CONTROLLER: 0x72fdBD51085bDa5eEEd3b55D1a46E2e92f0837a5 + }), + admin: AdminActors({ + ADMIN: holeskyWallets.YNSecurityCouncil, + STAKING_ADMIN: holeskyWallets.YNSecurityCouncil, + PROXY_ADMIN_OWNER: holeskyWallets.YNSecurityCouncil, + REWARDS_ADMIN: holeskyWallets.YNSecurityCouncil, + FEE_RECEIVER: holeskyWallets.YNSecurityCouncil, + ORACLE_ADMIN: holeskyWallets.YNSecurityCouncil, + STAKING_NODES_DELEGATOR: holeskyWallets.YNDelegator, + UNPAUSE_ADMIN: holeskyWallets.YNSecurityCouncil, + ASSET_MANAGER: holeskyWallets.YNSecurityCouncil, + EIGEN_STRATEGY_ADMIN: holeskyWallets.YNSecurityCouncil + }), + ops: OpsActors({ + STAKING_NODES_OPERATOR: holeskyWallets.YNDev, + VALIDATOR_MANAGER: holeskyWallets.YNValidatorService, + STAKING_NODE_CREATOR: holeskyWallets.YNDev, + POOLED_DEPOSITS_OWNER: holeskyWallets.YNDev, + PAUSE_ADMIN: holeskyWallets.YNSecurityCouncil, + REFERRAL_PUBLISHER: holeskyWallets.YNDev, + STRATEGY_CONTROLLER: holeskyWallets.YNStrategyController, + TOKEN_STAKING_NODE_OPERATOR: holeskyWallets.YNTokenStakingNodeOperator + }), + wallets: holeskyWallets + }); + } Wallets memory mainnetWallets = Wallets({ YNSecurityCouncil: 0xfcad670592a3b24869C0b51a6c6FDED4F95D6975, YNDelegator: 0xDF51B7843817F76220C0970eF58Ba726630028eF, YNDev: 0xa08F39d30dc865CC11a49b6e5cBd27630D6141C3, - YNValidatorService: 0x8e20eAf121154B69B7b880FA6c617c0175c4dE2e + YNValidatorService: 0x8e20eAf121154B69B7b880FA6c617c0175c4dE2e, + // TODO: replace with concrete deployment + YNStrategyController: 0x0573A7DaFBc080064663623979287286Bb65C1BD, + // TODO: replace with concrete deployment + YNTokenStakingNodeOperator: 0xfcad670592a3b24869C0b51a6c6FDED4F95D6975 // same as YNSecurityCouncil }); actors[1] = Actors({ eoa: EOAActors({ DEFAULT_SIGNER: 0xa1E340bd1e3ea09B3981164BBB4AfeDdF0e7bA0D, - DEPOSIT_BOOTSTRAPPER: 0x67a114e733b52CAC50A168F02b5626f500801C62 + DEPOSIT_BOOTSTRAPPER: 0x67a114e733b52CAC50A168F02b5626f500801C62, + MOCK_CONTROLLER: 0x72fdBD51085bDa5eEEd3b55D1a46E2e92f0837a5 }), admin: AdminActors({ ADMIN: mainnetWallets.YNSecurityCouncil, @@ -99,16 +120,19 @@ contract ActorAddresses { FEE_RECEIVER: mainnetWallets.YNSecurityCouncil, ORACLE_ADMIN: mainnetWallets.YNSecurityCouncil, STAKING_NODES_DELEGATOR: mainnetWallets.YNDelegator, - UNPAUSE_ADMIN: mainnetWallets.YNSecurityCouncil + UNPAUSE_ADMIN: mainnetWallets.YNSecurityCouncil, + ASSET_MANAGER: mainnetWallets.YNSecurityCouncil, + EIGEN_STRATEGY_ADMIN: mainnetWallets.YNSecurityCouncil }), ops: OpsActors({ STAKING_NODES_OPERATOR:mainnetWallets.YNDev, VALIDATOR_MANAGER: mainnetWallets.YNValidatorService, - LSD_RESTAKING_MANAGER: mainnetWallets.YNDev, STAKING_NODE_CREATOR: mainnetWallets.YNDev, POOLED_DEPOSITS_OWNER: 0xE1fAc59031520FD1eb901da990Da12Af295e6731, PAUSE_ADMIN: mainnetWallets.YNDev, - REFERRAL_PUBLISHER: mainnetWallets.YNDev + REFERRAL_PUBLISHER: mainnetWallets.YNDev, + STRATEGY_CONTROLLER: mainnetWallets.YNStrategyController, + TOKEN_STAKING_NODE_OPERATOR: mainnetWallets.YNTokenStakingNodeOperator }), wallets: mainnetWallets }); diff --git a/script/BaseScript.s.sol b/script/BaseScript.s.sol index 71a2c67e1..23e86c9a1 100644 --- a/script/BaseScript.s.sol +++ b/script/BaseScript.s.sol @@ -4,108 +4,20 @@ pragma solidity ^0.8.24; import {StakingNodesManager} from "src/StakingNodesManager.sol"; import {StakingNode} from "src/StakingNode.sol"; import {RewardsReceiver} from "src/RewardsReceiver.sol"; -import {ynLSD} from "src/ynLSD.sol"; import {stdJson} from "lib/forge-std/src/StdJson.sol"; -import {YieldNestOracle} from "src/YieldNestOracle.sol"; -import {LSDStakingNode} from "src/LSDStakingNode.sol"; import {RewardsDistributor} from "src/RewardsDistributor.sol"; import {ynETH} from "src/ynETH.sol"; import {Script} from "lib/forge-std/src/Script.sol"; import {Utils} from "script/Utils.sol"; import {ActorAddresses} from "script/Actors.sol"; +import {ContractAddresses} from "script/ContractAddresses.sol"; import {console} from "lib/forge-std/src/console.sol"; abstract contract BaseScript is Script, Utils { using stdJson for string; - - struct Deployment { - ynETH ynETH; - StakingNodesManager stakingNodesManager; - RewardsReceiver executionLayerReceiver; - RewardsReceiver consensusLayerReceiver; - RewardsDistributor rewardsDistributor; - StakingNode stakingNodeImplementation; - } - - struct ynLSDDeployment { - ynLSD ynlsd; - LSDStakingNode lsdStakingNodeImplementation; - YieldNestOracle yieldNestOracle; - } - - function getDeploymentFile() internal virtual view returns (string memory) { - string memory root = vm.projectRoot(); - return string.concat(root, "/deployments/ynETH-", vm.toString(block.chainid), ".json"); - } - - function saveDeployment(Deployment memory deployment) public virtual { - string memory json = "deployment"; - - // contract addresses - serializeProxyElements(json, "ynETH", address(deployment.ynETH)); - serializeProxyElements(json, "stakingNodesManager", address(deployment.stakingNodesManager)); - serializeProxyElements(json, "executionLayerReceiver", address(deployment.executionLayerReceiver)); - serializeProxyElements(json, "consensusLayerReceiver", address(deployment.consensusLayerReceiver)); - serializeProxyElements(json, "rewardsDistributor", address(deployment.rewardsDistributor)); - vm.serializeAddress(json, "stakingNodeImplementation", address(deployment.stakingNodeImplementation)); - - ActorAddresses.Actors memory actors = getActors(); - // actors - vm.serializeAddress(json, "PROXY_ADMIN_OWNER", address(actors.admin.PROXY_ADMIN_OWNER)); - vm.serializeAddress(json, "ADMIN", address(actors.admin.ADMIN)); - vm.serializeAddress(json, "STAKING_ADMIN", address(actors.admin.STAKING_ADMIN)); - vm.serializeAddress(json, "STAKING_NODES_OPERATOR", address(actors.ops.STAKING_NODES_OPERATOR)); - vm.serializeAddress(json, "VALIDATOR_MANAGER", address(actors.ops.VALIDATOR_MANAGER)); - vm.serializeAddress(json, "FEE_RECEIVER", address(actors.admin.FEE_RECEIVER)); - vm.serializeAddress(json, "PAUSE_ADMIN", address(actors.ops.PAUSE_ADMIN)); - vm.serializeAddress(json, "UNPAUSE_ADMIN", address(actors.admin.UNPAUSE_ADMIN)); - vm.serializeAddress(json, "LSD_RESTAKING_MANAGER", address(actors.ops.LSD_RESTAKING_MANAGER)); - vm.serializeAddress(json, "STAKING_NODE_CREATOR", address(actors.ops.STAKING_NODE_CREATOR)); - vm.serializeAddress(json, "ORACLE_ADMIN", address(actors.admin.ORACLE_ADMIN)); - vm.serializeAddress(json, "DEPOSIT_BOOTSTRAPPER", address(actors.eoa.DEPOSIT_BOOTSTRAPPER)); - - string memory finalJson = vm.serializeAddress(json, "DEFAULT_SIGNER", address((actors.eoa.DEFAULT_SIGNER))); - vm.writeJson(finalJson, getDeploymentFile()); - - console.log("Deployment JSON file written successfully:", getDeploymentFile()); - } - function loadDeployment() public view returns (Deployment memory) { - string memory deploymentFile = getDeploymentFile(); - string memory jsonContent = vm.readFile(deploymentFile); - Deployment memory deployment; - deployment.ynETH = ynETH(payable(jsonContent.readAddress(".proxy-ynETH"))); - deployment.stakingNodesManager = StakingNodesManager(payable(jsonContent.readAddress(".proxy-stakingNodesManager"))); - deployment.executionLayerReceiver = RewardsReceiver(payable(jsonContent.readAddress(".proxy-executionLayerReceiver"))); - deployment.consensusLayerReceiver = RewardsReceiver(payable(jsonContent.readAddress(".proxy-consensusLayerReceiver"))); - deployment.rewardsDistributor = RewardsDistributor(payable(jsonContent.readAddress(".proxy-rewardsDistributor"))); - deployment.stakingNodeImplementation = StakingNode(payable(jsonContent.readAddress(".stakingNodeImplementation"))); - - return deployment; - } - - function saveynLSDDeployment(ynLSDDeployment memory deployment) public { - string memory json = "ynLSDDeployment"; - ActorAddresses.Actors memory actors = getActors(); - string memory finalJson = vm.serializeAddress(json, "DEFAULT_SIGNER", address(actors.eoa.DEFAULT_SIGNER)); - // actors - vm.serializeAddress(json, "PROXY_ADMIN_OWNER", address(actors.admin.PROXY_ADMIN_OWNER)); - vm.serializeAddress(json, "ADMIN", address(actors.admin.ADMIN)); - vm.serializeAddress(json, "STAKING_ADMIN", address(actors.admin.STAKING_ADMIN)); - vm.serializeAddress(json, "STAKING_NODES_OPERATOR", address(actors.ops.STAKING_NODES_OPERATOR)); // Assuming STAKING_NODES_ADMIN is a typo and should be STAKING_NODES_OPERATOR or another existing role in the context provided - vm.serializeAddress(json, "VALIDATOR_MANAGER", address(actors.ops.VALIDATOR_MANAGER)); - vm.serializeAddress(json, "FEE_RECEIVER", address(actors.admin.FEE_RECEIVER)); - vm.serializeAddress(json, "PAUSE_ADMIN", address(actors.ops.PAUSE_ADMIN)); - vm.serializeAddress(json, "UNPAUSE_ADMIN", address(actors.admin.UNPAUSE_ADMIN)); - vm.serializeAddress(json, "LSD_RESTAKING_MANAGER", address(actors.ops.LSD_RESTAKING_MANAGER)); - vm.serializeAddress(json, "STAKING_NODE_CREATOR", address(actors.ops.STAKING_NODE_CREATOR)); - vm.serializeAddress(json, "ORACLE_ADMIN", address(actors.admin.ORACLE_ADMIN)); - vm.serializeAddress(json, "DEPOSIT_BOOTSTRAPPER", address(actors.eoa.DEPOSIT_BOOTSTRAPPER)); - vm.serializeAddress(json, "ynlsd", address(deployment.ynlsd)); - vm.serializeAddress(json, "lsdStakingNodeImplementation", address(deployment.lsdStakingNodeImplementation)); - vm.serializeAddress(json, "yieldNestOracle", address(deployment.yieldNestOracle)); - vm.writeJson(finalJson, getDeploymentFile()); - } + ActorAddresses private _actorAddresses = new ActorAddresses(); + ContractAddresses private _contractAddresses = new ContractAddresses(); function serializeActors(string memory json) public { ActorAddresses.Actors memory actors = getActors(); @@ -119,24 +31,12 @@ abstract contract BaseScript is Script, Utils { vm.serializeAddress(json, "FEE_RECEIVER", address(actors.admin.FEE_RECEIVER)); vm.serializeAddress(json, "PAUSE_ADMIN", address(actors.ops.PAUSE_ADMIN)); vm.serializeAddress(json, "UNPAUSE_ADMIN", address(actors.admin.UNPAUSE_ADMIN)); - vm.serializeAddress(json, "LSD_RESTAKING_MANAGER", address(actors.ops.LSD_RESTAKING_MANAGER)); vm.serializeAddress(json, "STAKING_NODE_CREATOR", address(actors.ops.STAKING_NODE_CREATOR)); vm.serializeAddress(json, "ORACLE_ADMIN", address(actors.admin.ORACLE_ADMIN)); vm.serializeAddress(json, "DEPOSIT_BOOTSTRAPPER", address(actors.eoa.DEPOSIT_BOOTSTRAPPER)); vm.serializeAddress(json, "POOLED_DEPOSITS_OWNER", address(actors.ops.POOLED_DEPOSITS_OWNER)); } - function loadynLSDDeployment() public view returns (ynLSDDeployment memory) { - string memory deploymentFile = getDeploymentFile(); - string memory jsonContent = vm.readFile(deploymentFile); - ynLSDDeployment memory deployment; - deployment.ynlsd = ynLSD(payable(jsonContent.readAddress(".ynlsd"))); - deployment.lsdStakingNodeImplementation = LSDStakingNode(payable(jsonContent.readAddress(".lsdStakingNodeImplementation"))); - deployment.yieldNestOracle = YieldNestOracle(payable(jsonContent.readAddress(".yieldNestOracle"))); - - return deployment; - } - function serializeProxyElements(string memory json, string memory name, address proxy) public { address proxyAdmin = getTransparentUpgradeableProxyAdminAddress(proxy); address implementation = getTransparentUpgradeableProxyImplementationAddress(proxy); @@ -146,7 +46,14 @@ abstract contract BaseScript is Script, Utils { } function getActors() public returns (ActorAddresses.Actors memory actors) { - return (new ActorAddresses()).getActors(block.chainid); + return _actorAddresses.getActors(block.chainid); } + function getChainAddresses() public returns (ContractAddresses.ChainAddresses memory chainAddresses) { + return _contractAddresses.getChainAddresses(block.chainid); + } + + function isSupportedChainId(uint256 chainId) public returns (bool) { + return _contractAddresses.isSupportedChainId(chainId); + } } diff --git a/script/BaseYnETHScript.s.sol b/script/BaseYnETHScript.s.sol new file mode 100644 index 000000000..c7b93f43e --- /dev/null +++ b/script/BaseYnETHScript.s.sol @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {StakingNodesManager} from "src/StakingNodesManager.sol"; +import {StakingNode} from "src/StakingNode.sol"; +import {RewardsReceiver} from "src/RewardsReceiver.sol"; +import {stdJson} from "lib/forge-std/src/StdJson.sol"; +import {RewardsDistributor} from "src/RewardsDistributor.sol"; +import {ynETH} from "src/ynETH.sol"; +import {Script} from "lib/forge-std/src/Script.sol"; +import {Utils} from "script/Utils.sol"; +import {ActorAddresses} from "script/Actors.sol"; +import {BaseScript} from "script/BaseScript.s.sol"; +import {console} from "lib/forge-std/src/console.sol"; + +abstract contract BaseYnETHScript is BaseScript { + using stdJson for string; + + struct Deployment { + ynETH ynETH; + StakingNodesManager stakingNodesManager; + RewardsReceiver executionLayerReceiver; + RewardsReceiver consensusLayerReceiver; + RewardsDistributor rewardsDistributor; + StakingNode stakingNodeImplementation; + } + + function getDeploymentFile() internal virtual view returns (string memory) { + string memory root = vm.projectRoot(); + return string.concat(root, "/deployments/ynETH-", vm.toString(block.chainid), ".json"); + } + + function saveDeployment(Deployment memory deployment) public virtual { + string memory json = "deployment"; + + // contract addresses + serializeProxyElements(json, "ynETH", address(deployment.ynETH)); + serializeProxyElements(json, "stakingNodesManager", address(deployment.stakingNodesManager)); + serializeProxyElements(json, "executionLayerReceiver", address(deployment.executionLayerReceiver)); + serializeProxyElements(json, "consensusLayerReceiver", address(deployment.consensusLayerReceiver)); + serializeProxyElements(json, "rewardsDistributor", address(deployment.rewardsDistributor)); + vm.serializeAddress(json, "stakingNodeImplementation", address(deployment.stakingNodeImplementation)); + + ActorAddresses.Actors memory actors = getActors(); + // actors + vm.serializeAddress(json, "PROXY_ADMIN_OWNER", address(actors.admin.PROXY_ADMIN_OWNER)); + vm.serializeAddress(json, "ADMIN", address(actors.admin.ADMIN)); + vm.serializeAddress(json, "STAKING_ADMIN", address(actors.admin.STAKING_ADMIN)); + vm.serializeAddress(json, "STAKING_NODES_OPERATOR", address(actors.ops.STAKING_NODES_OPERATOR)); + vm.serializeAddress(json, "VALIDATOR_MANAGER", address(actors.ops.VALIDATOR_MANAGER)); + vm.serializeAddress(json, "FEE_RECEIVER", address(actors.admin.FEE_RECEIVER)); + vm.serializeAddress(json, "PAUSE_ADMIN", address(actors.ops.PAUSE_ADMIN)); + vm.serializeAddress(json, "UNPAUSE_ADMIN", address(actors.admin.UNPAUSE_ADMIN)); + vm.serializeAddress(json, "STAKING_NODE_CREATOR", address(actors.ops.STAKING_NODE_CREATOR)); + vm.serializeAddress(json, "ORACLE_ADMIN", address(actors.admin.ORACLE_ADMIN)); + vm.serializeAddress(json, "DEPOSIT_BOOTSTRAPPER", address(actors.eoa.DEPOSIT_BOOTSTRAPPER)); + + string memory finalJson = vm.serializeAddress(json, "DEFAULT_SIGNER", address((actors.eoa.DEFAULT_SIGNER))); + vm.writeJson(finalJson, getDeploymentFile()); + + console.log("Deployment JSON file written successfully:", getDeploymentFile()); + } + + function loadDeployment() public view returns (Deployment memory) { + string memory deploymentFile = getDeploymentFile(); + string memory jsonContent = vm.readFile(deploymentFile); + Deployment memory deployment; + deployment.ynETH = ynETH(payable(jsonContent.readAddress(".proxy-ynETH"))); + deployment.stakingNodesManager = StakingNodesManager(payable(jsonContent.readAddress(".proxy-stakingNodesManager"))); + deployment.executionLayerReceiver = RewardsReceiver(payable(jsonContent.readAddress(".proxy-executionLayerReceiver"))); + deployment.consensusLayerReceiver = RewardsReceiver(payable(jsonContent.readAddress(".proxy-consensusLayerReceiver"))); + deployment.rewardsDistributor = RewardsDistributor(payable(jsonContent.readAddress(".proxy-rewardsDistributor"))); + deployment.stakingNodeImplementation = StakingNode(payable(jsonContent.readAddress(".stakingNodeImplementation"))); + + return deployment; + } +} \ No newline at end of file diff --git a/script/ContractAddresses.sol b/script/ContractAddresses.sol index 3f2dc465e..4a1d21ea7 100644 --- a/script/ContractAddresses.sol +++ b/script/ContractAddresses.sol @@ -4,6 +4,16 @@ pragma solidity ^0.8.24; contract ContractAddresses { + struct YnEigenAddresses { + address YNEIGEN_ADDRESS; + address TOKEN_STAKING_NODES_MANAGER_ADDRESS; + address ASSET_REGISTRY_ADDRESS; + address EIGEN_STRATEGY_MANAGER_ADDRESS; + address LSD_RATE_PROVIDER_ADDRESS; + address YNEIGEN_DEPOSIT_ADAPTER_ADDRESS; + address TIMELOCK_CONTROLLER_ADDRESS; + } + struct YieldNestAddresses { address YNETH_ADDRESS; address STAKING_NODES_MANAGER_ADDRESS; @@ -25,10 +35,23 @@ contract ContractAddresses { address SFRXETH_ADDRESS; address RETH_ADDRESS; address STETH_ADDRESS; - address RETH_FEED_ADDRESS; - address STETH_FEED_ADDRESS; + address WSTETH_ADDRESS; + address OETH_ADDRESS; + address WOETH_ADDRESS; + address OETH_ZAPPER_ADDRESS; + address SWELL_ADDRESS; + address METH_ADDRESS; + address CBETH_ADDRESS; + } + + struct LSDStrategies { address RETH_STRATEGY_ADDRESS; address STETH_STRATEGY_ADDRESS; + address OETH_STRATEGY_ADDRESS; + address SFRXETH_STRATEGY_ADDRESS; + address SWELL_STRATEGY_ADDRESS; + address METH_STRATEGY_ADDRESS; + address CBETH_STRATEGY_ADDRESS; } struct EthereumAddresses { @@ -40,7 +63,9 @@ contract ContractAddresses { EthereumAddresses ethereum; EigenlayerAddresses eigenlayer; LSDAddresses lsd; + LSDStrategies lsdStrategies; YieldNestAddresses yn; + YnEigenAddresses ynEigen; } struct ChainIds { @@ -63,7 +88,7 @@ contract ContractAddresses { eigenlayer: EigenlayerAddresses({ EIGENPOD_MANAGER_ADDRESS: 0x91E677b07F7AF907ec9a428aafA9fc14a0d3A338, DELEGATION_MANAGER_ADDRESS: 0x39053D51B77DC0d36036Fc1fCc8Cb819df8Ef37A, - DELEGATION_PAUSER_ADDRESS: 0x369e6F597e22EaB55fFb173C6d9cD234BD699111, + DELEGATION_PAUSER_ADDRESS: 0x369e6F597e22EaB55fFb173C6d9cD234BD699111, // TODO: remove this if unused STRATEGY_MANAGER_ADDRESS: 0x858646372CC42E1A627fcE94aa7A7033e7CF075A, STRATEGY_MANAGER_PAUSER_ADDRESS: 0xBE1685C81aA44FF9FB319dD389addd9374383e90, DELAYED_WITHDRAWAL_ROUTER_ADDRESS: 0x7Fe7E9CC0F274d2435AD5d56D5fa73E47F6A23D8 @@ -72,10 +97,22 @@ contract ContractAddresses { SFRXETH_ADDRESS: 0xac3E018457B222d93114458476f3E3416Abbe38F, RETH_ADDRESS: 0xae78736Cd615f374D3085123A210448E74Fc6393, STETH_ADDRESS: 0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84, - RETH_FEED_ADDRESS: 0x536218f9E9Eb48863970252233c8F271f554C2d0, - STETH_FEED_ADDRESS: 0x86392dC19c0b719886221c78AB11eb8Cf5c52812, + WSTETH_ADDRESS: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0, + OETH_ADDRESS: 0x856c4Efb76C1D1AE02e20CEB03A2A6a08b0b8dC3, + WOETH_ADDRESS: 0xDcEe70654261AF21C44c093C300eD3Bb97b78192, + OETH_ZAPPER_ADDRESS: 0x9858e47BCbBe6fBAC040519B02d7cd4B2C470C66, + SWELL_ADDRESS: 0xf951E335afb289353dc249e82926178EaC7DEd78, + METH_ADDRESS: 0xd5F7838F5C461fefF7FE49ea5ebaF7728bB0ADfa, + CBETH_ADDRESS: 0xBe9895146f7AF43049ca1c1AE358B0541Ea49704 + }), + lsdStrategies: LSDStrategies({ RETH_STRATEGY_ADDRESS: 0x1BeE69b7dFFfA4E2d53C2a2Df135C388AD25dCD2, - STETH_STRATEGY_ADDRESS: 0x93c4b944D05dfe6df7645A86cd2206016c51564D + STETH_STRATEGY_ADDRESS: 0x93c4b944D05dfe6df7645A86cd2206016c51564D, + OETH_STRATEGY_ADDRESS: 0xa4C637e0F704745D182e4D38cAb7E7485321d059, + SFRXETH_STRATEGY_ADDRESS: 0x8CA7A5d6f3acd3A7A8bC468a8CD0FB14B6BD28b6, + SWELL_STRATEGY_ADDRESS: 0x0Fe4F44beE93503346A3Ac9EE5A26b130a5796d6, + METH_STRATEGY_ADDRESS: 0x298aFB19A105D59E74658C4C334Ff360BadE6dd2, + CBETH_STRATEGY_ADDRESS: 0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc }), yn: YieldNestAddresses({ YNETH_ADDRESS: 0x09db87A538BD693E9d08544577d5cCfAA6373A48, @@ -83,6 +120,15 @@ contract ContractAddresses { REWARDS_DISTRIBUTOR_ADDRESS: 0x40d5FF3E218f54f4982661a0464a298Cf6652351, EXECUTION_LAYER_RECEIVER_ADDRESS: 0x1D6b2a11FFEa5F9a8Ed85A02581910b3d695C12b, CONSENSUS_LAYER_RECEIVER_ADDRESS: 0xE439fe4563F7666FCd7405BEC24aE7B0d226536e + }), + ynEigen: YnEigenAddresses({ + YNEIGEN_ADDRESS: 0x35Ec69A77B79c255e5d47D5A3BdbEFEfE342630c, + TOKEN_STAKING_NODES_MANAGER_ADDRESS: 0x6B566CB6cDdf7d140C59F84594756a151030a0C3, + ASSET_REGISTRY_ADDRESS: 0x323C933df2523D5b0C756210446eeE0fB84270fd, + EIGEN_STRATEGY_MANAGER_ADDRESS: 0x92D904019A92B0Cafce3492Abb95577C285A68fC, + LSD_RATE_PROVIDER_ADDRESS: 0xb658Cf6F4C232Be5c6035f2b42b96393089F20D9, + YNEIGEN_DEPOSIT_ADAPTER_ADDRESS: 0x9e72155d301a6555dc565315be72D295c76753c0, + TIMELOCK_CONTROLLER_ADDRESS: 0xbB73f8a5B0074b27c6df026c77fA08B0111D017A }) }); @@ -103,13 +149,25 @@ contract ContractAddresses { DELAYED_WITHDRAWAL_ROUTER_ADDRESS: 0x642c646053eaf2254f088e9019ACD73d9AE0FA32 // Placeholder address, replaced with address(1) for holesky }), lsd: LSDAddresses({ - SFRXETH_ADDRESS: placeholderAddress, // Placeholder address, replaced with address(1) for holesky + SFRXETH_ADDRESS: 0xa63f56985F9C7F3bc9fFc5685535649e0C1a55f3, RETH_ADDRESS: 0x7322c24752f79c05FFD1E2a6FCB97020C1C264F1, // source: https://docs.rocketpool.net/guides/staking/via-rp STETH_ADDRESS: 0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034, // source: https://docs.lido.fi/deployed-contracts/holesky/ - RETH_FEED_ADDRESS: 0xC028a945D4Ac8593F84F8dE3784F83143a165F1A, // Self-created aggregator TODO: Update - STETH_FEED_ADDRESS: 0xC028a945D4Ac8593F84F8dE3784F83143a165F1A, // Self-created aggregator TODO: Update - RETH_STRATEGY_ADDRESS: 0x3A8fBdf9e77DFc25d09741f51d3E181b25d0c4E0, // Placeholder address, replaced with address(1) for holesky - STETH_STRATEGY_ADDRESS: 0x7D704507b76571a51d9caE8AdDAbBFd0ba0e63d3 // Placeholder address, replaced with address(1) for holesky + WSTETH_ADDRESS: 0x8d09a4502Cc8Cf1547aD300E066060D043f6982D, // source: https://docs.lido.fi/deployed-contracts/holesky/ + OETH_ADDRESS: 0x10B83FBce870642ee33f0877ffB7EA43530E473D, // TODO: fix, currently a YieldNest Mock is used + WOETH_ADDRESS: 0xbaAcDcC565006b6429F57bC0f436dFAf14A526b1, // TODO: fix, currently a YieldNest Mock is used + OETH_ZAPPER_ADDRESS: 0x9858e47BCbBe6fBAC040519B02d7cd4B2C470C66, // TODO: fix, placeholder until available + SWELL_ADDRESS: 0xf951E335afb289353dc249e82926178EaC7DEd78, // TODO: fix, placeholder until available + METH_ADDRESS: 0xe3C063B1BEe9de02eb28352b55D49D85514C67FF, + CBETH_ADDRESS: 0x8720095Fa5739Ab051799211B146a2EEE4Dd8B37 + }), + lsdStrategies: LSDStrategies({ + RETH_STRATEGY_ADDRESS: 0x3A8fBdf9e77DFc25d09741f51d3E181b25d0c4E0, + STETH_STRATEGY_ADDRESS: 0x7D704507b76571a51d9caE8AdDAbBFd0ba0e63d3, + OETH_STRATEGY_ADDRESS: 0xa4C637e0F704745D182e4D38cAb7E7485321d059, // TODO: fix, placeholder until available + SFRXETH_STRATEGY_ADDRESS: 0x9281ff96637710Cd9A5CAcce9c6FAD8C9F54631c, + SWELL_STRATEGY_ADDRESS: 0x0Fe4F44beE93503346A3Ac9EE5A26b130a5796d6, // TODO: fix, placeholder until available + METH_STRATEGY_ADDRESS: 0xaccc5A86732BE85b5012e8614AF237801636F8e5, + CBETH_STRATEGY_ADDRESS: 0x70EB4D3c164a6B4A5f908D4FBb5a9cAfFb66bAB6 }), yn: YieldNestAddresses({ YNETH_ADDRESS: 0xd9029669BC74878BCB5BE58c259ed0A277C5c16E, @@ -117,6 +175,15 @@ contract ContractAddresses { REWARDS_DISTRIBUTOR_ADDRESS: 0x82915efF62af9FCC0d0735b8681959e069E3f2D8, EXECUTION_LAYER_RECEIVER_ADDRESS: 0xA5E9E1ceb4cC1854d0e186a9B3E67158b84AD072, CONSENSUS_LAYER_RECEIVER_ADDRESS: 0x706EED02702fFE9CBefD6A65E63f3C2b59B7eF2d + }), + ynEigen: YnEigenAddresses({ + YNEIGEN_ADDRESS: 0x071bdC8eDcdD66730f45a3D3A6F794FAA37C75ED, + TOKEN_STAKING_NODES_MANAGER_ADDRESS: 0x5c20D1a85C7d9acB503135a498E26Eb55d806552, + ASSET_REGISTRY_ADDRESS: 0xaD31546AdbfE1EcD7137310508f112039a35b6F7, + EIGEN_STRATEGY_MANAGER_ADDRESS: 0xA0a11A9b84bf87c0323bc183715a22eC7881B7FC, + LSD_RATE_PROVIDER_ADDRESS: 0xd68C29263F6dC2Ff8D9307b3AfAcD6D6fDeFbB3A, + YNEIGEN_DEPOSIT_ADAPTER_ADDRESS: 0x7d0c1F604571a1c015684e6c15f2DdEc432C5e74, + TIMELOCK_CONTROLLER_ADDRESS: 0x62173555C27C67644C5634e114e42A63A59CD7A5 }) }); } @@ -124,4 +191,8 @@ contract ContractAddresses { function getChainAddresses(uint256 chainId) external view returns (ChainAddresses memory) { return addresses[chainId]; } + + function isSupportedChainId(uint256 chainId) external view returns (bool) { + return chainId == chainIds.mainnet || chainId == chainIds.holeksy; + } } diff --git a/script/DeployPooledDepositsVaults.s.sol b/script/DeployPooledDepositsVaults.s.sol deleted file mode 100644 index 3642a8cd9..000000000 --- a/script/DeployPooledDepositsVaults.s.sol +++ /dev/null @@ -1,81 +0,0 @@ -// SPDX-License-Identifier: BSD 3-Clause License -pragma solidity ^0.8.24; - -import {TransparentUpgradeableProxy} from "lib/openzeppelin-contracts/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; -import {ProxyAdmin} from "lib/openzeppelin-contracts/contracts/proxy/transparent/ProxyAdmin.sol"; -import {BaseScript} from "script/BaseScript.s.sol"; -import {stdJson} from "lib/forge-std/src/StdJson.sol"; -import {PooledDepositsVault} from "src/PooledDepositsVault.sol"; // Renamed from PooledDeposits to PooledDepositsVault -import {ActorAddresses} from "script/Actors.sol"; -import {console} from "lib/forge-std/src/console.sol"; - -contract DeployPooledDepositsVaults is BaseScript { - using stdJson for string; - - struct PooledDepositsVaultsDeployment { - PooledDepositsVault[] vaults; - } - - function run() external virtual { - - uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); - - address deployerAddress = vm.addr(deployerPrivateKey); - console.log("Deployer Public Address:", deployerAddress); - - // ynETH.sol ROLES - ActorAddresses.Actors memory actors = getActors(); - - uint256 vaultCount = 6; - - PooledDepositsVault[] memory pooledDepositsVaults = new PooledDepositsVault[](vaultCount); // Renamed from PooledDeposits to PooledDepositsVault - vm.startBroadcast(deployerPrivateKey); - - PooledDepositsVault pooledDepositsVaultImplementation = new PooledDepositsVault(); // Renamed from PooledDeposits to PooledDepositsVault - for (uint i = 0; i < vaultCount; i++) { - bytes memory initData = abi.encodeWithSelector(PooledDepositsVault.initialize.selector, actors.ops.POOLED_DEPOSITS_OWNER); // Renamed from PooledDeposits to PooledDepositsVault - TransparentUpgradeableProxy pooledDepositsVaultProxy = new TransparentUpgradeableProxy(address(pooledDepositsVaultImplementation), actors.admin.PROXY_ADMIN_OWNER, initData); - PooledDepositsVault pooledDepositsVault = PooledDepositsVault(payable(address(pooledDepositsVaultProxy))); // Renamed from PooledDeposits to PooledDepositsVault - pooledDepositsVaults[i] = pooledDepositsVault; - } - PooledDepositsVaultsDeployment memory deployment; - deployment.vaults = pooledDepositsVaults; - savePooledDepositsDeployment(deployment); - vm.stopBroadcast(); - } - - function getVaultsDeploymentFile() internal view returns (string memory) { - string memory root = vm.projectRoot(); - return string.concat(root, "/deployments/PooledDepositsVaults-", vm.toString(block.chainid), ".json"); - } - - function savePooledDepositsDeployment(PooledDepositsVaultsDeployment memory deployment) internal { - - PooledDepositsVault[] memory pooledDepositsVaults = deployment.vaults; - - string memory json = "deployment"; - serializeActors(json); - - for (uint i = 0; i < pooledDepositsVaults.length; i++) { - - serializeProxyElements(json, string.concat("Deposit-", vm.toString(i)), address(pooledDepositsVaults[i])); - } - string memory finalJson = vm.serializeUint(json, "vaultCount", pooledDepositsVaults.length); - - vm.writeJson(finalJson, getVaultsDeploymentFile()); - - console.log("Deployment JSON file written successfully:", getVaultsDeploymentFile()); - } - - function loadPooledDepositsDeployment() public view returns (PooledDepositsVaultsDeployment memory deployment) { - string memory deploymentFile = getVaultsDeploymentFile(); - string memory jsonContent = vm.readFile(deploymentFile); - uint256 vaultCount = jsonContent.readUint(".vaultCount"); - deployment.vaults = new PooledDepositsVault[](vaultCount); - - for (uint i = 0; i < vaultCount; i++) { - address vaultAddress = jsonContent.readAddress(string.concat(".proxy-Deposit-", vm.toString(i))); - deployment.vaults[i] = PooledDepositsVault(payable(vaultAddress)); - } - } -} diff --git a/script/DeployReferralDepositAdapter.sol b/script/DeployReferralDepositAdapter.sol deleted file mode 100644 index e83e269e8..000000000 --- a/script/DeployReferralDepositAdapter.sol +++ /dev/null @@ -1,88 +0,0 @@ -import {BaseScript} from "script/BaseScript.s.sol"; -import {TransparentUpgradeableProxy} from "lib/openzeppelin-contracts/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; -import {ReferralDepositAdapter} from "src/ReferralDepositAdapter.sol"; -import {IReferralDepositAdapter} from "src/interfaces/IReferralDepositAdapter.sol"; - -import {ActorAddresses} from "script/Actors.sol"; -import {ContractAddresses} from "script/ContractAddresses.sol"; -import {console} from "lib/forge-std/src/console.sol"; -import { IynETH } from "src/interfaces/IynETH.sol"; - - -contract DeployReferralDepositAdapter is BaseScript { - - - - function saveDeployment(ReferralDepositAdapter referralDepositAdapter) public virtual { - string memory json = "deployment"; - - // contract addresses - serializeProxyElements(json, "ReferralDepositAdapter", address(referralDepositAdapter)); - - ActorAddresses.Actors memory actors = getActors(); - // actors - vm.serializeAddress(json, "PROXY_ADMIN_OWNER", address(actors.admin.PROXY_ADMIN_OWNER)); - vm.serializeAddress(json, "ADMIN", address(actors.admin.ADMIN)); - vm.serializeAddress(json, "STAKING_ADMIN", address(actors.admin.STAKING_ADMIN)); - vm.serializeAddress(json, "STAKING_NODES_OPERATOR", address(actors.ops.STAKING_NODES_OPERATOR)); - vm.serializeAddress(json, "VALIDATOR_MANAGER", address(actors.ops.VALIDATOR_MANAGER)); - vm.serializeAddress(json, "FEE_RECEIVER", address(actors.admin.FEE_RECEIVER)); - vm.serializeAddress(json, "PAUSE_ADMIN", address(actors.ops.PAUSE_ADMIN)); - vm.serializeAddress(json, "UNPAUSE_ADMIN", address(actors.admin.UNPAUSE_ADMIN)); - vm.serializeAddress(json, "LSD_RESTAKING_MANAGER", address(actors.ops.LSD_RESTAKING_MANAGER)); - vm.serializeAddress(json, "STAKING_NODE_CREATOR", address(actors.ops.STAKING_NODE_CREATOR)); - vm.serializeAddress(json, "ORACLE_ADMIN", address(actors.admin.ORACLE_ADMIN)); - vm.serializeAddress(json, "DEPOSIT_BOOTSTRAPPER", address(actors.eoa.DEPOSIT_BOOTSTRAPPER)); - - string memory finalJson = vm.serializeAddress(json, "DEFAULT_SIGNER", address((actors.eoa.DEFAULT_SIGNER))); - vm.writeJson(finalJson, getDeploymentFile()); - - console.log("Deployment JSON file written successfully:", getDeploymentFile()); - } - - function getDeploymentFile() internal override view returns (string memory) { - string memory root = vm.projectRoot(); - return string.concat(root, "/deployments/ReferralDepositAdapter-", vm.toString(block.chainid), ".json"); - } - - - function run() external { - - - uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); - - address publicKey = vm.addr(deployerPrivateKey); - console.log("Deployer Public Key:", publicKey); - - // ynETH.sol ROLES - ActorAddresses.Actors memory actors = getActors(); - - address _broadcaster = vm.addr(deployerPrivateKey); - console.log("Broadcaster Address:", _broadcaster); - - ContractAddresses contractAddresses = new ContractAddresses(); - ContractAddresses.ChainAddresses memory chainAddresses = contractAddresses.getChainAddresses(block.chainid); - - vm.startBroadcast(deployerPrivateKey); - - TransparentUpgradeableProxy referralDepositAdapterProxy; - ReferralDepositAdapter referralDepositAdapter; - - address logic = address(new ReferralDepositAdapter()); - - referralDepositAdapterProxy = new TransparentUpgradeableProxy(logic, actors.admin.PROXY_ADMIN_OWNER, ""); - referralDepositAdapter = ReferralDepositAdapter(payable(address(referralDepositAdapterProxy))); - - referralDepositAdapter.initialize( - IReferralDepositAdapter.Init({ - _ynETH: IynETH(chainAddresses.yn.YNETH_ADDRESS), - admin: actors.admin.ADMIN, - referralPublisher: actors.ops.REFERRAL_PUBLISHER - }) - ); - - vm.stopBroadcast(); - - saveDeployment(referralDepositAdapter); - } -} diff --git a/script/DeployYieldNest.s.sol b/script/DeployYieldNest.s.sol index d0a06eed2..048c7f257 100644 --- a/script/DeployYieldNest.s.sol +++ b/script/DeployYieldNest.s.sol @@ -20,10 +20,12 @@ import {RewardsDistributor} from "src/RewardsDistributor.sol"; import {ynETH} from "src/ynETH.sol"; import {ContractAddresses} from "script/ContractAddresses.sol"; import {BaseScript} from "script/BaseScript.s.sol"; +import {BaseYnETHScript} from "script/BaseYnETHScript.s.sol"; import {ActorAddresses} from "script/Actors.sol"; + import {console} from "lib/forge-std/src/console.sol"; -contract DeployYieldNest is BaseScript { +contract DeployYieldNest is BaseYnETHScript { TransparentUpgradeableProxy public ynethProxy; TransparentUpgradeableProxy public stakingNodesManagerProxy; diff --git a/script/DeployYnLSD.s.sol b/script/DeployYnLSD.s.sol deleted file mode 100644 index ab3a44c14..000000000 --- a/script/DeployYnLSD.s.sol +++ /dev/null @@ -1,142 +0,0 @@ -// SPDX-License-Identifier: BSD 3-Clause License -pragma solidity ^0.8.24; - -import {TransparentUpgradeableProxy} from "lib/openzeppelin-contracts/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; -import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; -import {IEigenPodManager} from "lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPodManager.sol"; -import {IDelegationManager} from "lib/eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol"; -import {IDelayedWithdrawalRouter} from "lib/eigenlayer-contracts/src/contracts/interfaces/IDelayedWithdrawalRouter.sol"; -import {IStrategyManager} from "lib/eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol"; -import {IStrategy} from "lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; -import {IDepositContract} from "src/external/ethereum/IDepositContract.sol"; -import {IWETH} from "src/external/tokens/IWETH.sol"; - -import {ynLSD} from "src/ynLSD.sol"; -import {YieldNestOracle} from "src/YieldNestOracle.sol"; -import {LSDStakingNode} from "src/LSDStakingNode.sol"; -import {ContractAddresses} from "script/ContractAddresses.sol"; -import {ActorAddresses} from "script/Actors.sol"; -import {BaseScript} from "script/BaseScript.s.sol"; -import {console} from "lib/forge-std/src/console.sol"; - -contract DeployYnLSD is BaseScript { - ynLSD public ynlsd; - YieldNestOracle public yieldNestOracle; - - IEigenPodManager public eigenPodManager; - IDelegationManager public delegationManager; - IDelayedWithdrawalRouter public delayedWithdrawalRouter; - IStrategyManager public strategyManager; - IDepositContract public depositContract; - IWETH public weth; - - function run() external { - uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); - - // ynETH.sol ROLES - ActorAddresses.Actors memory actors = getActors(); - - address _broadcaster = vm.addr(deployerPrivateKey); - - vm.startBroadcast(deployerPrivateKey); - - // solhint-disable-next-line no-console - console.log("Default Signer Address:", _broadcaster); - // solhint-disable-next-line no-console - console.log("Current Block Number:", block.number); - // solhint-disable-next-line no-console - console.log("Current Chain ID:", block.chainid); - - ContractAddresses contractAddresses = new ContractAddresses(); - ContractAddresses.ChainAddresses memory chainAddresses = contractAddresses.getChainAddresses(block.chainid); - eigenPodManager = IEigenPodManager(chainAddresses.eigenlayer.EIGENPOD_MANAGER_ADDRESS); - delegationManager = IDelegationManager(chainAddresses.eigenlayer.DELEGATION_MANAGER_ADDRESS); - delayedWithdrawalRouter = IDelayedWithdrawalRouter(chainAddresses.eigenlayer.DELAYED_WITHDRAWAL_ROUTER_ADDRESS); // Assuming DEPOSIT_2_ADDRESS is used for DelayedWithdrawalRouter - strategyManager = IStrategyManager(chainAddresses.eigenlayer.STRATEGY_MANAGER_ADDRESS); - depositContract = IDepositContract(chainAddresses.ethereum.DEPOSIT_2_ADDRESS); - weth = IWETH(chainAddresses.ethereum.WETH_ADDRESS); - - // Deploy implementations - { - ynLSD ynLSDImplementation = new ynLSD(); - TransparentUpgradeableProxy ynLSDProxy = new TransparentUpgradeableProxy(address(ynLSDImplementation), actors.admin.PROXY_ADMIN_OWNER, ""); - ynlsd = ynLSD(address(ynLSDProxy)); - } - - { - YieldNestOracle yieldNestOracleImplementation = new YieldNestOracle(); - TransparentUpgradeableProxy yieldNestOracleProxy = new TransparentUpgradeableProxy(address(yieldNestOracleImplementation), actors.admin.PROXY_ADMIN_OWNER, ""); - yieldNestOracle = YieldNestOracle(address(yieldNestOracleProxy)); - } - - IERC20[] memory assets = new IERC20[](2); - assets[0] = IERC20(chainAddresses.lsd.RETH_ADDRESS); - assets[1] = IERC20(chainAddresses.lsd.STETH_ADDRESS); - - IStrategy[] memory strategies = new IStrategy[](2); - strategies[0] = IStrategy(chainAddresses.lsd.RETH_STRATEGY_ADDRESS); - strategies[1] = IStrategy(chainAddresses.lsd.STETH_STRATEGY_ADDRESS); - // Initialize ynLSD with example parameters - { - address[] memory lsdPauseWhitelist = new address[](1); - lsdPauseWhitelist[0] = _broadcaster; - - ynLSD.Init memory ynlsdInit = ynLSD.Init({ - assets: assets, - strategies: strategies, - strategyManager: strategyManager, - delegationManager: delegationManager, - oracle: yieldNestOracle, - maxNodeCount: 10, - admin: actors.admin.ADMIN, - pauser: actors.ops.PAUSE_ADMIN, - unpauser: actors.admin.UNPAUSE_ADMIN, - stakingAdmin: actors.admin.STAKING_ADMIN, - lsdRestakingManager: actors.ops.LSD_RESTAKING_MANAGER, - lsdStakingNodeCreatorRole: actors.ops.STAKING_NODE_CREATOR, - pauseWhitelist: lsdPauseWhitelist, - depositBootstrapper: actors.eoa.DEPOSIT_BOOTSTRAPPER - }); - ynlsd.initialize(ynlsdInit); - } - - uint256[] memory maxAgesArray = new uint256[](assets.length); - address[] memory priceFeedAddresses = new address[](assets.length); - for (uint256 i = 0; i < assets.length; i++) { - maxAgesArray[i] = type(uint256).max; - if (assets[i] == IERC20(chainAddresses.lsd.RETH_ADDRESS)) { - priceFeedAddresses[i] = chainAddresses.lsd.RETH_FEED_ADDRESS; - } else if (assets[i] == IERC20(chainAddresses.lsd.STETH_ADDRESS)) { - priceFeedAddresses[i] = chainAddresses.lsd.STETH_FEED_ADDRESS; - } - } - - { - address[] memory assetsAddresses = new address[](assets.length); - for (uint256 i = 0; i < assets.length; i++) { - assetsAddresses[i] = address(assets[i]); - } - YieldNestOracle.Init memory yieldNestOracleInit = YieldNestOracle.Init({ - assets: assetsAddresses, - priceFeedAddresses: priceFeedAddresses, - maxAges: maxAgesArray, - admin: actors.admin.ORACLE_ADMIN, - oracleManager: actors.admin.ORACLE_ADMIN - }); - yieldNestOracle.initialize(yieldNestOracleInit); - } - - { - LSDStakingNode lsdStakingNodeImplementation = new LSDStakingNode(); - ynlsd.registerLSDStakingNodeImplementationContract(address(lsdStakingNodeImplementation)); - - ynLSDDeployment memory deployment = ynLSDDeployment({ - ynlsd: ynlsd, - lsdStakingNodeImplementation: lsdStakingNodeImplementation, - yieldNestOracle: yieldNestOracle - }); - - saveynLSDDeployment(deployment); - } - } -} diff --git a/script/Upgrade.s.sol b/script/Upgrade.s.sol deleted file mode 100644 index 05aa2ed61..000000000 --- a/script/Upgrade.s.sol +++ /dev/null @@ -1,63 +0,0 @@ -// SPDX-License-Identifier: BSD 3-Clause License -pragma solidity ^0.8.24; - -import {ITransparentUpgradeableProxy} from "lib/openzeppelin-contracts/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; -import {ProxyAdmin} from "lib/openzeppelin-contracts/contracts/proxy/transparent/ProxyAdmin.sol"; -import {BaseScript} from "script/BaseScript.s.sol"; -import {ynETH} from "src/ynETH.sol"; -import {StakingNodesManager} from "src/StakingNodesManager.sol"; -import {RewardsDistributor} from "src/RewardsDistributor.sol"; -import {StakingNode} from "src/StakingNode.sol"; -import {console} from "lib/forge-std/src/console.sol"; - -contract Upgrade is BaseScript { - function _deployImplementation(string memory contractName) internal returns (address, address) { - Deployment memory deployment = loadDeployment(); - if (keccak256(bytes(contractName)) == keccak256("ynETH")) { - ynETH impl = new ynETH(); - return (address(deployment.ynETH), address(impl)); - } - if (keccak256(bytes(contractName)) == keccak256("StakingNodesManager")) { - StakingNodesManager impl = new StakingNodesManager(); - return (address(deployment.stakingNodesManager), address(impl)); - } - if (keccak256(bytes(contractName)) == keccak256("RewardsDistributor")) { - RewardsDistributor impl = new RewardsDistributor(); - return (address(deployment.rewardsDistributor), address(impl)); - } - // if (keccak256(bytes(contractName)) == keccak256("RewardsReceiver")) { - // RewardsReceiver impl = new RewardsReceiver(); - // return (address(deployment.rewardsReceiver), address(impl)); - // } - revert("Uknown contract"); - } - - function run(string memory contractName) public { - Deployment memory deployment = loadDeployment(); - - console.log("Upgrading contract with name:", contractName); - - uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); - vm.startBroadcast(deployerPrivateKey); - - if (keccak256(bytes(contractName)) == keccak256("StakingNode")) { - StakingNode impl = new StakingNode(); - StakingNodesManager stakingNodesManager = deployment.stakingNodesManager; - - stakingNodesManager.upgradeStakingNodeImplementation(address(impl)); - } - - (address proxyAddr, address implAddress) = _deployImplementation(contractName); - vm.stopBroadcast(); - - console.log(string.concat(contractName, " address (proxy):")); - console.log(proxyAddr); - console.log("New implementation address:"); - console.log(implAddress); - - vm.startBroadcast(deployerPrivateKey); - ProxyAdmin(getTransparentUpgradeableProxyAdminAddress(proxyAddr)).upgradeAndCall(ITransparentUpgradeableProxy(proxyAddr), implAddress, ""); - vm.stopBroadcast(); - - } -} diff --git a/script/VerifyPooledDepositsVaults.s.sol b/script/VerifyPooledDepositsVaults.s.sol deleted file mode 100644 index 3e9e1ea1e..000000000 --- a/script/VerifyPooledDepositsVaults.s.sol +++ /dev/null @@ -1,56 +0,0 @@ -/// SPDX-License-Identifier: BSD 3-Clause License -pragma solidity ^0.8.24; - -import {ContractAddresses} from "script/ContractAddresses.sol"; -import {BaseScript} from "script/BaseScript.s.sol"; -import { IEigenPodManager } from "lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPodManager.sol"; -import {IStakingNode} from "src/interfaces/IStakingNode.sol"; -import {DeployPooledDepositsVaults} from "script/DeployPooledDepositsVaults.s.sol"; -import {Utils} from "script/Utils.sol"; -import {ProxyAdmin} from "lib/openzeppelin-contracts/contracts/proxy/transparent/ProxyAdmin.sol"; -import {console} from "lib/forge-std/src/console.sol"; -import {ActorAddresses} from "script/Actors.sol"; - -contract VerifyPooledDepositsVaults is DeployPooledDepositsVaults { - - PooledDepositsVaultsDeployment deployment; - ActorAddresses.Actors actors; - ContractAddresses.ChainAddresses chainAddresses; - - function run() external override { - - ContractAddresses contractAddresses = new ContractAddresses(); - chainAddresses = contractAddresses.getChainAddresses(block.chainid); - - deployment = loadPooledDepositsDeployment(); - actors = getActors(); - - verifyProxyAdminOwners(); - verifyVaultOwners(); - } - - function verifyProxyAdminOwners() public view { - for (uint i = 0; i < deployment.vaults.length; i++) { - ProxyAdmin proxyAdmin = ProxyAdmin(Utils.getTransparentUpgradeableProxyAdminAddress(address(deployment.vaults[i]))); - address vaultAdmin = proxyAdmin.owner(); - console.log("ProxyAdmin for vault at index", i, "is at address", address(proxyAdmin)); - require( - vaultAdmin == actors.admin.PROXY_ADMIN_OWNER, - string.concat("PooledDepositsVault: PROXY_ADMIN_OWNER INVALID, expected: ", vm.toString(actors.admin.PROXY_ADMIN_OWNER), ", got: ", vm.toString(vaultAdmin)) - ); - console.log("\u2705 Verified proxy admin owner for vault at index", i, " - ", vm.toString(vaultAdmin)); - } - } - - function verifyVaultOwners() public view { - for (uint i = 0; i < deployment.vaults.length; i++) { - address vaultOwner = deployment.vaults[i].owner(); - require( - vaultOwner == actors.ops.POOLED_DEPOSITS_OWNER, - string.concat("PooledDepositsVault: OWNER INVALID, expected: ", vm.toString(actors.ops.POOLED_DEPOSITS_OWNER), ", got: ", vm.toString(vaultOwner)) - ); - console.log("\u2705 Verified owner for vault at index", i, " - ", vm.toString(vaultOwner)); - } - } -} - diff --git a/script/VerifyYnETH.s.sol b/script/VerifyYnETH.s.sol index 3ca6e89de..1ecf42a18 100644 --- a/script/VerifyYnETH.s.sol +++ b/script/VerifyYnETH.s.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.24; import {ContractAddresses} from "script/ContractAddresses.sol"; -import {BaseScript} from "script/BaseScript.s.sol"; +import {BaseYnETHScript} from "script/BaseYnETHScript.s.sol"; import { IEigenPodManager } from "lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPodManager.sol"; import {IStakingNode} from "src/interfaces/IStakingNode.sol"; import {ProxyAdmin} from "lib/openzeppelin-contracts/contracts/proxy/transparent/ProxyAdmin.sol"; @@ -11,7 +11,7 @@ import {Utils} from "script/Utils.sol"; import {ActorAddresses} from "script/Actors.sol"; import {console} from "lib/forge-std/src/console.sol"; -contract Verify is BaseScript { +contract Verify is BaseYnETHScript { Deployment deployment; ActorAddresses.Actors actors; diff --git a/script/commands/DepositToYnLSDe.s.sol b/script/commands/DepositToYnLSDe.s.sol new file mode 100644 index 000000000..896d0ed2e --- /dev/null +++ b/script/commands/DepositToYnLSDe.s.sol @@ -0,0 +1,127 @@ + +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol"; + +import {IwstETH} from "../../src/external/lido/IwstETH.sol"; +import {IynEigen} from "../../src/interfaces/IynEigen.sol"; +import {ImETHStaking} from "../../src/external/mantle/ImETHStaking.sol"; +import {IfrxMinter} from "../../src/external/frax/IfrxMinter.sol"; + +import "../ynEigen/BaseYnEigenScript.s.sol"; + +interface IRocketPoolDepositPool { + function deposit() external payable; +} + +contract DepositToYnLSDe is BaseYnEigenScript { + uint256 public privateKey; // dev: assigned in test setup + + address public broadcaster; + + uint256 public constant AMOUNT = 0.1 ether; + + function run() public { + address token = _getTokenAddress(vm.prompt("Token (`sfrxETH`, `wstETH`, `mETH` and `rETH` (holesky only))")); + uint256 path = vm.parseUint(vm.prompt("Path (`0` for deposit or `1` for send")); + run(path, token); + } + + function run(uint256 path, address token) public { + uint256 deployerPrivateKey = privateKey == 0 ? vm.envUint("PRIVATE_KEY") : privateKey; + broadcaster = vm.addr(deployerPrivateKey); + console.log("Default Signer Address:", broadcaster); + console.log("Current Block Number:", block.number); + console.log("Current Chain ID:", block.chainid); + console.log("Token Address:", token); + console.log("Path:", path); + + vm.startBroadcast(deployerPrivateKey); + + uint256 _amount = _getToken(token); + if (path == 0) { + _deposit(_amount, token); // deposit to ynEIGEN + } else if (path == 1) { + _send(_amount, token); // send to broadcaster + } else { + revert("Invalid path"); + } + + vm.stopBroadcast(); + + console.log("Deposit successful"); + } + + function _getTokenAddress(string memory n) internal view returns (address) { + if (keccak256(abi.encodePacked(n)) == keccak256(abi.encodePacked("sfrxETH")) && block.chainid == 1) { + return chainAddresses.lsd.SFRXETH_ADDRESS; + } else if (keccak256(abi.encodePacked(n)) == keccak256(abi.encodePacked("wstETH"))) { + return chainAddresses.lsd.WSTETH_ADDRESS; + } else if (keccak256(abi.encodePacked(n)) == keccak256(abi.encodePacked("mETH"))) { + return chainAddresses.lsd.METH_ADDRESS; + } else if (keccak256(abi.encodePacked(n)) == keccak256(abi.encodePacked("rETH")) && block.chainid == 17000) { + return chainAddresses.lsd.RETH_ADDRESS; + } else { + revert("Invalid token name"); + } + } + + function _getToken(address token) internal returns (uint256 _amount) { + if (token == chainAddresses.lsd.SFRXETH_ADDRESS) { + _amount = _getSFRXETH(); + } else if (token == chainAddresses.lsd.WSTETH_ADDRESS) { + _amount = _getWSTETH(); + } else if (token == chainAddresses.lsd.METH_ADDRESS) { + _amount = _getMETH(); + } else if (token == chainAddresses.lsd.RETH_ADDRESS) { + _amount = _getRETH(); + } else { + revert("Invalid token address"); + } + } + + // NOTE: not deployed on holesky + function _getSFRXETH() internal returns (uint256) { + return IfrxMinter(0xbAFA44EFE7901E04E39Dad13167D089C559c1138).submitAndDeposit{value: AMOUNT}(broadcaster); + } + + function _getWSTETH() internal returns (uint256) { + uint256 balanceBefore = IERC20(chainAddresses.lsd.STETH_ADDRESS).balanceOf(broadcaster); + (bool sent, ) = chainAddresses.lsd.STETH_ADDRESS.call{value: AMOUNT}(""); + require(sent, "Failed to send Ether"); + + uint256 amount = IERC20(chainAddresses.lsd.STETH_ADDRESS).balanceOf(broadcaster) - balanceBefore; + IERC20(chainAddresses.lsd.STETH_ADDRESS).approve(chainAddresses.lsd.WSTETH_ADDRESS, amount); + return IwstETH(chainAddresses.lsd.WSTETH_ADDRESS).wrap(amount); + } + + // NOTE: fails if AMOUNT < 0.1 ether + function _getMETH() internal returns (uint256) { + ImETHStaking mETHStaking = block.chainid == 1 + ? ImETHStaking(0xe3cBd06D7dadB3F4e6557bAb7EdD924CD1489E8f) + : ImETHStaking(0xbe16244EAe9837219147384c8A7560BA14946262); + IERC20 mETH = IERC20(chainAddresses.lsd.METH_ADDRESS); + uint256 _balanceBefore = mETH.balanceOf(broadcaster); + mETHStaking.stake{value: AMOUNT}(mETHStaking.ethToMETH(AMOUNT)); + return mETH.balanceOf(broadcaster) - _balanceBefore; + } + + function _getRETH() internal returns (uint256) { // NOTE: only holesky + IRocketPoolDepositPool depositPool = IRocketPoolDepositPool(0x320f3aAB9405e38b955178BBe75c477dECBA0C27); + uint256 _balanceBefore = IERC20(chainAddresses.lsd.RETH_ADDRESS).balanceOf(broadcaster); + // NOTE: only works if pool is not at max capacity (it may be) + depositPool.deposit{value: AMOUNT}(); + return IERC20(chainAddresses.lsd.RETH_ADDRESS).balanceOf(broadcaster) - _balanceBefore; + } + + function _deposit(uint256 amount, address token) internal { + IERC20(token).approve(chainAddresses.ynEigen.YNEIGEN_ADDRESS, amount); + IynEigen(chainAddresses.ynEigen.YNEIGEN_ADDRESS).deposit(IERC20(token), amount, broadcaster); + } + + function _send(uint256 amount, address token) internal { + IERC20(token).transfer(actors.eoa.DEFAULT_SIGNER, amount); + } +} diff --git a/script/delegation/DelegateTransactionDataBuilder.sol b/script/delegation/DelegateTransactionDataBuilder.sol deleted file mode 100644 index 7d71f730f..000000000 --- a/script/delegation/DelegateTransactionDataBuilder.sol +++ /dev/null @@ -1,65 +0,0 @@ -// SPDX-License-Identifier: BSD 3-Clause License -pragma solidity ^0.8.24; - -import {TransparentUpgradeableProxy} from "lib/openzeppelin-contracts/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; -import {ProxyAdmin} from "lib/openzeppelin-contracts/contracts/proxy/transparent/ProxyAdmin.sol"; -import {BaseScript} from "script/BaseScript.s.sol"; -import {stdJson} from "lib/forge-std/src/StdJson.sol"; -import {PooledDepositsVault} from "src/PooledDepositsVault.sol"; // Renamed from PooledDeposits to PooledDepositsVault -import {ActorAddresses} from "script/Actors.sol"; -import {console} from "lib/forge-std/src/console.sol"; -import {IStakingNode} from "src/interfaces/IStakingNode.sol"; -import {ISignatureUtils} from "lib/eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol"; -import {IStakingNodesManager} from "src/interfaces/IStakingNodesManager.sol"; -import {ContractAddresses} from "script/ContractAddresses.sol"; - -contract DelegateTransactionBuilder is BaseScript { - - - function run() external { - - address[] memory stakingNodes = new address[](5); - stakingNodes[0] = 0x412946D1c4F7e55E3F4B9dD1bA6D619E29Af9bA2; - stakingNodes[1] = 0xAc4B7CA94c004A6D7cE9B62fb9d86DF8f6CcFc26; - stakingNodes[2] = 0xAEBDCD5285988009C1C4cC05a8DDdd29E42304C7; - stakingNodes[3] = 0x77F7d153Bd9e25293a95AEDFE8087F3e24D73c9e; - stakingNodes[4] = 0xc9170a5C286a6D8C80b07d20E087e20f273A36A1; - - ContractAddresses contractAddresses = new ContractAddresses(); - ContractAddresses.ChainAddresses memory chainAddresses = contractAddresses.getChainAddresses(block.chainid); - IStakingNodesManager stakingNodesManager = IStakingNodesManager(chainAddresses.yn.STAKING_NODES_MANAGER_ADDRESS); - IStakingNode[] memory allNodes = stakingNodesManager.getAllNodes(); - require(allNodes.length == stakingNodes.length, "Node count mismatch."); - - for (uint i = 0; i < stakingNodes.length; i++) { - require(address(allNodes[i]) == stakingNodes[i], "Node address mismatch."); - } - - address OPERATOR_A41 = 0xa83e07353A9ED2aF88e7281a2fA7719c01356D8e; - address OPERATOR_P2P = 0xDbEd88D83176316fc46797B43aDeE927Dc2ff2F5; - - address[] memory operators = new address[](5); - operators[0] = OPERATOR_A41; - operators[1] = OPERATOR_A41; - operators[2] = OPERATOR_A41; - operators[3] = OPERATOR_A41; - operators[4] = OPERATOR_P2P; - - for (uint i = 0; i < stakingNodes.length; i++) { - address currentOperator = operators[i]; - - // Generate tx data for delegating to an operator - bytes memory delegateTxData = abi.encodeWithSelector( - IStakingNode.delegate.selector, - currentOperator, - ISignatureUtils.SignatureWithExpiry({signature: "", expiry: 0}), - bytes32(0) - ); - console.log("Node address:", stakingNodes[i]); - console.log("Index:", i); - console.log("Delegating to operator:", currentOperator); - console.log("Delegate transaction data:", vm.toString(abi.encodePacked(delegateTxData))); - } - } - -} \ No newline at end of file diff --git a/script/deployYnViewer.s.sol b/script/deployYnViewer.s.sol deleted file mode 100644 index 9976d9e80..000000000 --- a/script/deployYnViewer.s.sol +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-License-Identifier: BSD 3-Clause License -pragma solidity ^0.8.24; - -import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; - -import {ynViewer} from "../src/ynViewer.sol"; - -import {ContractAddresses} from "./ContractAddresses.sol"; - -import "./BaseScript.s.sol"; - -contract DeployYnViewer is BaseScript { - - uint256 public privateKey; // dev: assigned in test setup - - ynViewer public viewer; - - function run() public { - - ContractAddresses _contractAddresses = new ContractAddresses(); - ContractAddresses.ChainAddresses memory _chainAddresses = _contractAddresses.getChainAddresses(block.chainid); - ActorAddresses.Actors memory _actors = getActors(); - - privateKey = vm.envUint("PRIVATE_KEY"); - vm.startBroadcast(privateKey); - - address _viewerImplementation = address(new ynViewer(_chainAddresses.yn.YNETH_ADDRESS, _chainAddresses.yn.STAKING_NODES_MANAGER_ADDRESS)); - viewer = ynViewer(address(new TransparentUpgradeableProxy(_viewerImplementation, _actors.admin.PROXY_ADMIN_OWNER, ""))); - - vm.stopBroadcast(); - - console.log("ynViewer proxy deployed at: ", address(viewer)); - console.log("ynViewer implementation deployed at: ", _viewerImplementation); - } -} \ No newline at end of file diff --git a/script/upgrades/GenerateGrantRoleTxData.s.sol b/script/upgrades/GenerateGrantRoleTxData.s.sol new file mode 100644 index 000000000..2abbe57be --- /dev/null +++ b/script/upgrades/GenerateGrantRoleTxData.s.sol @@ -0,0 +1,53 @@ + +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {StakingNodesManager} from "src/StakingNodesManager.sol"; +import {StakingNode} from "src/StakingNode.sol"; +import {RewardsReceiver} from "src/RewardsReceiver.sol"; +import {stdJson} from "lib/forge-std/src/StdJson.sol"; +import {RewardsDistributor} from "src/RewardsDistributor.sol"; +import {ynETH} from "src/ynETH.sol"; +import {Script} from "lib/forge-std/src/Script.sol"; +import {Utils} from "script/Utils.sol"; +import {ActorAddresses} from "script/Actors.sol"; +import {console} from "lib/forge-std/src/console.sol"; +import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; +import {ContractAddresses} from "script/ContractAddresses.sol"; +import { IwstETH } from "src/external/lido/IwstETH.sol"; +import { IynEigen } from "src/interfaces/IynEigen.sol"; +import {ITransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; +import {BaseScript} from "script/BaseScript.s.sol"; + +import { BaseYnEigenScript } from "script/ynEigen/BaseYnEigenScript.s.sol"; + + +contract GenerateGrantRoleTxData is BaseScript { + + function run() external { + // Get role and account from command line arguments + string memory roleString = vm.envString("ROLE"); + address account = vm.envAddress("ACCOUNT"); + + // Convert role string to bytes32 + bytes32 role = keccak256(bytes(roleString)); + + // Print role information + console.log("Role Information:"); + console.log("----------------"); + console.log("Role (string):", roleString); + console.log("Role (bytes32):", vm.toString(role)); + console.log("Account:", vm.toString(account)); + console.log("----------------"); + + // Generate the calldata for grantRole + bytes memory callData = abi.encodeWithSignature("grantRole(bytes32,address)", role, account); + + // Output the generated calldata + console.log("\nGenerated Calldata:"); + console.log("--------------------"); + console.logBytes(callData); + console.log("--------------------"); + } +} diff --git a/script/upgrades/GenerateYnLSDeUpgradeTxData.s.sol b/script/upgrades/GenerateYnLSDeUpgradeTxData.s.sol new file mode 100644 index 000000000..6043210d5 --- /dev/null +++ b/script/upgrades/GenerateYnLSDeUpgradeTxData.s.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {console} from "lib/forge-std/src/console.sol"; +import {ITransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; + +import {BaseYnEigenScript} from "script/ynEigen/BaseYnEigenScript.s.sol"; + +contract GenerateYnLSDeUpgradeTxData is BaseYnEigenScript { + Deployment deployment; + + function run() external { + deployment = loadDeployment(); + + console.log("=== Upgrade Information ==="); + console.log("Current Block Number: %s", block.number); + console.log("Current Chain ID: %s", block.chainid); + + string memory contractToUpgrade = vm.envString("CONTRACT_TO_UPGRADE"); + address newImplementation = vm.envAddress("NEW_IMPLEMENTATION"); + + console.log("=== Contract Upgrade Details ==="); + console.log("Contract to upgrade: %s", contractToUpgrade); + console.log("Contract address: %s", vm.toString(getProxyAddress(contractToUpgrade))); + + console.log("New implementation: %s", vm.toString(newImplementation)); + + address proxyAddress = getProxyAddress(contractToUpgrade); + ITransparentUpgradeableProxy proxy = ITransparentUpgradeableProxy(proxyAddress); + address proxyAdmin = getTransparentUpgradeableProxyAdminAddress(address(proxy)); + + bytes memory data = ""; // Empty data for now, can be customized if needed + bytes memory txData = + abi.encodeWithSelector(ProxyAdmin.upgradeAndCall.selector, address(proxy), newImplementation, data); + + console.log("=== Upgrade Transaction Details ==="); + console.log("Upgrade timelock: %s", vm.toString(address(deployment.upgradeTimelock))); + console.log("Target ProxyAdmin: %s", vm.toString(proxyAdmin)); + console.log("Upgrade transaction data:"); + console.logBytes(txData); + } +} diff --git a/script/upgrades/UpgradeYnETH-0.0.2.sol b/script/upgrades/UpgradeYnETH-0.0.2.sol deleted file mode 100644 index 44049f5a4..000000000 --- a/script/upgrades/UpgradeYnETH-0.0.2.sol +++ /dev/null @@ -1,61 +0,0 @@ -pragma solidity ^0.8.24; - -import "../../src/ynETH.sol"; -import "../../src/StakingNodesManager.sol"; -import "../../src/StakingNode.sol"; -import "../../src/RewardsDistributor.sol"; -import "../../src/RewardsReceiver.sol"; -import "script/BaseScript.s.sol"; -import {ContractAddresses} from "script/ContractAddresses.sol"; - - -contract UpgradeYnETH_0_0_2 is BaseScript { - ynETH public newynETH; - StakingNodesManager public newStakingNodesManager; - StakingNode public newStakingNode; - ActorAddresses.Actors actors; - - function run() external { - uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); - - address publicKey = vm.addr(deployerPrivateKey); - console.log("Deployer Public Key:", publicKey); - - // ynETH.sol ROLES - actors = getActors(); - - address _broadcaster = vm.addr(deployerPrivateKey); - - vm.startBroadcast(deployerPrivateKey); - - console.log("Default Signer Address:", _broadcaster); - console.log("Current Block Number:", block.number); - console.log("Current Chain ID:", block.chainid); - - newynETH = new ynETH(); - newStakingNodesManager = new StakingNodesManager(); - newStakingNode = new StakingNode(); - - vm.stopBroadcast(); - - saveDeployment(); - } - - function saveDeployment() public { - string memory json = "deployment"; - - // contract addresses - vm.serializeAddress(json, "ynETHImplementation", address(newynETH)); - vm.serializeAddress(json, "stakingNodesManagerImplementation", address(newStakingNodesManager)); - string memory finalJson = vm.serializeAddress(json, "stakingNodeImplementation", address(newStakingNode)); - - vm.writeJson(finalJson, getDeploymentFile()); - - console.log("Deployment JSON file written successfully:", getDeploymentFile()); - } - - function getDeploymentFile() internal view override returns (string memory) { - string memory root = vm.projectRoot(); - return string.concat(root, "/deployments/ynETH-upgrade-0.0.2", vm.toString(block.chainid), ".json"); - } -} diff --git a/script/verification/verify-bytecode-ynlsde.sh b/script/verification/verify-bytecode-ynlsde.sh new file mode 100644 index 000000000..c54deba1a --- /dev/null +++ b/script/verification/verify-bytecode-ynlsde.sh @@ -0,0 +1,119 @@ +#!/bin/bash + +# Read the deployment JSON file +DEPLOYMENT_FILE="./deployments/YnLSDe-1.json" + +# List of contracts to verify +contracts=("YnLSDe" "assetRegistry" "eigenStrategyManager" "tokenStakingNodesManager" "ynEigenDepositAdapter" "rateProvider") + +# Note: verify "ynEigenViewer" manually. more difficult to craft parameter bytecode verification + +# Read the Etherscan API key from .env file +ETHERSCAN_API_KEY=$(grep ETHERSCAN_API_KEY .env | cut -d '=' -f2 | tr -d '[:space:]') + +# Log ETHERSCAN_API_KEY (masked for security) +echo "ETHERSCAN_API_KEY: ${ETHERSCAN_API_KEY:0:4}...${ETHERSCAN_API_KEY: -4}" + + +get_solidity_contract_name() { + local contract_key=$1 + local solidity_contract="" + + if [ "$contract_key" == "YnLSDe" ]; then + solidity_contract="ynEigen" + elif [ "$contract_key" == "assetRegistry" ]; then + solidity_contract="AssetRegistry" + elif [ "$contract_key" == "eigenStrategyManager" ]; then + solidity_contract="EigenStrategyManager" + elif [ "$contract_key" == "tokenStakingNodesManager" ]; then + solidity_contract="TokenStakingNodesManager" + elif [ "$contract_key" == "ynEigenDepositAdapter" ]; then + solidity_contract="ynEigenDepositAdapter" + elif [ "$contract_key" == "rateProvider" ]; then + solidity_contract="LSDRateProvider" + elif [ "$contract_key" == "ynEigenViewer" ]; then + solidity_contract="ynEigenViewer" + elif [ "$contract_key" == "upgradeTimelock" ]; then + solidity_contract="TimelockController" + elif [ "$contract_key" == "tokenStakingNodeImplementation" ]; then + solidity_contract="TokenStakingNode" + else + echo "Error: Unknown contract key '$contract_key'" >&2 + return 1 + fi + + echo "$solidity_contract" +} + +# Function to extract proxy and implementation addresses +extract_addresses() { + local key=$1 + local proxy_address=$(jq -r ".[\"proxy-$key\"]" "$DEPLOYMENT_FILE") + local impl_address=$(jq -r ".[\"implementation-$key\"]" "$DEPLOYMENT_FILE") + local proxy_admin=$(jq -r ".[\"proxyAdmin-$key\"]" "$DEPLOYMENT_FILE") + echo "$proxy_address $impl_address $proxy_admin" +} + +verify_implementation() { + local impl_address=$1 + local solidity_contract=$2 + local contract_name=$3 + + # Get bytecode from Etherscan + local etherscan_sha256=$(curl -X GET "https://api.etherscan.io/api?module=proxy&action=eth_getCode&address=$impl_address&tag=latest&apikey=$ETHERSCAN_API_KEY" | jq -r '.result' | sha256sum) + + # Get local bytecode + local local_sha256=$(cat "out/$solidity_contract.sol/$solidity_contract.json" | jq -r '.deployedBytecode.object' | sed 's/"//g' | sha256sum) + + # Compare SHA256 hashes + if [ "$etherscan_sha256" = "$local_sha256" ]; then + echo "✅ Bytecode verification successful for $contract_name" + else + echo -e "❌ Error: Bytecode mismatch for $contract_name" + echo -e "❌ Etherscan SHA256: $etherscan_sha256" + echo -e "❌ Local SHA256: $local_sha256" + return 1 + fi +} + +# Function to verify a contract +verify_contract() { + local proxy_address=$1 + local impl_address=$2 + local proxy_admin=$3 + local contract_name=$4 + + # Get the Solidity contract name + local solidity_contract=$(get_solidity_contract_name "$contract_name") + if [ -z "$solidity_contract" ]; then + echo "Error: No Solidity contract name found for $contract_name" + return 1 + fi + + echo "Verifying $contract_name (Solidity contract: $solidity_contract)..." + + verify_implementation "$impl_address" "$solidity_contract" "$contract_name" +} + +# Extract upgradeTimelock address +upgradeTimelock=$(jq -r '.upgradeTimelock' "$DEPLOYMENT_FILE") + +verify_contract "" $upgradeTimelock "" "upgradeTimelock" + +# Extract tokenStakingNodeImplementation address +tokenStakingNodeImplementation=$(jq -r '.tokenStakingNodeImplementation' "$DEPLOYMENT_FILE") + +verify_contract "" $tokenStakingNodeImplementation "" "tokenStakingNodeImplementation" + + + +for contract in "${contracts[@]}"; do + read proxy impl proxy_admin <<< $(extract_addresses $contract) + + echo "Extracted addresses for $contract:" + echo " Proxy: $proxy" + echo " Implementation: $impl" + echo " Proxy Admin: $proxy_admin" + echo "" + verify_contract $proxy $impl $proxy_admin $contract +done \ No newline at end of file diff --git a/script/verification/verify-ynlsde-deployment.sh b/script/verification/verify-ynlsde-deployment.sh new file mode 100644 index 000000000..5232575e4 --- /dev/null +++ b/script/verification/verify-ynlsde-deployment.sh @@ -0,0 +1,169 @@ +#!/bin/bash + +# Read the deployment JSON file +DEPLOYMENT_FILE="./deployments/YnLSDe-17000.json" +# Read the Etherscan API key from .env file +ETHERSCAN_API_KEY=$(grep ETHERSCAN_API_KEY .env | cut -d '=' -f2) +# Read the RPC URL from .env file +RPC_URL=$(grep RPC_URL .env | cut -d '=' -f2) + +# Check if RPC_URL is empty +if [ -z "$RPC_URL" ]; then + echo "Error: RPC_URL is not set in the .env file" + exit 1 +fi + +echo "Using RPC URL: $RPC_URL" + +# Extract chain ID from RPC_URL +CHAIN_ID=$(cast chain-id --rpc-url $RPC_URL) +echo "Chain ID: $CHAIN_ID" + +# List of contracts to verify +contracts=("YnLSDe" "assetRegistry" "eigenStrategyManager" "tokenStakingNodesManager" "ynEigenDepositAdapter" "rateProvider" "ynEigenViewer") + +get_solidity_contract_name() { + local contract_key=$1 + local solidity_contract="" + + if [ "$contract_key" == "YnLSDe" ]; then + solidity_contract="ynEigen" + elif [ "$contract_key" == "assetRegistry" ]; then + solidity_contract="AssetRegistry" + elif [ "$contract_key" == "eigenStrategyManager" ]; then + solidity_contract="EigenStrategyManager" + elif [ "$contract_key" == "tokenStakingNodesManager" ]; then + solidity_contract="TokenStakingNodesManager" + elif [ "$contract_key" == "ynEigenDepositAdapter" ]; then + solidity_contract="ynEigenDepositAdapter" + elif [ "$contract_key" == "rateProvider" ]; then + solidity_contract="LSDRateProvider" + elif [ "$contract_key" == "ynEigenViewer" ]; then + solidity_contract="ynEigenViewer" + else + echo "Error: Unknown contract key '$contract_key'" >&2 + return 1 + fi + + echo "$solidity_contract" +} + +# Function to extract proxy and implementation addresses +extract_addresses() { + local key=$1 + local proxy_address=$(jq -r ".[\"proxy-$key\"]" "$DEPLOYMENT_FILE") + local impl_address=$(jq -r ".[\"implementation-$key\"]" "$DEPLOYMENT_FILE") + local proxy_admin=$(jq -r ".[\"proxyAdmin-$key\"]" "$DEPLOYMENT_FILE") + echo "$proxy_address $impl_address $proxy_admin" +} + +timelock_address=$(jq -r '.upgradeTimelock' "$DEPLOYMENT_FILE") + +# Function to verify a contract +verify_contract() { + local proxy_address=$1 + local impl_address=$2 + local proxy_admin=$3 + local contract_name=$4 + + # Get the Solidity contract name + local solidity_contract=$(get_solidity_contract_name "$contract_name") + if [ -z "$solidity_contract" ]; then + echo "Error: No Solidity contract name found for $contract_name" + return 1 + fi + + echo "Verifying $contract_name (Solidity contract: $solidity_contract)..." + + + # Verify the implementation contract + if [ "$contract_name" == "ynEigenViewer" ]; then + + # Extract proxy addresses for ynEigen, eigenStrategyManager, and tokenStakingNodesManager + read YnEigen _ _ <<< $(extract_addresses YnLSDe) + read AssetRegistry _ _ <<< $(extract_addresses assetRegistry) + read TokenStakingNodesManager _ _ <<< $(extract_addresses tokenStakingNodesManager) + read RateProvider _ _ <<< $(extract_addresses rateProvider) + + echo "Verifying ynEigenViewer..." + echo "AssetRegistry address: $AssetRegistry" + echo "YnEigen address: $YnEigen" + echo "TokenStakingNodesManager address: $TokenStakingNodesManager" + echo "RateProvider address: $RateProvider" + + + # Encode constructor arguments for ynEigenViewer + constructor_args=$(cast abi-encode "constructor(address,address,address,address)" $AssetRegistry $YnEigen $TokenStakingNodesManager $RateProvider) + + # Verify the ynEigenViewer implementation contract + forge verify-contract $impl_address $solidity_contract \ + --constructor-args $constructor_args \ + --etherscan-api-key $ETHERSCAN_API_KEY \ + --rpc-url $RPC_URL + else + forge verify-contract $impl_address $solidity_contract \ + --etherscan-api-key $ETHERSCAN_API_KEY \ + --rpc-url $RPC_URL + fi + + # Verify the proxy contract + forge verify-contract \ + --constructor-args $(cast abi-encode "constructor(address,address,bytes)" $impl_address $timelock_address "0x") \ + $proxy_address TransparentUpgradeableProxy \ + --etherscan-api-key $ETHERSCAN_API_KEY \ + --rpc-url $RPC_URL + + # FIXME: this still doesn't work. + # Verify the proxy admin contract + forge verify-contract \ + --constructor-args $(cast abi-encode "constructor(address)" $timelock_address) \ + $proxy_admin ProxyAdmin \ + --etherscan-api-key $ETHERSCAN_API_KEY \ + --rpc-url $RPC_URL +} + +# Verify each contract +for contract in "${contracts[@]}"; do + read proxy impl proxy_admin <<< $(extract_addresses $contract) + verify_contract $proxy $impl $proxy_admin $contract +done +# Verify TokenStakingNode implementation +token_staking_node_impl=$(jq -r '.tokenStakingNodeImplementation' "$DEPLOYMENT_FILE") +forge verify-contract $token_staking_node_impl TokenStakingNode \ + --etherscan-api-key $ETHERSCAN_API_KEY \ + --rpc-url $RPC_URL + +# Define delay based on chain ID +if [ "$CHAIN_ID" = "17000" ]; then + delay=$((15 * 60)) # 15 minutes in seconds +elif [ "$CHAIN_ID" = "1" ]; then + delay=$((3 * 24 * 60 * 60)) # 3 days in seconds +else + echo "Unsupported chain ID: $CHAIN_ID" + exit 1 +fi +echo "Timelock delay: $delay seconds" + + +# Load YNDev and YNSecurityCouncil addresses from deployment file +YNDev=$(jq -r '.YNDev' "$DEPLOYMENT_FILE") +YNSecurityCouncil=$(jq -r '.YnSecurityCouncil' "$DEPLOYMENT_FILE") + +# Log YNDev and YNSecurityCouncil addresses +echo "YNDev address: $YNDev" +echo "YNSecurityCouncil address: $YNSecurityCouncil" + +# Encode constructor arguments; assumes only one of each. +constructor_args=$(cast abi-encode "constructor(uint256,address[],address[],address)" $delay "[$YNDev]" "[$YNSecurityCouncil]" $YNSecurityCouncil) + +echo "Timelock constructor arguments: $constructor_args" + +# Verify TimelockController +forge verify-contract $timelock_address TimelockController \ + --constructor-args $constructor_args \ + --etherscan-api-key $ETHERSCAN_API_KEY \ + --rpc-url $RPC_URL + +echo "Verification process completed." + + diff --git a/script/ynEigen/BaseYnEigenScript.s.sol b/script/ynEigen/BaseYnEigenScript.s.sol new file mode 100644 index 000000000..639222fd7 --- /dev/null +++ b/script/ynEigen/BaseYnEigenScript.s.sol @@ -0,0 +1,160 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {stdJson} from "lib/forge-std/src/StdJson.sol"; +import {ynEigen} from "src/ynEIGEN/ynEigen.sol"; +import {AssetRegistry} from "src/ynEIGEN/AssetRegistry.sol"; +import {EigenStrategyManager} from "src/ynEIGEN/EigenStrategyManager.sol"; +import {TokenStakingNodesManager} from "src/ynEIGEN/TokenStakingNodesManager.sol"; +import {TokenStakingNode} from "src/ynEIGEN/TokenStakingNode.sol"; +import {ynEigenDepositAdapter} from "src/ynEIGEN/ynEigenDepositAdapter.sol"; +import {IRateProvider} from "src/interfaces/IRateProvider.sol"; +import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol"; + +import {ActorAddresses} from "script/Actors.sol"; +import {ContractAddresses} from "script/ContractAddresses.sol"; +import {BaseScript} from "script/BaseScript.s.sol"; +import {ynEigenViewer} from "src/ynEIGEN/ynEigenViewer.sol"; + +import {console} from "lib/forge-std/src/console.sol"; + +contract BaseYnEigenScript is BaseScript { + using stdJson for string; + + struct Deployment { + ynEigen ynEigen; + AssetRegistry assetRegistry; + EigenStrategyManager eigenStrategyManager; + TokenStakingNodesManager tokenStakingNodesManager; + TokenStakingNode tokenStakingNodeImplementation; + ynEigenDepositAdapter ynEigenDepositAdapterInstance; + IRateProvider rateProvider; + TimelockController upgradeTimelock; + ynEigenViewer viewer; + } + + struct Asset { + string name; + address strategy; + address token; + } + + struct Input { + Asset[] assets; + uint256 chainId; + string name; + string symbol; + } + + error IncorrectChainId(uint256 specifiedChainId, uint256 actualChainId); + error UnsupportedChainId(uint256 chainId); + error UnsupportedAsset(string asset, uint256 chainId); + + Input public inputs; + ActorAddresses.Actors public actors; + ContractAddresses.ChainAddresses public chainAddresses; + + address internal _deployer; + + constructor() { + actors = getActors(); + chainAddresses = getChainAddresses(); + } + + function _initDeployer() internal { + _deployer = msg.sender; // set by --sender when running the script + } + + function _loadJson(string memory _path) internal { + string memory path = string(abi.encodePacked(vm.projectRoot(), "/", _path)); + string memory json = vm.readFile(path); + bytes memory data = vm.parseJson(json); + + Input memory _inputs = abi.decode(data, (Input)); + + this.loadInputs(_inputs); + } + + /** + * @dev this function is required to load the JSON input struct into storage untill that feature is added to foundry + */ + function loadInputs(Input calldata _inputs) external { + inputs = _inputs; + } + + function _validateNetwork() internal virtual { + if (block.chainid != inputs.chainId) revert IncorrectChainId(inputs.chainId, block.chainid); + if (!isSupportedChainId(inputs.chainId)) revert UnsupportedChainId(inputs.chainId); + } + + function tokenName() internal view returns (string memory) { + return inputs.symbol; + } + + function getDeploymentFile() internal view virtual returns (string memory) { + string memory root = vm.projectRoot(); + + return string.concat(root, "/deployments/", tokenName(), "-", vm.toString(block.chainid), ".json"); + } + + function saveDeployment(Deployment memory deployment) public virtual { + string memory json = "deployment"; + + // contract addresses + serializeProxyElements(json, tokenName(), address(deployment.ynEigen)); + serializeProxyElements(json, "assetRegistry", address(deployment.assetRegistry)); + serializeProxyElements(json, "eigenStrategyManager", address(deployment.eigenStrategyManager)); + serializeProxyElements(json, "tokenStakingNodesManager", address(deployment.tokenStakingNodesManager)); + vm.serializeAddress(json, "tokenStakingNodeImplementation", address(deployment.tokenStakingNodeImplementation)); + serializeProxyElements(json, "ynEigenDepositAdapter", address(deployment.ynEigenDepositAdapterInstance)); + serializeProxyElements(json, "rateProvider", address(deployment.rateProvider)); + serializeProxyElements(json, "ynEigenViewer", address(deployment.viewer)); + vm.serializeAddress(json, "upgradeTimelock", address(deployment.upgradeTimelock)); + + // actors + vm.serializeAddress(json, "PROXY_ADMIN_OWNER", address(actors.admin.PROXY_ADMIN_OWNER)); + vm.serializeAddress(json, "ADMIN", address(actors.admin.ADMIN)); + vm.serializeAddress(json, "STAKING_ADMIN", address(actors.admin.STAKING_ADMIN)); + vm.serializeAddress(json, "STAKING_NODES_OPERATOR", address(actors.ops.STAKING_NODES_OPERATOR)); + vm.serializeAddress(json, "PAUSE_ADMIN", address(actors.ops.PAUSE_ADMIN)); + vm.serializeAddress(json, "UNPAUSE_ADMIN", address(actors.admin.UNPAUSE_ADMIN)); + vm.serializeAddress(json, "TOKEN_STAKING_NODE_CREATOR", address(actors.ops.STAKING_NODE_CREATOR)); + vm.serializeAddress(json, "STRATEGY_CONTROLLER", address(actors.ops.STRATEGY_CONTROLLER)); + vm.serializeAddress(json, "EIGEN_STRATEGY_ADMIN", address(actors.admin.EIGEN_STRATEGY_ADMIN)); + vm.serializeAddress(json, "YnSecurityCouncil", address(actors.wallets.YNSecurityCouncil)); + vm.serializeAddress(json, "YNDev", address(actors.wallets.YNDev)); + string memory finalJson = vm.serializeAddress(json, "DEFAULT_SIGNER", address((actors.eoa.DEFAULT_SIGNER))); + + vm.writeJson(finalJson, getDeploymentFile()); + + console.log("Deployment JSON file written successfully:", getDeploymentFile()); + } + + function loadDeployment() public view returns (Deployment memory) { + string memory deploymentFile = getDeploymentFile(); + string memory jsonContent = vm.readFile(deploymentFile); + Deployment memory deployment; + deployment.ynEigen = ynEigen(payable(jsonContent.readAddress(string.concat(".proxy-", tokenName())))); + deployment.tokenStakingNodesManager = + TokenStakingNodesManager(payable(jsonContent.readAddress(".proxy-tokenStakingNodesManager"))); + deployment.assetRegistry = AssetRegistry(payable(jsonContent.readAddress(".proxy-assetRegistry"))); + deployment.eigenStrategyManager = + EigenStrategyManager(payable(jsonContent.readAddress(".proxy-eigenStrategyManager"))); + deployment.tokenStakingNodeImplementation = + TokenStakingNode(payable(jsonContent.readAddress(".tokenStakingNodeImplementation"))); + deployment.ynEigenDepositAdapterInstance = + ynEigenDepositAdapter(payable(jsonContent.readAddress(".proxy-ynEigenDepositAdapter"))); + deployment.rateProvider = IRateProvider(payable(jsonContent.readAddress(".proxy-rateProvider"))); + deployment.viewer = ynEigenViewer(payable(jsonContent.readAddress(".proxy-ynEigenViewer"))); + deployment.upgradeTimelock = TimelockController(payable(jsonContent.readAddress(".upgradeTimelock"))); + + return deployment; + } + + function getProxyAddress(string memory contractName) public view returns (address) { + string memory deploymentFile = getDeploymentFile(); + string memory jsonContent = vm.readFile(deploymentFile); + string memory proxyKey = string.concat(".proxy-", contractName); + return jsonContent.readAddress(proxyKey); + } +} diff --git a/script/ynEigen/YnEigenDeployer.s.sol b/script/ynEigen/YnEigenDeployer.s.sol new file mode 100644 index 000000000..042657d6c --- /dev/null +++ b/script/ynEigen/YnEigenDeployer.s.sol @@ -0,0 +1,184 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol"; +import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; +import {IStrategy} from "lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; + +import {IRateProvider} from "src/interfaces/IRateProvider.sol"; +import {ynEigen} from "src/ynEIGEN/ynEigen.sol"; +import {TokenStakingNode} from "src/ynEIGEN/TokenStakingNode.sol"; +import {LSDRateProvider} from "src/ynEIGEN/LSDRateProvider.sol"; +import {HoleskyLSDRateProvider} from "src/testnet/HoleksyLSDRateProvider.sol"; +import {EigenStrategyManager} from "src/ynEIGEN/EigenStrategyManager.sol"; +import {AssetRegistry} from "src/ynEIGEN/AssetRegistry.sol"; +import {TokenStakingNodesManager} from "src/ynEIGEN/TokenStakingNodesManager.sol"; +import {ynEigenDepositAdapter} from "src/ynEIGEN/ynEigenDepositAdapter.sol"; +import {ynEigenViewer} from "src/ynEIGEN/ynEigenViewer.sol"; + +import {BaseYnEigenScript} from "script/ynEigen/BaseYnEigenScript.s.sol"; + +import {YnEigenFactory} from "./YnEigenFactory.sol"; +import {YnEigenInit, YnEigenActors, YnEigenChainAddresses, YnEigenImplementations} from "./YnEigenStructs.sol"; + +import {ynEigen} from "src/ynEIGEN/ynEigen.sol"; +import {EigenStrategyManager} from "src/ynEIGEN/EigenStrategyManager.sol"; +import {TokenStakingNodesManager} from "src/ynEIGEN/TokenStakingNodesManager.sol"; +import {AssetRegistry} from "src/ynEIGEN/AssetRegistry.sol"; +import {ynEigenDepositAdapter} from "src/ynEIGEN/ynEigenDepositAdapter.sol"; +import {ynEigenViewer} from "src/ynEIGEN/ynEigenViewer.sol"; +import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol"; +import {IRateProvider} from "src/interfaces/IRateProvider.sol"; + +contract YnEigenDeployer is BaseYnEigenScript { + // TODO: update this for new chains + function _getTimelockDelay() internal view returns (uint256) { + if (block.chainid == 17000) { + // Holesky + return 15 minutes; + } else if (block.chainid == 1) { + // Mainnet + return 3 days; + } else { + revert UnsupportedChainId(block.chainid); + } + } + + // TODO: update this for new chains and assets + function _getRateProviderImplementation() internal returns (address rateProviderImplementation) { + bytes32 hashedSymbol = keccak256(abi.encodePacked(inputs.symbol)); + if (block.chainid == 17000) { + // Holesky + if (hashedSymbol == keccak256(abi.encodePacked("ynLSDe"))) { + rateProviderImplementation = address(new HoleskyLSDRateProvider()); + } else { + revert UnsupportedAsset(inputs.symbol, block.chainid); + } + } else if (block.chainid == 1) { + // Mainnet + if (hashedSymbol == keccak256(abi.encodePacked("ynLSDe"))) { + rateProviderImplementation = address(new LSDRateProvider()); + } else { + revert UnsupportedAsset(inputs.symbol, block.chainid); + } + } else { + revert UnsupportedChainId(block.chainid); + } + } + + function _deploy() internal { + YnEigenInit memory init; + + { + IERC20[] memory assets = new IERC20[](inputs.assets.length); + IStrategy[] memory strategies = new IStrategy[](inputs.assets.length); + + for (uint256 i = 0; i < inputs.assets.length; i++) { + Asset memory asset = inputs.assets[i]; + IERC20 token = IERC20(asset.token); + IStrategy strategy = IStrategy(asset.strategy); + + assets[i] = token; + strategies[i] = strategy; + } + + YnEigenActors memory ynEigenActors; + + { + ynEigenActors = YnEigenActors({ + ADMIN: actors.admin.ADMIN, + PAUSE_ADMIN: actors.ops.PAUSE_ADMIN, + UNPAUSE_ADMIN: actors.admin.UNPAUSE_ADMIN, + STAKING_NODES_DELEGATOR_ADMIN: actors.admin.STAKING_NODES_DELEGATOR, + ASSET_MANAGER_ADMIN: actors.admin.ASSET_MANAGER, + EIGEN_STRATEGY_ADMIN: actors.admin.EIGEN_STRATEGY_ADMIN, + STAKING_NODE_CREATOR: actors.ops.STAKING_NODE_CREATOR, + STRATEGY_CONTROLLER: actors.ops.STRATEGY_CONTROLLER, + TOKEN_STAKING_NODE_OPERATOR: actors.ops.TOKEN_STAKING_NODE_OPERATOR, + YN_SECURITY_COUNCIL: actors.wallets.YNSecurityCouncil + }); + } + + YnEigenChainAddresses memory ynEigenChainAddresses; + + { + ynEigenChainAddresses = YnEigenChainAddresses({ + WSTETH_ADDRESS: chainAddresses.lsd.WSTETH_ADDRESS, + WOETH_ADDRESS: chainAddresses.lsd.WOETH_ADDRESS, + STRATEGY_MANAGER: chainAddresses.eigenlayer.STRATEGY_MANAGER_ADDRESS, + DELEGATION_MANAGER: chainAddresses.eigenlayer.DELEGATION_MANAGER_ADDRESS + }); + } + + vm.startBroadcast(); + YnEigenImplementations memory implementations; + { + implementations = YnEigenImplementations({ + ynEigen: address(new ynEigen()), + rateProvider: _getRateProviderImplementation(), + eigenStrategyManager: address(new EigenStrategyManager()), + tokenStakingNodesManager: address(new TokenStakingNodesManager()), + tokenStakingNode: address(new TokenStakingNode()), + assetRegistry: address(new AssetRegistry()), + depositAdapter: address(new ynEigenDepositAdapter()) + }); + } + + TimelockController timelock; + // Deploy timelock + { + address[] memory _proposers = new address[](1); + _proposers[0] = actors.wallets.YNSecurityCouncil; + address[] memory _executors = new address[](1); + _executors[0] = actors.wallets.YNSecurityCouncil; + timelock = new TimelockController( + _getTimelockDelay(), _proposers, _executors, actors.wallets.YNSecurityCouncil + ); + } + + init = YnEigenInit({ + name: inputs.name, + symbol: inputs.symbol, + maxNodeCount: 10, + timelock: address(timelock), + assets: assets, + strategies: strategies, + actors: ynEigenActors, + chainAddresses: ynEigenChainAddresses, + implementations: implementations + }); + } + + { + YnEigenFactory factory = new YnEigenFactory(); + + ( + ynEigen ynToken, + EigenStrategyManager eigenStrategyManager, + TokenStakingNodesManager tokenStakingNodesManager, + TokenStakingNode tokenStakingNode, + AssetRegistry assetRegistry, + ynEigenDepositAdapter ynEigenDepositAdapterInstance, + IRateProvider rateProvider, + TimelockController timelock, + ynEigenViewer viewer + ) = factory.deploy(init); + + vm.stopBroadcast(); + + Deployment memory deployment = Deployment({ + ynEigen: ynToken, + assetRegistry: assetRegistry, + eigenStrategyManager: eigenStrategyManager, + tokenStakingNodesManager: tokenStakingNodesManager, + tokenStakingNodeImplementation: tokenStakingNode, + ynEigenDepositAdapterInstance: ynEigenDepositAdapterInstance, + rateProvider: rateProvider, + upgradeTimelock: timelock, + viewer: viewer + }); + + saveDeployment(deployment); + } + } +} diff --git a/script/ynEigen/YnEigenFactory.sol b/script/ynEigen/YnEigenFactory.sol new file mode 100644 index 000000000..e8c759826 --- /dev/null +++ b/script/ynEigen/YnEigenFactory.sol @@ -0,0 +1,180 @@ +// SPDX-License-Identifier: BSD-3-Clause License +pragma solidity ^0.8.24; + +import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol"; + +import {IDelegationManager} from "lib/eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol"; +import {IStrategyManager} from "lib/eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol"; + +import {ITokenStakingNodesManager} from "src/interfaces/ITokenStakingNodesManager.sol"; + +import {IynEigen} from "src/interfaces/IynEigen.sol"; +import {IRateProvider} from "src/interfaces/IRateProvider.sol"; +import {IAssetRegistry} from "src/interfaces/IAssetRegistry.sol"; +import {IYieldNestStrategyManager} from "src/interfaces/IYieldNestStrategyManager.sol"; +import {ynEigen} from "src/ynEIGEN/ynEigen.sol"; +import {TokenStakingNode} from "src/ynEIGEN/TokenStakingNode.sol"; +import {EigenStrategyManager} from "src/ynEIGEN/EigenStrategyManager.sol"; +import {AssetRegistry} from "src/ynEIGEN/AssetRegistry.sol"; +import {TokenStakingNodesManager} from "src/ynEIGEN/TokenStakingNodesManager.sol"; +import {TokenStakingNode} from "src/ynEIGEN/TokenStakingNode.sol"; +import {AssetRegistry} from "src/ynEIGEN/AssetRegistry.sol"; +import {ynEigenDepositAdapter} from "src/ynEIGEN/ynEigenDepositAdapter.sol"; +import {ynEigenViewer} from "src/ynEIGEN/ynEigenViewer.sol"; +import {YnEigenInit} from "./YnEigenStructs.sol"; + +import {IwstETH} from "src/external/lido/IwstETH.sol"; +import {IERC4626} from "lib/openzeppelin-contracts/contracts/interfaces/IERC4626.sol"; +import {TransparentUpgradeableProxy} from + "lib/openzeppelin-contracts/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; + +interface IYnEigenFactory { + event YnEigenDeployed( + ynEigen ynEigen, + EigenStrategyManager eigenStrategyManager, + TokenStakingNodesManager tokenStakingNodesManager, + TokenStakingNode tokenStakingNode, + AssetRegistry assetRegistry, + ynEigenDepositAdapter ynEigenDepositAdapter, + IRateProvider rateProvider, + TimelockController timelock, + ynEigenViewer viewer + ); +} + +contract YnEigenFactory is IYnEigenFactory { + function _deployProxy(address implementation, address controller) internal returns (address proxy) { + proxy = address(new TransparentUpgradeableProxy(implementation, controller, "")); + } + + function deploy(YnEigenInit calldata init) + external + returns ( + ynEigen ynToken, + EigenStrategyManager eigenStrategyManager, + TokenStakingNodesManager tokenStakingNodesManager, + TokenStakingNode tokenStakingNode, + AssetRegistry assetRegistry, + ynEigenDepositAdapter ynEigenDepositAdapterInstance, + IRateProvider rateProvider, + TimelockController timelock, + ynEigenViewer viewer + ) + { + // Deploy proxies + ynToken = ynEigen(_deployProxy(init.implementations.ynEigen, init.timelock)); + eigenStrategyManager = + EigenStrategyManager(_deployProxy(init.implementations.eigenStrategyManager, init.timelock)); + tokenStakingNodesManager = + TokenStakingNodesManager(_deployProxy(init.implementations.tokenStakingNodesManager, init.timelock)); + tokenStakingNode = TokenStakingNode(init.implementations.tokenStakingNode); + assetRegistry = AssetRegistry(_deployProxy(init.implementations.assetRegistry, init.timelock)); + ynEigenDepositAdapterInstance = + ynEigenDepositAdapter(_deployProxy(init.implementations.depositAdapter, init.timelock)); + rateProvider = IRateProvider(_deployProxy(init.implementations.rateProvider, init.timelock)); + timelock = TimelockController(payable(init.timelock)); + + // Initialize ynToken + ynToken.initialize( + ynEigen.Init({ + name: init.name, + symbol: init.symbol, + admin: init.actors.ADMIN, + pauser: init.actors.PAUSE_ADMIN, + unpauser: init.actors.UNPAUSE_ADMIN, + yieldNestStrategyManager: address(eigenStrategyManager), + assetRegistry: IAssetRegistry(address(assetRegistry)), + pauseWhitelist: new address[](0) + }) + ); + + // Initialize eigenStrategyManager + eigenStrategyManager.initialize( + EigenStrategyManager.Init({ + assets: init.assets, + strategies: init.strategies, + ynEigen: IynEigen(address(ynToken)), + strategyManager: IStrategyManager(init.chainAddresses.STRATEGY_MANAGER), + delegationManager: IDelegationManager(init.chainAddresses.DELEGATION_MANAGER), + tokenStakingNodesManager: ITokenStakingNodesManager(address(tokenStakingNodesManager)), + admin: init.actors.ADMIN, + pauser: init.actors.PAUSE_ADMIN, + unpauser: init.actors.UNPAUSE_ADMIN, + strategyController: init.actors.STRATEGY_CONTROLLER, + strategyAdmin: init.actors.EIGEN_STRATEGY_ADMIN, + wstETH: IwstETH(init.chainAddresses.WSTETH_ADDRESS), + woETH: IERC4626(init.chainAddresses.WOETH_ADDRESS) + }) + ); + + // Initialize assetRegistry + assetRegistry.initialize( + AssetRegistry.Init({ + assets: init.assets, + rateProvider: IRateProvider(address(rateProvider)), + yieldNestStrategyManager: IYieldNestStrategyManager(address(eigenStrategyManager)), + ynEigen: IynEigen(address(ynToken)), + admin: init.actors.ADMIN, + pauser: init.actors.PAUSE_ADMIN, + unpauser: init.actors.UNPAUSE_ADMIN, + assetManagerRole: init.actors.ASSET_MANAGER_ADMIN + }) + ); + + // Initialize tokenStakingNodesManager + tokenStakingNodesManager.initialize( + TokenStakingNodesManager.Init({ + admin: address(this), // Placeholder; changed post tokenStakingNode registration + stakingAdmin: address(this), // Placeholder; changed post tokenStakingNode registration + strategyManager: IStrategyManager(init.chainAddresses.STRATEGY_MANAGER), + delegationManager: IDelegationManager(init.chainAddresses.DELEGATION_MANAGER), + yieldNestStrategyManager: address(eigenStrategyManager), + maxNodeCount: init.maxNodeCount, + pauser: init.actors.PAUSE_ADMIN, + unpauser: init.actors.UNPAUSE_ADMIN, + tokenStakingNodeOperator: init.actors.TOKEN_STAKING_NODE_OPERATOR, + tokenStakingNodeCreatorRole: init.actors.STAKING_NODE_CREATOR, + tokenStakingNodesDelegator: init.actors.STAKING_NODES_DELEGATOR_ADMIN + }) + ); + + // Register tokenStakingNode + tokenStakingNodesManager.registerTokenStakingNode(address(tokenStakingNode)); + + // Set roles post tokenStakingNode registration + tokenStakingNodesManager.grantRole(tokenStakingNodesManager.DEFAULT_ADMIN_ROLE(), init.actors.ADMIN); + tokenStakingNodesManager.grantRole(tokenStakingNodesManager.STAKING_ADMIN_ROLE(), init.timelock); + tokenStakingNodesManager.revokeRole(tokenStakingNodesManager.STAKING_ADMIN_ROLE(), address(this)); + tokenStakingNodesManager.revokeRole(tokenStakingNodesManager.DEFAULT_ADMIN_ROLE(), address(this)); + + // ynEigenDepositAdapter + ynEigenDepositAdapterInstance.initialize( + ynEigenDepositAdapter.Init({ + ynEigen: address(ynToken), + wstETH: init.chainAddresses.WSTETH_ADDRESS, + woETH: init.chainAddresses.WOETH_ADDRESS, + admin: init.actors.ADMIN + }) + ); + + // ynEigenViewer + { + ynEigenViewer viewerImplementation = new ynEigenViewer( + address(assetRegistry), address(ynToken), address(tokenStakingNodesManager), address(rateProvider) + ); + viewer = ynEigenViewer(_deployProxy(address(viewerImplementation), init.actors.YN_SECURITY_COUNCIL)); + } + + emit YnEigenDeployed( + ynToken, + eigenStrategyManager, + tokenStakingNodesManager, + tokenStakingNode, + assetRegistry, + ynEigenDepositAdapterInstance, + rateProvider, + timelock, + viewer + ); + } +} diff --git a/script/ynEigen/YnEigenScript.s.sol b/script/ynEigen/YnEigenScript.s.sol new file mode 100644 index 000000000..f8ee44338 --- /dev/null +++ b/script/ynEigen/YnEigenScript.s.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {YnEigenDeployer} from "./YnEigenDeployer.s.sol"; +import {YnEigenVerifier} from "./YnEigenVerifier.s.sol"; +import {console} from "lib/forge-std/src/console.sol"; + +contract YnEigenScript is YnEigenDeployer, YnEigenVerifier { + function run(string memory _filePath) public { + _initDeployer(); + _loadJson(_filePath); + _validateNetwork(); + + console.log("\n"); + console.log("Deployer Address:", _deployer); + console.log("Deployer Balance:", _deployer.balance); + console.log("Block Number:", block.number); + console.log("ChainId:", inputs.chainId); + console.log("Name:", inputs.name); + console.log("Symbol:", inputs.symbol); + + console.log("Assets:"); + for (uint256 i = 0; i < inputs.assets.length; i++) { + Asset memory asset = inputs.assets[i]; + console.log(asset.name); + console.log(asset.token); + console.log(asset.strategy); + } + console.log("\n"); + + _deploy(); + _verify(); + } + + function verify(string memory _filePath) public { + console.log("Verifying deployment in ", _filePath); + _initDeployer(); + _loadJson(_filePath); + _validateNetwork(); + console.log("Block Number:", block.number); + console.log("ChainId:", inputs.chainId); + console.log("Name:", inputs.name); + console.log("Symbol:", inputs.symbol); + _verify(); + } +} diff --git a/script/ynEigen/YnEigenStructs.sol b/script/ynEigen/YnEigenStructs.sol new file mode 100644 index 000000000..b6924338f --- /dev/null +++ b/script/ynEigen/YnEigenStructs.sol @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: BSD-3-Clause License +pragma solidity ^0.8.24; + +import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; +import {IStrategy} from "lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; + +struct YnEigenActors { + address ADMIN; + address PAUSE_ADMIN; + address UNPAUSE_ADMIN; + address STAKING_NODES_DELEGATOR_ADMIN; + address ASSET_MANAGER_ADMIN; + address EIGEN_STRATEGY_ADMIN; + address STAKING_NODE_CREATOR; + address STRATEGY_CONTROLLER; + address TOKEN_STAKING_NODE_OPERATOR; + address YN_SECURITY_COUNCIL; +} + +struct YnEigenChainAddresses { + address WSTETH_ADDRESS; + address WOETH_ADDRESS; + address STRATEGY_MANAGER; + address DELEGATION_MANAGER; +} + +struct YnEigenImplementations { + address ynEigen; + address rateProvider; + address eigenStrategyManager; + address tokenStakingNodesManager; + address tokenStakingNode; + address assetRegistry; + address depositAdapter; +} + +struct YnEigenInit { + string name; + string symbol; + uint256 maxNodeCount; + address timelock; + IERC20[] assets; + IStrategy[] strategies; + YnEigenActors actors; + YnEigenChainAddresses chainAddresses; + YnEigenImplementations implementations; +} diff --git a/script/ynEigen/YnEigenVerifier.s.sol b/script/ynEigen/YnEigenVerifier.s.sol new file mode 100644 index 000000000..44bb5eca2 --- /dev/null +++ b/script/ynEigen/YnEigenVerifier.s.sol @@ -0,0 +1,582 @@ +/// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; +import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; + +import {IStrategy} from "lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; + +import {BaseYnEigenScript} from "script/ynEigen/BaseYnEigenScript.s.sol"; +import {Utils} from "script/Utils.sol"; + +import {console} from "lib/forge-std/src/console.sol"; + +interface IynEigen { + function assetRegistry() external view returns (address); + function yieldNestStrategyManager() external view returns (address); +} + +contract YnEigenVerifier is BaseYnEigenScript { + Deployment private deployment; + + using Strings for uint256; + + function _verify() internal { + deployment = loadDeployment(); + + verifyUpgradeTimelockRoles(); + verifyProxyAdminOwners(); + verifyRoles(); + verifySystemParameters(); + verifyContractDependencies(); + ynEigenSanityCheck(); + } + + function verifyUpgradeTimelockRoles() internal view { + // Verify PROPOSER_ROLE + require( + deployment.upgradeTimelock.hasRole( + deployment.upgradeTimelock.PROPOSER_ROLE(), address(actors.wallets.YNSecurityCouncil) + ), + "upgradeTimelock: PROPOSER_ROLE INVALID" + ); + console.log("\u2705 upgradeTimelock: PROPOSER_ROLE - ", vm.toString(address(actors.wallets.YNSecurityCouncil))); + + // Verify EXECUTOR_ROLE + require( + deployment.upgradeTimelock.hasRole( + deployment.upgradeTimelock.EXECUTOR_ROLE(), address(actors.wallets.YNSecurityCouncil) + ), + "upgradeTimelock: EXECUTOR_ROLE INVALID" + ); + console.log("\u2705 upgradeTimelock: EXECUTOR_ROLE - ", vm.toString(address(actors.wallets.YNSecurityCouncil))); + + // Verify CANCELLER_ROLE + require( + deployment.upgradeTimelock.hasRole( + deployment.upgradeTimelock.CANCELLER_ROLE(), address(actors.wallets.YNSecurityCouncil) + ), + "upgradeTimelock: CANCELLER_ROLE INVALID" + ); + console.log("\u2705 upgradeTimelock: CANCELLER_ROLE - ", vm.toString(address(actors.wallets.YNSecurityCouncil))); + + // Verify DEFAULT_ADMIN_ROLE + require( + deployment.upgradeTimelock.hasRole( + deployment.upgradeTimelock.DEFAULT_ADMIN_ROLE(), address(actors.wallets.YNSecurityCouncil) + ), + "upgradeTimelock: DEFAULT_ADMIN_ROLE INVALID" + ); + console.log( + "\u2705 upgradeTimelock: DEFAULT_ADMIN_ROLE - ", vm.toString(address(actors.wallets.YNSecurityCouncil)) + ); + + // Verify delay + uint256 expectedDelay = block.chainid == 17000 ? 15 minutes : 3 days; + require(deployment.upgradeTimelock.getMinDelay() == expectedDelay, "upgradeTimelock: DELAY INVALID"); + console.log("\u2705 upgradeTimelock: DELAY - ", deployment.upgradeTimelock.getMinDelay()); + } + + function verifyProxyAdminOwners() internal view { + address proxyAdminOwner = address(deployment.upgradeTimelock); + + address ynEigenAdmin = + ProxyAdmin(Utils.getTransparentUpgradeableProxyAdminAddress(address(deployment.ynEigen))).owner(); + require( + ynEigenAdmin == proxyAdminOwner, + string.concat( + "ynEigen: PROXY_ADMIN_OWNER INVALID, expected: ", + vm.toString(proxyAdminOwner), + ", got: ", + vm.toString(ynEigenAdmin) + ) + ); + console.log("\u2705 ynEigen: PROXY_ADMIN_OWNER - ", vm.toString(ynEigenAdmin)); + + address stakingNodesManagerAdmin = ProxyAdmin( + Utils.getTransparentUpgradeableProxyAdminAddress(address(deployment.tokenStakingNodesManager)) + ).owner(); + require( + stakingNodesManagerAdmin == proxyAdminOwner, + string.concat( + "stakingNodesManager: PROXY_ADMIN_OWNER INVALID, expected: ", + vm.toString(proxyAdminOwner), + ", got: ", + vm.toString(stakingNodesManagerAdmin) + ) + ); + console.log("\u2705 stakingNodesManager: PROXY_ADMIN_OWNER - ", vm.toString(stakingNodesManagerAdmin)); + + address assetRegistryAdmin = + ProxyAdmin(Utils.getTransparentUpgradeableProxyAdminAddress(address(deployment.assetRegistry))).owner(); + require( + assetRegistryAdmin == proxyAdminOwner, + string.concat( + "assetRegistry: PROXY_ADMIN_OWNER INVALID, expected: ", + vm.toString(proxyAdminOwner), + ", got: ", + vm.toString(assetRegistryAdmin) + ) + ); + console.log("\u2705 assetRegistry: PROXY_ADMIN_OWNER - ", vm.toString(assetRegistryAdmin)); + + address eigenStrategyManagerAdmin = ProxyAdmin( + Utils.getTransparentUpgradeableProxyAdminAddress(address(deployment.eigenStrategyManager)) + ).owner(); + require( + eigenStrategyManagerAdmin == proxyAdminOwner, + string.concat( + "eigenStrategyManager: PROXY_ADMIN_OWNER INVALID, expected: ", + vm.toString(proxyAdminOwner), + ", got: ", + vm.toString(eigenStrategyManagerAdmin) + ) + ); + console.log("\u2705 eigenStrategyManager: PROXY_ADMIN_OWNER - ", vm.toString(eigenStrategyManagerAdmin)); + + address ynEigenDepositAdapterAdmin = ProxyAdmin( + Utils.getTransparentUpgradeableProxyAdminAddress(address(deployment.ynEigenDepositAdapterInstance)) + ).owner(); + require( + ynEigenDepositAdapterAdmin == proxyAdminOwner, + string.concat( + "ynEigenDepositAdapter: PROXY_ADMIN_OWNER INVALID, expected: ", + vm.toString(proxyAdminOwner), + ", got: ", + vm.toString(ynEigenDepositAdapterAdmin) + ) + ); + console.log("\u2705 ynEigenDepositAdapter: PROXY_ADMIN_OWNER - ", vm.toString(ynEigenDepositAdapterAdmin)); + + address ynEigenDepositAdapterInstanceAdmin = ProxyAdmin( + Utils.getTransparentUpgradeableProxyAdminAddress(address(deployment.ynEigenDepositAdapterInstance)) + ).owner(); + require( + ynEigenDepositAdapterInstanceAdmin == proxyAdminOwner, + string.concat( + "ynEigenDepositAdapterInstance: PROXY_ADMIN_OWNER INVALID, expected: ", + vm.toString(proxyAdminOwner), + ", got: ", + vm.toString(ynEigenDepositAdapterInstanceAdmin) + ) + ); + console.log( + "\u2705 ynEigenDepositAdapterInstance: PROXY_ADMIN_OWNER - ", + vm.toString(ynEigenDepositAdapterInstanceAdmin) + ); + } + + function verifyRoles() internal view { + //-------------------------------------------------------------------------------------- + // YnEigene roles + //-------------------------------------------------------------------------------------- + + // DEFAULT_ADMIN_ROLE + require( + deployment.ynEigen.hasRole(deployment.ynEigen.DEFAULT_ADMIN_ROLE(), address(actors.admin.ADMIN)), + "ynEigen: DEFAULT_ADMIN_ROLE INVALID" + ); + console.log("\u2705 ynEigen: DEFAULT_ADMIN_ROLE - ", vm.toString(address(actors.admin.ADMIN))); + + // PAUSER_ROLE + require( + deployment.ynEigen.hasRole(deployment.ynEigen.PAUSER_ROLE(), address(actors.ops.PAUSE_ADMIN)), + "ynEigen: PAUSER_ROLE INVALID" + ); + console.log("\u2705 ynEigen: PAUSER_ROLE - ", vm.toString(address(actors.ops.PAUSE_ADMIN))); + + // UNPAUSER_ROLE + require( + deployment.ynEigen.hasRole(deployment.ynEigen.UNPAUSER_ROLE(), address(actors.admin.UNPAUSE_ADMIN)), + "ynEigen: UNPAUSER_ROLE INVALID" + ); + console.log("\u2705 ynEigen: UNPAUSER_ROLE - ", vm.toString(address(actors.admin.UNPAUSE_ADMIN))); + + //-------------------------------------------------------------------------------------- + // assetRegistry roles + //-------------------------------------------------------------------------------------- + + // DEFAULT_ADMIN_ROLE + require( + deployment.assetRegistry.hasRole(deployment.assetRegistry.DEFAULT_ADMIN_ROLE(), address(actors.admin.ADMIN)), + "assetRegistry: DEFAULT_ADMIN_ROLE INVALID" + ); + console.log("\u2705 assetRegistry: DEFAULT_ADMIN_ROLE - ", vm.toString(address(actors.admin.ADMIN))); + + // PAUSER_ROLE + require( + deployment.assetRegistry.hasRole(deployment.assetRegistry.PAUSER_ROLE(), address(actors.ops.PAUSE_ADMIN)), + "assetRegistry: PAUSER_ROLE INVALID" + ); + console.log("\u2705 assetRegistry: PAUSER_ROLE - ", vm.toString(address(actors.ops.PAUSE_ADMIN))); + + // UNPAUSER_ROLE + require( + deployment.assetRegistry.hasRole( + deployment.assetRegistry.UNPAUSER_ROLE(), address(actors.admin.UNPAUSE_ADMIN) + ), + "assetRegistry: UNPAUSER_ROLE INVALID" + ); + console.log("\u2705 assetRegistry: UNPAUSER_ROLE - ", vm.toString(address(actors.admin.UNPAUSE_ADMIN))); + + // ASSET_MANAGER_ROLE + require( + deployment.assetRegistry.hasRole( + deployment.assetRegistry.ASSET_MANAGER_ROLE(), address(actors.admin.ASSET_MANAGER) + ), + "assetRegistry: ASSET_MANAGER_ROLE INVALID" + ); + console.log("\u2705 assetRegistry: ASSET_MANAGER_ROLE - ", vm.toString(address(actors.admin.ASSET_MANAGER))); + + //-------------------------------------------------------------------------------------- + // eigenStrategyManager roles + //-------------------------------------------------------------------------------------- + + // DEFAULT_ADMIN_ROLE + require( + deployment.eigenStrategyManager.hasRole( + deployment.eigenStrategyManager.DEFAULT_ADMIN_ROLE(), address(actors.admin.EIGEN_STRATEGY_ADMIN) + ), + "eigenStrategyManager: DEFAULT_ADMIN_ROLE INVALID" + ); + console.log( + "\u2705 eigenStrategyManager: DEFAULT_ADMIN_ROLE - ", + vm.toString(address(actors.admin.EIGEN_STRATEGY_ADMIN)) + ); + + // PAUSER_ROLE + require( + deployment.eigenStrategyManager.hasRole( + deployment.eigenStrategyManager.PAUSER_ROLE(), address(actors.ops.PAUSE_ADMIN) + ), + "eigenStrategyManager: PAUSER_ROLE INVALID" + ); + console.log("\u2705 eigenStrategyManager: PAUSER_ROLE - ", vm.toString(address(actors.ops.PAUSE_ADMIN))); + + // UNPAUSER_ROLE + require( + deployment.eigenStrategyManager.hasRole( + deployment.eigenStrategyManager.UNPAUSER_ROLE(), address(actors.admin.UNPAUSE_ADMIN) + ), + "eigenStrategyManager: UNPAUSER_ROLE INVALID" + ); + console.log("\u2705 eigenStrategyManager: UNPAUSER_ROLE - ", vm.toString(address(actors.admin.UNPAUSE_ADMIN))); + + // STRATEGY_CONTROLLER_ROLE + require( + deployment.eigenStrategyManager.hasRole( + deployment.eigenStrategyManager.STRATEGY_CONTROLLER_ROLE(), address(actors.ops.STRATEGY_CONTROLLER) + ), + "eigenStrategyManager: STRATEGY_CONTROLLER_ROLE INVALID" + ); + console.log( + "\u2705 eigenStrategyManager: STRATEGY_CONTROLLER_ROLE - ", + vm.toString(address(actors.ops.STRATEGY_CONTROLLER)) + ); + + // STRATEGY_ADMIN_ROLE + require( + deployment.eigenStrategyManager.hasRole( + deployment.eigenStrategyManager.STRATEGY_ADMIN_ROLE(), address(actors.admin.EIGEN_STRATEGY_ADMIN) + ), + "eigenStrategyManager: STRATEGY_ADMIN_ROLE INVALID" + ); + console.log( + "\u2705 eigenStrategyManager: STRATEGY_ADMIN_ROLE - ", + vm.toString(address(actors.admin.EIGEN_STRATEGY_ADMIN)) + ); + + //-------------------------------------------------------------------------------------- + // tokenStakingNodesManager roles + //-------------------------------------------------------------------------------------- + + // DEFAULT_ADMIN_ROLE + require( + deployment.tokenStakingNodesManager.hasRole( + deployment.tokenStakingNodesManager.DEFAULT_ADMIN_ROLE(), address(actors.admin.ADMIN) + ), + "tokenStakingNodesManager: DEFAULT_ADMIN_ROLE INVALID" + ); + console.log("\u2705 tokenStakingNodesManager: DEFAULT_ADMIN_ROLE - ", vm.toString(address(actors.admin.ADMIN))); + + address proxyAdminOwner = address(deployment.upgradeTimelock); + // STAKING_ADMIN_ROLE + require( + deployment.tokenStakingNodesManager.hasRole( + deployment.tokenStakingNodesManager.STAKING_ADMIN_ROLE(), proxyAdminOwner + ), + "tokenStakingNodesManager: STAKING_ADMIN_ROLE INVALID" + ); + console.log("\u2705 tokenStakingNodesManager: STAKING_ADMIN_ROLE - ", vm.toString(address(proxyAdminOwner))); + + // TOKEN_STAKING_NODE_OPERATOR_ROLE + require( + deployment.tokenStakingNodesManager.hasRole( + deployment.tokenStakingNodesManager.TOKEN_STAKING_NODE_OPERATOR_ROLE(), + address(actors.ops.TOKEN_STAKING_NODE_OPERATOR) + ), + "tokenStakingNodesManager: TOKEN_STAKING_NODE_OPERATOR_ROLE INVALID" + ); + console.log( + "\u2705 tokenStakingNodesManager: TOKEN_STAKING_NODE_OPERATOR_ROLE - ", + vm.toString(address(actors.ops.TOKEN_STAKING_NODE_OPERATOR)) + ); + + // TOKEN_STAKING_NODE_CREATOR_ROLE + require( + deployment.tokenStakingNodesManager.hasRole( + deployment.tokenStakingNodesManager.TOKEN_STAKING_NODE_CREATOR_ROLE(), + address(actors.ops.STAKING_NODE_CREATOR) + ), + "tokenStakingNodesManager: TOKEN_STAKING_NODE_CREATOR_ROLE INVALID" + ); + console.log( + "\u2705 tokenStakingNodesManager: TOKEN_STAKING_NODE_CREATOR_ROLE - ", + vm.toString(address(actors.ops.STAKING_NODE_CREATOR)) + ); + + // PAUSER_ROLE + require( + deployment.tokenStakingNodesManager.hasRole( + deployment.tokenStakingNodesManager.PAUSER_ROLE(), address(actors.ops.PAUSE_ADMIN) + ), + "tokenStakingNodesManager: PAUSER_ROLE INVALID" + ); + console.log("\u2705 tokenStakingNodesManager: PAUSER_ROLE - ", vm.toString(address(actors.ops.PAUSE_ADMIN))); + + // UNPAUSER_ROLE + require( + deployment.tokenStakingNodesManager.hasRole( + deployment.tokenStakingNodesManager.UNPAUSER_ROLE(), address(actors.admin.UNPAUSE_ADMIN) + ), + "tokenStakingNodesManager: UNPAUSER_ROLE INVALID" + ); + console.log( + "\u2705 tokenStakingNodesManager: UNPAUSER_ROLE - ", vm.toString(address(actors.admin.UNPAUSE_ADMIN)) + ); + + //-------------------------------------------------------------------------------------- + // ynEigenDepositAdapter roles + //-------------------------------------------------------------------------------------- + + // DEFAULT_ADMIN_ROLE + require( + deployment.ynEigenDepositAdapterInstance.hasRole( + deployment.ynEigenDepositAdapterInstance.DEFAULT_ADMIN_ROLE(), address(actors.admin.ADMIN) + ), + "ynEigenDepositAdapter: DEFAULT_ADMIN_ROLE INVALID" + ); + console.log("\u2705 ynEigenDepositAdapter: DEFAULT_ADMIN_ROLE - ", vm.toString(address(actors.admin.ADMIN))); + } + + function verifySystemParameters() internal view { + // Verify the system parameters + for (uint256 i = 0; i < inputs.assets.length; i++) { + Asset memory asset = inputs.assets[i]; + IERC20 token = IERC20(asset.token); + IStrategy strategy = IStrategy(asset.strategy); + + require( + deployment.assetRegistry.assets(i) == token, + string.concat("assetRegistry: asset ", i.toString(), " INVALID") + ); + console.log( + string.concat("\u2705 assetRegistry: asset ", i.toString(), " - Value:"), + address(deployment.assetRegistry.assets(i)) + ); + + require( + deployment.eigenStrategyManager.strategies(token) == strategy, + string.concat("eigenStrategyManager: strategy ", i.toString(), " INVALID") + ); + console.log( + string.concat("\u2705 eigenStrategyManager: strategy ", i.toString(), " - Value:"), + address(deployment.eigenStrategyManager.strategies(token)) + ); + } + + require( + address(deployment.tokenStakingNodesManager.strategyManager()) + == address(chainAddresses.eigenlayer.STRATEGY_MANAGER_ADDRESS), + "tokenStakingNodesManager: strategyManager INVALID" + ); + console.log( + "\u2705 tokenStakingNodesManager: strategyManager - Value:", + address(deployment.tokenStakingNodesManager.strategyManager()) + ); + + require( + address(deployment.tokenStakingNodesManager.delegationManager()) + == address(chainAddresses.eigenlayer.DELEGATION_MANAGER_ADDRESS), + "tokenStakingNodesManager: delegationManager INVALID" + ); + console.log( + "\u2705 tokenStakingNodesManager: delegationManager - Value:", + address(deployment.tokenStakingNodesManager.delegationManager()) + ); + + require( + deployment.tokenStakingNodesManager.maxNodeCount() == 10, "tokenStakingNodesManager: maxNodeCount INVALID" + ); + console.log( + "\u2705 tokenStakingNodesManager: maxNodeCount - Value:", deployment.tokenStakingNodesManager.maxNodeCount() + ); + + require( + address(deployment.ynEigenDepositAdapterInstance.ynEigen()) == address(deployment.ynEigen), + "ynEigenDepositAdapter: ynEigen INVALID" + ); + console.log( + "\u2705 ynEigenDepositAdapter: ynEigen - Value:", + address(deployment.ynEigenDepositAdapterInstance.ynEigen()) + ); + + require( + address(deployment.ynEigenDepositAdapterInstance.wstETH()) == address(chainAddresses.lsd.WSTETH_ADDRESS), + "ynEigenDepositAdapter: wstETH INVALID" + ); + console.log( + "\u2705 ynEigenDepositAdapter: wstETH - Value:", address(deployment.ynEigenDepositAdapterInstance.wstETH()) + ); + + require( + address(deployment.ynEigenDepositAdapterInstance.woETH()) == address(chainAddresses.lsd.WOETH_ADDRESS), + "ynEigenDepositAdapter: woETH INVALID" + ); + console.log( + "\u2705 ynEigenDepositAdapter: woETH - Value:", address(deployment.ynEigenDepositAdapterInstance.woETH()) + ); + + console.log("\u2705 All system parameters verified successfully"); + } + + function verifyContractDependencies() internal view { + verifyYnEIGENDependencies(); + verifyTokenStakingNodesManagerDependencies(); + verifyAssetRegistryDependencies(); + verifyEigenStrategyManagerDependencies(); + + console.log("\u2705 All contract dependencies verified successfully"); + } + + function verifyYnEIGENDependencies() internal view { + //Verify ynEIGEN contract dependencies + require( + IynEigen(address(deployment.ynEigen)).assetRegistry() == address(deployment.assetRegistry), + "ynEigen: AssetRegistry dependency mismatch" + ); + console.log("\u2705 ynEigen: AssetRegistry dependency verified successfully"); + + require( + IynEigen(address(deployment.ynEigen)).yieldNestStrategyManager() == address(deployment.eigenStrategyManager), + "ynEigen: EigenStrategyManager dependency mismatch" + ); + console.log("\u2705 ynEigen: EigenStrategyManager dependency verified successfully"); + } + + function verifyTokenStakingNodesManagerDependencies() internal view { + require( + address(deployment.tokenStakingNodesManager.strategyManager()) + == chainAddresses.eigenlayer.STRATEGY_MANAGER_ADDRESS, + "tokenStakingNodesManager: strategyManager dependency mismatch" + ); + console.log("\u2705 tokenStakingNodesManager: strategyManager dependency verified successfully"); + + require( + address(deployment.tokenStakingNodesManager.delegationManager()) + == chainAddresses.eigenlayer.DELEGATION_MANAGER_ADDRESS, + "tokenStakingNodesManager: delegationManager dependency mismatch" + ); + console.log("\u2705 tokenStakingNodesManager: delegationManager dependency verified successfully"); + + require( + address(deployment.tokenStakingNodesManager.upgradeableBeacon().implementation()) + == address(deployment.tokenStakingNodeImplementation), + "tokenStakingNodesManager: upgradeableBeacon dependency mismatch" + ); + console.log("\u2705 tokenStakingNodesManager: upgradeableBeacon dependency verified successfully"); + + require( + address(deployment.tokenStakingNodesManager.yieldNestStrategyManager()) + == address(deployment.eigenStrategyManager), + "tokenStakingNodesManager: yieldNestStrategyManager dependency mismatch" + ); + console.log("\u2705 tokenStakingNodesManager: yieldNestStrategyManager dependency verified successfully"); + } + + function verifyAssetRegistryDependencies() internal view { + require( + address(deployment.assetRegistry.strategyManager()) == address(deployment.eigenStrategyManager), + "assetRegistry: strategyManager dependency mismatch" + ); + console.log("\u2705 assetRegistry: strategyManager dependency verified successfully"); + + require( + address(deployment.assetRegistry.rateProvider()) == address(deployment.rateProvider), + "assetRegistry: rateProvider dependency mismatch" + ); + console.log("\u2705 assetRegistry: rateProvider dependency verified successfully"); + + require( + address(deployment.assetRegistry.ynEigen()) == address(deployment.ynEigen), + "assetRegistry: ynEigen dependency mismatch" + ); + console.log("\u2705 assetRegistry: ynEigen dependency verified successfully"); + } + + function verifyEigenStrategyManagerDependencies() internal view { + require( + address(deployment.eigenStrategyManager.ynEigen()) == address(deployment.ynEigen), + "eigenStrategyManager: ynEigen INVALID" + ); + console.log("\u2705 eigenStrategyManager: ynEigen - Value:", address(deployment.eigenStrategyManager.ynEigen())); + + require( + address(deployment.eigenStrategyManager.strategyManager()) + == address(chainAddresses.eigenlayer.STRATEGY_MANAGER_ADDRESS), + "eigenStrategyManager: strategyManager INVALID" + ); + console.log( + "\u2705 eigenStrategyManager: strategyManager - Value:", + address(deployment.eigenStrategyManager.strategyManager()) + ); + + require( + address(deployment.eigenStrategyManager.delegationManager()) + == address(chainAddresses.eigenlayer.DELEGATION_MANAGER_ADDRESS), + "eigenStrategyManager: delegationManager INVALID" + ); + console.log( + "\u2705 eigenStrategyManager: delegationManager - Value:", + address(deployment.eigenStrategyManager.delegationManager()) + ); + + require( + address(deployment.eigenStrategyManager.tokenStakingNodesManager()) + == address(deployment.tokenStakingNodesManager), + "eigenStrategyManager: tokenStakingNodesManager INVALID" + ); + console.log( + "\u2705 eigenStrategyManager: tokenStakingNodesManager - Value:", + address(deployment.eigenStrategyManager.tokenStakingNodesManager()) + ); + + require( + address(deployment.eigenStrategyManager.wstETH()) == address(chainAddresses.lsd.WSTETH_ADDRESS), + "eigenStrategyManager: wstETH INVALID" + ); + console.log("\u2705 eigenStrategyManager: wstETH - Value:", address(deployment.eigenStrategyManager.wstETH())); + + require( + address(deployment.eigenStrategyManager.woETH()) == address(chainAddresses.lsd.WOETH_ADDRESS), + "eigenStrategyManager: woETH INVALID" + ); + console.log("\u2705 eigenStrategyManager: woETH - Value:", address(deployment.eigenStrategyManager.woETH())); + } + + function ynEigenSanityCheck() internal { + require(deployment.assetRegistry.totalAssets() >= 0, "assetRegistry: totalAssets INVALID"); + console.log("\u2705 assetRegistry: totalAssets - Value:", deployment.assetRegistry.totalAssets()); + } +} diff --git a/script/ynEigen/bash/deployYnEigen.sh b/script/ynEigen/bash/deployYnEigen.sh new file mode 100755 index 000000000..27c522249 --- /dev/null +++ b/script/ynEigen/bash/deployYnEigen.sh @@ -0,0 +1,109 @@ +#!/bin/bash +source .env + +set -e + +###################### +## GLOBAL VARIABLES ## +###################### + +# unset private key as we are reading it from cast wallet +PRIVATE_KEY="" +DEPLOYER_ACCOUNT_NAME=${DEPLOYER_ACCOUNT_NAME:-"yieldnestDeployerKey"} + +# verify env variables +if [[ -z $ETHERSCAN_API_KEY || -z $RPC_URL || -z $DEPLOYER_ADDRESS ]]; then + echo "invalid .env vars" + exit 1 +fi +############### +## FUNCTIONS ## +############### + +function display_help() { + delimitier + echo "Please enter the relative file path to the input json." + delimitier +} + +function delimitier() { + echo '#################################################' +} + +function simulate() { + forge script $1 -s $2 --rpc-url $3 --account $DEPLOYER_ACCOUNT_NAME --sender $DEPLOYER_ADDRESS +} + +function broadcast() { + forge script $1 -s $2 --rpc-url $3 --account $DEPLOYER_ACCOUNT_NAME --sender $DEPLOYER_ADDRESS --broadcast --etherscan-api-key $ETHERSCAN_API_KEY --verify +} +function simulator() { + # the first argument should be the path to the JSON input file + INPUT_JSON=$1 + CHAIN=$(jq -r ".chainId" "$INPUT_JSON") + CALLDATA=$(cast calldata "run(string)" "/$INPUT_JSON") + + simulate script/ynEigen/YnEigenScript.s.sol:YnEigenScript $CALLDATA $RPC_URL +} +function verify() { + # the first argument should be the path to the JSON input file + INPUT_JSON=$1 + CHAIN=$(jq -r ".chainId" "$INPUT_JSON") + CALLDATA=$(cast calldata "verify(string)" "/$INPUT_JSON") + + broadcast script/ynEigen/YnEigenScript.s.sol:YnEigenScript $CALLDATA $RPC_URL +} +function deploy() { + # the first argument should be the path to the JSON input file + INPUT_JSON=$1 + CHAIN=$(jq -r ".chainId" "$INPUT_JSON") + CALLDATA=$(cast calldata "run(string)" "/$INPUT_JSON") + + broadcast script/ynEigen/YnEigenScript.s.sol:YnEigenScript $CALLDATA $RPC_URL +} +if [[ "$1" == "" ]]; then + echo "$1" + display_help +else + delimitier + read -p "Would you like to VERIFY an existing deployment or DEPLOY a new ynLSD? VERIFY/DEPLOY " DEPLOY + case $DEPLOY in + deploy | DEPLOY | [Dd]*) + delimitier + read -p "Would you like to simulate this transaction before deployment? y/n " CONFIRMATION + + case $CONFIRMATION in + [Yy]*) + echo "Simulating..." + simulator $1 + ;; + [Nn]*) + echo "Deploying..." + ;; + esac + delimitier + read -p "Would you like to continue deploying? y/n " DEPLOYMENT + case $DEPLOYMENT in + [Yy]*) + echo "Deploying..." + deploy $1 + ;; + [Nn]*) + echo "Exiting." + exit 0 + ;; + esac + ;; + [vV] | VERIFY | verify) + echo "Verifying..." + verify $1 + ;; + *) + echo "Invalid input" + exit 1 + ;; + esac +fi + +echo "script finished" +exit 0 diff --git a/script/ynEigen/input/input-template.json b/script/ynEigen/input/input-template.json new file mode 100644 index 000000000..4bbb2feb7 --- /dev/null +++ b/script/ynEigen/input/input-template.json @@ -0,0 +1,27 @@ +{ + "chainId": 17000, + "name": "YieldNest Restaked LSD - Eigenlayer", + "symbol": "ynLSDe", + "assets": [ + { + "name": "WSTETH", + "token": "0x0000000000000000000000000000000000000000", + "strategy": "0x0000000000000000000000000000000000000000" + }, + { + "name": "SFRXETH", + "token": "0x0000000000000000000000000000000000000000", + "strategy": "0x0000000000000000000000000000000000000000" + }, + { + "name": "WOETH", + "token": "0x0000000000000000000000000000000000000000", + "strategy": "0x0000000000000000000000000000000000000000" + }, + { + "name": "RETH", + "token": "0x0000000000000000000000000000000000000000", + "strategy": "0x0000000000000000000000000000000000000000" + } + ] +} \ No newline at end of file diff --git a/script/ynEigen/input/lsd-holesky.json b/script/ynEigen/input/lsd-holesky.json new file mode 100644 index 000000000..93c3c34e3 --- /dev/null +++ b/script/ynEigen/input/lsd-holesky.json @@ -0,0 +1,32 @@ +{ + "chainId": 17000, + "name": "YieldNest Restaked LSD - Eigenlayer", + "symbol": "YnLSDe", + "assets": [ + { + "name": "WSTETH", + "token": "0x8d09a4502Cc8Cf1547aD300E066060D043f6982D", + "strategy": "0x7D704507b76571a51d9caE8AdDAbBFd0ba0e63d3" + }, + { + "name": "SFRXETH", + "token": "0xa63f56985F9C7F3bc9fFc5685535649e0C1a55f3", + "strategy": "0x9281ff96637710Cd9A5CAcce9c6FAD8C9F54631c" + }, + { + "name": "RETH", + "token": "0x7322c24752f79c05FFD1E2a6FCB97020C1C264F1", + "strategy": "0x3A8fBdf9e77DFc25d09741f51d3E181b25d0c4E0" + }, + { + "name": "METH", + "token": "0xe3C063B1BEe9de02eb28352b55D49D85514C67FF", + "strategy": "0xaccc5A86732BE85b5012e8614AF237801636F8e5" + }, + { + "name": "STADER", + "token": "0xB4F5fc289a778B80392b86fa70A7111E5bE0F859", + "strategy": "0x31B6F59e1627cEfC9fA174aD03859fC337666af7" + } + ] +} \ No newline at end of file diff --git a/script/ynEigen/input/lsd-mainnet.json b/script/ynEigen/input/lsd-mainnet.json new file mode 100644 index 000000000..19b945f71 --- /dev/null +++ b/script/ynEigen/input/lsd-mainnet.json @@ -0,0 +1,27 @@ +{ + "chainId": 1, + "name": "YieldNest Restaked LSD - Eigenlayer", + "symbol": "ynLSDe", + "assets": [ + { + "name": "WSTETH", + "token": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "strategy": "0x93c4b944D05dfe6df7645A86cd2206016c51564D" + }, + { + "name": "SFRXETH", + "token": "0xac3E018457B222d93114458476f3E3416Abbe38F", + "strategy": "0x8CA7A5d6f3acd3A7A8bC468a8CD0FB14B6BD28b6" + }, + { + "name": "WOETH", + "token": "0xDcEe70654261AF21C44c093C300eD3Bb97b78192", + "strategy": "0xa4C637e0F704745D182e4D38cAb7E7485321d059" + }, + { + "name": "RETH", + "token": "0xae78736Cd615f374D3085123A210448E74Fc6393", + "strategy": "0x1BeE69b7dFFfA4E2d53C2a2Df135C388AD25dCD2" + } + ] +} diff --git a/src/YieldNestOracle.sol b/src/YieldNestOracle.sol deleted file mode 100644 index baa9ebb4e..000000000 --- a/src/YieldNestOracle.sol +++ /dev/null @@ -1,137 +0,0 @@ -// SPDX-License-Identifier: BSD 3-Clause License -pragma solidity ^0.8.24; - -import {AccessControlUpgradeable} from "lib/openzeppelin-contracts-upgradeable/contracts/access/AccessControlUpgradeable.sol"; -import {AggregatorV3Interface} from "src/external/chainlink/AggregatorV3Interface.sol"; - -interface IYieldNestOracleEvents { - event AssetPriceFeedSet(address indexed asset, address indexed priceFeedAddress, uint256 maxAge); -} - -contract YieldNestOracle is AccessControlUpgradeable, IYieldNestOracleEvents { - - //-------------------------------------------------------------------------------------- - //---------------------------------- ERRORS ------------------------------------------- - //-------------------------------------------------------------------------------------- - - error PriceFeedTooStale(uint256 age, uint256 maxAge); - error ZeroAddress(); - error ZeroAge(); - error ArraysLengthMismatch(uint256 assetsLength, uint256 priceFeedAddressesLength, uint256 maxAgesLength); - error PriceFeedNotSet(); - error InvalidPriceValue(int256 price); - - //-------------------------------------------------------------------------------------- - //---------------------------------- VARIABLES --------------------------------------- - //-------------------------------------------------------------------------------------- - - struct AssetPriceFeed { - AggregatorV3Interface priceFeed; - uint256 maxAge; // in seconds - } - - mapping(address => AssetPriceFeed) public assetPriceFeeds; - - //-------------------------------------------------------------------------------------- - //---------------------------------- ROLES ------------------------------------------- - //-------------------------------------------------------------------------------------- - - bytes32 public constant ORACLE_MANAGER_ROLE = keccak256("ORACLE_MANAGER_ROLE"); - - //-------------------------------------------------------------------------------------- - //---------------------------------- INITIALIZATION ---------------------------------- - //-------------------------------------------------------------------------------------- - - struct Init { - address[] assets; - address[] priceFeedAddresses; - uint256[] maxAges; - address admin; - address oracleManager; - } - - constructor() { - _disableInitializers(); - } - - function initialize(Init memory init) - external - notZeroAddress(init.admin) - notZeroAddress(init.oracleManager) - initializer { - __AccessControl_init(); - _grantRole(DEFAULT_ADMIN_ROLE, init.admin); - _grantRole(ORACLE_MANAGER_ROLE, init.oracleManager); - - if (init.assets.length != init.priceFeedAddresses.length || init.assets.length != init.maxAges.length) { - revert ArraysLengthMismatch({assetsLength: init.assets.length, priceFeedAddressesLength: init.priceFeedAddresses.length, maxAgesLength: init.maxAges.length}); - } - for (uint256 i = 0; i < init.assets.length; i++) { - _setAssetPriceFeed(init.assets[i], init.priceFeedAddresses[i], init.maxAges[i]); - } - } - - //-------------------------------------------------------------------------------------- - //---------------------------------- FUNCTIONS --------------------------------------- - //-------------------------------------------------------------------------------------- - - /** - * @notice Sets the price feed for a given asset. - * @param asset The address of the asset. - * @param priceFeedAddress The address of the price feed. - * @param maxAge The maximum age (in seconds) of the price feed data to be considered valid. - */ - function setAssetPriceFeed(address asset, address priceFeedAddress, uint256 maxAge) public onlyRole(ORACLE_MANAGER_ROLE) { - _setAssetPriceFeed(asset, priceFeedAddress, maxAge); - } - - function _setAssetPriceFeed(address asset, address priceFeedAddress, uint256 maxAge) internal { - if(priceFeedAddress == address(0) || asset == address(0)) { - revert ZeroAddress(); - } - - if (maxAge == 0) { - revert ZeroAge(); - } - - assetPriceFeeds[asset] = AssetPriceFeed(AggregatorV3Interface(priceFeedAddress), maxAge); - emit AssetPriceFeedSet(asset, priceFeedAddress, maxAge); - } - - /** - * @notice Retrieves the latest price for a given asset. - * @param asset The address of the asset. - * @return The latest price of the asset. - */ - function getLatestPrice(address asset) public view returns (uint256) { - AssetPriceFeed storage priceFeed = assetPriceFeeds[asset]; - if(address(priceFeed.priceFeed) == address(0)) { - revert PriceFeedNotSet(); - } - - (, int256 price,, uint256 timeStamp,) = priceFeed.priceFeed.latestRoundData(); - uint256 age = block.timestamp - timeStamp; - if (age > priceFeed.maxAge) { - revert PriceFeedTooStale(age, priceFeed.maxAge); - } - - if (price <= 0) { - revert InvalidPriceValue(price); - } - - return uint256(price); - } - - //-------------------------------------------------------------------------------------- - //---------------------------------- MODIFIERS --------------------------------------- - //-------------------------------------------------------------------------------------- - - /// @notice Ensure that the given address is not the zero address. - /// @param _address The address to check. - modifier notZeroAddress(address _address) { - if (_address == address(0)) { - revert ZeroAddress(); - } - _; - } -} diff --git a/src/external/frax/IFrxEthWethDualOracle.sol b/src/external/frax/IFrxEthWethDualOracle.sol new file mode 100644 index 000000000..e0ae7d619 --- /dev/null +++ b/src/external/frax/IFrxEthWethDualOracle.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +interface IFrxEthWethDualOracle { + + /// @notice The ```getCurveEmaEthPerFrxEth``` function gets the EMA price of frxEth in eth units + /// @dev normalized to match precision of oracle + /// @return _ethPerFrxEth + function getCurveEmaEthPerFrxEth() external view returns (uint256 _ethPerFrxEth); +} \ No newline at end of file diff --git a/src/external/frax/IfrxMinter.sol b/src/external/frax/IfrxMinter.sol new file mode 100644 index 000000000..023be5b4d --- /dev/null +++ b/src/external/frax/IfrxMinter.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import { IERC20 } from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; + +interface IfrxMinter is IERC20 { + + function submitAndDeposit(address recipient) external payable returns (uint256 shares); +} \ No newline at end of file diff --git a/src/external/frax/IsfrxETH.sol b/src/external/frax/IsfrxETH.sol new file mode 100644 index 000000000..1e0cb6c3f --- /dev/null +++ b/src/external/frax/IsfrxETH.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {IERC4626} from "lib/openzeppelin-contracts/contracts/interfaces/IERC4626.sol"; + +interface IsfrxETH is IERC4626 { + function pricePerShare() external view returns (uint256); +} \ No newline at end of file diff --git a/src/external/lido/IstETH.sol b/src/external/lido/IstETH.sol new file mode 100644 index 000000000..2b1a617ac --- /dev/null +++ b/src/external/lido/IstETH.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; + +interface IstETH is IERC20 { + function getPooledEthByShares(uint256 _shares) external view returns (uint256); +} \ No newline at end of file diff --git a/src/external/lido/IwstETH.sol b/src/external/lido/IwstETH.sol new file mode 100644 index 000000000..ed82b6b8c --- /dev/null +++ b/src/external/lido/IwstETH.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; + +interface IwstETH is IERC20 { + function unwrap(uint256 _wstETHAmount) external returns (uint256); + + function wrap(uint256 _stETHAmount) external returns (uint256); + + function getWstETHByStETH( + uint256 _stETHAmount + ) external view returns (uint256); + + function getStETHByWstETH( + uint256 _wstETHAmount + ) external view returns (uint256); + + function stEthPerToken() external view returns (uint256); + + function stETH() external view returns (address); +} \ No newline at end of file diff --git a/src/external/mantle/ImETHStaking.sol b/src/external/mantle/ImETHStaking.sol new file mode 100644 index 000000000..128d7f638 --- /dev/null +++ b/src/external/mantle/ImETHStaking.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; + +interface ImETHStaking is IERC20 { + function mETHToETH(uint256 mETHAmount) external view returns (uint256); + function ethToMETH(uint256 ethAmount) external view returns (uint256); + function stake(uint256 minMETHAmount) external payable; +} \ No newline at end of file diff --git a/src/external/rocketpool/IrETH.sol b/src/external/rocketpool/IrETH.sol new file mode 100644 index 000000000..bbc2a5998 --- /dev/null +++ b/src/external/rocketpool/IrETH.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; + +interface IrETH is IERC20 { + function getExchangeRate() external view returns (uint256); +} \ No newline at end of file diff --git a/src/external/swell/IswETH.sol b/src/external/swell/IswETH.sol new file mode 100644 index 000000000..652045dde --- /dev/null +++ b/src/external/swell/IswETH.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; + +/** + @notice interface for Swell Staked ETH swETH + */ +interface IswETH is IERC20 { + function swETHToETHRate() external view returns (uint256); +} \ No newline at end of file diff --git a/src/external/tokens/IWETH.sol b/src/external/tokens/IWETH.sol index 7bcf0cea0..1980f176a 100644 --- a/src/external/tokens/IWETH.sol +++ b/src/external/tokens/IWETH.sol @@ -3,10 +3,10 @@ pragma solidity ^0.8.24; interface IWETH { function deposit() external payable; - function withdraw(uint wad) external; - function totalSupply() external view returns (uint); - function approve(address guy, uint wad) external returns (bool); - function transfer(address dst, uint wad) external returns (bool); - function transferFrom(address src, address dst, uint wad) external returns (bool); + function withdraw(uint256 wad) external; + function totalSupply() external view returns (uint256); + function approve(address guy, uint256 wad) external returns (bool); + function transfer(address dst, uint256 wad) external returns (bool); + function transferFrom(address src, address dst, uint256 wad) external returns (bool); function symbol() external returns (string memory); } diff --git a/src/interfaces/IAssetRegistry.sol b/src/interfaces/IAssetRegistry.sol new file mode 100644 index 000000000..2e759f4ba --- /dev/null +++ b/src/interfaces/IAssetRegistry.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; + + +interface IAssetRegistry { + + enum AssetStatus { + Unavailable, // Unavailable is 0, all asset default to Nonexistent + Active, + Disabled + } + struct AssetData { + AssetStatus status; + } + + function assetData(IERC20 asset) external view returns (AssetData memory); + function addAsset(IERC20 asset) external; + function disableAsset(IERC20 asset) external; + function deleteAsset(IERC20 asset) external; + function totalAssets() external view returns (uint256); + function convertToUnitOfAccount(IERC20 asset, uint256 amount) external view returns (uint256); + function assetIsSupported(IERC20 asset) external view returns (bool); +} diff --git a/src/interfaces/IEigenStrategyManager.sol b/src/interfaces/IEigenStrategyManager.sol new file mode 100644 index 000000000..c79372011 --- /dev/null +++ b/src/interfaces/IEigenStrategyManager.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {IStrategy} from "lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; +import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; +import {IwstETH} from "src/external/lido/IwstETH.sol"; +import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol"; + + +interface IEigenStrategyManager { + + function getStakedAssetsBalances( + IERC20[] calldata assets + ) external view returns (uint256[] memory stakedBalances); + + function getStakedAssetBalance(IERC20 asset) external view returns (uint256 stakedBalance); + + function strategies(IERC20 asset) external view returns (IStrategy); + + function wstETH() external view returns (IwstETH); + function woETH() external view returns (IERC4626); + function oETH() external view returns (IERC20); + function stETH() external view returns (IERC20); +} \ No newline at end of file diff --git a/src/interfaces/IRateProvider.sol b/src/interfaces/IRateProvider.sol new file mode 100644 index 000000000..26debf650 --- /dev/null +++ b/src/interfaces/IRateProvider.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +interface IRateProvider { + function rate(address _asset) external view returns (uint256); +} diff --git a/src/interfaces/IStakingNodesManager.sol b/src/interfaces/IStakingNodesManager.sol index 8a3abbabe..a6ef118d3 100644 --- a/src/interfaces/IStakingNodesManager.sol +++ b/src/interfaces/IStakingNodesManager.sol @@ -15,12 +15,12 @@ interface IStakingNodesManager { bytes publicKey; bytes signature; bytes32 depositDataRoot; - uint nodeId; + uint256 nodeId; } struct Validator { bytes publicKey; - uint nodeId; + uint256 nodeId; } function eigenPodManager() external view returns (IEigenPodManager); @@ -32,11 +32,11 @@ interface IStakingNodesManager { function getAllNodes() external view returns (IStakingNode[] memory); function isStakingNodesOperator(address) external view returns (bool); function isStakingNodesDelegator(address _address) external view returns (bool); - function processRewards(uint nodeId, RewardsType rewardsType) external payable; + function processRewards(uint256 nodeId, RewardsType rewardsType) external payable; function registerValidators( ValidatorData[] calldata _depositData ) external; - function nodesLength() external view returns (uint); + function nodesLength() external view returns (uint256); function upgradeableBeacon() external returns (UpgradeableBeacon); } diff --git a/src/interfaces/ILSDStakingNode.sol b/src/interfaces/ITokenStakingNode.sol similarity index 62% rename from src/interfaces/ILSDStakingNode.sol rename to src/interfaces/ITokenStakingNode.sol index 67214c91a..2145c4970 100644 --- a/src/interfaces/ILSDStakingNode.sol +++ b/src/interfaces/ITokenStakingNode.sol @@ -3,26 +3,28 @@ pragma solidity ^0.8.24; import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; import {ISignatureUtils} from "lib/eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol"; -import {IynLSD} from "src/interfaces/IynLSD.sol"; +import {ITokenStakingNodesManager} from "src/interfaces/ITokenStakingNodesManager.sol"; +import {IStrategy} from "lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; -interface ILSDStakingNode { +interface ITokenStakingNode { /// @notice Configuration for contract initialization. struct Init { - IynLSD ynLSD; - uint nodeId; + ITokenStakingNodesManager tokenStakingNodesManager; + uint256 nodeId; } function nodeId() external returns (uint256); function initialize(Init calldata init) external; - function depositAssetsToEigenlayer( + function depositAssetsToEigenlayer( IERC20[] memory assets, - uint256[] memory amounts + uint256[] memory amounts, + IStrategy[] memory strategies ) external; - function ynLSD() external view returns (IynLSD); + function tokenStakingNodesManager() external view returns (ITokenStakingNodesManager); function implementation() external view returns (address); @@ -35,6 +37,4 @@ interface ILSDStakingNode { ) external; function undelegate() external; - - function recoverAssets(IERC20 asset) external; } diff --git a/src/interfaces/ITokenStakingNodesManager.sol b/src/interfaces/ITokenStakingNodesManager.sol new file mode 100644 index 000000000..e6c2797a5 --- /dev/null +++ b/src/interfaces/ITokenStakingNodesManager.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {UpgradeableBeacon} from "lib/openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol"; +import {IDelegationManager} from "lib/eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol"; +import {IStrategyManager} from "lib/eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol"; +import {ITokenStakingNode} from "src/interfaces/ITokenStakingNode.sol"; + +interface ITokenStakingNodesManager { + + function createTokenStakingNode() external returns (ITokenStakingNode); + function registerTokenStakingNode(address _implementationContract) external; + function upgradeTokenStakingNode(address _implementationContract) external; + function setMaxNodeCount(uint256 _maxNodeCount) external; + function hasTokenStakingNodeOperatorRole(address account) external view returns (bool); + function hasTokenStakingNodeDelegatorRole(address account) external view returns (bool); + + function delegationManager() external view returns (IDelegationManager); + function strategyManager() external view returns (IStrategyManager); + function upgradeableBeacon() external view returns (UpgradeableBeacon); + + function getAllNodes() external view returns (ITokenStakingNode[] memory); + function nodesLength() external view returns (uint256); + function hasYieldNestStrategyManagerRole(address) external view returns (bool); + + function getNodeById(uint256 nodeId) external view returns (ITokenStakingNode); +} diff --git a/src/interfaces/IYieldNestStrategyManager.sol b/src/interfaces/IYieldNestStrategyManager.sol new file mode 100644 index 000000000..5f2aaf448 --- /dev/null +++ b/src/interfaces/IYieldNestStrategyManager.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; + +interface IYieldNestStrategyManager { + + function getStakedAssetsBalances( + IERC20[] calldata assets + ) external view returns (uint256[] memory stakedBalances); + + function getStakedAssetBalance(IERC20 asset) external view returns (uint256 stakedBalance); + + function supportsAsset(IERC20 asset) external view returns (bool); + +} \ No newline at end of file diff --git a/src/interfaces/IynEigen.sol b/src/interfaces/IynEigen.sol new file mode 100644 index 000000000..5a29131bb --- /dev/null +++ b/src/interfaces/IynEigen.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; + +interface IynEigen is IERC20 { + + function deposit( + IERC20 asset, + uint256 amount, + address receiver + ) external returns (uint256 shares); + + function totalAssets() external view returns (uint256); + + function convertToShares(IERC20 asset, uint256 amount) external view returns(uint256 shares); + + function previewDeposit(IERC20 asset, uint256 amount) external view returns (uint256); + + function retrieveAssets( + IERC20[] calldata assetsToRetrieve, + uint256[] calldata amounts + ) external; + + function assetBalances(IERC20[] calldata assetsArray) external view returns (uint256[] memory balances); + function assetBalance(IERC20 asset) external view returns (uint256 balance); + + function yieldNestStrategyManager() external view returns (address); +} \ No newline at end of file diff --git a/src/interfaces/IynLSD.sol b/src/interfaces/IynLSD.sol deleted file mode 100644 index 5896c0e26..000000000 --- a/src/interfaces/IynLSD.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: BSD 3-Clause License -pragma solidity ^0.8.24; - -import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; -import {IStrategyManager,IStrategy} from "lib/eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol"; -import {IDelegationManager} from "lib/eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol"; -import {ILSDStakingNode} from "src/interfaces/ILSDStakingNode.sol"; -import {ILSDStakingNode} from "src/interfaces/ILSDStakingNode.sol"; -import {UpgradeableBeacon} from "lib/openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol"; - -interface IynLSD { - - function deposit( - IERC20 token, - uint256 amount, - address receiver - ) external returns (uint256 shares); - - function upgradeableBeacon() external view returns (UpgradeableBeacon); - - function strategies(IERC20 asset) external view returns (IStrategy); - - function totalAssets() external view returns (uint); - - function convertToShares(IERC20 asset, uint amount) external view returns(uint shares); - - function createLSDStakingNode() external returns (ILSDStakingNode); - - function registerLSDStakingNodeImplementationContract(address _implementationContract) external; - - function upgradeLSDStakingNodeImplementation(address _implementationContract) external; - - function setMaxNodeCount(uint _maxNodeCount) external; - - function hasLSDRestakingManagerRole(address account) external returns (bool); - - function retrieveAsset(uint nodeId, IERC20 asset, uint256 amount) external; - - function strategyManager() external returns (IStrategyManager); - - function delegationManager() external returns (IDelegationManager); - -} \ No newline at end of file diff --git a/src/testnet/HoleksyLSDRateProvider.sol b/src/testnet/HoleksyLSDRateProvider.sol new file mode 100644 index 000000000..b404ec4c6 --- /dev/null +++ b/src/testnet/HoleksyLSDRateProvider.sol @@ -0,0 +1,96 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; +import {IERC4626} from "lib/openzeppelin-contracts/contracts/interfaces/IERC4626.sol"; +import {IstETH} from "src/external/lido/IstETH.sol"; +import {IrETH} from "src/external/rocketpool/IrETH.sol"; +import {ImETHStaking} from "src/external/mantle/ImETHStaking.sol"; + + +struct StaderExchangeRate { + uint256 block_number; + uint256 eth_balance; + uint256 ethx_supply; +} + +interface StaderOracle { + function getExchangeRate() external view returns (StaderExchangeRate memory); +} + +contract HoleskyLSDRateProvider { + + //-------------------------------------------------------------------------------------- + //---------------------------------- ERRORS ------------------------------------------ + //-------------------------------------------------------------------------------------- + + error UnsupportedAsset(address asset); + + //-------------------------------------------------------------------------------------- + //---------------------------------- CONSTANTS --------------------------------------- + //-------------------------------------------------------------------------------------- + + + uint256 public constant UNIT = 1e18; + address public constant FRAX_ASSET = 0xa63f56985F9C7F3bc9fFc5685535649e0C1a55f3; // sfrxETH + address public constant LIDO_ASSET = 0x8d09a4502Cc8Cf1547aD300E066060D043f6982D; // wstETH + address public constant RETH_ASSET = 0x7322c24752f79c05FFD1E2a6FCB97020C1C264F1; // RETH + + /** WOETH is a mock deployed by YieldNest */ + address public constant WOETH_ASSET = 0xbaAcDcC565006b6429F57bC0f436dFAf14A526b1; + address public constant METH_ASSET = 0xe3C063B1BEe9de02eb28352b55D49D85514C67FF; + address public constant METH_STAKING_CONTRACT = 0xbe16244EAe9837219147384c8A7560BA14946262; + address public constant LIDO_UDERLYING = 0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034; // stETH + + /// STADER + address public constant STADER_ORACLE = 0x90ED1c6563e99Ea284F7940b1b443CE0BC4fC3e4; + address public constant STADER_ASSET = 0xB4F5fc289a778B80392b86fa70A7111E5bE0F859; //ETHX + + //-------------------------------------------------------------------------------------- + //---------------------------------- INITIALIZATION ---------------------------------- + //-------------------------------------------------------------------------------------- + + /** + * @dev Returns the rate of the specified asset. + * @param _asset The address of the asset for which to get the rate. + * @return The rate of the specified asset in terms of its underlying value. + * @notice This function handles multiple types of liquid staking derivatives (LSDs) and their respective rates. + * It supports Lido's stETH, Frax's sfrxETH, Rocket Pool's rETH, Swell's swETH, and Wrapped stETH. + * It reverts if the asset is not supported. + */ + function rate(address _asset) external view returns (uint256) { + + /* + This contract uses the rate as provided the protocol that controls the asset. + This approach avoids issues with sourcing market prices that would cause asset value + fluctuation that depends on market price fluctuation + Known risks that require mitigation: + In case one of the LSDs depegs from its ETH price, users can still deposit to ynEigen, + and receive the same amount of shares as though the underlying asset has not depegged yet, + as the protocols below will report the same LSD/ETH price. + */ + + if (_asset == LIDO_ASSET) { + return IstETH(LIDO_UDERLYING).getPooledEthByShares(UNIT); + } + if (_asset == FRAX_ASSET) { + return IERC4626(FRAX_ASSET).totalAssets() * UNIT / IERC20(FRAX_ASSET).totalSupply(); + } + if (_asset == WOETH_ASSET) { + return IERC4626(WOETH_ASSET).previewRedeem(UNIT); + } + if (_asset == RETH_ASSET) { + return IrETH(RETH_ASSET).getExchangeRate(); + } + if (_asset == METH_ASSET) { + return ImETHStaking(METH_STAKING_CONTRACT).mETHToETH(UNIT); + } + + if (_asset == STADER_ASSET) { + StaderExchangeRate memory res = StaderOracle(STADER_ORACLE).getExchangeRate(); + return (res.eth_balance * UNIT) / res.ethx_supply; + } + + revert UnsupportedAsset(_asset); + } +} diff --git a/src/ynEIGEN/AssetRegistry.sol b/src/ynEIGEN/AssetRegistry.sol new file mode 100644 index 000000000..9e5fff958 --- /dev/null +++ b/src/ynEIGEN/AssetRegistry.sol @@ -0,0 +1,375 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {AccessControlUpgradeable} from "lib/openzeppelin-contracts-upgradeable/contracts/access/AccessControlUpgradeable.sol"; +import {ReentrancyGuardUpgradeable} from "lib/openzeppelin-contracts-upgradeable/contracts/utils/ReentrancyGuardUpgradeable.sol"; +import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; +import {IERC20Metadata} from "lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {IynEigen} from "src/interfaces/IynEigen.sol"; +import {IRateProvider} from "src/interfaces/IRateProvider.sol"; +import {IAssetRegistry} from "src/interfaces/IAssetRegistry.sol"; +import "lib/openzeppelin-contracts-upgradeable/contracts/access/AccessControlUpgradeable.sol"; +import {IYieldNestStrategyManager} from "src/interfaces/IYieldNestStrategyManager.sol"; + + +interface IAssetRegistryEvents { + event AssetAdded(address indexed asset); + event AssetDeleted(address indexed asset, uint256 assetIndex); + event AssetActivated(address indexed asset); + event AssetDisabled(address indexed asset); + event PausedUpdated(bool paused); +} + +/** @title AssetRegistry.sol + * @dev This contract handles the strategy management for ynEigen asset allocations. + */ + contract AssetRegistry is IAssetRegistry, AccessControlUpgradeable, ReentrancyGuardUpgradeable, IAssetRegistryEvents { + + //-------------------------------------------------------------------------------------- + //---------------------------------- ERRORS ------------------------------------------ + //-------------------------------------------------------------------------------------- + + error UnsupportedAsset(IERC20 asset); + error Paused(); + error AssetNotActive(address inactiveAsset); + error AssetAlreadyActive(address asset); + error AssetNotDisabled(address asset); + error AssetBalanceNonZeroInPool(uint256 balanceInPool); + error AssetBalanceNonZeroInStrategyManager(uint256 balanceInStrategyManager); + error AssetNotFound(address absentAsset); + error ZeroAmount(); + error ZeroAddress(); + error LengthMismatch(uint256 length1, uint256 length2); + error AssetAlreadyAvailable(address asset); + error NoStrategyDefinedForAsset(IERC20 asset); + error RateNotAvailableForAsset(IERC20 asset); + + //-------------------------------------------------------------------------------------- + //---------------------------------- ROLES ------------------------------------------- + //-------------------------------------------------------------------------------------- + + bytes32 public constant ASSET_MANAGER_ROLE = keccak256("ASSET_MANAGER_ROLE"); + bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); + bytes32 public constant UNPAUSER_ROLE = keccak256("UNPAUSER_ROLE"); + + //-------------------------------------------------------------------------------------- + //---------------------------------- VARIABLES --------------------------------------- + //-------------------------------------------------------------------------------------- + + /// @notice List of supported ERC20 asset contracts. + IERC20[] public assets; + + mapping(IERC20 => AssetData) public _assetData; + + bool public actionsPaused; + + IRateProvider public rateProvider; + IYieldNestStrategyManager public strategyManager; + IynEigen public ynEigen; + + + //-------------------------------------------------------------------------------------- + //---------------------------------- INITIALIZATION ---------------------------------- + //-------------------------------------------------------------------------------------- + + constructor() { + _disableInitializers(); + } + + struct Init { + IERC20[] assets; + IRateProvider rateProvider; + IYieldNestStrategyManager yieldNestStrategyManager; + IynEigen ynEigen; + address admin; + address pauser; + address unpauser; + address assetManagerRole; + } + + function initialize(Init calldata init) + public + notZeroAddress(address(init.rateProvider)) + notZeroAddress(address(init.admin)) + notZeroAddress(address(init.pauser)) + notZeroAddress(address(init.unpauser)) + initializer { + __AccessControl_init(); + __ReentrancyGuard_init(); + + _grantRole(DEFAULT_ADMIN_ROLE, init.admin); + _grantRole(PAUSER_ROLE, init.pauser); + _grantRole(UNPAUSER_ROLE, init.unpauser); + _grantRole(ASSET_MANAGER_ROLE, init.assetManagerRole); + + strategyManager = init.yieldNestStrategyManager; + + uint256 assetsLength = init.assets.length; + for (uint256 i = 0; i < assetsLength; i++) { + IERC20 asset = init.assets[i]; + if (address(asset) == address(0)) { + revert ZeroAddress(); + } + if (_assetData[asset].status == AssetStatus.Active) { + revert AssetAlreadyActive(address(asset)); + } + + if (!strategyManager.supportsAsset(asset)) { + revert NoStrategyDefinedForAsset(asset); + } + + assets.push(asset); + _assetData[asset] = AssetData({ + status: AssetStatus.Active + }); + } + + rateProvider = init.rateProvider; + ynEigen = init.ynEigen; + } + + //-------------------------------------------------------------------------------------- + //---------------------------------- ASSET MANAGEMENT -------------------------------- + //-------------------------------------------------------------------------------------- + + /** + * @notice Adds a new asset to the system. + * @dev Adds an asset to the _assetData mapping and sets it as active. This function can only be called by the strategy manager. + * @param asset The address of the ERC20 token to be added. + */ + function addAsset(IERC20 asset) + public + onlyRole(ASSET_MANAGER_ROLE) + notZeroAddress(address(asset)) + whenNotPaused { + if (_assetData[asset].status != AssetStatus.Unavailable) { + revert AssetAlreadyAvailable(address(asset)); + } + + if (!strategyManager.supportsAsset(asset)) { + revert NoStrategyDefinedForAsset(asset); + } + + try rateProvider.rate(address(asset)) { + // solhint-disable-previous-line no-empty-blocks + // If the rate exists, do nothing + } catch { + revert RateNotAvailableForAsset(asset); + } + + assets.push(asset); + + _assetData[asset] = AssetData({ + status: AssetStatus.Active + }); + + emit AssetAdded(address(asset)); + } + + /** + * @notice Disables an existing asset in the system. + * @dev Sets an asset as inactive in the _assetData mapping. This function can only be called by the strategy manager. + * @param asset The address of the ERC20 token to be disabled. + */ + function disableAsset(IERC20 asset) + public + onlyRole(ASSET_MANAGER_ROLE) + notZeroAddress(address(asset)) + whenNotPaused { + if (_assetData[asset].status != AssetStatus.Active) { + revert AssetNotActive(address(asset)); + } + + _assetData[asset].status = AssetStatus.Disabled; + + emit AssetDisabled(address(asset)); + } + + /** + * @notice Deletes an asset from the system entirely. Asset can only be deleted of no balance exists in the system. + * By that, no amount of that asset exists the ynEigen Pool or deposited in the EigenLayer strategy. + * @dev Removes an asset from the _assetData mapping and the assets array. This function can only be called by the strategy manager. + * @param asset The address of the ERC20 token to be deleted. + */ + function deleteAsset(IERC20 asset) + public + onlyRole(ASSET_MANAGER_ROLE) + notZeroAddress(address(asset)) + whenNotPaused { + if (_assetData[asset].status != AssetStatus.Disabled) { + // Asset can only be deleted it has been Disabled + revert AssetNotDisabled(address(asset)); + } + + uint256 balanceInPool = ynEigen.assetBalance(asset); + if (balanceInPool != 0) { + revert AssetBalanceNonZeroInPool(balanceInPool); + } + + uint256 strategyBalance = strategyManager.getStakedAssetBalance(asset); + if (strategyBalance != 0) { + revert AssetBalanceNonZeroInStrategyManager(strategyBalance); + } + + // Remove asset from the assets array + uint256 assetIndex = findAssetIndex(asset); + + // Move the last element into the place to delete + assets[assetIndex] = assets[assets.length - 1]; + assets.pop(); + + // Remove asset from the mapping + delete _assetData[asset]; + + emit AssetDeleted(address(asset), assetIndex); + } + + /** + * @notice Finds the index of an asset in the assets array. + * @param asset The asset to find. + * @return uint256 The index of the asset. + */ + function findAssetIndex(IERC20 asset) internal view returns (uint256) { + uint256 assetsLength = assets.length; + for (uint256 i = 0; i < assetsLength; i++) { + if (assets[i] == asset) { + return i; + } + } + revert AssetNotFound(address(asset)); + } + + //-------------------------------------------------------------------------------------- + //---------------------------------- ASSET VALUE ------------------------------------- + //-------------------------------------------------------------------------------------- + + /** + * @notice This function calculates the total assets of the contract + * @dev It iterates over all the assets in the contract, gets the latest price for each asset from the oracle, + * multiplies it with the balance of the asset and adds it to the total + * @return total The total assets of the contract in the form of uint + */ + function totalAssets() public view returns (uint256) { + uint256 total = 0; + + uint256[] memory depositedBalances = getAllAssetBalances(); + + uint256 assetsLength = assets.length; + for (uint256 i = 0; i < assetsLength; i++) { + uint256 balanceInUnitOfAccount = convertToUnitOfAccount(assets[i], depositedBalances[i]); + total += balanceInUnitOfAccount; + } + return total; + } + + /** + * @notice Retrieves the total balances of all assets managed by the contract, both held directly and managed through strategies. + * @dev This function aggregates the balances of each asset held directly by the contract and in each LSDStakingNode, + * including those managed by strategies associated with each asset. + * @return assetBalances An array of the total balances for each asset, indexed in the same order as the `assets` array. + */ + function getAllAssetBalances() + public + view + returns (uint256[] memory assetBalances) + { + uint256 assetsCount = assets.length; + + assetBalances = new uint256[](assetsCount); + + // populate with the ynEigen balances + assetBalances = ynEigen.assetBalances(assets); + + uint256[] memory stakedAssetBalances = strategyManager.getStakedAssetsBalances(assets); + + if (stakedAssetBalances.length != assetsCount) { + revert LengthMismatch(assetsCount, stakedAssetBalances.length); + } + + for (uint256 i = 0; i < assetsCount; i++) { + assetBalances[i] += stakedAssetBalances[i]; + } + } + + /** + * @notice Retrieves the list of all assets managed by the contract. + * @dev Returns an array of addresses representing the ERC20 tokens considered as assets. + * @return An array of ERC20 token addresses. + */ + function getAssets() public view returns (IERC20[] memory) { + return assets; + } + + /** + * @notice Converts the amount of a given asset to its equivalent value in the unit of account of the vault. + * @dev This function takes into account the decimal places of the asset to ensure accurate conversion. + * @param asset The ERC20 token to be converted to the unit of account. + * @param amount The amount of the asset to be converted. + * @return uint256 equivalent amount of the asset in the unit of account. + */ + function convertToUnitOfAccount(IERC20 asset, uint256 amount) public view returns (uint256) { + uint256 assetRate = rateProvider.rate(address(asset)); + uint8 assetDecimals = IERC20Metadata(address(asset)).decimals(); + return assetDecimals != 18 + ? assetRate * amount / (10 ** assetDecimals) + : assetRate * amount / 1e18; + } + + //-------------------------------------------------------------------------------------- + //---------------------------------- PAUSING ----------------------------------------- + //-------------------------------------------------------------------------------------- + + /** + * @notice Pauses management actions. + * @dev Can only be called by an account with the PAUSER_ROLE. + */ + function pauseActions() external onlyRole(PAUSER_ROLE) { + actionsPaused = true; + emit PausedUpdated(actionsPaused); + } + + /** + * @notice Unpauses management actions. + * @dev Can only be called by an account with the UNPAUSER_ROLE. + */ + function unpauseActions() external onlyRole(UNPAUSER_ROLE) { + actionsPaused = false; + emit PausedUpdated(actionsPaused); + } + + //-------------------------------------------------------------------------------------- + //---------------------------------- VIEWS ------------------------------------------- + //-------------------------------------------------------------------------------------- + + /** + * @notice Checks if an asset is supported. + * @dev Returns true if the asset is active. + */ + function assetIsSupported(IERC20 asset) public view returns (bool) { + return _assetData[asset].status == AssetStatus.Active; + } + + function assetData(IERC20 asset) public view returns (AssetData memory) { + return _assetData[asset]; + } + + //-------------------------------------------------------------------------------------- + //---------------------------------- MODIFIERS --------------------------------------- + //-------------------------------------------------------------------------------------- + + /// @notice Ensure that the given address is not the zero address. + /// @param _address The address to check. + modifier notZeroAddress(address _address) { + if (_address == address(0)) { + revert ZeroAddress(); + } + _; + } + + modifier whenNotPaused() { + if (actionsPaused) { + revert Paused(); + } + _; + } + } \ No newline at end of file diff --git a/src/ynEIGEN/EigenStrategyManager.sol b/src/ynEIGEN/EigenStrategyManager.sol new file mode 100644 index 000000000..86599085d --- /dev/null +++ b/src/ynEIGEN/EigenStrategyManager.sol @@ -0,0 +1,403 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {Initializable} from "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol"; +import {AccessControlUpgradeable} from "lib/openzeppelin-contracts-upgradeable/contracts/access/AccessControlUpgradeable.sol"; +import {ReentrancyGuardUpgradeable} from "lib/openzeppelin-contracts-upgradeable/contracts/utils/ReentrancyGuardUpgradeable.sol"; +import {IStrategyManager} from "lib/eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol"; +import {IDelegationManager} from "lib/eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol"; +import {IStrategy} from "lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; +import {IYieldNestStrategyManager} from "src/interfaces/IYieldNestStrategyManager.sol"; +import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; +import {ITokenStakingNodesManager} from "src/interfaces/ITokenStakingNodesManager.sol"; +import {ITokenStakingNode} from "src/interfaces/ITokenStakingNode.sol"; +import {IynEigen} from "src/interfaces/IynEigen.sol"; +import {IwstETH} from "src/external/lido/IwstETH.sol"; +import {IERC4626} from "lib/openzeppelin-contracts/contracts/interfaces/IERC4626.sol"; +import {SafeERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol"; + + +interface IEigenStrategyManagerEvents { + event StrategyAdded(address indexed asset, address indexed strategy); + event StakedAssetsToNode(uint256 indexed nodeId, IERC20[] assets, uint256[] amounts); + event DepositedToEigenlayer(IERC20[] depositAssets, uint256[] depositAmounts, IStrategy[] strategiesForNode); +} + +/** @title EigenStrategyManager + * @dev This contract handles the strategy management for ynEigen asset allocations. + */ +contract EigenStrategyManager is + IYieldNestStrategyManager, + IEigenStrategyManagerEvents, + Initializable, + AccessControlUpgradeable, + ReentrancyGuardUpgradeable + { + + using SafeERC20 for IERC20; + + + //-------------------------------------------------------------------------------------- + //---------------------------------- STRUCTS ----------------------------------------- + //-------------------------------------------------------------------------------------- + + + struct NodeAllocation { + uint256 nodeId; + IERC20[] assets; + uint256[] amounts; + } + + //-------------------------------------------------------------------------------------- + //---------------------------------- ERRORS ------------------------------------------ + //-------------------------------------------------------------------------------------- + + error ZeroAddress(); + error InvalidNodeId(uint256 nodeId); + error InvalidStakingAmount(uint256 amount); + error StrategyNotFound(address asset); + error LengthMismatch(uint256 length1, uint256 length2); + error AssetAlreadyExists(address asset); + error NoStrategyDefinedForAsset(address asset); + error AssetDoesNotMatchStrategyUnderlyingToken(address asset, address strategyUnderlyingToken); + + + //-------------------------------------------------------------------------------------- + //---------------------------------- ROLES ------------------------------------------- + //-------------------------------------------------------------------------------------- + + /// @notice Role is allowed to set the pause state + bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); + + /// @notice Role allowed to unset the pause state + bytes32 public constant UNPAUSER_ROLE = keccak256("UNPAUSER_ROLE"); + + /// @notice Controls the strategy actions + bytes32 public constant STRATEGY_CONTROLLER_ROLE = keccak256("STRATEGY_CONTROLLER_ROLE"); + + /// @notice Role allowed to manage strategies + bytes32 public constant STRATEGY_ADMIN_ROLE = keccak256("STRATEGY_ADMIN_ROLE"); + + //-------------------------------------------------------------------------------------- + //---------------------------------- CONSTANTS --------------------------------------- + //-------------------------------------------------------------------------------------- + + + //-------------------------------------------------------------------------------------- + //---------------------------------- VARIABLES --------------------------------------- + //-------------------------------------------------------------------------------------- + + IynEigen public ynEigen; + IStrategyManager public strategyManager; + IDelegationManager public delegationManager; + ITokenStakingNodesManager public tokenStakingNodesManager; + + // Mapping of asset to its corresponding strategy + mapping(IERC20 => IStrategy) public strategies; + + IwstETH public wstETH; + IERC4626 public woETH; + IERC20 public oETH; + IERC20 public stETH; + + //-------------------------------------------------------------------------------------- + //---------------------------------- INITIALIZATION ---------------------------------- + //-------------------------------------------------------------------------------------- + + struct Init { + IERC20[] assets; + IStrategy[] strategies; + IynEigen ynEigen; + IStrategyManager strategyManager; + IDelegationManager delegationManager; + ITokenStakingNodesManager tokenStakingNodesManager; + address admin; + address strategyController; + address unpauser; + address pauser; + address strategyAdmin; + IwstETH wstETH; + IERC4626 woETH; + } + + function initialize(Init calldata init) + public + notZeroAddress(address(init.strategyManager)) + notZeroAddress(address(init.admin)) + notZeroAddress(address(init.strategyController)) + initializer { + __AccessControl_init(); + + _grantRole(DEFAULT_ADMIN_ROLE, init.admin); + _grantRole(PAUSER_ROLE, init.pauser); + _grantRole(UNPAUSER_ROLE, init.unpauser); + _grantRole(STRATEGY_CONTROLLER_ROLE, init.strategyController); + _grantRole(STRATEGY_ADMIN_ROLE, init.strategyAdmin); + + for (uint256 i = 0; i < init.assets.length; i++) { + if (address(init.assets[i]) == address(0) || address(init.strategies[i]) == address(0)) { + revert ZeroAddress(); + } + if (strategies[init.assets[i]] != IStrategy(address(0))) { + revert AssetAlreadyExists(address(init.assets[i])); + } + strategies[init.assets[i]] = init.strategies[i]; + emit StrategyAdded(address(init.assets[i]), address(init.strategies[i])); + } + + ynEigen = init.ynEigen; + + strategyManager = init.strategyManager; + delegationManager = init.delegationManager; + tokenStakingNodesManager = init.tokenStakingNodesManager; + wstETH = init.wstETH; + woETH = init.woETH; + stETH = IERC20(wstETH.stETH()); + oETH = IERC20(woETH.asset()); + } + + //-------------------------------------------------------------------------------------- + //---------------------------------- STRATEGY ---------------------------------------- + //-------------------------------------------------------------------------------------- + + /** + * @notice Stakes specified amounts of assets into a specific node on EigenLayer. + * @param nodeId The ID of the node where assets will be staked. + * @param assets An array of ERC20 tokens to be staked. + * @param amounts An array of amounts corresponding to each asset to be staked. + */ + function stakeAssetsToNode( + uint256 nodeId, + IERC20[] memory assets, + uint256[] memory amounts + ) public onlyRole(STRATEGY_CONTROLLER_ROLE) nonReentrant { + _stakeAssetsToNode(nodeId, assets, amounts); + } + + /** + * @notice Stakes assets to multiple nodes on EigenLayer according to the specified allocations. + * @param allocations An array of NodeAllocation structs, each containing a node ID, an array of assets, + * and an array of amounts to stake on that node. + */ + function stakeAssetsToNodes(NodeAllocation[] calldata allocations) external onlyRole(STRATEGY_CONTROLLER_ROLE) nonReentrant { + for (uint256 i = 0; i < allocations.length; i++) { + NodeAllocation memory allocation = allocations[i]; + _stakeAssetsToNode(allocation.nodeId, allocation.assets, allocation.amounts); + } + } + + function _stakeAssetsToNode( + uint256 nodeId, + IERC20[] memory assets, + uint256[] memory amounts + ) internal { + uint256 assetsLength = assets.length; + uint256 amountsLength = amounts.length; + + if (assetsLength != amountsLength) { + revert LengthMismatch(assetsLength, amountsLength); + } + + ITokenStakingNode node = tokenStakingNodesManager.getNodeById(nodeId); + if (address(node) == address(0)) { + revert InvalidNodeId(nodeId); + } + + IStrategy[] memory strategiesForNode = new IStrategy[](assetsLength); + for (uint256 i = 0; i < assetsLength; i++) { + IERC20 asset = assets[i]; + if (amounts[i] == 0) { + revert InvalidStakingAmount(amounts[i]); + } + IStrategy strategy = strategies[asset]; + if (address(strategy) == address(0)) { + revert StrategyNotFound(address(asset)); + } + strategiesForNode[i] = strategy; + } + // Transfer assets to node + ynEigen.retrieveAssets(assets, amounts); + + IERC20[] memory depositAssets = new IERC20[](assetsLength); + uint256[] memory depositAmounts = new uint256[](amountsLength); + + for (uint256 i = 0; i < assetsLength; i++) { + (IERC20 depositAsset, uint256 depositAmount) = toEigenLayerDeposit(assets[i], amounts[i]); + depositAssets[i] = depositAsset; + depositAmounts[i] = depositAmount; + + // Transfer each asset to the node + depositAsset.safeTransfer(address(node), depositAmount); + } + + emit StakedAssetsToNode(nodeId, assets, amounts); + + node.depositAssetsToEigenlayer(depositAssets, depositAmounts, strategiesForNode); + + emit DepositedToEigenlayer(depositAssets, depositAmounts, strategiesForNode); + } + + function toEigenLayerDeposit( + IERC20 asset, + uint256 amount + ) internal returns (IERC20 depositAsset, uint256 depositAmount) { + if (address(asset) == address(wstETH)) { + // Adjust for wstETH + depositAsset = stETH; + depositAmount = wstETH.unwrap(amount); + } else if (address(asset) == address(woETH)) { + // Adjust for woeth + depositAsset = oETH; + // calling redeem with receiver and owner as address(this) + depositAmount = woETH.redeem(amount, address(this), address(this)); + } else { + // No adjustment needed + depositAsset = asset; + depositAmount = amount; + } + } + + //-------------------------------------------------------------------------------------- + //---------------------------------- ADMIN ------------------------------------------- + //-------------------------------------------------------------------------------------- + + /** + * @notice Adds a new strategy for a specific asset. + * @param asset The asset for which the strategy is to be added. + * @param strategy The strategy contract address to be associated with the asset. + */ + function setStrategy(IERC20 asset, IStrategy strategy) + external + onlyRole(STRATEGY_ADMIN_ROLE) + notZeroAddress(address(asset)) + notZeroAddress(address(strategy)) { + if (address(strategy.underlyingToken()) != address(asset)) { + revert AssetDoesNotMatchStrategyUnderlyingToken(address(asset), address(strategy.underlyingToken())); + } + + strategies[asset] = strategy; + emit StrategyAdded(address(asset), address(strategy)); + } + + //-------------------------------------------------------------------------------------- + //---------------------------------- VIEWS ------------------------------------------- + //-------------------------------------------------------------------------------------- + + /** + * @notice Retrieves the total balances of staked assets across all nodes. + * @param assets An array of ERC20 tokens for which balances are to be retrieved. + * @return stakedBalances An array of total balances for each asset, indexed in the same order as the `assets` array. + */ + function getStakedAssetsBalances(IERC20[] calldata assets) public view returns (uint256[] memory stakedBalances) { + + stakedBalances = new uint256[](assets.length); + // Add balances contained in each TokenStakingNode, including those managed by strategies. + + ITokenStakingNode[] memory nodes = tokenStakingNodesManager.getAllNodes(); + uint256 nodesCount = nodes.length; + uint256 assetsCount = assets.length; + for (uint256 j = 0; j < assetsCount; j++) { + + IERC20 asset = assets[j]; + for (uint256 i; i < nodesCount; i++ ) { + ITokenStakingNode node = nodes[i]; + + uint256 strategyBalance = toUserAssetAmount( + asset, + strategies[asset].userUnderlyingView((address(node))) + ); + stakedBalances[j] += strategyBalance; + } + } + } + + /** + * @notice Converts the user's underlying asset amount to the equivalent user asset amount. + * @dev This function handles the conversion for wrapped staked ETH (wstETH) and wrapped other ETH (woETH), + * returning the equivalent amount in the respective wrapped token. + * @param asset The ERC20 token for which the conversion is being made. + * @param userUnderlyingView The amount of the underlying asset. + * @return The equivalent amount in the user asset denomination. + */ + function toUserAssetAmount(IERC20 asset, uint256 userUnderlyingView) public view returns (uint256) { + if (address(asset) == address(wstETH)) { + // Adjust for wstETH using view method, converting stETH to wstETH + return wstETH.getWstETHByStETH(userUnderlyingView); + } + if (address(asset) == address(woETH)) { + // Adjust for woETH using view method, converting oETH to woETH + return woETH.previewDeposit(userUnderlyingView); + } + return userUnderlyingView; + } + + /** + * @notice Retrieves the total staked balance of a specific asset across all nodes. + * @param asset The ERC20 token for which the staked balance is to be retrieved. + * @return stakedBalance The total staked balance of the specified asset. + */ + function getStakedAssetBalance(IERC20 asset) public view returns (uint256 stakedBalance) { + if (address(strategies[asset]) == address(0)) { + revert NoStrategyDefinedForAsset(address(asset)); + } + + ITokenStakingNode[] memory nodes = tokenStakingNodesManager.getAllNodes(); + uint256 nodesCount = nodes.length; + for (uint256 i; i < nodesCount; i++ ) { + ITokenStakingNode node = nodes[i]; + stakedBalance += _getStakedAssetBalanceForNode(asset, node); + } + } + + /** + * @notice Retrieves the staked balance of a specific asset for a given node. + * @param asset The ERC20 token for which the staked balance is to be retrieved. + * @param nodeId The specific nodeId for which the staked balance is to be retrieved. + * @return stakedBalance The staked balance of the specified asset for the given node. + */ + function getStakedAssetBalanceForNode( + IERC20 asset, + uint256 nodeId + ) public view returns (uint256 stakedBalance) { + if (address(strategies[asset]) == address(0)) { + revert NoStrategyDefinedForAsset(address(asset)); + } + + ITokenStakingNode node = tokenStakingNodesManager.getNodeById(nodeId); + return _getStakedAssetBalanceForNode(asset, node); + } + + function _getStakedAssetBalanceForNode( + IERC20 asset, + ITokenStakingNode node + ) internal view returns (uint256 stakedBalance) { + + uint256 strategyBalance = toUserAssetAmount( + asset, + strategies[asset].userUnderlyingView((address(node))) + ); + stakedBalance += strategyBalance; + } + + /** + * @notice Checks if a given asset is supported by any strategy. + * @param asset The ERC20 token to check. + * @return isSupported True if there is a strategy defined for the asset, false otherwise. + */ + function supportsAsset(IERC20 asset) public view returns (bool) { + return address(strategies[asset]) != address(0); + } + + //-------------------------------------------------------------------------------------- + //---------------------------------- MODIFIERS --------------------------------------- + //-------------------------------------------------------------------------------------- + + /// @notice Ensure that the given address is not the zero address. + /// @param _address The address to check. + modifier notZeroAddress(address _address) { + if (_address == address(0)) { + revert ZeroAddress(); + } + _; + } +} diff --git a/src/ynEIGEN/LSDRateProvider.sol b/src/ynEIGEN/LSDRateProvider.sol new file mode 100644 index 000000000..20d5de744 --- /dev/null +++ b/src/ynEIGEN/LSDRateProvider.sol @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {IERC4626} from "lib/openzeppelin-contracts/contracts/interfaces/IERC4626.sol"; +import {IstETH} from "src/external/lido/IstETH.sol"; +import {IrETH} from "src/external/rocketpool/IrETH.sol"; +import {IswETH} from "src/external/swell/IswETH.sol"; +import {ImETHStaking} from "src/external/mantle/ImETHStaking.sol"; +import {IFrxEthWethDualOracle} from "src/external/frax/IFrxEthWethDualOracle.sol"; +import {IsfrxETH} from "src/external/frax/IsfrxETH.sol"; + +contract LSDRateProvider { + + //-------------------------------------------------------------------------------------- + //---------------------------------- ERRORS ------------------------------------------ + //-------------------------------------------------------------------------------------- + + error UnsupportedAsset(address asset); + + //-------------------------------------------------------------------------------------- + //---------------------------------- CONSTANTS --------------------------------------- + //-------------------------------------------------------------------------------------- + + uint256 constant UNIT = 1e18; + address constant public FRAX_ASSET = 0xac3E018457B222d93114458476f3E3416Abbe38F; // sfrxETH + address constant public FRX_ETH_WETH_DUAL_ORACLE = 0x350a9841956D8B0212EAdF5E14a449CA85FAE1C0; // FrxEthWethDualOracle + address constant public LIDO_ASSET = 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0; // wstETH + address constant public RETH_ASSET = 0xae78736Cd615f374D3085123A210448E74Fc6393; // RETH + address constant public WOETH_ASSET = 0xDcEe70654261AF21C44c093C300eD3Bb97b78192; + address constant public SWELL_ASSET = 0xf951E335afb289353dc249e82926178EaC7DEd78; + address constant public METH_ASSET = 0xd5F7838F5C461fefF7FE49ea5ebaF7728bB0ADfa; + address constant public METH_STAKING_CONTRACT = 0xe3cBd06D7dadB3F4e6557bAb7EdD924CD1489E8f; + + address constant public LIDO_UDERLYING = 0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84; // stETH + + //-------------------------------------------------------------------------------------- + //---------------------------------- INITIALIZATION ---------------------------------- + //-------------------------------------------------------------------------------------- + + /** + * @dev Returns the rate of the specified asset. + * @param _asset The address of the asset for which to get the rate. + * @return The rate of the specified asset in terms of its underlying value. + * @notice This function handles multiple types of liquid staking derivatives (LSDs) and their respective rates. + * It supports Lido's stETH, Frax's sfrxETH, Rocket Pool's rETH, Swell's swETH, and Wrapped stETH. + * It reverts if the asset is not supported. + * The rates are sourced from each protocol's specific redemption rate provider. + */ + function rate(address _asset) external view returns (uint256) { + + if (_asset == LIDO_ASSET) { + return IstETH(LIDO_UDERLYING).getPooledEthByShares(UNIT); + } + if (_asset == FRAX_ASSET) { + /* + + The deposit asset for sfrxETH is frxETH and not ETH. In order to account for any frxETH/ETH rate fluctuations, + an frxETH/ETH oracle is used as provided by Frax. + + Documentation: https://docs.frax.finance/frax-oracle/advanced-concepts + */ + uint256 frxETHPriceInETH = IFrxEthWethDualOracle(FRX_ETH_WETH_DUAL_ORACLE).getCurveEmaEthPerFrxEth(); + return IsfrxETH(FRAX_ASSET).pricePerShare() * frxETHPriceInETH / UNIT; + } + if (_asset == WOETH_ASSET) { + return IERC4626(WOETH_ASSET).previewRedeem(UNIT); + } + if (_asset == RETH_ASSET) { + return IrETH(RETH_ASSET).getExchangeRate(); + } + if (_asset == METH_ASSET) { + return ImETHStaking(METH_STAKING_CONTRACT).mETHToETH(UNIT); + } + if (_asset == SWELL_ASSET) { + return IswETH(SWELL_ASSET).swETHToETHRate(); + } + revert UnsupportedAsset(_asset); + } +} diff --git a/src/LSDStakingNode.sol b/src/ynEIGEN/TokenStakingNode.sol similarity index 68% rename from src/LSDStakingNode.sol rename to src/ynEIGEN/TokenStakingNode.sol index 73a4f094e..084ca071b 100644 --- a/src/LSDStakingNode.sol +++ b/src/ynEIGEN/TokenStakingNode.sol @@ -10,22 +10,31 @@ import {ISignatureUtils} from "lib/eigenlayer-contracts/src/contracts/interfaces import {IStrategyManager} from "lib/eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol"; import {IDelegationManager} from "lib/eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol"; import {IStrategy} from "lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; -import {IynLSD} from "src/interfaces/IynLSD.sol"; -import {ILSDStakingNode} from "src/interfaces/ILSDStakingNode.sol"; - -interface ILSDStakingNodeEvents { - event DepositToEigenlayer(IERC20 indexed asset, IStrategy indexed strategy, uint256 amount, uint256 eigenShares); +import {ITokenStakingNode} from "src/interfaces/ITokenStakingNode.sol"; +import {ITokenStakingNodesManager} from "src/interfaces/ITokenStakingNodesManager.sol"; + +interface ITokenStakingNodeEvents { + event DepositToEigenlayer( + IERC20 indexed asset, + IStrategy indexed strategy, + uint256 amount, + uint256 eigenShares + ); event Delegated(address indexed operator, bytes32 approverSalt); event Undelegated(bytes32[] withdrawalRoots); } /** - * @title LSD Staking Node - * @dev Implements staking node functionality for LSD tokens, enabling LSD staking, delegation, and rewards management. + * @title Token Staking Node + * @dev Implements staking node functionality for tokens, enabling token staking, delegation, and rewards management. * This contract interacts with the Eigenlayer protocol to deposit assets, delegate staking operations, and manage staking rewards. */ -contract LSDStakingNode is ILSDStakingNode, Initializable, ReentrancyGuardUpgradeable, ILSDStakingNodeEvents { - +contract TokenStakingNode is + ITokenStakingNode, + Initializable, + ReentrancyGuardUpgradeable, + ITokenStakingNodeEvents +{ using SafeERC20 for IERC20; //-------------------------------------------------------------------------------------- @@ -33,13 +42,15 @@ contract LSDStakingNode is ILSDStakingNode, Initializable, ReentrancyGuardUpgrad //-------------------------------------------------------------------------------------- error ZeroAddress(); - error NotLSDRestakingManager(); + error NotTokenStakingNodeOperator(); + error NotStrategyManager(); + error NotTokenStakingNodeDelegator(); //-------------------------------------------------------------------------------------- //---------------------------------- VARIABLES --------------------------------------- //-------------------------------------------------------------------------------------- - IynLSD public ynLSD; + ITokenStakingNodesManager public override tokenStakingNodesManager; uint256 public nodeId; //-------------------------------------------------------------------------------------- @@ -47,15 +58,18 @@ contract LSDStakingNode is ILSDStakingNode, Initializable, ReentrancyGuardUpgrad //-------------------------------------------------------------------------------------- constructor() { - _disableInitializers(); + _disableInitializers(); } - function initialize(Init memory init) + function initialize( + Init memory init + ) public - notZeroAddress(address(init.ynLSD)) - initializer { + notZeroAddress(address(init.tokenStakingNodesManager)) + initializer + { __ReentrancyGuard_init(); - ynLSD = init.ynLSD; + tokenStakingNodesManager = init.tokenStakingNodesManager; nodeId = init.nodeId; } @@ -64,35 +78,33 @@ contract LSDStakingNode is ILSDStakingNode, Initializable, ReentrancyGuardUpgrad //-------------------------------------------------------------------------------------- /** - * @notice Deposits multiple assets into their respective strategies on Eigenlayer by retrieving them from ynLSD. + * @notice Deposits multiple assets into their respective strategies on Eigenlayer by retrieving them from tokenStakingNodesManager. * @dev Iterates through the provided arrays of assets and amounts, depositing each into its corresponding strategy. * @param assets An array of IERC20 tokens to be deposited. * @param amounts An array of amounts corresponding to each asset to be deposited. */ function depositAssetsToEigenlayer( - IERC20[] memory assets, - uint256[] memory amounts - ) - external - nonReentrant - onlyLSDRestakingManager - { - IStrategyManager strategyManager = ynLSD.strategyManager(); - - for (uint256 i = 0; i < assets.length; i++) { + IERC20[] calldata assets, + uint256[] calldata amounts, + IStrategy[] calldata strategies + ) external nonReentrant onlyYieldNestStrategyManager { + IStrategyManager strategyManager = tokenStakingNodesManager + .strategyManager(); + + uint256 assetsLength = assets.length; + for (uint256 i = 0; i < assetsLength; i++) { IERC20 asset = assets[i]; uint256 amount = amounts[i]; - IStrategy strategy = ynLSD.strategies(asset); - - uint256 balanceBefore = asset.balanceOf(address(this)); - ynLSD.retrieveAsset(nodeId, asset, amount); - uint256 balanceAfter = asset.balanceOf(address(this)); - uint256 retrievedAmount = balanceAfter - balanceBefore; + IStrategy strategy = strategies[i]; - asset.forceApprove(address(strategyManager), retrievedAmount); + asset.forceApprove(address(strategyManager), amount); - uint256 eigenShares = strategyManager.depositIntoStrategy(IStrategy(strategy), asset, retrievedAmount); - emit DepositToEigenlayer(asset, strategy, retrievedAmount, eigenShares); + uint256 eigenShares = strategyManager.depositIntoStrategy( + IStrategy(strategy), + asset, + amount + ); + emit DepositToEigenlayer(asset, strategy, amount, eigenShares); } } @@ -108,40 +120,51 @@ contract LSDStakingNode is ILSDStakingNode, Initializable, ReentrancyGuardUpgrad address operator, ISignatureUtils.SignatureWithExpiry memory signature, bytes32 approverSalt - ) public virtual onlyLSDRestakingManager { - - IDelegationManager delegationManager = ynLSD.delegationManager(); + ) public virtual onlyDelegator { + IDelegationManager delegationManager = tokenStakingNodesManager + .delegationManager(); delegationManager.delegateTo(operator, signature, approverSalt); - emit Delegated(operator, 0); + emit Delegated(operator, approverSalt); } /** * @notice Undelegates the staking operation. */ - function undelegate() public override onlyLSDRestakingManager { - - IDelegationManager delegationManager = IDelegationManager(address(ynLSD.delegationManager())); - bytes32[] memory withdrawalRoots = delegationManager.undelegate(address(this)); + function undelegate() public override onlyDelegator { + IDelegationManager delegationManager = IDelegationManager( + address(tokenStakingNodesManager.delegationManager()) + ); + bytes32[] memory withdrawalRoots = delegationManager.undelegate( + address(this) + ); emit Undelegated(withdrawalRoots); } - /** - * @notice Recovers assets that were deposited directly - * @param asset The asset to be recovered - */ - function recoverAssets(IERC20 asset) external onlyLSDRestakingManager { - asset.safeTransfer(address(ynLSD), asset.balanceOf(address(this))); - } - //-------------------------------------------------------------------------------------- //---------------------------------- MODIFIERS --------------------------------------- //-------------------------------------------------------------------------------------- - modifier onlyLSDRestakingManager() { - if (!ynLSD.hasLSDRestakingManagerRole(msg.sender)) { - revert NotLSDRestakingManager(); + modifier onlyOperator() { + if ( + !tokenStakingNodesManager.hasTokenStakingNodeOperatorRole(msg.sender) + ) { + revert NotTokenStakingNodeOperator(); + } + _; + } + + modifier onlyDelegator() { + if (!tokenStakingNodesManager.hasTokenStakingNodeDelegatorRole(msg.sender)) { + revert NotTokenStakingNodeDelegator(); + } + _; + } + + modifier onlyYieldNestStrategyManager() { + if (!tokenStakingNodesManager.hasYieldNestStrategyManagerRole(msg.sender)) { + revert NotStrategyManager(); } _; } @@ -171,7 +194,6 @@ contract LSDStakingNode is ILSDStakingNode, Initializable, ReentrancyGuardUpgrad return _getInitializedVersion(); } - //-------------------------------------------------------------------------------------- //---------------------------------- MODIFIERS --------------------------------------- //-------------------------------------------------------------------------------------- diff --git a/src/ynEIGEN/TokenStakingNodesManager.sol b/src/ynEIGEN/TokenStakingNodesManager.sol new file mode 100644 index 000000000..992682933 --- /dev/null +++ b/src/ynEIGEN/TokenStakingNodesManager.sol @@ -0,0 +1,320 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {SafeERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol"; +import {BeaconProxy} from "lib/openzeppelin-contracts/contracts/proxy/beacon/BeaconProxy.sol"; +import {UpgradeableBeacon} from "lib/openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol"; +import {AccessControlUpgradeable} from "lib/openzeppelin-contracts-upgradeable/contracts/access/AccessControlUpgradeable.sol"; +import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; +import {IStrategyManager} from "lib/eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol"; +import {IDelegationManager} from "lib/eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol"; +import {ITokenStakingNode} from "src/interfaces/ITokenStakingNode.sol"; +import {ITokenStakingNodesManager} from "src/interfaces/ITokenStakingNodesManager.sol"; + +interface ITokenStakingNodesManagerEvents { + + event AssetRetrieved(IERC20 asset, uint256 amount, uint256 nodeId, address sender); + event TokenStakingNodeCreated(uint256 nodeId, address nodeAddress); + event MaxNodeCountUpdated(uint256 maxNodeCount); + event DepositsPausedUpdated(bool paused); + + event RegisteredStakingNodeImplementationContract(address upgradeableBeaconAddress, address implementationContract); + event UpgradedStakingNodeImplementationContract(address implementationContract, uint256 nodesCount); + event NodeInitialized(address nodeAddress, uint64 initializedVersion); +} + +contract TokenStakingNodesManager is AccessControlUpgradeable, ITokenStakingNodesManager, ITokenStakingNodesManagerEvents { + using SafeERC20 for IERC20; + + //-------------------------------------------------------------------------------------- + //---------------------------------- ERRORS ------------------------------------------ + //-------------------------------------------------------------------------------------- + + error UnsupportedAsset(IERC20 asset); + error Unauthorized(); + error InsufficientFunds(); + error Paused(); + error ZeroAmount(); + error ZeroAddress(); + error BeaconImplementationAlreadyExists(); + error NoBeaconImplementationExists(); + error TooManyStakingNodes(uint256 maxNodeCount); + error NodeIdOutOfRange(uint256 nodeId); + + //-------------------------------------------------------------------------------------- + //---------------------------------- ROLES ------------------------------------------- + //-------------------------------------------------------------------------------------- + + bytes32 public constant STAKING_ADMIN_ROLE = keccak256("STAKING_ADMIN_ROLE"); + bytes32 public constant TOKEN_STAKING_NODE_OPERATOR_ROLE = keccak256("TOKEN_STAKING_NODE_OPERATOR_ROLE"); + bytes32 public constant TOKEN_STAKING_NODES_DELEGATOR_ROLE = keccak256("TOKEN_STAKING_NODES_DELEGATOR_ROLE"); + bytes32 public constant TOKEN_STAKING_NODE_CREATOR_ROLE = keccak256("TOKEN_STAKING_NODE_CREATOR_ROLE"); + bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); + bytes32 public constant UNPAUSER_ROLE = keccak256("UNPAUSER_ROLE"); + + //-------------------------------------------------------------------------------------- + //---------------------------------- VARIABLES --------------------------------------- + //-------------------------------------------------------------------------------------- + + IStrategyManager public strategyManager; + IDelegationManager public delegationManager; + address public yieldNestStrategyManager; + + UpgradeableBeacon public upgradeableBeacon; + + /** + * @notice Array of Token Staking Node contracts. + * @dev These nodes are crucial for the delegation process within the YieldNest protocol. Each node represents a unique staking entity + * that can delegate tokens to various operators for yield optimization. + */ + ITokenStakingNode[] public nodes; + uint256 public maxNodeCount; + + //-------------------------------------------------------------------------------------- + //---------------------------------- EVENTS ------------------------------------------ + //-------------------------------------------------------------------------------------- + + event NodeAdded(address indexed node); + event NodeRemoved(address indexed node); + event FundsTransferredToNode(address indexed node, uint256 amount); + event FundsReceivedFromNode(address indexed node, uint256 amount); + + //-------------------------------------------------------------------------------------- + //---------------------------------- INITIALIZATION ---------------------------------- + //-------------------------------------------------------------------------------------- + + constructor() { + _disableInitializers(); + } + + struct Init { + IStrategyManager strategyManager; + IDelegationManager delegationManager; + address yieldNestStrategyManager; + uint256 maxNodeCount; + address admin; + address pauser; + address unpauser; + address stakingAdmin; + address tokenStakingNodeOperator; + address tokenStakingNodeCreatorRole; + address tokenStakingNodesDelegator; + } + + function initialize(Init calldata init) + public + notZeroAddress(address(init.strategyManager)) + notZeroAddress(address(init.admin)) + notZeroAddress(address(init.stakingAdmin)) + notZeroAddress(address(init.tokenStakingNodeOperator)) + notZeroAddress(init.tokenStakingNodeCreatorRole) + notZeroAddress(init.tokenStakingNodesDelegator) + initializer { + __AccessControl_init(); + + _grantRole(DEFAULT_ADMIN_ROLE, init.admin); + _grantRole(STAKING_ADMIN_ROLE, init.stakingAdmin); + _grantRole(TOKEN_STAKING_NODE_OPERATOR_ROLE, init.tokenStakingNodeOperator); + _grantRole(TOKEN_STAKING_NODE_CREATOR_ROLE, init.tokenStakingNodeCreatorRole); + _grantRole(TOKEN_STAKING_NODES_DELEGATOR_ROLE, init.tokenStakingNodesDelegator); + _grantRole(PAUSER_ROLE, init.pauser); + _grantRole(UNPAUSER_ROLE, init.unpauser); + + strategyManager = init.strategyManager; + delegationManager = init.delegationManager; + yieldNestStrategyManager = init.yieldNestStrategyManager; + maxNodeCount = init.maxNodeCount; + } + + + //-------------------------------------------------------------------------------------- + //---------------------------------- STAKING NODE CREATION --------------------------- + //-------------------------------------------------------------------------------------- + + /** + * @notice Creates a new Token Staking Node using the Upgradeable Beacon pattern. + * @dev This function creates a new BeaconProxy instance pointing to the current implementation set in the upgradeableBeacon. + * It initializes the staking node, adds it to the nodes array, and emits an event. + * Reverts if the maximum number of staking nodes has been reached. + * @return ITokenStakingNode The interface of the newly created Token Staking Node. + */ + function createTokenStakingNode() + public + notZeroAddress((address(upgradeableBeacon))) + onlyRole(TOKEN_STAKING_NODE_CREATOR_ROLE) + returns (ITokenStakingNode) { + + uint256 nodeId = nodes.length; + + if (nodeId >= maxNodeCount) { + revert TooManyStakingNodes(maxNodeCount); + } + + BeaconProxy proxy = new BeaconProxy(address(upgradeableBeacon), ""); + ITokenStakingNode node = ITokenStakingNode(payable(proxy)); + + initializeTokenStakingNode(node, nodeId); + + nodes.push(node); + + emit TokenStakingNodeCreated(nodeId, address(node)); + + return node; + } + + /** + * @notice Initializes a newly created Token Staking Node. + * @dev This function checks the current initialized version of the node and performs initialization if it hasn't been done. + * For future versions, additional conditional blocks should be added to handle version-specific initialization. + * @param node The ITokenStakingNode instance to be initialized. + * @param nodeId The ID of the staking node. + */ + function initializeTokenStakingNode(ITokenStakingNode node, uint256 nodeId) virtual internal { + + uint64 initializedVersion = node.getInitializedVersion(); + if (initializedVersion == 0) { + node.initialize( + ITokenStakingNode.Init(ITokenStakingNodesManager(address(this)), nodeId) + ); + + // update version to latest + initializedVersion = node.getInitializedVersion(); + emit NodeInitialized(address(node), initializedVersion); + } + + // NOTE: for future versions add additional if clauses that initialize the node + // for the next version while keeping the previous initializers + } + + /** + * @notice Registers a new Token Staking Node implementation contract. + * @dev This function sets a new implementation contract for the Token Staking Node by creating a new UpgradeableBeacon. + * It can only be called once to boostrap the first implementation. + * @param _implementationContract The address of the new Token Staking Node implementation contract. + */ + function registerTokenStakingNode(address _implementationContract) + public + onlyRole(STAKING_ADMIN_ROLE) + notZeroAddress(_implementationContract) { + + if (address(upgradeableBeacon) != address(0)) { + revert BeaconImplementationAlreadyExists(); + } + + upgradeableBeacon = new UpgradeableBeacon(_implementationContract, address(this)); + + emit RegisteredStakingNodeImplementationContract(address(upgradeableBeacon), _implementationContract); + } + + /** + * @notice Upgrades the Token Staking Node implementation to a new version. + * @dev This function upgrades the implementation contract of the Token Staking Nodes by setting a new implementation address in the upgradeable beacon. + * It then reinitializes all existing staking nodes to ensure they are compatible with the new implementation. + * This function can only be called by an account with the STAKING_ADMIN_ROLE. + * @param _implementationContract The address of the new implementation contract. + */ + function upgradeTokenStakingNode(address _implementationContract) + public + onlyRole(STAKING_ADMIN_ROLE) + notZeroAddress(_implementationContract) { + + if (address(upgradeableBeacon) == address(0)) { + revert NoBeaconImplementationExists(); + } + + upgradeableBeacon.upgradeTo(_implementationContract); + + uint256 nodeCount = nodes.length; + + // Reinitialize all nodes to ensure compatibility with the new implementation. + for (uint256 i = 0; i < nodeCount; i++) { + initializeTokenStakingNode(nodes[i], nodeCount); + } + + emit UpgradedStakingNodeImplementationContract(address(_implementationContract), nodeCount); + } + + /// @notice Sets the maximum number of staking nodes allowed + /// @param _maxNodeCount The maximum number of staking nodes + function setMaxNodeCount(uint256 _maxNodeCount) public onlyRole(STAKING_ADMIN_ROLE) { + maxNodeCount = _maxNodeCount; + emit MaxNodeCountUpdated(_maxNodeCount); + } + + //-------------------------------------------------------------------------------------- + //---------------------------------- TokenStakingNode Roles -------------------------- + //-------------------------------------------------------------------------------------- + + /** + * @notice Checks if the specified account has the Token Staking Node Operator role. + * @param account The address to check for the role. + * @return True if the account has the Token Staking Node Operator role, false otherwise. + */ + function hasTokenStakingNodeOperatorRole(address account) external view returns (bool) { + return hasRole(TOKEN_STAKING_NODE_OPERATOR_ROLE, account); + } + + /** + * @notice Checks if the specified address has the Token Staking Node Delegator role. + * @param _address The address to check for the role. + * @return True if the address has the Token Staking Node Delegator role, false otherwise. + */ + function hasTokenStakingNodeDelegatorRole(address _address) public view returns (bool) { + return hasRole(TOKEN_STAKING_NODES_DELEGATOR_ROLE, _address); + } + + /** + * @notice Checks if the specified address has the EigenStrategyManager role. + * @param caller The address to check. + * @return True if the specified address is the EigenStrategyManager, false otherwise. + */ + function hasYieldNestStrategyManagerRole(address caller) public view returns (bool) { + return caller == yieldNestStrategyManager; + } + + //-------------------------------------------------------------------------------------- + //---------------------------------- VIEWS ------------------------------------------- + //-------------------------------------------------------------------------------------- + + /** + * @notice Retrieves all registered token staking nodes. + * @return An array of addresses representing all the token staking nodes. + */ + function getAllNodes() public view returns (ITokenStakingNode[] memory) { + return nodes; + } + + /** + * @notice Gets the total number of registered token staking nodes. + * @return The total number of token staking nodes. + */ + function nodesLength() public view returns (uint256) { + return nodes.length; + } + + /** + * @notice Retrieves a staking node by its ID. + * @param nodeId The ID of the node to retrieve. + * @return ITokenStakingNode The staking node associated with the given ID. + * @dev Reverts if the node ID is out of range. + */ + function getNodeById(uint256 nodeId) public view returns (ITokenStakingNode) { + if (nodeId >= nodes.length) { + revert NodeIdOutOfRange(nodeId); + } + return nodes[nodeId]; + } + + //-------------------------------------------------------------------------------------- + //---------------------------------- MODIFIERS --------------------------------------- + //-------------------------------------------------------------------------------------- + + /// @notice Ensure that the given address is not the zero address. + /// @param _address The address to check. + modifier notZeroAddress(address _address) { + if (_address == address(0)) { + revert ZeroAddress(); + } + _; + } +} diff --git a/src/ynEIGEN/ynEigen.sol b/src/ynEIGEN/ynEigen.sol new file mode 100644 index 000000000..57924de17 --- /dev/null +++ b/src/ynEIGEN/ynEigen.sol @@ -0,0 +1,328 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {Math} from "lib/openzeppelin-contracts/contracts/utils/math/Math.sol"; +import {SafeERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol"; +import {ReentrancyGuardUpgradeable} from "lib/openzeppelin-contracts-upgradeable/contracts/utils/ReentrancyGuardUpgradeable.sol"; +import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; +import {IynEigen} from "src/interfaces/IynEigen.sol"; +import {IAssetRegistry} from "src/interfaces/IAssetRegistry.sol"; + +import {ynBase} from "src/ynBase.sol"; + + +interface IynEigenEvents { + event DepositAsset(address indexed sender, address indexed receiver, address indexed asset, uint256 amount, uint256 shares); + event AssetRetrieved(IERC20 asset, uint256 amount, address destination); + event LSDStakingNodeCreated(uint256 nodeId, address nodeAddress); + event MaxNodeCountUpdated(uint256 maxNodeCount); + event DepositsPausedUpdated(bool paused); +} + +contract ynEigen is IynEigen, ynBase, ReentrancyGuardUpgradeable, IynEigenEvents { + using SafeERC20 for IERC20; + + struct Asset { + uint256 balance; + // Add extra fields here + } + + //-------------------------------------------------------------------------------------- + //---------------------------------- ERRORS ------------------------------------------- + //-------------------------------------------------------------------------------------- + + error UnsupportedAsset(IERC20 asset); + error Paused(); + error ZeroAmount(); + error ZeroAddress(); + error LengthMismatch(uint256 assetsCount, uint256 stakedAssetsCount); + error AssetRetrievalLengthMismatch(uint256 assetsCount, uint256 amountsCount); + error NotStrategyManager(address msgSender); + error InsufficientAssetBalance(IERC20 asset, uint256 balance, uint256 requestedAmount); + error ZeroShares(); + + //-------------------------------------------------------------------------------------- + //---------------------------------- VARIABLES --------------------------------------- + //-------------------------------------------------------------------------------------- + + mapping(address => Asset) public assets; + + address public yieldNestStrategyManager; + IAssetRegistry public assetRegistry; + + bool public depositsPaused; + + //-------------------------------------------------------------------------------------- + //---------------------------------- INITIALIZATION ---------------------------------- + //-------------------------------------------------------------------------------------- + + constructor() { + _disableInitializers(); + } + + struct Init { + string name; + string symbol; + IAssetRegistry assetRegistry; + address yieldNestStrategyManager; + address admin; + address pauser; + address unpauser; + address[] pauseWhitelist; + } + + function initialize(Init calldata init) + public + notZeroAddress(address(init.assetRegistry)) + notZeroAddress(address(init.admin)) + initializer { + __AccessControl_init(); + __ReentrancyGuard_init(); + __ynBase_init(init.name, init.symbol); + + _grantRole(DEFAULT_ADMIN_ROLE, init.admin); + _grantRole(PAUSER_ROLE, init.pauser); + _grantRole(UNPAUSER_ROLE, init.unpauser); + + assetRegistry = init.assetRegistry; + yieldNestStrategyManager = init.yieldNestStrategyManager; + + _setTransfersPaused(true); // transfers are initially paused + _updatePauseWhitelist(init.pauseWhitelist, true); + } + + + //-------------------------------------------------------------------------------------- + //---------------------------------- DEPOSITS --------------------------------------- + //-------------------------------------------------------------------------------------- + + /** + * @notice Deposits a specified amount of an asset into the contract and mints shares to the receiver. + * @dev This function first checks if the asset is supported, then converts the asset amount to unitOfAccount equivalent, + * calculates the shares to be minted based on the unitOfAccount value, mints the shares to the receiver, and finally + * transfers the asset from the sender to the contract. Emits a Deposit event upon success. + * @param asset The ERC20 asset to be deposited. + * @param amount The amount of the asset to be deposited. + * @param receiver The address to receive the minted shares. + * @return shares The amount of shares minted to the receiver. + */ + function deposit( + IERC20 asset, + uint256 amount, + address receiver + ) public nonReentrant returns (uint256 shares) { + + if (depositsPaused) { + revert Paused(); + } + + return _deposit(asset, amount, receiver, msg.sender); + } + + function _deposit( + IERC20 asset, + uint256 amount, + address receiver, + address sender + ) internal returns (uint256 shares) { + + if (!assetIsSupported(asset)) { + revert UnsupportedAsset(asset); + } + + if (amount == 0) { + revert ZeroAmount(); + } + + asset.safeTransferFrom(sender, address(this), amount); + + // Convert the value of the asset deposited to unitOfAccount + uint256 assetAmountInUnitOfAccount = assetRegistry.convertToUnitOfAccount(asset, amount); + // Calculate how many shares to be minted using the same formula as ynUnitOfAccount + shares = _convertToShares(assetAmountInUnitOfAccount, Math.Rounding.Floor); + + if (shares == 0) { + revert ZeroShares(); + } + + // Mint the calculated shares to the receiver + _mint(receiver, shares); + + assets[address(asset)].balance += amount; + + emit DepositAsset(sender, receiver, address(asset), amount, shares); + } + + /** + * @notice Converts an LRT amount to shares based on the current exchange rate and specified rounding method. + * @param amount The amount of LRT to convert to shares. + * @param rounding The rounding method to use for the calculation. + * @return The number of shares equivalent to the given LRT amount. + */ + function _convertToShares(uint256 amount, Math.Rounding rounding) internal view returns (uint256) { + // 1:1 exchange rate on the first stake. + // Use totalSupply to see if this is the bootstrap call, not totalAssets + + uint256 currentTotalSupply = totalSupply(); + uint256 currentTotalAssets = totalAssets(); + if (currentTotalSupply == 0) { + return amount; + } + + // Can only happen in bootstrap phase if `totalAssets` and `totalSupply` could be manipulated + // independently. That should not be possible. + return Math.mulDiv( + amount, + currentTotalSupply, + currentTotalAssets, + rounding + ); + } + + /// @notice Calculates the amount of shares to be minted for a given deposit. + /// @param asset The asset to be deposited. + /// @param amount The amount of asset to be deposited. + /// @return The amount of shares to be minted. + function previewDeposit(IERC20 asset, uint256 amount) public view virtual returns (uint256) { + return convertToShares(asset, amount); + } + + /** + * @notice Converts a given amount of a specific asset to shares + * @param asset The ERC-20 asset to be converted + * @param amount The amount of the asset to be converted + * @return shares The equivalent amount of shares for the given amount of the asset + */ + function convertToShares(IERC20 asset, uint256 amount) public view returns(uint256 shares) { + + if(assetIsSupported(asset)) { + uint256 assetAmountInUnitOfAccount = assetRegistry.convertToUnitOfAccount(asset, amount); + shares = _convertToShares(assetAmountInUnitOfAccount, Math.Rounding.Floor); + } else { + revert UnsupportedAsset(asset); + } + } + + //-------------------------------------------------------------------------------------- + //---------------------------------- TOTAL ASSETS ----------------------------------- + //-------------------------------------------------------------------------------------- + + /** + * @notice This function calculates the total assets of the contract + * @dev It iterates over all the assets in the contract, gets the latest price for each asset from the oracle, + * multiplies it with the balance of the asset and adds it to the total + * @return total The total assets of the contract in the form of uint + */ + function totalAssets() public view returns (uint256) { + return assetRegistry.totalAssets(); + } + + /** + * @notice Retrieves the balances of specified assets. + * @param assetsArray An array of ERC20 tokens for which to retrieve balances. + * @return balances An array of balances corresponding to the input assets. + */ + function assetBalances(IERC20[] calldata assetsArray) public view returns (uint256[] memory balances) { + + uint256 assetsArrayLength = assetsArray.length; + balances = new uint256[](assetsArrayLength); + for (uint256 i = 0; i < assetsArrayLength; i++) { + balances[i] = assets[address(assetsArray[i])].balance; + } + } + + /** + * @notice Retrieves the balance of a specific asset. + * @param asset The ERC20 token for which to retrieve the balance. + * @return balance The balance of the specified asset. + */ + function assetBalance(IERC20 asset) public view returns (uint256 balance) { + balance = assets[address(asset)].balance; + } + + //-------------------------------------------------------------------------------------- + //---------------------------------- ASSET ALLOCATION -------------------------------- + //-------------------------------------------------------------------------------------- + + /** + * @notice Retrieves specified amounts of multiple assets and sends them to designated destinations. + * @dev Transfers the specified amounts of assets to the corresponding destinations. This function can only be called by the strategy manager. + * Reverts if the caller is not the strategy manager or if any of the assets are not supported. + * @param assetsToRetrieve An array of ERC20 tokens to be retrieved. + * @param amounts An array of amounts of the assets to be retrieved, corresponding to the `assetsToRetrieve` array. + */ + function retrieveAssets( + IERC20[] calldata assetsToRetrieve, + uint256[] calldata amounts + ) public onlyStrategyManager { + + uint256 assetsToRetrieveLength = assetsToRetrieve.length; + if (assetsToRetrieveLength != amounts.length) { + revert AssetRetrievalLengthMismatch(assetsToRetrieveLength, amounts.length); + } + + address strategyManagerAddress = yieldNestStrategyManager; + + for (uint256 i = 0; i < assetsToRetrieveLength; i++) { + IERC20 asset = assetsToRetrieve[i]; + if (!assetRegistry.assetIsSupported(asset)) { + revert UnsupportedAsset(asset); + } + + Asset memory assetState = assets[address(asset)]; + if (amounts[i] > assetState.balance) { + revert InsufficientAssetBalance(asset, assetState.balance, amounts[i]); + } + + assets[address(asset)].balance -= amounts[i]; + IERC20(asset).safeTransfer(strategyManagerAddress, amounts[i]); + emit AssetRetrieved(asset, amounts[i], strategyManagerAddress); + } + } + + //-------------------------------------------------------------------------------------- + //---------------------------------- PAUSING ----------------------------------------- + //-------------------------------------------------------------------------------------- + + /// @notice Pauses deposits. + /// @dev Can only be called by an account with the PAUSER_ROLE. + function pauseDeposits() external onlyRole(PAUSER_ROLE) { + depositsPaused = true; + emit DepositsPausedUpdated(depositsPaused); + } + + /// @notice Unpauses deposits. + /// @dev Can only be called by an account with the UNPAUSER_ROLE. + function unpauseDeposits() external onlyRole(UNPAUSER_ROLE) { + depositsPaused = false; + emit DepositsPausedUpdated(depositsPaused); + } + + /** + * @notice Checks if an asset is supported by the asset registry. + * @param asset The ERC20 token to check for support. + * @return bool True if the asset is supported, false otherwise. + */ + function assetIsSupported(IERC20 asset) public view returns (bool) { + return assetRegistry.assetIsSupported(asset); + } + //-------------------------------------------------------------------------------------- + //---------------------------------- MODIFIERS --------------------------------------- + //-------------------------------------------------------------------------------------- + + /// @notice Ensure that the given address is not the zero address. + /// @param _address The address to check. + modifier notZeroAddress(address _address) { + if (_address == address(0)) { + revert ZeroAddress(); + } + _; + } + + modifier onlyStrategyManager() { + if(msg.sender != yieldNestStrategyManager) { + revert NotStrategyManager(msg.sender); + } + _; + } +} diff --git a/src/ynEIGEN/ynEigenDepositAdapter.sol b/src/ynEIGEN/ynEigenDepositAdapter.sol new file mode 100644 index 000000000..2e5a709f9 --- /dev/null +++ b/src/ynEIGEN/ynEigenDepositAdapter.sol @@ -0,0 +1,196 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; +import {IERC4626} from "lib/openzeppelin-contracts/contracts/interfaces/IERC4626.sol"; +import {IynEigen} from "src/interfaces/IynEigen.sol"; +import {IwstETH} from "src/external/lido/IwstETH.sol"; +import {SafeERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol"; + +import {AccessControlUpgradeable} from "lib/openzeppelin-contracts-upgradeable/contracts/access/AccessControlUpgradeable.sol"; +import {Initializable} from "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol"; + +interface IynEigenDepositAdapterEvents { + event ReferralDepositProcessed( + address sender, + address indexed receiver, + address indexed asset, + uint256 amount, + uint256 shares, + address indexed referrer, + uint256 timestamp + ); + + event DepositWrappedAsset( + address indexed sender, + address indexed receiver, + address indexed asset, + uint256 amount, + uint256 wrappedAmount, + uint256 shares + ); +} + + +contract ynEigenDepositAdapter is IynEigenDepositAdapterEvents, Initializable, AccessControlUpgradeable { + + using SafeERC20 for IERC20; + using SafeERC20 for IwstETH; + using SafeERC20 for IERC4626; + + //-------------------------------------------------------------------------------------- + //---------------------------------- ERRORS ------------------------------------------- + //-------------------------------------------------------------------------------------- + + error ZeroAddress(); + error SelfReferral(); + + //-------------------------------------------------------------------------------------- + //---------------------------------- VARIABLES --------------------------------------- + //-------------------------------------------------------------------------------------- + + IynEigen public ynEigen; + IwstETH public wstETH; + IERC4626 public woETH; + IERC20 public stETH; + IERC20 public oETH; + + //-------------------------------------------------------------------------------------- + //---------------------------------- INITIALIZATION ---------------------------------- + //-------------------------------------------------------------------------------------- + + struct Init { + address ynEigen; + address wstETH; + address woETH; + address admin; + } + + function initialize(Init memory init) + public + initializer + notZeroAddress(init.ynEigen) + notZeroAddress(init.wstETH) + notZeroAddress(init.woETH) + notZeroAddress(init.admin) + { + __AccessControl_init(); + _grantRole(DEFAULT_ADMIN_ROLE, init.admin); + ynEigen = IynEigen(init.ynEigen); + wstETH = IwstETH(init.wstETH); + woETH = IERC4626(init.woETH); + + stETH = IERC20(wstETH.stETH()); + oETH = IERC20(woETH.asset()); + } + + /** + * @notice Handles the deposit of assets into the ynEigen system. + It supports all assets supported by ynEigen + + oETH and and stETH which are wrapped prior to deposit. + * @dev This function routes the deposit based on the type of asset provided. + * @param asset The asset to be deposited. + * @param amount The amount of the asset to be deposited. + * @param receiver The address that will receive the ynEigen tokens. + * @return The number of ynEigen tokens received by the receiver. + */ + function deposit(IERC20 asset, uint256 amount, address receiver) public returns (uint256) { + if (address(asset) == address(stETH)) { + return depositStETH(amount, receiver); + } else if (address(asset) == address(oETH)) { + return depositOETH(amount, receiver); + } else { + asset.safeTransferFrom(msg.sender, address(this), amount); + asset.forceApprove(address(ynEigen), amount); + return ynEigen.deposit(asset, amount, receiver); + } + } + + + /// @notice Simulates the deposit of assets into the ynEigen system and returns the expected number of shares. + /// @dev This function handles the conversion for oETH and stETH before simulating the deposit since + /// they are not natively supported by ynEigen. + /// @param asset The asset to be deposited. + /// @param amount The amount of the asset to be deposited. + /// @return shares The expected number of ynEigen tokens (shares) to be received. + function previewDeposit(IERC20 asset, uint256 amount) external view returns (uint256 shares) { + if (address(asset) == address(oETH)) { + // Convert oETH to woETH + uint256 woETHAmount = IERC4626(woETH).convertToShares(amount); + return ynEigen.previewDeposit(IERC20(woETH), woETHAmount); + } else if (address(asset) == address(stETH)) { + // Convert stETH to wstETH + uint256 wstETHAmount = IwstETH(wstETH).getWstETHByStETH(amount); + return ynEigen.previewDeposit(IERC20(wstETH), wstETHAmount); + } else { + // For all other assets, use the standard previewDeposit function + return ynEigen.previewDeposit(IERC20(asset), amount); + } + } + + /** + * @notice Deposits an asset with referral information. + * IMPORTANT: The referred or referree is the receiver, NOT msg.sender + * @dev This function extends the basic deposit functionality with referral tracking. + * @param asset The ERC20 asset to be deposited. + * @param amount The amount of the asset to be deposited. + * @param receiver The address that will receive the ynEigen tokens. + * @param referrer The address of the referrer. + * @return shares The number of ynEigen tokens received by the receiver. + */ + function depositWithReferral( + IERC20 asset, + uint256 amount, + address receiver, + address referrer + ) external returns (uint256 shares) { + if (receiver == address(0)) { + revert ZeroAddress(); + } + if (referrer == address(0)) { + revert ZeroAddress(); + } + if (referrer == receiver) { + revert SelfReferral(); + } + shares = deposit(asset, amount, receiver); + emit ReferralDepositProcessed(msg.sender, receiver, address(asset), amount, shares, referrer, block.timestamp); + } + + function depositStETH(uint256 amount, address receiver) internal returns (uint256 shares) { + stETH.safeTransferFrom(msg.sender, address(this), amount); + stETH.forceApprove(address(wstETH), amount); + uint256 wstETHAmount = wstETH.wrap(amount); + wstETH.forceApprove(address(ynEigen), wstETHAmount); + + shares = ynEigen.deposit(IERC20(address(wstETH)), wstETHAmount, receiver); + + emit DepositWrappedAsset(msg.sender, receiver, address(stETH), amount, wstETHAmount, shares); + } + + function depositOETH(uint256 amount, address receiver) internal returns (uint256 shares) { + oETH.safeTransferFrom(msg.sender, address(this), amount); + oETH.forceApprove(address(woETH), amount); + uint256 woETHShares = woETH.deposit(amount, address(this)); + woETH.forceApprove(address(ynEigen), woETHShares); + + shares = ynEigen.deposit(IERC20(address(woETH)), woETHShares, receiver); + + emit DepositWrappedAsset(msg.sender, receiver, address(oETH), amount, woETHShares, shares); + } + + //-------------------------------------------------------------------------------------- + //---------------------------------- MODIFIERS --------------------------------------- + //-------------------------------------------------------------------------------------- + + /** + * @notice Ensure that the given address is not the zero address. + * @param _address The address to check. + */ + modifier notZeroAddress(address _address) { + if (_address == address(0)) { + revert ZeroAddress(); + } + _; + } +} diff --git a/src/ynEIGEN/ynEigenViewer.sol b/src/ynEIGEN/ynEigenViewer.sol new file mode 100644 index 000000000..32a528b9e --- /dev/null +++ b/src/ynEIGEN/ynEigenViewer.sol @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {IERC20, IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {IwstETH} from "../external/lido/IwstETH.sol"; +import {IynEigen} from "../interfaces/IynEigen.sol"; +import {IRateProvider} from "../interfaces/IRateProvider.sol"; +import {ITokenStakingNodesManager,ITokenStakingNode} from "../interfaces/ITokenStakingNodesManager.sol"; +import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol"; +import {AssetRegistry} from "./AssetRegistry.sol"; +import {IEigenStrategyManager} from "../interfaces/IEigenStrategyManager.sol"; + + +contract ynEigenViewer { + + struct AssetInfo { + address asset; + string name; + string symbol; + uint256 ratioOfTotalAssets; + uint256 totalBalance; + } + + /* solhint-disable immutable-vars-naming */ + AssetRegistry public immutable assetRegistry; + IynEigen public immutable ynEIGEN; + ITokenStakingNodesManager public immutable tokenStakingNodesManager; + IRateProvider public immutable rateProvider; + /* solhint-enable immutable-vars-naming */ + + uint256 public constant DECIMALS = 1_000_000; + uint256 public constant UNIT = 1 ether; + + constructor(address _assetRegistry, address _ynEIGEN, address _tokenStakingNodesManager, address _rateProvider) { + assetRegistry = AssetRegistry(_assetRegistry); + ynEIGEN = IynEigen(_ynEIGEN); + tokenStakingNodesManager = ITokenStakingNodesManager(_tokenStakingNodesManager); + rateProvider = IRateProvider(_rateProvider); + } + + function getAllStakingNodes() external view returns (ITokenStakingNode[] memory) { + return tokenStakingNodesManager.getAllNodes(); + } + + function getYnEigenAssets() external view returns (AssetInfo[] memory _assetsInfo) { + IERC20[] memory _assets = assetRegistry.getAssets(); + uint256 _assetsLength = _assets.length; + _assetsInfo = new AssetInfo[](_assetsLength); + + uint256 _totalAssets = ynEIGEN.totalAssets(); + for (uint256 i = 0; i < _assetsLength; ++i) { + uint256 _balance = assetRegistry.convertToUnitOfAccount(_assets[i], ynEIGEN.assetBalance(_assets[i])); + _assetsInfo[i] = AssetInfo({ + asset: address(_assets[i]), + name: IERC20Metadata(address(_assets[i])).name(), + symbol: IERC20Metadata(address(_assets[i])).symbol(), + ratioOfTotalAssets: (_balance > 0 && _totalAssets > 0) ? _balance * DECIMALS / _totalAssets : 0, + totalBalance: _balance + }); + } + } + + function previewDeposit(IERC20 asset, uint256 amount) external view returns (uint256 shares) { + IEigenStrategyManager eigenStrategyManager = IEigenStrategyManager(ynEIGEN.yieldNestStrategyManager()); + address oETH = address(eigenStrategyManager.oETH()); + address stETH = address(eigenStrategyManager.stETH()); + address woETH = address(eigenStrategyManager.woETH()); + address wstETH = address(eigenStrategyManager.wstETH()); + + if (address(asset) == oETH) { + // Convert oETH to woETH + uint256 woETHAmount = IERC4626(woETH).convertToShares(amount); + return ynEIGEN.previewDeposit(IERC20(woETH), woETHAmount); + } else if (address(asset) == stETH) { + // Convert stETH to wstETH + uint256 wstETHAmount = IwstETH(wstETH).getWstETHByStETH(amount); + return ynEIGEN.previewDeposit(IERC20(wstETH), wstETHAmount); + } else { + // For all other assets, use the standard previewDeposit function + return ynEIGEN.previewDeposit(IERC20(asset), amount); + } + } + + function getRate() external view returns (uint256) { + uint256 _totalSupply = ynEIGEN.totalSupply(); + uint256 _totalAssets = ynEIGEN.totalAssets(); + if (_totalSupply == 0 || _totalAssets == 0) return 1 ether; + return 1 ether * _totalAssets / _totalSupply; + } +} \ No newline at end of file diff --git a/src/ynLSD.sol b/src/ynLSD.sol deleted file mode 100644 index f6ce19b80..000000000 --- a/src/ynLSD.sol +++ /dev/null @@ -1,507 +0,0 @@ -// SPDX-License-Identifier: BSD 3-Clause License -pragma solidity ^0.8.24; - -import {Math} from "lib/openzeppelin-contracts/contracts/utils/math/Math.sol"; -import {SafeERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol"; -import {IERC20Metadata} from "lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {BeaconProxy} from "lib/openzeppelin-contracts/contracts/proxy/beacon/BeaconProxy.sol"; -import {UpgradeableBeacon} from "lib/openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol"; -import {ReentrancyGuardUpgradeable} from "lib/openzeppelin-contracts-upgradeable/contracts/utils/ReentrancyGuardUpgradeable.sol"; -import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; -import {IStrategy} from "lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; -import {IStrategyManager} from "lib/eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol"; -import {IDelegationManager} from "lib/eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol"; -import {IynLSD} from "src/interfaces/IynLSD.sol"; -import {ILSDStakingNode} from "src/interfaces/ILSDStakingNode.sol"; -import {YieldNestOracle} from "src/YieldNestOracle.sol"; -import {ynBase} from "src/ynBase.sol"; - - -interface IynLSDEvents { - event Deposit(address indexed sender, address indexed receiver, uint256 amount, uint256 shares); - event AssetRetrieved(IERC20 asset, uint256 amount, uint256 nodeId, address sender); - event LSDStakingNodeCreated(uint256 nodeId, address nodeAddress); - event MaxNodeCountUpdated(uint256 maxNodeCount); - event DepositsPausedUpdated(bool paused); - - event RegisteredStakingNodeImplementationContract(address upgradeableBeaconAddress, address implementationContract); - event UpgradedStakingNodeImplementationContract(address implementationContract, uint256 nodesCount); - event NodeInitialized(address nodeAddress, uint64 initializedVersion); -} - -contract ynLSD is IynLSD, ynBase, ReentrancyGuardUpgradeable, IynLSDEvents { - using SafeERC20 for IERC20; - - //-------------------------------------------------------------------------------------- - //---------------------------------- ERRORS ------------------------------------------- - //-------------------------------------------------------------------------------------- - - error UnsupportedAsset(IERC20 asset); - error Paused(); - error ZeroAmount(); - error ZeroAddress(); - error BeaconImplementationAlreadyExists(); - error NoBeaconImplementationExists(); - error TooManyStakingNodes(uint256 maxNodeCount); - error NotLSDStakingNode(address sender, uint256 nodeId); - error InsufficientBoostrapAmount(address asset, uint256 amount, uint256 valueInETH); - - //-------------------------------------------------------------------------------------- - //---------------------------------- ROLES ------------------------------------------- - //-------------------------------------------------------------------------------------- - - bytes32 public constant STAKING_ADMIN_ROLE = keccak256("STAKING_ADMIN_ROLE"); - bytes32 public constant LSD_RESTAKING_MANAGER_ROLE = keccak256("LSD_RESTAKING_MANAGER_ROLE"); - bytes32 public constant LSD_STAKING_NODE_CREATOR_ROLE = keccak256("LSD_STAKING_NODE_CREATOR_ROLE"); - - uint256 public constant BOOTSTRAP_AMOUNT_UNITS = 10; - - //-------------------------------------------------------------------------------------- - //---------------------------------- VARIABLES --------------------------------------- - //-------------------------------------------------------------------------------------- - - YieldNestOracle public oracle; - IStrategyManager public strategyManager; - IDelegationManager public delegationManager; - - UpgradeableBeacon public upgradeableBeacon; - - /// @notice Mapping of ERC20 tokens to their corresponding EigenLayer strategy contracts. - mapping(IERC20 => IStrategy) public strategies; - - /// @notice List of supported ERC20 asset contracts. - IERC20[] public assets; - - /** - * @notice Array of LSD Staking Node contracts. - * @dev These nodes are crucial for the delegation process within the YieldNest protocol. Each node represents a unique staking entity - * that can delegate LSD tokens to various operators for yield optimization. - */ - ILSDStakingNode[] public nodes; - uint256 public maxNodeCount; - - bool public depositsPaused; - - //-------------------------------------------------------------------------------------- - //---------------------------------- INITIALIZATION ---------------------------------- - //-------------------------------------------------------------------------------------- - - constructor() { - _disableInitializers(); - } - - struct Init { - IERC20[] assets; - IStrategy[] strategies; - IStrategyManager strategyManager; - IDelegationManager delegationManager; - YieldNestOracle oracle; - uint256 maxNodeCount; - address admin; - address pauser; - address unpauser; - address stakingAdmin; - address lsdRestakingManager; - address lsdStakingNodeCreatorRole; - address[] pauseWhitelist; - address depositBootstrapper; - } - - function initialize(Init calldata init) - public - notZeroAddress(address(init.strategyManager)) - notZeroAddress(address(init.oracle)) - notZeroAddress(address(init.admin)) - notZeroAddress(address(init.stakingAdmin)) - notZeroAddress(address(init.lsdRestakingManager)) - notZeroAddress(init.lsdStakingNodeCreatorRole) - initializer { - __AccessControl_init(); - __ReentrancyGuard_init(); - __ynBase_init("ynLSD", "ynLSD"); - - _grantRole(DEFAULT_ADMIN_ROLE, init.admin); - _grantRole(STAKING_ADMIN_ROLE, init.stakingAdmin); - _grantRole(LSD_RESTAKING_MANAGER_ROLE, init.lsdRestakingManager); - _grantRole(LSD_STAKING_NODE_CREATOR_ROLE, init.lsdStakingNodeCreatorRole); - _grantRole(PAUSER_ROLE, init.pauser); - _grantRole(UNPAUSER_ROLE, init.unpauser); - - for (uint256 i = 0; i < init.assets.length; i++) { - if (address(init.assets[i]) == address(0) || address(init.strategies[i]) == address(0)) { - revert ZeroAddress(); - } - assets.push(init.assets[i]); - strategies[init.assets[i]] = init.strategies[i]; - } - - strategyManager = init.strategyManager; - delegationManager = init.delegationManager; - oracle = init.oracle; - maxNodeCount = init.maxNodeCount; - - _setTransfersPaused(true); // transfers are initially paused - _updatePauseWhitelist(init.pauseWhitelist, true); - - initializeBoostrapDeposit(init); - } - - function initializeBoostrapDeposit(Init calldata init) internal { - // deposit boostrap amount to avoid share inflation attacks - uint256 bootstrapAmount = BOOTSTRAP_AMOUNT_UNITS * (10 ** (IERC20Metadata(address(assets[0])).decimals())); - uint256 bootstrapAmountInETH = convertToETH(assets[0], bootstrapAmount); - - if (bootstrapAmountInETH < 1 ether) { - revert InsufficientBoostrapAmount(address(assets[0]), bootstrapAmount, bootstrapAmountInETH); - } - - _deposit(assets[0], bootstrapAmount, init.depositBootstrapper, init.depositBootstrapper); - } - - //-------------------------------------------------------------------------------------- - //---------------------------------- DEPOSITS --------------------------------------- - //-------------------------------------------------------------------------------------- - - /** - * @notice Deposits a specified amount of an asset into the contract and mints shares to the receiver. - * @dev This function first checks if the asset is supported, then converts the asset amount to ETH equivalent, - * calculates the shares to be minted based on the ETH value, mints the shares to the receiver, and finally - * transfers the asset from the sender to the contract. Emits a Deposit event upon success. - * @param asset The ERC20 asset to be deposited. - * @param amount The amount of the asset to be deposited. - * @param receiver The address to receive the minted shares. - * @return shares The amount of shares minted to the receiver. - */ - function deposit( - IERC20 asset, - uint256 amount, - address receiver - ) public nonReentrant returns (uint256 shares) { - - if (depositsPaused) { - revert Paused(); - } - - return _deposit(asset, amount, receiver, msg.sender); - } - - function _deposit( - IERC20 asset, - uint256 amount, - address receiver, - address sender - ) internal returns (uint256 shares) { - - IStrategy strategy = strategies[asset]; - if(address(strategy) == address(0x0)){ - revert UnsupportedAsset(asset); - } - - if (amount == 0) { - revert ZeroAmount(); - } - - // Convert the value of the asset deposited to ETH - uint256 assetAmountInETH = convertToETH(asset, amount); - // Calculate how many shares to be minted using the same formula as ynETH - shares = _convertToShares(assetAmountInETH, Math.Rounding.Floor); - - // Mint the calculated shares to the receiver - _mint(receiver, shares); - - // Transfer assets in after shares are computed since _convertToShares relies on totalAssets - // which inspects asset.balanceOf(address(this)) - asset.safeTransferFrom(sender, address(this), amount); - - emit Deposit(sender, receiver, amount, shares); - } - - /** - * @notice Converts an LRT amount to shares based on the current exchange rate and specified rounding method. - * @param amount The amount of LRT to convert to shares. - * @param rounding The rounding method to use for the calculation. - * @return The number of shares equivalent to the given LRT amount. - */ - function _convertToShares(uint256 amount, Math.Rounding rounding) internal view returns (uint256) { - // 1:1 exchange rate on the first stake. - // Use totalSupply to see if this is the bootstrap call, not totalAssets - if (totalSupply() == 0) { - return amount; - } - - // Can only happen in bootstrap phase if `totalControlled` and `ynETHSupply` could be manipulated - // independently. That should not be possible. - return Math.mulDiv( - amount, - totalSupply(), - totalAssets(), - rounding - ); - } - - - /// @notice Calculates the amount of shares to be minted for a given deposit. - /// @param asset The asset to be deposited. - /// @param amount The amount of asset to be deposited. - /// @return The amount of shares to be minted. - function previewDeposit(IERC20 asset, uint256 amount) public view virtual returns (uint256) { - return convertToShares(asset, amount); - } - - /** - * @notice This function calculates the total assets of the contract - * @dev It iterates over all the assets in the contract, gets the latest price for each asset from the oracle, - * multiplies it with the balance of the asset and adds it to the total - * @return total The total assets of the contract in the form of uint - */ - function totalAssets() public view returns (uint256) { - uint256 total = 0; - - uint256[] memory depositedBalances = getTotalAssets(); - for (uint256 i = 0; i < assets.length; i++) { - uint256 balanceInETH = convertToETH(assets[i], depositedBalances[i]); - total += balanceInETH; - } - return total; - } - - /** - * @notice Converts a given amount of a specific asset to shares - * @param asset The ERC-20 asset to be converted - * @param amount The amount of the asset to be converted - * @return shares The equivalent amount of shares for the given amount of the asset - */ - function convertToShares(IERC20 asset, uint256 amount) public view returns(uint256 shares) { - IStrategy strategy = strategies[asset]; - if(address(strategy) != address(0)){ - uint256 assetAmountInETH = convertToETH(asset, amount); - shares = _convertToShares(assetAmountInETH, Math.Rounding.Floor); - } else { - revert UnsupportedAsset(asset); - } - } - - /** - * @notice Retrieves the total balances of all assets managed by the contract, both held directly and managed through strategies. - * @dev This function aggregates the balances of each asset held directly by the contract and in each LSDStakingNode, - * including those managed by strategies associated with each asset. - * @return assetBalances An array of the total balances for each asset, indexed in the same order as the `assets` array. - */ - function getTotalAssets() - public - view - returns (uint256[] memory assetBalances) - { - uint256 assetsCount = assets.length; - - assetBalances = new uint256[](assetsCount); - IStrategy[] memory assetStrategies = new IStrategy[](assetsCount); - - // Add balances for funds held directly in ynLSD. - for (uint256 i = 0; i < assetsCount; i++) { - IERC20 asset = assets[i]; - assetStrategies[i] = strategies[asset]; - - uint256 balanceThis = asset.balanceOf(address(this)); - assetBalances[i] += balanceThis; - } - - // Add balances contained in each LSDStakingNode, including those managed by strategies. - uint256 nodesCount = nodes.length; - for (uint256 i; i < nodesCount; i++ ) { - - ILSDStakingNode node = nodes[i]; - for (uint256 j = 0; j < assetsCount; j++) { - - IERC20 asset = assets[j]; - uint256 balanceNode = asset.balanceOf(address(node)); - assetBalances[j] += balanceNode; - - uint256 strategyBalance = assetStrategies[j].userUnderlyingView((address(node))); - assetBalances[j] += strategyBalance; - } - } - } - - /** - * @notice Converts the amount of a given asset to its equivalent value in ETH based on the latest price from the oracle. - * @dev This function takes into account the decimal places of the asset to ensure accurate conversion. - * @param asset The ERC20 token to be converted to ETH. - * @param amount The amount of the asset to be converted. - * @return uint256 equivalent amount of the asset in ETH. - */ - function convertToETH(IERC20 asset, uint256 amount) public view returns (uint256) { - uint256 assetPriceInETH = oracle.getLatestPrice(address(asset)); - uint8 assetDecimals = IERC20Metadata(address(asset)).decimals(); - return assetDecimals != 18 - ? assetPriceInETH * amount / (10 ** assetDecimals) - : assetPriceInETH * amount / 1e18; - } - - /// @notice Pauses ETH deposits. - /// @dev Can only be called by an account with the PAUSER_ROLE. - function pauseDeposits() external onlyRole(PAUSER_ROLE) { - depositsPaused = true; - emit DepositsPausedUpdated(depositsPaused); - } - - /// @notice Unpauses ETH deposits. - /// @dev Can only be called by an account with the UNPAUSER_ROLE. - function unpauseDeposits() external onlyRole(UNPAUSER_ROLE) { - depositsPaused = false; - emit DepositsPausedUpdated(depositsPaused); - } - - - //-------------------------------------------------------------------------------------- - //---------------------------------- STAKING NODE CREATION --------------------------- - //-------------------------------------------------------------------------------------- - /** - * @notice Creates a new LSD Staking Node using the Upgradeable Beacon pattern. - * @dev This function creates a new BeaconProxy instance pointing to the current implementation set in the upgradeableBeacon. - * It initializes the staking node, adds it to the nodes array, and emits an event. - * Reverts if the maximum number of staking nodes has been reached. - * @return ILSDStakingNode The interface of the newly created LSD Staking Node. - */ - function createLSDStakingNode() - public - notZeroAddress((address(upgradeableBeacon))) - onlyRole(LSD_STAKING_NODE_CREATOR_ROLE) - returns (ILSDStakingNode) { - - uint256 nodeId = nodes.length; - - if (nodeId >= maxNodeCount) { - revert TooManyStakingNodes(maxNodeCount); - } - - BeaconProxy proxy = new BeaconProxy(address(upgradeableBeacon), ""); - ILSDStakingNode node = ILSDStakingNode(payable(proxy)); - - initializeLSDStakingNode(node, nodeId); - - nodes.push(node); - - emit LSDStakingNodeCreated(nodeId, address(node)); - - return node; - } - - /** - * @notice Initializes a newly created LSD Staking Node. - * @dev This function checks the current initialized version of the node and performs initialization if it hasn't been done. - * For future versions, additional conditional blocks should be added to handle version-specific initialization. - * @param node The ILSDStakingNode instance to be initialized. - * @param nodeId The ID of the staking node. - */ - function initializeLSDStakingNode(ILSDStakingNode node, uint256 nodeId) virtual internal { - - uint64 initializedVersion = node.getInitializedVersion(); - if (initializedVersion == 0) { - node.initialize( - ILSDStakingNode.Init(IynLSD(address(this)), nodeId) - ); - - // update version to latest - initializedVersion = node.getInitializedVersion(); - emit NodeInitialized(address(node), initializedVersion); - } - - // NOTE: for future versions add additional if clauses that initialize the node - // for the next version while keeping the previous initializers - } - - /** - * @notice Registers a new LSD Staking Node implementation contract. - * @dev This function sets a new implementation contract for the LSD Staking Node by creating a new UpgradeableBeacon. - * It can only be called once to boostrap the first implementation. - * @param _implementationContract The address of the new LSD Staking Node implementation contract. - */ - function registerLSDStakingNodeImplementationContract(address _implementationContract) - public - onlyRole(STAKING_ADMIN_ROLE) - notZeroAddress(_implementationContract) { - - if (address(upgradeableBeacon) != address(0)) { - revert BeaconImplementationAlreadyExists(); - } - - upgradeableBeacon = new UpgradeableBeacon(_implementationContract, address(this)); - - emit RegisteredStakingNodeImplementationContract(address(upgradeableBeacon), _implementationContract); - } - - /** - * @notice Upgrades the LSD Staking Node implementation to a new version. - * @dev This function upgrades the implementation contract of the LSD Staking Nodes by setting a new implementation address in the upgradeable beacon. - * It then reinitializes all existing staking nodes to ensure they are compatible with the new implementation. - * This function can only be called by an account with the STAKING_ADMIN_ROLE. - * @param _implementationContract The address of the new implementation contract. - */ - function upgradeLSDStakingNodeImplementation(address _implementationContract) - public - onlyRole(STAKING_ADMIN_ROLE) - notZeroAddress(_implementationContract) { - - if (address(upgradeableBeacon) == address(0)) { - revert NoBeaconImplementationExists(); - } - - upgradeableBeacon.upgradeTo(_implementationContract); - - uint256 nodeCount = nodes.length; - - // Reinitialize all nodes to ensure compatibility with the new implementation. - for (uint256 i = 0; i < nodeCount; i++) { - initializeLSDStakingNode(nodes[i], nodeCount); - } - - emit UpgradedStakingNodeImplementationContract(address(_implementationContract), nodeCount); - } - - /// @notice Sets the maximum number of staking nodes allowed - /// @param _maxNodeCount The maximum number of staking nodes - function setMaxNodeCount(uint256 _maxNodeCount) public onlyRole(STAKING_ADMIN_ROLE) { - maxNodeCount = _maxNodeCount; - emit MaxNodeCountUpdated(_maxNodeCount); - } - - function hasLSDRestakingManagerRole(address account) external view returns (bool) { - return hasRole(LSD_RESTAKING_MANAGER_ROLE, account); - } - - /** - * @notice Retrieves a specified amount of an asset from the staking node. - * @dev Transfers the specified `amount` of `asset` to the caller, if the caller is the staking node. - * Reverts if the caller is not the staking node or if the asset is not supported. - * @param nodeId The ID of the staking node attempting to retrieve the asset. - * @param asset The ERC20 token to be retrieved. - * @param amount The amount of the asset to be retrieved. - */ - function retrieveAsset(uint256 nodeId, IERC20 asset, uint256 amount) external { - if (address(nodes[nodeId]) != msg.sender) { - revert NotLSDStakingNode(msg.sender, nodeId); - } - - IStrategy strategy = strategies[asset]; - if (address(strategy) == address(0)) { - revert UnsupportedAsset(asset); - } - - IERC20(asset).safeTransfer(msg.sender, amount); - emit AssetRetrieved(asset, amount, nodeId, msg.sender); - } - - //-------------------------------------------------------------------------------------- - //---------------------------------- MODIFIERS --------------------------------------- - //-------------------------------------------------------------------------------------- - - /// @notice Ensure that the given address is not the zero address. - /// @param _address The address to check. - modifier notZeroAddress(address _address) { - if (_address == address(0)) { - revert ZeroAddress(); - } - _; - } -} diff --git a/test/integration/IntegrationBaseTest.sol b/test/integration/IntegrationBaseTest.sol index 8a04b53a3..ff829693c 100644 --- a/test/integration/IntegrationBaseTest.sol +++ b/test/integration/IntegrationBaseTest.sol @@ -17,9 +17,6 @@ import {IReferralDepositAdapter} from "src/interfaces/IReferralDepositAdapter.so import {IynETH} from "src/interfaces/IynETH.sol"; import {Test} from "forge-std/Test.sol"; import {ynETH} from "src/ynETH.sol"; -import {ynLSD} from "src/ynLSD.sol"; -import {YieldNestOracle} from "src/YieldNestOracle.sol"; -import {LSDStakingNode} from "src/LSDStakingNode.sol"; import {ynViewer} from "src/ynViewer.sol"; import {StakingNodesManager} from "src/StakingNodesManager.sol"; import {StakingNode} from "src/StakingNode.sol"; @@ -60,11 +57,6 @@ contract IntegrationBaseTest is Test, Utils { // Assets ynETH public yneth; - ynLSD public ynlsd; - - - // Oracles - YieldNestOracle public yieldNestOracle; // Eigen IEigenPodManager public eigenPodManager; @@ -88,13 +80,11 @@ contract IntegrationBaseTest is Test, Utils { // Setup Protocol setupYnETHPoxies(); - setupYnLSDProxies(); setupEthereum(); setupEigenLayer(); setupRewardsDistributor(); setupStakingNodesManager(); setupYnETH(); - setupYieldNestOracleAndYnLSD(); setupUtils(); } @@ -140,20 +130,6 @@ contract IntegrationBaseTest is Test, Utils { stakingNodesManager = StakingNodesManager(payable(stakingNodesManagerProxy)); } - function setupYnLSDProxies() public { - TransparentUpgradeableProxy ynLSDProxy; - TransparentUpgradeableProxy yieldNestOracleProxy; - - yieldNestOracle = new YieldNestOracle(); - ynlsd = new ynLSD(); - - yieldNestOracleProxy = new TransparentUpgradeableProxy(address(yieldNestOracle), actors.admin.PROXY_ADMIN_OWNER, ""); - ynLSDProxy = new TransparentUpgradeableProxy(address(ynlsd), actors.admin.PROXY_ADMIN_OWNER, ""); - - yieldNestOracle = YieldNestOracle(address(yieldNestOracleProxy)); - ynlsd = ynLSD(address(ynLSDProxy)); - } - function setupUtils() public { viewer = new ynViewer(address(yneth), address(stakingNodesManager)); @@ -248,66 +224,5 @@ contract IntegrationBaseTest is Test, Utils { vm.prank(actors.admin.STAKING_ADMIN); // StakingNodesManager is the only contract that can register a staking node implementation contract stakingNodesManager.registerStakingNodeImplementationContract(address(stakingNodeImplementation)); } - - function setupYieldNestOracleAndYnLSD() public { - IERC20[] memory assets = new IERC20[](2); - address[] memory assetsAddresses = new address[](2); - address[] memory priceFeeds = new address[](2); - uint256[] memory maxAges = new uint256[](2); - IStrategy[] memory strategies = new IStrategy[](2); - - address[] memory pauseWhitelist = new address[](1); - pauseWhitelist[0] = actors.ops.PAUSE_ADMIN; - - // stETH - assets[0] = IERC20(chainAddresses.lsd.STETH_ADDRESS); - assetsAddresses[0] = chainAddresses.lsd.STETH_ADDRESS; - strategies[0] = IStrategy(chainAddresses.lsd.STETH_STRATEGY_ADDRESS); - priceFeeds[0] = chainAddresses.lsd.STETH_FEED_ADDRESS; - maxAges[0] = uint256(86400); //one hour - - // rETH - assets[1] = IERC20(chainAddresses.lsd.RETH_ADDRESS); - assetsAddresses[1] = chainAddresses.lsd.RETH_ADDRESS; - strategies[1] = IStrategy(chainAddresses.lsd.RETH_STRATEGY_ADDRESS); - priceFeeds[1] = chainAddresses.lsd.RETH_FEED_ADDRESS; - maxAges[1] = uint256(86400); - - YieldNestOracle.Init memory oracleInit = YieldNestOracle.Init({ - assets: assetsAddresses, - priceFeedAddresses: priceFeeds, - maxAges: maxAges, - admin: actors.admin.ADMIN, - oracleManager: actors.admin.ORACLE_ADMIN - }); - yieldNestOracle.initialize(oracleInit); - LSDStakingNode lsdStakingNodeImplementation = new LSDStakingNode(); - ynLSD.Init memory init = ynLSD.Init({ - assets: assets, - strategies: strategies, - strategyManager: strategyManager, - delegationManager: delegationManager, - oracle: yieldNestOracle, - maxNodeCount: 10, - admin: actors.admin.ADMIN, - unpauser: actors.admin.UNPAUSE_ADMIN, - stakingAdmin: actors.admin.STAKING_ADMIN, - lsdRestakingManager: actors.ops.LSD_RESTAKING_MANAGER, - lsdStakingNodeCreatorRole: actors.ops.STAKING_NODE_CREATOR, - pauseWhitelist: pauseWhitelist, - pauser: actors.ops.PAUSE_ADMIN, - depositBootstrapper: actors.eoa.DEPOSIT_BOOTSTRAPPER - }); - - TestAssetUtils testAssetUtils = new TestAssetUtils(); - testAssetUtils.get_stETH(actors.eoa.DEPOSIT_BOOTSTRAPPER, 10000 ether); - - vm.prank(actors.eoa.DEPOSIT_BOOTSTRAPPER); - IERC20(chainAddresses.lsd.STETH_ADDRESS).approve(address(ynlsd), type(uint256).max); - ynlsd.initialize(init); - - vm.prank(actors.admin.STAKING_ADMIN); - ynlsd.registerLSDStakingNodeImplementationContract(address(lsdStakingNodeImplementation)); - } } diff --git a/test/integration/LSDStakingNode.t.sol b/test/integration/LSDStakingNode.t.sol deleted file mode 100644 index 29f0b480e..000000000 --- a/test/integration/LSDStakingNode.t.sol +++ /dev/null @@ -1,190 +0,0 @@ -// SPDX-License-Identifier: BSD 3-Clause License -pragma solidity 0.8.24; - -import {IntegrationBaseTest} from "test/integration/IntegrationBaseTest.sol"; -import {IERC20} from "lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol"; -import {LSDStakingNode} from "src/LSDStakingNode.sol"; -import {IStrategyManager} from "lib/eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol"; -import {ILSDStakingNode} from "src/interfaces/ILSDStakingNode.sol"; -import {IynLSD} from "src/interfaces/IynLSD.sol"; -import {IPausable} from "lib/eigenlayer-contracts/src/contracts/interfaces/IPausable.sol"; -import {IDelegationManager} from "lib/eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol"; -import {ISignatureUtils} from "lib/eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol"; -import {TestAssetUtils} from "test/utils/TestAssetUtils.sol"; - -contract skipLSDStakingNodeTest is IntegrationBaseTest { - - ILSDStakingNode lsdStakingNode; - - function setUp() public override { - super.setUp(); - vm.prank(actors.ops.STAKING_NODE_CREATOR); - lsdStakingNode = ynlsd.createLSDStakingNode(); - } - - function testYnLSDView() public { - IynLSD _ynlsd = lsdStakingNode.ynLSD(); - assertEq(address(_ynlsd), address(ynlsd)); - } - - function testNodeIdView() public { - uint256 _nodeId = lsdStakingNode.nodeId(); - assertEq(_nodeId, 0); - } - - function testImplementationView() public { - address _implementation = lsdStakingNode.implementation(); - vm.prank(actors.ops.STAKING_NODE_CREATOR); - ynlsd.createLSDStakingNode(); - ILSDStakingNode _lsdStakingNode = ynlsd.nodes(0); - assertEq(_implementation, address(_lsdStakingNode.implementation())); - } - - function testDepositAssetsToEigenlayerSuccess() public { - // 1. Obtain stETH and Deposit assets to ynLSD by User - TestAssetUtils testAssetUtils = new TestAssetUtils(); - IERC20 stETH = IERC20(chainAddresses.lsd.STETH_ADDRESS); - uint256 balance = testAssetUtils.get_stETH(address(this), 0.01 ether); - stETH.approve(address(ynlsd), balance); - ynlsd.deposit(stETH, balance, address(this)); - - // 2. Deposit assets to Eigenlayer by LSD ReStaking Manager - IPausable pausableStrategyManager = IPausable(address(strategyManager)); - vm.prank(actors.ops.STAKING_NODE_CREATOR); - address unpauser = pausableStrategyManager.pauserRegistry().unpauser(); - vm.startPrank(unpauser); - pausableStrategyManager.unpause(0); - vm.stopPrank(); - - IERC20[] memory assets = new IERC20[](1); - assets[0] = stETH; - uint256[] memory amounts = new uint256[](1); - amounts[0] = 1 ether; - vm.prank(actors.ops.LSD_RESTAKING_MANAGER); - lsdStakingNode.depositAssetsToEigenlayer(assets, amounts); - (, uint256[] memory deposits) = strategyManager.getDeposits(address(lsdStakingNode)); - assertGt(deposits[0], 1); - } - - function testDepositAssetsToEigenlayerFail() public { - - // 1. Obtain stETH and Deposit assets to ynLSD by User - TestAssetUtils testAssetUtils = new TestAssetUtils(); - IERC20 stETH = IERC20(chainAddresses.lsd.STETH_ADDRESS); - uint256 balance = testAssetUtils.get_stETH(address(this), 0.01 ether); - stETH.approve(address(ynlsd), balance); - ynlsd.deposit(stETH, balance, address(this)); - - // 2. Deposit should fail when paused - IStrategyManager strategyManager = ynlsd.strategyManager(); - vm.prank(chainAddresses.eigenlayer.STRATEGY_MANAGER_PAUSER_ADDRESS); - IPausable(address(strategyManager)).pause(1); - IERC20[] memory assets = new IERC20[](1); - assets[0] = stETH; - uint256[] memory amounts = new uint256[](1); - amounts[0] = balance; - vm.prank(actors.ops.LSD_RESTAKING_MANAGER); - vm.expectRevert("Pausable: index is paused"); - lsdStakingNode.depositAssetsToEigenlayer(assets, amounts); - } -} - - -contract LSDStakingNodeDelegate is IntegrationBaseTest { - function testLSDStakingNodeDelegate() public { - vm.prank(actors.ops.STAKING_NODE_CREATOR); - ILSDStakingNode lsdStakingNodeInstance = ynlsd.createLSDStakingNode(); - IDelegationManager delegationManager = ynlsd.delegationManager(); - - IPausable pauseDelegationManager = IPausable(address(delegationManager)); - vm.prank(chainAddresses.eigenlayer.DELEGATION_PAUSER_ADDRESS); - pauseDelegationManager.unpause(0); - - // register as operator - delegationManager.registerAsOperator( - IDelegationManager.OperatorDetails({ - earningsReceiver: address(this), - delegationApprover: address(0), - stakerOptOutWindowBlocks: 1 - }), - "ipfs://some-ipfs-hash" - ); - - ISignatureUtils.SignatureWithExpiry memory signature; - bytes32 approverSalt; - - vm.prank(actors.ops.LSD_RESTAKING_MANAGER); - lsdStakingNodeInstance.delegate(address(this), signature, approverSalt); - } - - function testLSDStakingNodeUndelegate() public { - vm.prank(actors.ops.STAKING_NODE_CREATOR); - ILSDStakingNode lsdStakingNodeInstance = ynlsd.createLSDStakingNode(); - IDelegationManager delegationManager = ynlsd.delegationManager(); - IPausable pauseDelegationManager = IPausable(address(delegationManager)); - - // Unpause delegation manager to allow delegation - vm.prank(chainAddresses.eigenlayer.DELEGATION_PAUSER_ADDRESS); - pauseDelegationManager.unpause(0); - - // Register as operator and delegate - delegationManager.registerAsOperator( - IDelegationManager.OperatorDetails({ - earningsReceiver: address(this), - delegationApprover: address(0), - stakerOptOutWindowBlocks: 1 - }), - "ipfs://some-ipfs-hash" - ); - - vm.prank(actors.ops.LSD_RESTAKING_MANAGER); - ISignatureUtils.SignatureWithExpiry memory signature; - bytes32 approverSalt; - - lsdStakingNodeInstance.delegate(address(this), signature, approverSalt); - - // Attempt to undelegate - vm.expectRevert(); - lsdStakingNodeInstance.undelegate(); - - IStrategyManager strategyManager = ynlsd.strategyManager(); - uint256 stakerStrategyListLength = strategyManager.stakerStrategyListLength(address(lsdStakingNodeInstance)); - assertEq(stakerStrategyListLength, 0, "Staker strategy list length should be 0."); - - // Now actually undelegate with the correct role - vm.prank(actors.ops.LSD_RESTAKING_MANAGER); - lsdStakingNodeInstance.undelegate(); - - // Verify undelegation - address delegatedAddress = delegationManager.delegatedTo(address(lsdStakingNodeInstance)); - assertEq(delegatedAddress, address(0), "Delegation should be cleared after undelegation."); - } - - function testRecoverDirectDeposits() public { - // setup - vm.prank(actors.ops.STAKING_NODE_CREATOR); - ILSDStakingNode lsdStakingNodeInstance = ynlsd.createLSDStakingNode(); - // 1. Obtain stETH and Deposit assets to ynLSD by User - TestAssetUtils testAssetUtils = new TestAssetUtils(); - IERC20 stETH = IERC20(chainAddresses.lsd.STETH_ADDRESS); - uint256 balance = testAssetUtils.get_stETH(address(this), 0.01 ether); - uint256 ynLSDBalanceBefore = stETH.balanceOf(address(ynlsd)); - - // transfer steth to the staking node - stETH.approve(address(lsdStakingNodeInstance), balance); - stETH.transfer(address(lsdStakingNodeInstance), balance); - - // recover the stuck steth in the staking node - vm.prank(actors.ops.LSD_RESTAKING_MANAGER); - lsdStakingNodeInstance.recoverAssets(IERC20(chainAddresses.lsd.STETH_ADDRESS)); - stETH.balanceOf(address(ynlsd)); - assertEq( - compareWithThreshold( - stETH.balanceOf(address(ynlsd)) - ynLSDBalanceBefore, - balance, - 2 - ), - true - ); - } -} \ No newline at end of file diff --git a/test/integration/ReferralDepositAdapter.t.sol b/test/integration/ReferralDepositAdapter.t.sol index 2c2ef9c83..537df8fb2 100644 --- a/test/integration/ReferralDepositAdapter.t.sol +++ b/test/integration/ReferralDepositAdapter.t.sol @@ -1,3 +1,4 @@ + // SPDX-License-Identifier: BSD 3-Clause License pragma solidity ^0.8.24; diff --git a/test/integration/RewardsDistributor.t.sol b/test/integration/RewardsDistributor.t.sol index e4aaa5ad0..eeabaa210 100644 --- a/test/integration/RewardsDistributor.t.sol +++ b/test/integration/RewardsDistributor.t.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.24; import {IntegrationBaseTest} from "test/integration/IntegrationBaseTest.sol"; import {RewardsDistributor} from "src/RewardsDistributor.sol"; +import {NonPayableContract} from "test/utils/NonPayableContract.sol"; contract RewardsDistributorTest is IntegrationBaseTest { @@ -38,9 +39,10 @@ contract RewardsDistributorTest is IntegrationBaseTest { vm.deal(address(consensusLayerReceiver), 3 ether); // set invalid fee receiver - vm.prank(actors.admin.REWARDS_ADMIN); - address nonPayableAddress = address(yieldNestOracle); + + address nonPayableAddress = address(new NonPayableContract()); address payable payableAddress = payable(nonPayableAddress); + vm.prank(actors.admin.REWARDS_ADMIN); rewardsDistributor.setFeesReceiver(payableAddress); // process rewards diff --git a/test/integration/Roles.t.sol b/test/integration/Roles.t.sol index 0a2ffe0e9..f0bcd10c0 100644 --- a/test/integration/Roles.t.sol +++ b/test/integration/Roles.t.sol @@ -130,49 +130,6 @@ contract RolesTest is IntegrationBaseTest { assertTrue(executionLayerReceiver.hasRole(WITHDRAWER_ROLE, newRewardsDistributor)); assertFalse(executionLayerReceiver.hasRole(WITHDRAWER_ROLE, address(rewardsDistributor))); - } - function testRoleChangeYnLSD() public { - address newStakingAdmin = address(0xABC); - bytes32 STAKING_ADMIN_ROLE = keccak256("STAKING_ADMIN_ROLE"); - bytes32 LSD_RESTAKING_MANAGER_ROLE = keccak256("LSD_RESTAKING_MANAGER_ROLE"); - bytes32 LSD_STAKING_NODE_CREATOR_ROLE = keccak256("LSD_STAKING_NODE_CREATOR_ROLE"); - - assertTrue(ynlsd.hasRole(ynlsd.DEFAULT_ADMIN_ROLE(), actors.admin.ADMIN)); - assertTrue(ynlsd.hasRole(STAKING_ADMIN_ROLE, actors.admin.STAKING_ADMIN)); - assertTrue(ynlsd.hasRole(LSD_RESTAKING_MANAGER_ROLE, actors.ops.LSD_RESTAKING_MANAGER)); - assertTrue(ynlsd.hasRole(LSD_STAKING_NODE_CREATOR_ROLE, actors.ops.STAKING_NODE_CREATOR)); - - vm.startPrank(actors.admin.ADMIN); - ynlsd.grantRole(STAKING_ADMIN_ROLE, newStakingAdmin); - ynlsd.revokeRole(STAKING_ADMIN_ROLE, actors.admin.STAKING_ADMIN); - ynlsd.grantRole(LSD_RESTAKING_MANAGER_ROLE, newStakingAdmin); - ynlsd.revokeRole(LSD_RESTAKING_MANAGER_ROLE, actors.ops.LSD_RESTAKING_MANAGER); - ynlsd.grantRole(LSD_STAKING_NODE_CREATOR_ROLE, newStakingAdmin); - ynlsd.revokeRole(LSD_STAKING_NODE_CREATOR_ROLE, actors.ops.STAKING_NODE_CREATOR); - vm.stopPrank(); - - assertTrue(ynlsd.hasRole(STAKING_ADMIN_ROLE, newStakingAdmin)); - assertTrue(ynlsd.hasRole(LSD_RESTAKING_MANAGER_ROLE, newStakingAdmin)); - assertTrue(ynlsd.hasRole(LSD_STAKING_NODE_CREATOR_ROLE, newStakingAdmin)); - assertFalse(ynlsd.hasRole(STAKING_ADMIN_ROLE, actors.admin.STAKING_ADMIN)); - assertFalse(ynlsd.hasRole(LSD_RESTAKING_MANAGER_ROLE, actors.ops.LSD_RESTAKING_MANAGER)); - assertFalse(ynlsd.hasRole(LSD_STAKING_NODE_CREATOR_ROLE, actors.ops.STAKING_NODE_CREATOR)); - } - - function testRoleChangeYieldNestOracle() public { - address newOracleManager = address(0xDEF); - bytes32 ORACLE_MANAGER_ROLE = keccak256("ORACLE_MANAGER_ROLE"); - - assertTrue(yieldNestOracle.hasRole(yieldNestOracle.DEFAULT_ADMIN_ROLE(), actors.admin.ADMIN)); - assertTrue(yieldNestOracle.hasRole(ORACLE_MANAGER_ROLE, actors.admin.ORACLE_ADMIN)); - - vm.startPrank(actors.admin.ADMIN); - yieldNestOracle.grantRole(ORACLE_MANAGER_ROLE, newOracleManager); - yieldNestOracle.revokeRole(ORACLE_MANAGER_ROLE, actors.admin.ORACLE_ADMIN); - vm.stopPrank(); - - assertTrue(yieldNestOracle.hasRole(ORACLE_MANAGER_ROLE, newOracleManager)); - assertFalse(yieldNestOracle.hasRole(ORACLE_MANAGER_ROLE, actors.admin.ORACLE_ADMIN)); } } diff --git a/test/integration/Upgrades.t.sol b/test/integration/Upgrades.t.sol index 441d2b1f2..2a6562cd5 100644 --- a/test/integration/Upgrades.t.sol +++ b/test/integration/Upgrades.t.sol @@ -3,8 +3,6 @@ pragma solidity ^0.8.24; import {IntegrationBaseTest} from "./IntegrationBaseTest.sol"; import {StakingNodesManager} from "src/StakingNodesManager.sol"; import {ynETH} from "src/ynETH.sol"; -import {ynLSD} from "src/ynLSD.sol"; -import {YieldNestOracle} from "src/YieldNestOracle.sol"; import {MockYnETHERC4626} from "test/mocks/MockYnETHERC4626.sol"; import {MockERC20} from "test/mocks/MockERC20.sol"; import {RewardsDistributor} from "src/RewardsDistributor.sol"; @@ -46,23 +44,14 @@ contract UpgradesTest is IntegrationBaseTest { assertEq(currentRewardsDistributorImpl, newRewardsDistributorImpl); } - function testUpgradeYnLSD() public { - address newYnLSDImpl = address(new ynLSD()); - vm.prank(actors.admin.PROXY_ADMIN_OWNER); - ProxyAdmin(getTransparentUpgradeableProxyAdminAddress(address(ynlsd))).upgradeAndCall(ITransparentUpgradeableProxy(address(ynlsd)), newYnLSDImpl, ""); - - address currentYnLSDImpl = getTransparentUpgradeableProxyImplementationAddress(address(ynlsd)); - assertEq(currentYnLSDImpl, newYnLSDImpl); - } - - function testUpgradeYieldNestOracle() public { - address newYieldNestOracleImpl = address(new YieldNestOracle()); - vm.prank(actors.admin.PROXY_ADMIN_OWNER); - ProxyAdmin(getTransparentUpgradeableProxyAdminAddress(address(yieldNestOracle))).upgradeAndCall(ITransparentUpgradeableProxy(address(yieldNestOracle)), newYieldNestOracleImpl, ""); + // function testUpgradeYnLSD() public { + // address newYnLSDImpl = address(new ynLSD()); + // vm.prank(actors.admin.PROXY_ADMIN_OWNER); + // ProxyAdmin(getTransparentUpgradeableProxyAdminAddress(address(ynlsd))).upgradeAndCall(ITransparentUpgradeableProxy(address(ynlsd)), newYnLSDImpl, ""); - address currentYieldNestOracleImpl = getTransparentUpgradeableProxyImplementationAddress(address(yieldNestOracle)); - assertEq(currentYieldNestOracleImpl, newYieldNestOracleImpl); - } + // address currentYnLSDImpl = getTransparentUpgradeableProxyImplementationAddress(address(ynlsd)); + // assertEq(currentYnLSDImpl, newYnLSDImpl); + // } function testUpgradeStakingNodesManagerToV2AndReinit() public { TestStakingNodesManagerV2.ReInit memory reInit = TestStakingNodesManagerV2.ReInit({ @@ -132,61 +121,61 @@ contract UpgradesTest is IntegrationBaseTest { upgradedYnETH.deposit(nETHDepositAmount, address(this)); } - function setupInitializeYnLSD(address assetAddress) internal returns (ynLSD.Init memory, ynLSD ynlsd) { - TransparentUpgradeableProxy ynlsdProxy; - ynlsd = ynLSD(payable(ynlsdProxy)); - - // Re-deploying ynLSD and creating its proxy again - ynlsd = new ynLSD(); - ynlsdProxy = new TransparentUpgradeableProxy(address(ynlsd), actors.admin.PROXY_ADMIN_OWNER, ""); - ynlsd = ynLSD(payable(ynlsdProxy)); - - address[] memory pauseWhitelist = new address[](1); - pauseWhitelist[0] = actors.eoa.DEFAULT_SIGNER; - - IERC20[] memory assets = new IERC20[](2); - address[] memory assetsAddresses = new address[](2); - address[] memory priceFeeds = new address[](2); - uint256[] memory maxAges = new uint256[](2); - IStrategy[] memory strategies = new IStrategy[](2); - - // rETH - assets[0] = IERC20(chainAddresses.lsd.RETH_ADDRESS); - assetsAddresses[0] = chainAddresses.lsd.RETH_ADDRESS; - strategies[0] = IStrategy(chainAddresses.lsd.RETH_STRATEGY_ADDRESS); - priceFeeds[0] = chainAddresses.lsd.RETH_FEED_ADDRESS; - maxAges[0] = uint256(86400); - - // Zero Addresses - assets[1] = IERC20(assetAddress); - assetsAddresses[1] = chainAddresses.lsd.STETH_ADDRESS; - strategies[1] = IStrategy(chainAddresses.lsd.STETH_STRATEGY_ADDRESS); - priceFeeds[1] = chainAddresses.lsd.STETH_FEED_ADDRESS; - maxAges[1] = uint256(86400); //one hour - ynLSD.Init memory init = ynLSD.Init({ - assets: assets, - strategies: strategies, - strategyManager: strategyManager, - delegationManager: delegationManager, - oracle: yieldNestOracle, - maxNodeCount: 10, - admin: actors.admin.ADMIN, - stakingAdmin: actors.admin.STAKING_ADMIN, - lsdRestakingManager: actors.ops.LSD_RESTAKING_MANAGER, - lsdStakingNodeCreatorRole: actors.ops.STAKING_NODE_CREATOR, - pauseWhitelist: pauseWhitelist, - pauser: actors.ops.PAUSE_ADMIN, - unpauser: actors.admin.UNPAUSE_ADMIN, - depositBootstrapper: actors.eoa.DEPOSIT_BOOTSTRAPPER - }); - - return (init, ynlsd); - } - - function testYnLSDInitializeRevertsAssetAddressZero() public { - (ynLSD.Init memory init, ynLSD ynlsd) = setupInitializeYnLSD(address(0)); - bytes memory encodedError = abi.encodeWithSelector(ynLSD.ZeroAddress.selector); - vm.expectRevert(encodedError); - ynlsd.initialize(init); - } + // function setupInitializeYnLSD(address assetAddress) internal returns (ynLSD.Init memory, ynLSD ynlsd) { + // TransparentUpgradeableProxy ynlsdProxy; + // ynlsd = ynLSD(payable(ynlsdProxy)); + + // // Re-deploying ynLSD and creating its proxy again + // ynlsd = new ynLSD(); + // ynlsdProxy = new TransparentUpgradeableProxy(address(ynlsd), actors.admin.PROXY_ADMIN_OWNER, ""); + // ynlsd = ynLSD(payable(ynlsdProxy)); + + // address[] memory pauseWhitelist = new address[](1); + // pauseWhitelist[0] = actors.eoa.DEFAULT_SIGNER; + + // IERC20[] memory assets = new IERC20[](2); + // address[] memory assetsAddresses = new address[](2); + // address[] memory priceFeeds = new address[](2); + // uint256[] memory maxAges = new uint256[](2); + // IStrategy[] memory strategies = new IStrategy[](2); + + // // rETH + // assets[0] = IERC20(chainAddresses.lsd.RETH_ADDRESS); + // assetsAddresses[0] = chainAddresses.lsd.RETH_ADDRESS; + // strategies[0] = IStrategy(chainAddresses.lsd.RETH_STRATEGY_ADDRESS); + // priceFeeds[0] = chainAddresses.lsd.RETH_FEED_ADDRESS; + // maxAges[0] = uint256(86400); + + // // Zero Addresses + // assets[1] = IERC20(assetAddress); + // assetsAddresses[1] = chainAddresses.lsd.STETH_ADDRESS; + // strategies[1] = IStrategy(chainAddresses.lsd.STETH_STRATEGY_ADDRESS); + // priceFeeds[1] = chainAddresses.lsd.STETH_FEED_ADDRESS; + // maxAges[1] = uint256(86400); //one hour + // ynLSD.Init memory init = ynLSD.Init({ + // assets: assets, + // strategies: strategies, + // strategyManager: strategyManager, + // delegationManager: delegationManager, + // oracle: yieldNestOracle, + // maxNodeCount: 10, + // admin: actors.admin.ADMIN, + // stakingAdmin: actors.admin.STAKING_ADMIN, + // lsdRestakingManager: actors.ops.LSD_RESTAKING_MANAGER, + // lsdStakingNodeCreatorRole: actors.ops.STAKING_NODE_CREATOR, + // pauseWhitelist: pauseWhitelist, + // pauser: actors.ops.PAUSE_ADMIN, + // unpauser: actors.admin.UNPAUSE_ADMIN, + // depositBootstrapper: actors.eoa.DEPOSIT_BOOTSTRAPPER + // }); + + // return (init, ynlsd); + // } + + // function testYnLSDInitializeRevertsAssetAddressZero() public { + // (ynLSD.Init memory init, ynLSD ynlsd) = setupInitializeYnLSD(address(0)); + // bytes memory encodedError = abi.encodeWithSelector(ynLSD.ZeroAddress.selector); + // vm.expectRevert(encodedError); + // ynlsd.initialize(init); + // } } diff --git a/test/integration/YieldNestOracle.t.sol b/test/integration/YieldNestOracle.t.sol deleted file mode 100644 index 801dc7979..000000000 --- a/test/integration/YieldNestOracle.t.sol +++ /dev/null @@ -1,210 +0,0 @@ -// SPDX-License-Identifier: BSD 3-Clause License -pragma solidity 0.8.24; - -import "test/integration/IntegrationBaseTest.sol"; -import {IERC20} from "lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol"; -import {AggregatorV3Interface} from "src/external/chainlink/AggregatorV3Interface.sol"; - - -contract YieldNestOracleTest is IntegrationBaseTest { - - error PriceFeedTooStale(uint256 age, uint256 maxAge); - function testSetAssetWithZeroAge() public { - vm.expectRevert(YieldNestOracle.ZeroAge.selector); - vm.prank(actors.admin.ORACLE_ADMIN); - yieldNestOracle.setAssetPriceFeed(chainAddresses.lsd.RETH_ADDRESS, chainAddresses.lsd.RETH_FEED_ADDRESS, 0); // zero age - } - - function testSetAssetWithZeroAssetAddress() public { - vm.expectRevert(YieldNestOracle.ZeroAddress.selector); - vm.prank(actors.admin.ORACLE_ADMIN); - yieldNestOracle.setAssetPriceFeed(address(0), chainAddresses.lsd.RETH_FEED_ADDRESS, 3600); // one hour, zero asset address - } - - function testSetAssetWithZeroPriceFeedAddress() public { - vm.expectRevert(YieldNestOracle.ZeroAddress.selector); - vm.prank(actors.admin.ORACLE_ADMIN); - yieldNestOracle.setAssetPriceFeed(chainAddresses.lsd.RETH_ADDRESS, address(0), 3600); // one hour, zero price feed address - } - - function testSetAssetWithBothAddressesZero() public { - vm.expectRevert(YieldNestOracle.ZeroAddress.selector); - vm.prank(actors.admin.ORACLE_ADMIN); - yieldNestOracle.setAssetPriceFeed(address(0), address(0), 3600); // one hour, both addresses zero - } - - function testSetAssetSuccessfully() public { - address assetAddress = chainAddresses.lsd.RETH_ADDRESS; - address priceFeedAddress = chainAddresses.lsd.RETH_FEED_ADDRESS; - uint256 age = 3600; // one hour - - // Expect no revert, successful execution - vm.prank(actors.admin.ORACLE_ADMIN); - yieldNestOracle.setAssetPriceFeed(assetAddress, priceFeedAddress, age); - - // Verify the asset price feed is set correctly - (AggregatorV3Interface setPriceFeedAddress, uint256 setAge) = yieldNestOracle.assetPriceFeeds(assetAddress); - assertEq(address(setPriceFeedAddress), priceFeedAddress, "Price feed address mismatch"); - assertEq(setAge, age, "Age mismatch"); - } - - function testForGetLatestPrice() public { - - IERC20 asset = IERC20(chainAddresses.lsd.RETH_ADDRESS); - AggregatorV3Interface assetPriceFeed = AggregatorV3Interface(chainAddresses.lsd.RETH_FEED_ADDRESS); - (, int256 price, , uint256 timeStamp, ) = assetPriceFeed.latestRoundData(); - - assertGt(timeStamp, 0, "Zero timestamp"); - assertGt(price, 0, "Zero price"); - // One hour age - uint256 age = 1; - vm.prank(actors.admin.ORACLE_ADMIN); - yieldNestOracle.setAssetPriceFeed(chainAddresses.lsd.RETH_ADDRESS, chainAddresses.lsd.RETH_FEED_ADDRESS, age); - vm.expectRevert( - abi.encodeWithSelector(PriceFeedTooStale.selector, block.timestamp - timeStamp, age) - ); - yieldNestOracle.getLatestPrice(address(asset)); - - // 24 hours age - age = 86400; - vm.prank(actors.admin.ORACLE_ADMIN); - yieldNestOracle.setAssetPriceFeed(chainAddresses.lsd.RETH_ADDRESS, chainAddresses.lsd.RETH_FEED_ADDRESS, age); - uint256 obtainedPrice = yieldNestOracle.getLatestPrice(address(asset)); - assertEq(uint256(price), obtainedPrice, "Price mismatch"); - } - - function testGetLatestPriceWithUnsetAsset() public { - // Arrange - address unsetAssetAddress = address(1); // An arbitrary address not set in the oracle - - // Act & Assert - // Expect the oracle to revert with "Price feed not set" for an asset that hasn't been set up - vm.expectRevert(abi.encodeWithSelector(YieldNestOracle.PriceFeedNotSet.selector)); - yieldNestOracle.getLatestPrice(unsetAssetAddress); - } - - function testUpdateAssetPriceFeedSuccessfully() public { - // Arrange - address assetAddress = chainAddresses.lsd.RETH_ADDRESS; - address newPriceFeedAddress = address(2); // An arbitrary new price feed address - uint256 newAge = 7200; // two hours - - // Act - vm.prank(actors.admin.ORACLE_ADMIN); - yieldNestOracle.setAssetPriceFeed(assetAddress, newPriceFeedAddress, newAge); - - // Assert - // Verify the asset price feed is updated correctly - (AggregatorV3Interface updatedPriceFeedAddress, uint256 updatedAge) = yieldNestOracle.assetPriceFeeds(assetAddress); - assertEq(address(updatedPriceFeedAddress), newPriceFeedAddress, "Price feed address not updated correctly"); - assertEq(updatedAge, newAge, "Age not updated correctly"); - } - - function setupIntializationTests(address[] memory assetAddresses, address[] memory priceFeeds, uint256[] memory maxAges) - public returns (YieldNestOracle, YieldNestOracle.Init memory) { - TransparentUpgradeableProxy yieldNestOracleProxy; - yieldNestOracle = new YieldNestOracle(); - yieldNestOracleProxy = new TransparentUpgradeableProxy(address(yieldNestOracle), actors.admin.PROXY_ADMIN_OWNER, ""); - yieldNestOracle = YieldNestOracle(address(yieldNestOracleProxy)); - - IStrategy[] memory strategies = new IStrategy[](2); - address[] memory pauseWhitelist = new address[](1); - pauseWhitelist[0] = actors.eoa.DEFAULT_SIGNER; - - strategies[0] = IStrategy(chainAddresses.lsd.RETH_STRATEGY_ADDRESS); - strategies[1] = IStrategy(chainAddresses.lsd.STETH_STRATEGY_ADDRESS); - - YieldNestOracle.Init memory oracleInit = YieldNestOracle.Init({ - assets: assetAddresses, - priceFeedAddresses: priceFeeds, - maxAges: maxAges, - admin: actors.admin.ADMIN, - oracleManager: actors.admin.ORACLE_ADMIN - }); - return (yieldNestOracle, oracleInit); - } - - function testInitializeAssetAddressesArraysLengthMismatch() public { - address[] memory assetAddresses = new address[](3); - address[] memory priceFeeds = new address[](2); - uint256[] memory maxAges = new uint256[](2); - - assetAddresses[0] = chainAddresses.lsd.RETH_ADDRESS; - assetAddresses[1] = chainAddresses.lsd.STETH_ADDRESS; - assetAddresses[2] = chainAddresses.lsd.STETH_ADDRESS; - priceFeeds[0] = chainAddresses.lsd.RETH_FEED_ADDRESS; - priceFeeds[1] = chainAddresses.lsd.STETH_FEED_ADDRESS; - maxAges[1] = uint256(86400); - maxAges[0] = uint256(86400); - - (YieldNestOracle oracle, YieldNestOracle.Init memory init) = setupIntializationTests(assetAddresses, priceFeeds, maxAges); - vm.expectRevert( - abi.encodeWithSelector( - YieldNestOracle.ArraysLengthMismatch.selector, - assetAddresses.length, - priceFeeds.length, - maxAges.length - ) - ); - oracle.initialize(init); - } - - function testInitializeAssetMaxAgesLengthMismatch() public { - address[] memory assetAddresses = new address[](2); - address[] memory priceFeeds = new address[](2); - uint256[] memory maxAges = new uint256[](3); - - assetAddresses[0] = chainAddresses.lsd.RETH_ADDRESS; - assetAddresses[1] = chainAddresses.lsd.STETH_ADDRESS; - - priceFeeds[0] = chainAddresses.lsd.RETH_FEED_ADDRESS; - priceFeeds[1] = chainAddresses.lsd.STETH_FEED_ADDRESS; - maxAges[0] = uint256(86400); - maxAges[1] = uint256(86400); - maxAges[2] = uint256(86400); - - (YieldNestOracle oracle, YieldNestOracle.Init memory init) = setupIntializationTests(assetAddresses, priceFeeds, maxAges); - vm.expectRevert( - abi.encodeWithSelector( - YieldNestOracle.ArraysLengthMismatch.selector, - assetAddresses.length, - priceFeeds.length, - maxAges.length - ) - ); - oracle.initialize(init); - } - - function testInitializePriceFeedZeroAddress() public { - address[] memory assetAddresses = new address[](2); - address[] memory priceFeeds = new address[](2); - uint256[] memory maxAges = new uint256[](2); - assetAddresses[0] = chainAddresses.lsd.RETH_ADDRESS; - assetAddresses[1] = chainAddresses.lsd.STETH_ADDRESS; - priceFeeds[0] = address(0); - priceFeeds[1] = chainAddresses.lsd.STETH_FEED_ADDRESS; - maxAges[0] = uint256(86400); - maxAges[1] = uint256(86400); - - (YieldNestOracle oracle, YieldNestOracle.Init memory init) = setupIntializationTests(assetAddresses, priceFeeds, maxAges); - vm.expectRevert(abi.encodeWithSelector(YieldNestOracle.ZeroAddress.selector)); - oracle.initialize(init); - } - - function testInitializeAssetZeroAddress() public { - address[] memory assets = new address[](2); - address[] memory priceFeeds = new address[](2); - uint256[] memory maxAges = new uint256[](2); - assets[0] = address(0); - assets[1] = address(0); - priceFeeds[0] = chainAddresses.lsd.RETH_FEED_ADDRESS; - priceFeeds[1] = chainAddresses.lsd.STETH_FEED_ADDRESS; - maxAges[0] = uint256(86400); - maxAges[1] = uint256(86400); - - (YieldNestOracle oracle, YieldNestOracle.Init memory init) = setupIntializationTests(assets, priceFeeds, maxAges); - vm.expectRevert(abi.encodeWithSelector(YieldNestOracle.ZeroAddress.selector)); - oracle.initialize(init); - } -} - diff --git a/test/integration/ynEIGEN/AssetRegistry.t.sol b/test/integration/ynEIGEN/AssetRegistry.t.sol new file mode 100644 index 000000000..47f261ec5 --- /dev/null +++ b/test/integration/ynEIGEN/AssetRegistry.t.sol @@ -0,0 +1,514 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity 0.8.24; + +import "./ynEigenIntegrationBaseTest.sol"; +import {ProxyAdmin} from "lib/openzeppelin-contracts/contracts/proxy/transparent/ProxyAdmin.sol"; +import {UpgradeableBeacon} from "lib/openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol"; +import {ITransparentUpgradeableProxy} from "lib/openzeppelin-contracts/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; +import {IPausable} from "lib/eigenlayer-contracts/src/contracts/interfaces//IPausable.sol"; +import {ITokenStakingNode} from "src/interfaces/ITokenStakingNode.sol"; +import {ynBase} from "src/ynBase.sol"; +import {IERC4626} from "lib/openzeppelin-contracts/contracts/interfaces/IERC4626.sol"; +import {IrETH} from "src/external/rocketpool/IrETH.sol"; +import { IwstETH } from "src/external/lido/IwstETH.sol"; +import {IstETH} from "src/external/lido/IstETH.sol"; +import {IFrxEthWethDualOracle} from "src/external/frax/IFrxEthWethDualOracle.sol"; +import {IsfrxETH} from "src/external/frax/IsfrxETH.sol"; +import {IAccessControl} from "lib/openzeppelin-contracts/contracts/access/IAccessControl.sol"; + +import "forge-std/console.sol"; + +contract AssetRegistryTest is ynEigenIntegrationBaseTest { + + TestAssetUtils testAssetUtils; + + constructor() { + testAssetUtils = new TestAssetUtils(); + } + + function setUp() public override { + super.setUp(); + + vm.prank(actors.ops.STAKING_NODE_CREATOR); + tokenStakingNodesManager.createTokenStakingNode(); + } + + function testTotalAssetsWithFuzzedDeposits( + uint256 wstethAmount, + uint256 woethAmount, + uint256 rethAmount + ) public { + vm.assume( + wstethAmount < 100 ether && wstethAmount >= 1 wei && + woethAmount < 100 ether && woethAmount >= 1 wei && + rethAmount < 100 ether && rethAmount >= 1 wei + ); + + { + address prankedUserWstETH = address(uint160(uint256(keccak256(abi.encodePacked("wstETHUser"))))); + depositAsset(chainAddresses.lsd.WSTETH_ADDRESS, wstethAmount, prankedUserWstETH); + } + + { + // Deposit woETH using utility function + address prankedUserWoETH = address(uint160(uint256(keccak256(abi.encodePacked("woETHUser"))))); + depositAsset(chainAddresses.lsd.WOETH_ADDRESS, woethAmount, prankedUserWoETH); + } + + { + // Deposit rETH using utility function + address prankedUserRETH = address(uint160(uint256(keccak256(abi.encodePacked("rETHUser"))))); + depositAsset(chainAddresses.lsd.RETH_ADDRESS, rethAmount, prankedUserRETH); + } + + uint256 wstethRate = IstETH(chainAddresses.lsd.STETH_ADDRESS).getPooledEthByShares(1e18); + uint256 woethRate = IERC4626(chainAddresses.lsd.WOETH_ADDRESS).previewRedeem(1e18); + uint256 rethRate = IrETH(chainAddresses.lsd.RETH_ADDRESS).getExchangeRate(); + + // Calculate expected total assets + uint256 expectedTotalAssets = (wstethAmount * wstethRate / 1e18) + (woethAmount * woethRate / 1e18) + (rethAmount * rethRate / 1e18); + + // Fetch total assets from the registry + uint256 totalAssets = assetRegistry.totalAssets(); + + // Assert total assets + assertEq(totalAssets, expectedTotalAssets, "Total assets should match expected value based on deposited amounts and rates"); + + assertEq(ynEigenToken.totalAssets(), totalAssets, "ynEigen.totalAssets should be equal to totalAssets from the registry"); + } + + function testGetAllAssetBalancesWithoutDeposits( + uint256 wstethAmount, + uint256 woethAmount, + uint256 rethAmount + ) public { + vm.assume( + wstethAmount < 100 ether && wstethAmount >= 1 wei && + woethAmount < 100 ether && woethAmount >= 1 wei && + rethAmount < 100 ether && rethAmount >= 1 wei + ); + + { + address prankedUserWstETH = address(uint160(uint256(keccak256(abi.encodePacked("wstETHUser"))))); + depositAsset(chainAddresses.lsd.WSTETH_ADDRESS, wstethAmount, prankedUserWstETH); + } + + { + // Deposit woETH using utility function + address prankedUserWoETH = address(uint160(uint256(keccak256(abi.encodePacked("woETHUser"))))); + depositAsset(chainAddresses.lsd.WOETH_ADDRESS, woethAmount, prankedUserWoETH); + } + + { + // Deposit rETH using utility function + address prankedUserRETH = address(uint160(uint256(keccak256(abi.encodePacked("rETHUser"))))); + depositAsset(chainAddresses.lsd.RETH_ADDRESS, rethAmount, prankedUserRETH); + } + + uint256[] memory balances = assetRegistry.getAllAssetBalances(); + IERC20[] memory assets = assetRegistry.getAssets(); + assertEq(balances.length, assets.length, "Balances and assets arrays should have the same length"); + uint256[] memory expectedBalances = new uint256[](assets.length); + for (uint i = 0; i < assets.length; i++) { + address assetAddress = address(assets[i]); + if (assetAddress == chainAddresses.lsd.WSTETH_ADDRESS) { + expectedBalances[i] = wstethAmount; + } else if (assetAddress == chainAddresses.lsd.WOETH_ADDRESS) { + expectedBalances[i] = woethAmount; + } else if (assetAddress == chainAddresses.lsd.RETH_ADDRESS) { + expectedBalances[i] = rethAmount; + } else { + expectedBalances[i] = 0; // Default to 0 for any other assets + } + } + + for (uint i = 0; i < assets.length; i++) { + assertEq(balances[i], expectedBalances[i], "Deposited amount does not match the expected balance for the asset"); + } + + assertEq(balances.length, assets.length, "Balances array length should match the assets array length"); + } + + function testWstETHConvertToUnitOfAccountFuzz(uint256 amount) public { + vm.assume(amount < 1000000 ether); + + // End of the Selection + IERC20 asset = IERC20(chainAddresses.lsd.WSTETH_ADDRESS); // Using wstETH as the asset + uint256 realRate = IstETH(chainAddresses.lsd.STETH_ADDRESS).getPooledEthByShares(1e18); + uint256 expectedConvertedAmount = amount * realRate / 1e18; // Calculating the expected converted amount based on the real rate + uint256 convertedAmount = assetRegistry.convertToUnitOfAccount(asset, amount); + assertEq(convertedAmount, expectedConvertedAmount, "Converted amount should match expected value based on real rate"); + } + + function testsfrxETHConvertToUnitOfAccountFuzz(uint256 amount) public { + vm.assume(amount < 1000000 ether); + + // End of the Selection + IERC20 asset = IERC20(chainAddresses.lsd.SFRXETH_ADDRESS); // Using wstETH as the asset + address FRAX_ASSET = chainAddresses.lsd.SFRXETH_ADDRESS; + IFrxEthWethDualOracle FRX_ETH_WETH_DUAL_ORACLE = IFrxEthWethDualOracle(testAssetUtils.FRX_ETH_WETH_DUAL_ORACLE()); + uint256 realRate = IsfrxETH(FRAX_ASSET).pricePerShare() * FRX_ETH_WETH_DUAL_ORACLE.getCurveEmaEthPerFrxEth() / 1e18; + uint256 expectedConvertedAmount = amount * realRate / 1e18; // Calculating the expected converted amount based on the real rate + uint256 convertedAmount = assetRegistry.convertToUnitOfAccount(asset, amount); + assertEq(convertedAmount, expectedConvertedAmount, "Converted amount should match expected value based on real rate"); + } + + function testrETHConvertToUnitOfAccountFuzz(uint256 amount) public { + vm.assume(amount < 1000000 ether); + + IERC20 asset = IERC20(chainAddresses.lsd.RETH_ADDRESS); // Using rETH as the asset + uint256 realRate = IrETH(chainAddresses.lsd.RETH_ADDRESS).getExchangeRate(); + uint256 expectedConvertedAmount = amount * realRate / 1e18; // Calculating the expected converted amount based on the real rate + uint256 convertedAmount = assetRegistry.convertToUnitOfAccount(asset, amount); + assertEq(convertedAmount, expectedConvertedAmount, "Converted amount should match expected value based on real rate"); + } + + function testWoETHConvertToUnitOfAccountFuzz(uint256 amount) public { + vm.assume(amount < 1000000 ether); + + IERC20 asset = IERC20(chainAddresses.lsd.WOETH_ADDRESS); // Using woETH as the asset + uint256 realRate = IERC4626(chainAddresses.lsd.WOETH_ADDRESS).previewRedeem(1e18); + uint256 expectedConvertedAmount = amount * realRate / 1e18; // Calculating the expected converted amount based on the real rate + uint256 convertedAmount = assetRegistry.convertToUnitOfAccount(asset, amount); + assertEq(convertedAmount, expectedConvertedAmount, "Converted amount should match expected value based on real rate"); + } + + function testPauseActions() public { + vm.prank(actors.ops.PAUSE_ADMIN); + assetRegistry.pauseActions(); + assertTrue(assetRegistry.actionsPaused(), "Actions should be paused"); + } + + function testUnpauseActions() public { + vm.prank(actors.admin.UNPAUSE_ADMIN); + assetRegistry.unpauseActions(); + assertFalse(assetRegistry.actionsPaused(), "Actions should be unpaused"); + } + + function testPauseActionsWrongCaller() public { + vm.expectRevert(abi.encodeWithSelector(IAccessControl.AccessControlUnauthorizedAccount.selector, address(this), assetRegistry.PAUSER_ROLE())); + assetRegistry.pauseActions(); + } + + function testUnpauseActionsWrongCaller() public { + vm.expectRevert(abi.encodeWithSelector(IAccessControl.AccessControlUnauthorizedAccount.selector, address(this), assetRegistry.UNPAUSER_ROLE())); + assetRegistry.unpauseActions(); + } + + function testGetAssets() public { + IERC20[] memory registeredAssets = assetRegistry.getAssets(); + uint256 numAssets = registeredAssets.length; + assertEq(numAssets, assets.length, "There should be at least one registered asset"); + + for (uint i = 0; i < numAssets; i++) { + address assetAddress = address(registeredAssets[i]); + assertEq(assetAddress, address(assets[i])); + } + } + + // ============================================================================================ + // AssetRegistry.addAsset + // ============================================================================================ + + function testAddAsset() public { + uint256 totalAssetsBefore = assetRegistry.totalAssets(); + + IERC20 swellAsset = IERC20(chainAddresses.lsd.SWELL_ADDRESS); + IStrategy swellStrategy = IStrategy(chainAddresses.lsdStrategies.SWELL_STRATEGY_ADDRESS); + vm.prank(actors.admin.EIGEN_STRATEGY_ADMIN); + eigenStrategyManager.setStrategy(swellAsset, swellStrategy); + + vm.prank(actors.admin.ASSET_MANAGER); + assetRegistry.addAsset(IERC20(chainAddresses.lsd.SWELL_ADDRESS)); + assertEq( + uint256(assetRegistry.assetData(IERC20(chainAddresses.lsd.SWELL_ADDRESS)).status), + uint256(IAssetRegistry.AssetStatus.Active), + "Swell asset should be active after addition" + ); + + uint256 totalAssetsAfter = assetRegistry.totalAssets(); + assertEq(totalAssetsBefore, totalAssetsAfter, "Total assets count should remain the same after adding an asset"); + } + + function testAddDuplicateAssetShouldFail() public { + + IERC20 swellAsset = IERC20(chainAddresses.lsd.SWELL_ADDRESS); + + IStrategy swellStrategy = IStrategy(chainAddresses.lsdStrategies.SWELL_STRATEGY_ADDRESS); + vm.prank(actors.admin.EIGEN_STRATEGY_ADMIN); + eigenStrategyManager.setStrategy(swellAsset, swellStrategy); + + vm.prank(actors.admin.ASSET_MANAGER); + assetRegistry.addAsset(swellAsset); // First addition should succeed + + vm.prank(actors.admin.ASSET_MANAGER); + vm.expectRevert(abi.encodeWithSelector(AssetRegistry.AssetAlreadyAvailable.selector, address(swellAsset))); + assetRegistry.addAsset(swellAsset); // Attempt to add the same asset again should fail + } + + function testAddAssetWithNoPriceFeedShouldFail() public { + IERC20 assetWithoutPriceFeed = IERC20(chainAddresses.lsd.CBETH_ADDRESS); // Assume SWELL has no price feed + + IStrategy strategyForAsset = IStrategy(chainAddresses.lsdStrategies.CBETH_STRATEGY_ADDRESS); + vm.prank(actors.admin.EIGEN_STRATEGY_ADMIN); + eigenStrategyManager.setStrategy(assetWithoutPriceFeed, strategyForAsset); + + vm.prank(actors.admin.ASSET_MANAGER); + vm.expectRevert(abi.encodeWithSelector(AssetRegistry.RateNotAvailableForAsset.selector, assetWithoutPriceFeed)); + assetRegistry.addAsset(assetWithoutPriceFeed); // This should fail as there's no price feed for SWELL + } + + function testAddDisabledAssetShouldFail() public { + IERC20 swellAsset = IERC20(chainAddresses.lsd.SWELL_ADDRESS); + IStrategy swellStrategy = IStrategy(chainAddresses.lsdStrategies.SWELL_STRATEGY_ADDRESS); + + // Add strategy and asset first + vm.prank(actors.admin.EIGEN_STRATEGY_ADMIN); + eigenStrategyManager.setStrategy(swellAsset, swellStrategy); + vm.prank(actors.admin.ASSET_MANAGER); + assetRegistry.addAsset(swellAsset); + + // Disable the asset + vm.prank(actors.admin.ASSET_MANAGER); + assetRegistry.disableAsset(swellAsset); + + // Attempt to add the disabled asset again should fail + vm.prank(actors.admin.ASSET_MANAGER); + vm.expectRevert(abi.encodeWithSelector(AssetRegistry.AssetAlreadyAvailable.selector, address(swellAsset))); + assetRegistry.addAsset(swellAsset); + } + + function testAddExistingAssetShouldFail() public { + + address sfrxETHAddress = address(chainAddresses.lsd.SFRXETH_ADDRESS); + vm.prank(actors.admin.ASSET_MANAGER); + vm.expectRevert(abi.encodeWithSelector(AssetRegistry.AssetAlreadyAvailable.selector, sfrxETHAddress)); + assetRegistry.addAsset(IERC20(sfrxETHAddress)); // Attempt to add the same asset again should fail + } + + function testAddAssetWithoutStrategyShouldFail() public { + IERC20 assetWithoutStrategy = IERC20(chainAddresses.lsd.SWELL_ADDRESS); // Assume OETH has no strategy set + + vm.prank(actors.admin.ASSET_MANAGER); + vm.expectRevert(abi.encodeWithSelector(AssetRegistry.NoStrategyDefinedForAsset.selector, assetWithoutStrategy)); + assetRegistry.addAsset(assetWithoutStrategy); // This should fail as there's no strategy defined for OETH + } + + + // ============================================================================================ + // AssetRegistry.disableAsset + // ============================================================================================ + + function testDisableAsset() public { + IERC20 swellAsset = IERC20(chainAddresses.lsd.SWELL_ADDRESS); + IStrategy swellStrategy = IStrategy(chainAddresses.lsdStrategies.SWELL_STRATEGY_ADDRESS); + + // Add strategy and asset first + vm.prank(actors.admin.EIGEN_STRATEGY_ADMIN); + eigenStrategyManager.setStrategy(swellAsset, swellStrategy); + vm.prank(actors.admin.ASSET_MANAGER); + assetRegistry.addAsset(swellAsset); + + // Ensure the asset is active before disabling + assertEq( + uint256(assetRegistry.assetData(swellAsset).status), + uint256(IAssetRegistry.AssetStatus.Active), + "Asset should be active before disabling" + ); + + // Disable the asset + vm.prank(actors.admin.ASSET_MANAGER); + assetRegistry.disableAsset(swellAsset); + + // Check if the asset is now inactive + assertEq( + uint256(assetRegistry.assetData(swellAsset).status), + uint256(IAssetRegistry.AssetStatus.Disabled), + "Asset status should be Disabled after disabling" + ); + } + + function testDisableNonexistentAssetShouldFail() public { + IERC20 nonexistentAsset = IERC20(address(0xABCDEF)); // Assume this asset was never added + + vm.prank(actors.admin.ASSET_MANAGER); + vm.expectRevert(abi.encodeWithSelector(AssetRegistry.AssetNotActive.selector, address(nonexistentAsset))); + assetRegistry.disableAsset(nonexistentAsset); // This should fail as the asset does not exist + } + + function testDisableAssetWithoutPermissionShouldFail() public { + IERC20 swellAsset = IERC20(chainAddresses.lsd.SWELL_ADDRESS); + IStrategy swellStrategy = IStrategy(chainAddresses.lsdStrategies.SWELL_STRATEGY_ADDRESS); + + // Add strategy and asset first + vm.prank(actors.admin.EIGEN_STRATEGY_ADMIN); + eigenStrategyManager.setStrategy(swellAsset, swellStrategy); + vm.prank(actors.admin.ASSET_MANAGER); + assetRegistry.addAsset(swellAsset); + + vm.expectRevert(abi.encodeWithSelector(IAccessControl.AccessControlUnauthorizedAccount.selector, address(this), assetRegistry.ASSET_MANAGER_ROLE())); + assetRegistry.disableAsset(swellAsset); + } + + function testDisableAlreadyDisabledAssetShouldFail() public { + IERC20 swellAsset = IERC20(chainAddresses.lsd.SWELL_ADDRESS); + IStrategy swellStrategy = IStrategy(chainAddresses.lsdStrategies.SWELL_STRATEGY_ADDRESS); + + // Add strategy and asset first + vm.prank(actors.admin.EIGEN_STRATEGY_ADMIN); + eigenStrategyManager.setStrategy(swellAsset, swellStrategy); + vm.prank(actors.admin.ASSET_MANAGER); + assetRegistry.addAsset(swellAsset); + + // Disable the asset first time + vm.prank(actors.admin.ASSET_MANAGER); + assetRegistry.disableAsset(swellAsset); + + // Attempt to disable the already disabled asset + vm.prank(actors.admin.ASSET_MANAGER); + vm.expectRevert(abi.encodeWithSelector(AssetRegistry.AssetNotActive.selector, address(swellAsset))); + assetRegistry.disableAsset(swellAsset); // This should fail as the asset is already disabled + } + + function testDeleteAsset() public { + IERC20 swellAsset = IERC20(chainAddresses.lsd.SWELL_ADDRESS); + IStrategy swellStrategy = IStrategy(chainAddresses.lsdStrategies.SWELL_STRATEGY_ADDRESS); + + // Add strategy and asset first + vm.prank(actors.admin.EIGEN_STRATEGY_ADMIN); + eigenStrategyManager.setStrategy(swellAsset, swellStrategy); + vm.prank(actors.admin.ASSET_MANAGER); + assetRegistry.addAsset(swellAsset); + + // Disable before deleting + vm.prank(actors.admin.ASSET_MANAGER); + assetRegistry.disableAsset(swellAsset); + + // Ensure the asset is active before deleting + assertEq( + uint256(assetRegistry.assetData(swellAsset).status), + uint256(IAssetRegistry.AssetStatus.Disabled), + "Asset should be disabled before deleting"); + + // Delete the asset + vm.prank(actors.admin.ASSET_MANAGER); + assetRegistry.deleteAsset(swellAsset); + + assertEq( + uint256(assetRegistry.assetData(swellAsset).status), + uint256(IAssetRegistry.AssetStatus.Unavailable), + "Asset should be Unavailable after deletion"); + + + // Check if the asset is now deleted + IERC20[] memory allAssets = assetRegistry.getAssets(); + bool assetFound = false; + for (uint i = 0; i < allAssets.length; i++) { + if (address(allAssets[i]) == address(swellAsset)) { + assetFound = true; + break; + } + } + assertFalse(assetFound, "Asset should not be found after deletion"); + } + + function testDeleteAssetWithBalanceShouldFail() public { + IERC20 swellAsset = IERC20(chainAddresses.lsd.SWELL_ADDRESS); + IStrategy swellStrategy = IStrategy(chainAddresses.lsdStrategies.SWELL_STRATEGY_ADDRESS); + + // Add strategy and asset first + vm.prank(actors.admin.EIGEN_STRATEGY_ADMIN); + eigenStrategyManager.setStrategy(swellAsset, swellStrategy); + vm.prank(actors.admin.ASSET_MANAGER); + assetRegistry.addAsset(swellAsset); + + // Simulate balance in the asset + vm.mockCall(address(ynEigenToken), abi.encodeWithSelector(IynEigen.assetBalance.selector, swellAsset), abi.encode(100)); + + + // Disable before deleting + vm.prank(actors.admin.ASSET_MANAGER); + assetRegistry.disableAsset(swellAsset); + + // Ensure the asset is active before deleting + assertEq( + uint256(assetRegistry.assetData(swellAsset).status), + uint256(IAssetRegistry.AssetStatus.Disabled), + "Asset should be disabled before deleting"); + + // Attempt to delete the asset + vm.prank(actors.admin.ASSET_MANAGER); + vm.expectRevert(abi.encodeWithSelector(AssetRegistry.AssetBalanceNonZeroInPool.selector, 100)); + assetRegistry.deleteAsset(swellAsset); + } + + function testDeleteAssetNotDisabledShouldFail() public { + IERC20 swellAsset = IERC20(chainAddresses.lsd.SWELL_ADDRESS); + IStrategy swellStrategy = IStrategy(chainAddresses.lsdStrategies.SWELL_STRATEGY_ADDRESS); + + // Add strategy and asset first + vm.prank(actors.admin.EIGEN_STRATEGY_ADMIN); + eigenStrategyManager.setStrategy(swellAsset, swellStrategy); + vm.prank(actors.admin.ASSET_MANAGER); + assetRegistry.addAsset(swellAsset); + + // Ensure the asset is active before attempting to delete + assertEq( + uint256(assetRegistry.assetData(swellAsset).status), + uint256(IAssetRegistry.AssetStatus.Active), + "Asset should be Active before deletion attempt"); + + // Attempt to delete the asset without disabling it + vm.prank(actors.admin.ASSET_MANAGER); + vm.expectRevert(abi.encodeWithSelector(AssetRegistry.AssetNotDisabled.selector, address(swellAsset))); + assetRegistry.deleteAsset(swellAsset); + } + + function testDeleteExistingAsset_rETH() public { + IERC20 rETHAsset = IERC20(chainAddresses.lsd.RETH_ADDRESS); + + depositAsset(chainAddresses.lsd.RETH_ADDRESS, 100, actors.admin.ASSET_MANAGER); + + vm.prank(actors.admin.ASSET_MANAGER); + assetRegistry.disableAsset(rETHAsset); + + // Ensure the asset is disabled before deleting + assertEq( + uint256(assetRegistry.assetData(rETHAsset).status), + uint256(IAssetRegistry.AssetStatus.Disabled), + "Asset should be Disabled before deletion"); + + + // Delete the asset + vm.prank(actors.admin.ASSET_MANAGER); + vm.expectRevert(abi.encodeWithSelector(AssetRegistry.AssetBalanceNonZeroInPool.selector, 100)); + assetRegistry.deleteAsset(rETHAsset); + } + + function testDeleteAssetWithoutPermissionShouldFail() public { + IERC20 swellAsset = IERC20(chainAddresses.lsd.SWELL_ADDRESS); + IStrategy swellStrategy = IStrategy(chainAddresses.lsdStrategies.SWELL_STRATEGY_ADDRESS); + + // Add strategy and asset first + vm.prank(actors.admin.EIGEN_STRATEGY_ADMIN); + eigenStrategyManager.setStrategy(swellAsset, swellStrategy); + vm.prank(actors.admin.ASSET_MANAGER); + assetRegistry.addAsset(swellAsset); + + // Try to delete the asset without proper permissions + vm.expectRevert(abi.encodeWithSelector(IAccessControl.AccessControlUnauthorizedAccount.selector, address(this), assetRegistry.ASSET_MANAGER_ROLE())); + assetRegistry.deleteAsset(swellAsset); + } + + // Utility functions + + function depositAsset(address assetAddress, uint256 amount, address user) internal { + IERC20 asset = IERC20(assetAddress); + testAssetUtils.get_Asset(assetAddress, user, amount); + vm.prank(user); + asset.approve(address(ynEigenToken), amount); + vm.prank(user); + ynEigenToken.deposit(asset, amount, user); + } +} \ No newline at end of file diff --git a/test/integration/ynEIGEN/DepositToYnLSDeScript.t.sol b/test/integration/ynEIGEN/DepositToYnLSDeScript.t.sol new file mode 100644 index 000000000..786ab003a --- /dev/null +++ b/test/integration/ynEIGEN/DepositToYnLSDeScript.t.sol @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import "../../../script/commands/DepositToYnLSDe.s.sol"; + +import "forge-std/Test.sol"; +import "forge-std/console.sol"; + +contract DepositToYnLSDeScript is DepositToYnLSDe, Test { + + function setUp() public { + address _deployer; + (_deployer, privateKey) = makeAddrAndKey("deployer"); + vm.deal({ account: _deployer, newBalance: 100 ether }); + } + + function testSfrxETHDeposit() public { + if (block.chainid != 1) return; + run(0, chainAddresses.lsd.SFRXETH_ADDRESS); + } + + function testSfrxETHSend() public { + if (block.chainid != 1) return; + run(1, chainAddresses.lsd.SFRXETH_ADDRESS); + } + + function testMETHDeposit() public { + run(0, chainAddresses.lsd.METH_ADDRESS); + } + + function testMETHSend() public { + run(1, chainAddresses.lsd.METH_ADDRESS); + } + + function testRETHDeposit() public { + if (block.chainid != 17000) return; + run(0, chainAddresses.lsd.RETH_ADDRESS); + } + + function testRETHSend() public { + if (block.chainid != 17000) return; + run(1, chainAddresses.lsd.RETH_ADDRESS); + } +} diff --git a/test/integration/ynEIGEN/EigenStrategyManager.t.sol b/test/integration/ynEIGEN/EigenStrategyManager.t.sol new file mode 100644 index 000000000..014157c5d --- /dev/null +++ b/test/integration/ynEIGEN/EigenStrategyManager.t.sol @@ -0,0 +1,263 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity 0.8.24; + +import "./ynEigenIntegrationBaseTest.sol"; +import {ProxyAdmin} from "lib/openzeppelin-contracts/contracts/proxy/transparent/ProxyAdmin.sol"; +import {UpgradeableBeacon} from "lib/openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol"; +import {ITransparentUpgradeableProxy} from "lib/openzeppelin-contracts/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; +import {IPausable} from "lib/eigenlayer-contracts/src/contracts/interfaces//IPausable.sol"; +import {ITokenStakingNode} from "src/interfaces/ITokenStakingNode.sol"; +import {ynBase} from "src/ynBase.sol"; +import "forge-std/console.sol"; +import {IwstETH} from "src/external/lido/IwstETH.sol"; +import {IERC4626} from "lib/openzeppelin-contracts/contracts/interfaces/IERC4626.sol"; +import { EigenStrategyManager } from "src/ynEIGEN/EigenStrategyManager.sol"; + +contract EigenStrategyManagerTest is ynEigenIntegrationBaseTest { + + TestAssetUtils testAssetUtils; + address[10] public depositors; + + constructor() { + testAssetUtils = new TestAssetUtils(); + for (uint i = 0; i < 10; i++) { + depositors[i] = address(uint160(uint256(keccak256(abi.encodePacked("depositor", i))))); + } + } + + function testStakeAssetsToNodeSuccessFuzz( + uint256 wstethAmount, + uint256 woethAmount, + uint256 rethAmount, + uint256 sfrxethAmount + ) public { + + // cannot call stakeAssetsToNode with any amount == 0. all must be non-zero. + vm.assume( + wstethAmount < 100 ether && wstethAmount >= 2 wei && + woethAmount < 100 ether && woethAmount >= 2 wei && + rethAmount < 100 ether && rethAmount >= 2 wei && + sfrxethAmount < 100 ether && sfrxethAmount >= 2 wei + ); + + // Setup: Create a token staking node and prepare assetsToDeposit + vm.prank(actors.ops.STAKING_NODE_CREATOR); + tokenStakingNodesManager.createTokenStakingNode(); + ITokenStakingNode tokenStakingNode = tokenStakingNodesManager.nodes(0); + + // uint256 wstethAmount = 18446744073709551616; // 1.844e19 + // uint256 woethAmount = 4918; + // uint256 rethAmount = 5018; + // uint256 sfrxethAmount = 17119; // 1.711e4 + + uint256 assetCount = 4; + + // Call with arrays and from controller + IERC20[] memory assetsToDeposit = new IERC20[](assetCount); + assetsToDeposit[0] = IERC20(chainAddresses.lsd.WSTETH_ADDRESS); + assetsToDeposit[1] = IERC20(chainAddresses.lsd.WOETH_ADDRESS); + assetsToDeposit[2] = IERC20(chainAddresses.lsd.RETH_ADDRESS); + assetsToDeposit[3] = IERC20(chainAddresses.lsd.SFRXETH_ADDRESS); + + uint256[] memory amounts = new uint256[](assetCount); + amounts[0] = wstethAmount; + amounts[1] = woethAmount; + amounts[2] = rethAmount; + amounts[3] = sfrxethAmount; + + for (uint256 i = 0; i < assetCount; i++) { + address prankedUser = depositors[i]; + if (amounts[i] == 0) { + // no deposits + continue; + } + testAssetUtils.depositAsset(ynEigenToken, address(assetsToDeposit[i]), amounts[i], prankedUser); + } + + uint256[] memory initialBalances = new uint256[](assetsToDeposit.length); + for (uint256 i = 0; i < assetsToDeposit.length; i++) { + initialBalances[i] = assetsToDeposit[i].balanceOf(address(ynEigenToken)); + } + + uint256 totalAssetsBefore = ynEigenToken.totalAssets(); + + vm.startPrank(actors.ops.STRATEGY_CONTROLLER); + eigenStrategyManager.stakeAssetsToNode(tokenStakingNode.nodeId(), assetsToDeposit, amounts); + vm.stopPrank(); + + for (uint256 i = 0; i < assetsToDeposit.length; i++) { + uint256 initialBalance = initialBalances[i]; + uint256 finalBalance = assetsToDeposit[i].balanceOf(address(ynEigenToken)); + assertEq(initialBalance - finalBalance, amounts[i], "Balance of ynEigen did not decrease by the staked amount for asset"); + assertEq(compareWithThreshold(eigenStrategyManager.getStakedAssetBalance(assetsToDeposit[i]), initialBalance, 3), true, "Staked asset balance does not match initial balance within threshold"); + uint256 userUnderlyingView = eigenStrategyManager.strategies(assetsToDeposit[i]).userUnderlyingView(address(tokenStakingNode)); + + uint256 expectedUserUnderlyingView = initialBalance; + if (address(assetsToDeposit[i]) == chainAddresses.lsd.WSTETH_ADDRESS || address(assetsToDeposit[i]) == chainAddresses.lsd.WOETH_ADDRESS) { + + // TODO: come back to this to see why the reverse operation of converting the + // userUnderlyingView to the wrapped asset using the Rate Provider does not give the same result + + //expectedUserUnderlyingView = expectedUserUnderlyingView * wrappedAssetRate / 1e18; + //userUnderlyingView = userUnderlyingView * 1e18 / wrappedAssetRate; + if (address(assetsToDeposit[i]) == chainAddresses.lsd.WSTETH_ADDRESS) { + IwstETH wstETH = IwstETH(chainAddresses.lsd.WSTETH_ADDRESS); + userUnderlyingView = wstETH.getWstETHByStETH(userUnderlyingView); + } else if (address(assetsToDeposit[i]) == chainAddresses.lsd.WOETH_ADDRESS) { + IERC4626 woETH = IERC4626(chainAddresses.lsd.WOETH_ADDRESS); + userUnderlyingView = woETH.previewDeposit(userUnderlyingView); + } + } + + uint256 comparisonTreshold = 3; + assertEq(compareWithThreshold(expectedUserUnderlyingView, userUnderlyingView, comparisonTreshold), true, "Initial balance does not match user underlying view within threshold"); + } + + uint256 totalAssetsAfter = ynEigenToken.totalAssets(); + assertEq(compareWithThreshold(totalAssetsBefore, totalAssetsAfter, 100), true, "Total assets before and after staking do not match within a threshold of 3"); + } + + + function testStakeAssetsToMultipleNodes( + uint256 wstethAmount, + uint256 woethAmount + ) public { + + vm.assume( + wstethAmount < 1000 ether && wstethAmount >= 2 wei && + woethAmount < 1000 ether && woethAmount >= 2 wei + ); + + vm.startPrank(actors.ops.STAKING_NODE_CREATOR); + tokenStakingNodesManager.createTokenStakingNode(); + tokenStakingNodesManager.createTokenStakingNode(); + vm.stopPrank(); + + EigenStrategyManager.NodeAllocation[] memory allocations = new EigenStrategyManager.NodeAllocation[](2); + IERC20[] memory assets1 = new IERC20[](1); + uint256[] memory amounts1 = new uint256[](1); + assets1[0] = IERC20(chainAddresses.lsd.WSTETH_ADDRESS); + amounts1[0] = wstethAmount; + + testAssetUtils.depositAsset(ynEigenToken, address(assets1[0]), amounts1[0], depositors[0]); + + IERC20[] memory assets2 = new IERC20[](1); + uint256[] memory amounts2 = new uint256[](1); + assets2[0] = IERC20(chainAddresses.lsd.WOETH_ADDRESS); + amounts2[0] = woethAmount; + + testAssetUtils.depositAsset(ynEigenToken, address(assets2[0]), amounts2[0], depositors[1]); + + allocations[0] = EigenStrategyManager.NodeAllocation(0, assets1, amounts1); + allocations[1] = EigenStrategyManager.NodeAllocation(1, assets2, amounts2); + + uint256 totalAssetsBefore = ynEigenToken.totalAssets(); + + vm.startPrank(actors.ops.STRATEGY_CONTROLLER); + eigenStrategyManager.stakeAssetsToNodes(allocations); + vm.stopPrank(); + + { + uint256 totalAssetsAfter = ynEigenToken.totalAssets(); + assertEq(compareWithThreshold(totalAssetsBefore, totalAssetsAfter, 100), true, "Total assets before and after staking to multiple nodes do not match within a threshold of 100"); + } + + { + uint256 userUnderlyingViewNode0 = eigenStrategyManager.strategies(assets1[0]).userUnderlyingView(address(tokenStakingNodesManager.nodes(0))); + IwstETH wstETH = IwstETH(chainAddresses.lsd.WSTETH_ADDRESS); + uint256 wstETHAmountNode0 = wstETH.getWstETHByStETH(userUnderlyingViewNode0); + assertEq( + compareWithThreshold(wstETHAmountNode0, wstethAmount, 3), true, + string.concat("Unwrapped stETH amount does not match expected for node 0. Expected: ", vm.toString(wstethAmount), ", Got: ", vm.toString(wstETHAmountNode0)) + ); + } + + { + uint256 userUnderlyingViewNode1 = eigenStrategyManager.strategies(assets2[0]).userUnderlyingView(address(tokenStakingNodesManager.nodes(1))); + IERC4626 woETH = IERC4626(chainAddresses.lsd.WOETH_ADDRESS); + uint256 woETHAmountNode1 = woETH.previewDeposit(userUnderlyingViewNode1); + assertEq( + compareWithThreshold(woETHAmountNode1, woethAmount, 3), true, + string.concat("Unwrapped oETH amount does not match expected for node 1. Expected: ", vm.toString(woethAmount), ", Got: ", vm.toString(woETHAmountNode1)) + ); + } + + } + + function testExpectedStrategiesForAssets() public { + address wstethAsset = chainAddresses.lsd.WSTETH_ADDRESS; + address woethAsset = chainAddresses.lsd.WOETH_ADDRESS; + address rethAsset = chainAddresses.lsd.RETH_ADDRESS; + address sfrxethAsset = chainAddresses.lsd.SFRXETH_ADDRESS; + address expectedStrategyForWSTETH = chainAddresses.lsdStrategies.STETH_STRATEGY_ADDRESS; + address expectedStrategyForWOETH = chainAddresses.lsdStrategies.OETH_STRATEGY_ADDRESS; + address expectedStrategyForRETH = chainAddresses.lsdStrategies.RETH_STRATEGY_ADDRESS; + address expectedStrategyForSFRXETH = chainAddresses.lsdStrategies.SFRXETH_STRATEGY_ADDRESS; + + assertEq(address(eigenStrategyManager.strategies(IERC20(wstethAsset))), expectedStrategyForWSTETH, "Incorrect strategy for WSTETH"); + assertEq(address(eigenStrategyManager.strategies(IERC20(woethAsset))), expectedStrategyForWOETH, "Incorrect strategy for WOETH"); + assertEq(address(eigenStrategyManager.strategies(IERC20(rethAsset))), expectedStrategyForRETH, "Incorrect strategy for RETH"); + assertEq(address(eigenStrategyManager.strategies(IERC20(sfrxethAsset))), expectedStrategyForSFRXETH, "Incorrect strategy for SFRXETH"); + } + + function testAddStrategySuccess() public { + IERC20 newAsset = IERC20(chainAddresses.lsd.SWELL_ADDRESS); // Using SWELL as the new asset + IStrategy newStrategy = IStrategy(chainAddresses.lsdStrategies.SWELL_STRATEGY_ADDRESS); // Using SWELL strategy + + // Initially, there should be no strategy set for newAsset + assertEq(address(eigenStrategyManager.strategies(newAsset)), address(0), "Strategy already set for new asset"); + + // Add strategy for newAsset + vm.prank(actors.admin.EIGEN_STRATEGY_ADMIN); + eigenStrategyManager.setStrategy(newAsset, newStrategy); + + // Verify that the strategy has been set + assertEq(address(eigenStrategyManager.strategies(newAsset)), address(newStrategy), "Strategy not set correctly"); + } + + function testAddStrategyTwice() public { + IERC20 existingAsset = IERC20(chainAddresses.lsd.SWELL_ADDRESS); + IStrategy existingStrategy = IStrategy(chainAddresses.lsdStrategies.SWELL_STRATEGY_ADDRESS); + + // Setup: Add a strategy initially + vm.prank(actors.admin.EIGEN_STRATEGY_ADMIN); + eigenStrategyManager.setStrategy(existingAsset, existingStrategy); + + + vm.prank(actors.admin.EIGEN_STRATEGY_ADMIN); + eigenStrategyManager.setStrategy(existingAsset, existingStrategy); + } + + function testAddStrategyWithMismatchedUnderlyingToken() public { + IERC20 asset = IERC20(chainAddresses.lsd.SWELL_ADDRESS); // Using SWELL as the asset + IStrategy mismatchedStrategy = IStrategy(chainAddresses.lsdStrategies.OETH_STRATEGY_ADDRESS); // Incorrect strategy for SWELL + + // Setup: Ensure the underlying token of the mismatched strategy is not SWELL + assertNotEq(address(mismatchedStrategy.underlyingToken()), address(asset), "Underlying token should not match asset"); + + // Attempt to add a strategy with a mismatched underlying token + vm.startPrank(actors.admin.EIGEN_STRATEGY_ADMIN); + vm.expectRevert( + abi.encodeWithSelector(EigenStrategyManager.AssetDoesNotMatchStrategyUnderlyingToken.selector, address(asset), address(mismatchedStrategy.underlyingToken()))); + eigenStrategyManager.setStrategy(asset, mismatchedStrategy); + vm.stopPrank(); + } + + function testAddStrategyFailureZeroAsset() public { + IStrategy newStrategy = IStrategy(address(0x456)); // Example new strategy address + + vm.prank(actors.admin.EIGEN_STRATEGY_ADMIN); + // Test with zero address for asset + vm.expectRevert(abi.encodeWithSelector(EigenStrategyManager.ZeroAddress.selector)); + eigenStrategyManager.setStrategy(IERC20(address(0)), newStrategy); + } + + function testAddStrategyFailureZeroStrategy() public { + IERC20 newAsset = IERC20(address(0x123)); // Example new asset address + + vm.prank(actors.admin.EIGEN_STRATEGY_ADMIN); + vm.expectRevert(abi.encodeWithSelector(EigenStrategyManager.ZeroAddress.selector)); + eigenStrategyManager.setStrategy(newAsset, IStrategy(address(0))); + } +} \ No newline at end of file diff --git a/test/integration/ynEIGEN/TokenStakingNode.t.sol b/test/integration/ynEIGEN/TokenStakingNode.t.sol new file mode 100644 index 000000000..e18a49d4a --- /dev/null +++ b/test/integration/ynEIGEN/TokenStakingNode.t.sol @@ -0,0 +1,189 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity 0.8.24; + +import {ynEigenIntegrationBaseTest} from "test/integration/ynEIGEN/ynEigenIntegrationBaseTest.sol"; +import {IERC20} from "lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol"; +import {IStrategyManager} from "lib/eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol"; +import {IynEigen} from "src/interfaces/IynEigen.sol"; +import {IPausable} from "lib/eigenlayer-contracts/src/contracts/interfaces/IPausable.sol"; +import {IDelegationManager} from "lib/eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol"; +import {ISignatureUtils} from "lib/eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol"; +import {TestAssetUtils} from "test/utils/TestAssetUtils.sol"; +import {ITokenStakingNode} from "src/interfaces/ITokenStakingNode.sol"; +import {IwstETH} from "src/external/lido/IwstETH.sol"; + +import "forge-std/console.sol"; + + +contract TokenStakingNodeTest is ynEigenIntegrationBaseTest { + + ITokenStakingNode tokenStakingNode; + TestAssetUtils testAssetUtils; + + constructor() { + testAssetUtils = new TestAssetUtils(); + } + + function setUp() public override { + super.setUp(); + vm.prank(actors.ops.STAKING_NODE_CREATOR); + tokenStakingNode = tokenStakingNodesManager.createTokenStakingNode(); + } + + function testNodeIdView() public { + uint256 _nodeId = tokenStakingNode.nodeId(); + assertEq(_nodeId, 0); + } + + function testImplementationView() public { + address _implementation = tokenStakingNode.implementation(); + vm.prank(actors.ops.STAKING_NODE_CREATOR); + tokenStakingNodesManager.createTokenStakingNode(); + ITokenStakingNode _newTokenStakingNode = tokenStakingNodesManager.nodes(0); + assertEq(_implementation, address(_newTokenStakingNode.implementation())); + } + + function testDepositAssetsToEigenlayerSuccessFuzz( + uint256 wstethAmount + ) public { + vm.assume( + wstethAmount < 10000 ether && wstethAmount >= 2 wei + ); + + // 1. Obtain wstETH and Deposit assets to ynEigen by User + IERC20 wstETH = IERC20(chainAddresses.lsd.WSTETH_ADDRESS); + testAssetUtils.depositAsset(ynEigenToken, address(wstETH), wstethAmount, address(this)); + + // 2. Deposit assets to Eigenlayer by Token Staking Node + + IERC20[] memory assets = new IERC20[](1); + assets[0] = wstETH; + uint256[] memory amounts = new uint256[](1); + amounts[0] = wstethAmount; + uint256 nodeId = tokenStakingNode.nodeId(); + vm.prank(actors.ops.STRATEGY_CONTROLLER); + eigenStrategyManager.stakeAssetsToNode(nodeId, assets, amounts); + + uint256 expectedStETHAmount = IwstETH(address(wstETH)).stEthPerToken() * amounts[0] / 1e18; + + // TODO: figure out why this doesn't match. + // assertTrue( + // compareWithThreshold(deposits[0], expectedStETHAmount, 2), + // "Strategy user underlying view does not match expected stETH amount within threshold" + // ); + + uint256 treshold = wstethAmount / 1e17 + 3; + uint256 expectedBalance = eigenStrategyManager.getStakedAssetBalance(assets[0]); + assertTrue( + compareWithThreshold(expectedBalance, amounts[0], treshold), + "Staked asset balance does not match expected deposits" + ); + + uint256 strategyUserUnderlyingView = eigenStrategyManager.strategies(assets[0]).userUnderlyingView(address(tokenStakingNode)); + + assertTrue(compareWithThreshold(strategyUserUnderlyingView, expectedStETHAmount, treshold), "Strategy user underlying view does not match expected stETH amount within threshold"); + } + + function testDepositAssetsToEigenlayerFail() public { + // 1. Obtain wstETH and Deposit assets to ynEigen by User + IERC20 wstETH = IERC20(chainAddresses.lsd.WSTETH_ADDRESS); + uint256 balance = testAssetUtils.get_wstETH(address(this), 10 ether); + wstETH.approve(address(ynEigenToken), balance); + ynEigenToken.deposit(wstETH, balance, address(this)); + uint256 nodeId = tokenStakingNode.nodeId(); + + // 2. Deposit should fail when paused + IStrategyManager strategyManager = eigenStrategyManager.strategyManager(); + vm.prank(chainAddresses.eigenlayer.STRATEGY_MANAGER_PAUSER_ADDRESS); + IPausable(address(strategyManager)).pause(1); + IERC20[] memory assets = new IERC20[](1); + assets[0] = wstETH; + uint256[] memory amounts = new uint256[](1); + amounts[0] = balance; + vm.prank(actors.ops.STRATEGY_CONTROLLER); + vm.expectRevert("Pausable: index is paused"); + eigenStrategyManager.stakeAssetsToNode(nodeId, assets, amounts); + } +} + + +contract TokenStakingNodeDelegate is ynEigenIntegrationBaseTest { + + + function testTokenStakingNodeDelegate() public { + vm.prank(actors.ops.STAKING_NODE_CREATOR); + ITokenStakingNode tokenStakingNodeInstance = tokenStakingNodesManager.createTokenStakingNode(); + IDelegationManager delegationManager = tokenStakingNodesManager.delegationManager(); + + IPausable pauseDelegationManager = IPausable(address(delegationManager)); + vm.prank(chainAddresses.eigenlayer.DELEGATION_PAUSER_ADDRESS); + pauseDelegationManager.unpause(0); + + address operatorAddress = address(uint160(uint256(keccak256(abi.encodePacked(block.timestamp, block.prevrandao))))); + + // register as operator + vm.prank(operatorAddress); + delegationManager.registerAsOperator( + IDelegationManager.OperatorDetails({ + earningsReceiver: operatorAddress, + delegationApprover: address(0), + stakerOptOutWindowBlocks: 1 + }), + "ipfs://some-ipfs-hash" + ); + + ISignatureUtils.SignatureWithExpiry memory signature; + bytes32 approverSalt; + + vm.prank(actors.admin.STAKING_NODES_DELEGATOR); + tokenStakingNodeInstance.delegate(operatorAddress, signature, approverSalt); + address delegatedTo = delegationManager.delegatedTo(address(tokenStakingNodeInstance)); + assertEq(delegatedTo, operatorAddress, "Delegation did not occur as expected."); + } + + function testTokenStakingNodeUndelegate() public { + vm.prank(actors.ops.STAKING_NODE_CREATOR); + ITokenStakingNode tokenStakingNodeInstance = tokenStakingNodesManager.createTokenStakingNode(); + IDelegationManager delegationManager = tokenStakingNodesManager.delegationManager(); + IPausable pauseDelegationManager = IPausable(address(delegationManager)); + + // Unpause delegation manager to allow delegation + vm.prank(chainAddresses.eigenlayer.DELEGATION_PAUSER_ADDRESS); + pauseDelegationManager.unpause(0); + + address operatorAddress = address(uint160(uint256(keccak256(abi.encodePacked(block.timestamp, block.prevrandao))))); + + // Register as operator and delegate + vm.prank(operatorAddress); + delegationManager.registerAsOperator( + IDelegationManager.OperatorDetails({ + earningsReceiver: operatorAddress, + delegationApprover: address(0), + stakerOptOutWindowBlocks: 1 + }), + "ipfs://some-ipfs-hash" + ); + + ISignatureUtils.SignatureWithExpiry memory signature; + bytes32 approverSalt; + + vm.prank(actors.admin.STAKING_NODES_DELEGATOR); + tokenStakingNodeInstance.delegate(operatorAddress, signature, approverSalt); + + // Attempt to undelegate + vm.expectRevert(); + tokenStakingNodeInstance.undelegate(); + + IStrategyManager strategyManager = tokenStakingNodesManager.strategyManager(); + uint256 stakerStrategyListLength = strategyManager.stakerStrategyListLength(address(tokenStakingNodeInstance)); + assertEq(stakerStrategyListLength, 0, "Staker strategy list length should be 0."); + + // Now actually undelegate with the correct role + vm.prank(actors.admin.STAKING_NODES_DELEGATOR); + tokenStakingNodeInstance.undelegate(); + + // Verify undelegation + address delegatedAddress = delegationManager.delegatedTo(address(tokenStakingNodeInstance)); + assertEq(delegatedAddress, address(0), "Delegation should be cleared after undelegation."); + } +} \ No newline at end of file diff --git a/test/integration/ynEIGEN/TokenStakingNodesManager.t.sol b/test/integration/ynEIGEN/TokenStakingNodesManager.t.sol new file mode 100644 index 000000000..f7942d173 --- /dev/null +++ b/test/integration/ynEIGEN/TokenStakingNodesManager.t.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import "./ynEigenIntegrationBaseTest.sol"; +import {ProxyAdmin} from "lib/openzeppelin-contracts/contracts/proxy/transparent/ProxyAdmin.sol"; +import {UpgradeableBeacon} from "lib/openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol"; +import {ITransparentUpgradeableProxy} from "lib/openzeppelin-contracts/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; +import {IPausable} from "lib/eigenlayer-contracts/src/contracts/interfaces//IPausable.sol"; +import {ITokenStakingNode} from "src/interfaces/ITokenStakingNode.sol"; +import {ynBase} from "src/ynBase.sol"; +import {TestTokenStakingNodeV2} from "test/mocks/TestTokenStakingNodeV2.sol"; +import {TestTokenStakingNodesManagerV2} from "test/mocks/TestTokenStakingNodesManagerV2.sol"; + + +import "forge-std/console.sol"; + +contract TokenStakingNodesManagerAdminTest is ynEigenIntegrationBaseTest { + + function testCreateTokenStakingNode() public { + vm.prank(actors.ops.STAKING_NODE_CREATOR); + ITokenStakingNode tokenStakingNodeInstance = tokenStakingNodesManager.createTokenStakingNode(); + + uint256 expectedNodeId = 0; + assertEq(tokenStakingNodeInstance.nodeId(), expectedNodeId, "Node ID does not match expected value"); + } + + function testCreateStakingNodeOverMax() public { + vm.startPrank(actors.ops.STAKING_NODE_CREATOR); + for (uint256 i = 0; i < 10; i++) { + tokenStakingNodesManager.createTokenStakingNode(); + } + vm.expectRevert(abi.encodeWithSelector(TokenStakingNodesManager.TooManyStakingNodes.selector, 10)); + tokenStakingNodesManager.createTokenStakingNode(); + vm.stopPrank(); + } + + function testCreate2TokenStakingNodes() public { + vm.prank(actors.ops.STAKING_NODE_CREATOR); + ITokenStakingNode tokenStakingNodeInstance1 = tokenStakingNodesManager.createTokenStakingNode(); + uint256 expectedNodeId1 = 0; + assertEq(tokenStakingNodeInstance1.nodeId(), expectedNodeId1, "Node ID for node 1 does not match expected value"); + + vm.prank(actors.ops.STAKING_NODE_CREATOR); + ITokenStakingNode tokenStakingNodeInstance2 = tokenStakingNodesManager.createTokenStakingNode(); + uint256 expectedNodeId2 = 1; + assertEq(tokenStakingNodeInstance2.nodeId(), expectedNodeId2, "Node ID for node 2 does not match expected value"); + } + + function testCreateTokenStakingNodeAfterUpgradeWithoutUpgradeability() public { + // Upgrade the ynEigenToken implementation to TestTokenStakingNodesManagerV2 + address newImplementation = address(new TestTokenStakingNodesManagerV2()); + vm.prank(actors.admin.PROXY_ADMIN_OWNER); + ProxyAdmin(getTransparentUpgradeableProxyAdminAddress(address(tokenStakingNodesManager))) + .upgradeAndCall(ITransparentUpgradeableProxy(address(tokenStakingNodesManager)), newImplementation, ""); + + // Attempt to create a token staking node after the upgrade - should fail since implementation is not there + vm.expectRevert(); + vm.prank(actors.ops.STAKING_NODE_CREATOR); + tokenStakingNodesManager.createTokenStakingNode(); + } + + function testUpgradeTokenStakingNodeImplementation() public { + vm.prank(actors.ops.STAKING_NODE_CREATOR); + ITokenStakingNode tokenStakingNodeInstance = tokenStakingNodesManager.createTokenStakingNode(); + + // upgrade the ynEigenToken to support the new initialization version. + address newYnEigenTokenImpl = address(new TestTokenStakingNodesManagerV2()); + vm.prank(actors.admin.PROXY_ADMIN_OWNER); + ProxyAdmin(getTransparentUpgradeableProxyAdminAddress(address(tokenStakingNodesManager))) + .upgradeAndCall(ITransparentUpgradeableProxy(address(tokenStakingNodesManager)), newYnEigenTokenImpl, ""); + + TestTokenStakingNodeV2 testTokenStakingNodeV2 = new TestTokenStakingNodeV2(); + vm.prank(actors.admin.STAKING_ADMIN); + tokenStakingNodesManager.upgradeTokenStakingNode(address(testTokenStakingNodeV2)); + + UpgradeableBeacon beacon = tokenStakingNodesManager.upgradeableBeacon(); + address upgradedImplementationAddress = beacon.implementation(); + assertEq(upgradedImplementationAddress, address(testTokenStakingNodeV2)); + + TestTokenStakingNodeV2 testTokenStakingNodeV2Instance = TestTokenStakingNodeV2(payable(address(tokenStakingNodeInstance))); + uint256 redundantFunctionResult = testTokenStakingNodeV2Instance.redundantFunction(); + assertEq(redundantFunctionResult, 1234567); + + assertEq(testTokenStakingNodeV2Instance.valueToBeInitialized(), 23, "Value to be initialized does not match expected value"); + } + + function testFailRegisterTokenStakingNodeImplementationTwice() public { + address initialImplementation = address(new TestTokenStakingNodeV2()); + tokenStakingNodesManager.registerTokenStakingNode(initialImplementation); + + address newImplementation = address(new TestTokenStakingNodeV2()); + vm.expectRevert("ynEigenToken: Implementation already exists"); + tokenStakingNodesManager.registerTokenStakingNode(newImplementation); + } + + function testSetMaxNodeCount() public { + uint256 maxNodeCount = 10; + vm.prank(actors.admin.STAKING_ADMIN); + tokenStakingNodesManager.setMaxNodeCount(maxNodeCount); + assertEq(tokenStakingNodesManager.maxNodeCount(), maxNodeCount, "Max node count does not match expected value"); + } + + // function testPauseDepositsFunctionality() public { + // IERC20 stETH = IERC20(chainAddresses.lsd.STETH_ADDRESS); + + // uint256 depositAmount = 0.1 ether; + + // // 1. Obtain stETH and Deposit assets to ynLSD by User + // TestAssetUtils testAssetUtils = new TestAssetUtils(); + // uint256 balance = testAssetUtils.get_stETH(address(this), depositAmount); + // stETH.approve(address(ynlsd), balance); + + // // Arrange + // vm.prank(actors.ops.PAUSE_ADMIN); + // ynlsd.pauseDeposits(); + + // // Act & Assert + // bool pauseState = ynlsd.depositsPaused(); + // assertTrue(pauseState, "Deposit ETH should be paused after setting pause state to true"); + + // // Trying to deposit ETH while pause + // vm.expectRevert(ynLSD.Paused.selector); + // ynlsd.deposit(stETH, balance, address(this)); + + // // Unpause and try depositing again + // vm.prank(actors.admin.UNPAUSE_ADMIN); + // ynlsd.unpauseDeposits(); + // pauseState = ynlsd.depositsPaused(); + + // assertFalse(pauseState, "Deposit ETH should be unpaused after setting pause state to false"); + + // // Deposit should succeed now + // ynlsd.deposit(stETH, balance, address(this)); + // assertGt(ynlsd.totalAssets(), 0, "ynLSD balance should be greater than 0 after deposit"); + // } + +} \ No newline at end of file diff --git a/test/integration/ynEIGEN/ynEigen.t.sol b/test/integration/ynEIGEN/ynEigen.t.sol new file mode 100644 index 000000000..ab9af3085 --- /dev/null +++ b/test/integration/ynEIGEN/ynEigen.t.sol @@ -0,0 +1,592 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity 0.8.24; + +import "./ynEigenIntegrationBaseTest.sol"; +import {ProxyAdmin} from "lib/openzeppelin-contracts/contracts/proxy/transparent/ProxyAdmin.sol"; +import {UpgradeableBeacon} from "lib/openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol"; +import {ITransparentUpgradeableProxy} from "lib/openzeppelin-contracts/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; +import {IPausable} from "lib/eigenlayer-contracts/src/contracts/interfaces//IPausable.sol"; +import {ITokenStakingNode} from "src/interfaces/ITokenStakingNode.sol"; +import {ynBase} from "src/ynBase.sol"; + +contract ynEigenTest is ynEigenIntegrationBaseTest { + + TestAssetUtils testAssetUtils; + constructor() { + testAssetUtils = new TestAssetUtils(); + } + + struct DepositTestVars { + uint256 initialSupply; + uint256 initialAssetBalance; + uint256 internalAssetBalanceBefore; + uint256 totalAssetsBefore; + uint256 balance; + uint256 finalAssetBalance; + uint256 finalSupply; + uint256 internalAssetBalanceAfter; + uint256 userYnEigenBalanceAfter; + uint256 ethEquivalent; + uint256 totalAssetsAfter; + + uint256 userYnEigenBalanceBefore; + } + + function depositAssetAndVerify(IERC20 asset, uint256 amount) public { + + address prankedUser = address(0x1234543210); + DepositTestVars memory vars; + vars.initialSupply = ynEigenToken.totalSupply(); + vars.initialAssetBalance = asset.balanceOf(address(ynEigenToken)); + vars.internalAssetBalanceBefore = ynEigenToken.assetBalance(asset); + vars.totalAssetsBefore = ynEigenToken.totalAssets(); + + // 1. Obtain asset and Deposit assets to ynEigen by User + vars.balance = testAssetUtils.get_Asset(address(asset), prankedUser, amount); + + vars.userYnEigenBalanceBefore = ynEigenToken.balanceOf(prankedUser); + + vm.prank(prankedUser); + asset.approve(address(ynEigenToken), vars.balance); + vm.prank(prankedUser); + ynEigenToken.deposit(asset, vars.balance, prankedUser); + + vars.finalAssetBalance = asset.balanceOf(address(ynEigenToken)); + vars.finalSupply = ynEigenToken.totalSupply(); + vars.internalAssetBalanceAfter = ynEigenToken.assetBalance(asset); + + vars.userYnEigenBalanceAfter = ynEigenToken.balanceOf(prankedUser); + + + assertEq( + vars.finalSupply, + vars.initialSupply + (vars.userYnEigenBalanceAfter - vars.userYnEigenBalanceBefore), + "Total supply did not increase correctly"); + + vars.ethEquivalent = rateProvider.rate(address(asset)) * amount / 1e18; + vars.totalAssetsAfter = ynEigenToken.totalAssets(); + assertTrue( + compareWithThreshold(vars.totalAssetsAfter, vars.totalAssetsBefore + vars.ethEquivalent, 2), + string.concat( + "Total assets did not increase by the correct ETH equivalent amount. Expected: ", + vm.toString(vars.totalAssetsBefore + vars.ethEquivalent), + ", Got: ", + vm.toString(vars.totalAssetsAfter) + ) + ); + } + + function testDepositwstETHSuccessWithOneDepositFuzz(uint256 amount) public { + vm.assume( + amount < 10000 ether && amount >= 2 wei + ); + + IERC20 wstETH = IERC20(chainAddresses.lsd.WSTETH_ADDRESS); + depositAssetAndVerify(wstETH, amount); + } + + function testDepositsfrxETHSuccessWithOneDepositFuzz(uint256 amount) public { + vm.assume( + amount < 10000 ether && amount >= 2 wei + ); + + IERC20 sfrxETH = IERC20(chainAddresses.lsd.SFRXETH_ADDRESS); + depositAssetAndVerify(sfrxETH, amount); + } + + function testDepositrETHSuccessWithOneDepositFuzz(uint256 amount) public { + vm.assume( + amount < 10000 ether && amount >= 2 wei + ); + + IERC20 rETH = IERC20(chainAddresses.lsd.RETH_ADDRESS); + depositAssetAndVerify(rETH, amount); + } + + function testDepositmETHSuccessWithOneDepositFuzz( + uint256 amount + ) public { + + // NOTE: mETH doesn't usually work with 10k amounts at a time to stake ETH and obtain it in 1 tx + vm.assume( + amount < 1000 ether && amount >= 2 wei + ); + + IERC20 mETH = IERC20(chainAddresses.lsd.METH_ADDRESS); + depositAssetAndVerify(mETH, amount); + } + + function testMultipleDepositsFuzz( + uint8 asset0Index, + uint8 asset1Index, + uint256 asset0Amount, + uint256 asset1Amount + ) public { + + vm.assume(asset0Index < 4 && asset1Index < 4); + vm.assume( + asset0Amount < 10000 ether && asset0Amount >= 2 wei && + asset1Amount < 10000 ether && asset1Amount >= 2 wei + ); + + IERC20[] memory assets = new IERC20[](4); + assets[0] = IERC20(chainAddresses.lsd.WSTETH_ADDRESS); + assets[1] = IERC20(chainAddresses.lsd.SFRXETH_ADDRESS); + assets[2] = IERC20(chainAddresses.lsd.RETH_ADDRESS); + assets[3] = IERC20(chainAddresses.lsd.WOETH_ADDRESS); + + depositAssetAndVerify(assets[asset0Index], asset0Amount); + depositAssetAndVerify(assets[asset1Index], asset1Amount); + + } + + function testDepositwstETHSuccessWithMultipleDeposits() public { + IERC20 wstETH = IERC20(chainAddresses.lsd.WSTETH_ADDRESS); + uint256 amount = 32 ether; + + address prankedUser = address(0x123); + uint256 initialSupply = ynEigenToken.totalSupply(); + + // 1. Obtain wstETH and Deposit assets to ynEigen by User + uint256 balance = testAssetUtils.get_wstETH(prankedUser, amount); + assertEq(compareRebasingTokenBalances(balance, amount), true, "Amount not received"); + + vm.prank(prankedUser); + wstETH.approve(address(ynEigenToken), 32 ether); + uint256 depositAmountOne = 5 ether; + uint256 depositAmountTwo = 3 ether; + uint256 depositAmountThree = 7 ether; + + vm.prank(prankedUser); + ynEigenToken.deposit(wstETH, depositAmountOne, prankedUser); + vm.prank(prankedUser); + ynEigenToken.deposit(wstETH, depositAmountTwo, prankedUser); + vm.prank(prankedUser); + ynEigenToken.deposit(wstETH, depositAmountThree, prankedUser); + + assertEq(ynEigenToken.balanceOf(prankedUser), ynEigenToken.totalSupply() - initialSupply, "ynEigen balance does not match total supply"); + } + + function testDepositUnsupportedAsset() public { + IERC20 asset = IERC20(address(1)); + uint256 amount = 1 ether; + address receiver = address(this); + + vm.expectRevert(abi.encodeWithSelector(ynEigen.UnsupportedAsset.selector, address(asset))); + ynEigenToken.deposit(asset, amount, receiver); + } + + function testDepositWithZeroAmount() public { + IERC20 asset = IERC20(chainAddresses.lsd.WSTETH_ADDRESS); + uint256 amount = 0; // Zero amount for deposit + address receiver = address(this); + + vm.expectRevert(ynEigen.ZeroAmount.selector); + ynEigenToken.deposit(asset, amount, receiver); + } + + function testConvertToShares() public { + IERC20 asset = IERC20(address(this)); + uint256 amount = 1000; + vm.expectRevert(abi.encodeWithSelector(ynEigen.UnsupportedAsset.selector, address(asset))); + ynEigenToken.convertToShares(asset, amount); + } + + function testConvertToSharesWithNoAssets() public { + vm.prank(actors.ops.STAKING_NODE_CREATOR); + tokenStakingNodesManager.createTokenStakingNode(); + uint256 totalAssets = ynEigenToken.totalAssets(); + assertEq(totalAssets, 0, "Total assets should be zero initially"); + } + + function testGetTotalAssetsConsistency() public { + uint256 totalAssets = ynEigenToken.totalAssets(); + assertEq(totalAssets, 0, "Total assets should match bootstrap amount in ETH"); + } + + function testDepositUnsupportedAssetReverts() public { + IERC20 asset = IERC20(address(1)); + vm.expectRevert(abi.encodeWithSelector(ynEigen.UnsupportedAsset.selector, asset)); + ynEigenToken.convertToShares(asset, 1000); + } + + function testCalculateSharesForAsset() public { + IERC20 asset = IERC20(chainAddresses.lsd.RETH_ADDRESS); + uint256 amount = 1000; + uint256 shares = ynEigenToken.convertToShares(asset, amount); + uint256 assetRate = rateProvider.rate(address(asset)); + + assertEq(shares, (uint256(assetRate) * amount) / 1e18, "Total shares calculation mismatch"); + } + function testTotalAssetsAfterDeposit() public { + IERC20 asset = IERC20(chainAddresses.lsd.WSTETH_ADDRESS); + uint256 amount = 1 ether; + + IPausable pausableStrategyManager = IPausable(address(eigenLayer.strategyManager)); + vm.prank(actors.ops.STAKING_NODE_CREATOR); + ITokenStakingNode tokenStakingNode = tokenStakingNodesManager.createTokenStakingNode(); + + address unpauser = pausableStrategyManager.pauserRegistry().unpauser(); + + vm.startPrank(unpauser); + pausableStrategyManager.unpause(0); + vm.stopPrank(); + + uint256 totalAssetsBeforeDeposit = ynEigenToken.totalAssets(); + + // 1. Obtain wstETH and Deposit assets to ynEigen by User + uint256 balance = testAssetUtils.get_wstETH(address(this), amount); + assertEq(balance == amount, true, "Amount not received"); + asset.approve(address(ynEigenToken), balance); + ynEigenToken.deposit(asset, balance, address(this)); + { + IERC20[] memory assets = new IERC20[](1); + uint256[] memory amounts = new uint256[](1); + assets[0] = asset; + amounts[0] = amount; + + uint256 nodeId = tokenStakingNode.nodeId(); + vm.prank(actors.ops.STRATEGY_CONTROLLER); + eigenStrategyManager.stakeAssetsToNode(nodeId, assets, amounts); + } + uint256 totalAssetsAfterDeposit = ynEigenToken.totalAssets(); + + IStrategy strategy = eigenStrategyManager.strategies(IERC20(chainAddresses.lsd.WSTETH_ADDRESS)); + uint256 balanceInStrategyForNode = strategy.userUnderlyingView((address(tokenStakingNode))); + + // expectedBalance is the same as in the strategy because 1 stETH = 1 ETH. + uint256 expectedBalance = balanceInStrategyForNode; + + // Assert that totalAssets reflects the deposit + assertEq( + compareWithThreshold(totalAssetsAfterDeposit - totalAssetsBeforeDeposit, expectedBalance, 2), + true, + "Total assets do not reflect the deposit" + ); + } + + function testPreviewDepositwstETH(uint256 amount) public { + vm.assume( + amount < 10000 ether && amount >= 2 wei + ); + + IERC20 asset = IERC20(chainAddresses.lsd.WSTETH_ADDRESS); + + uint256 wstethPrice = rateProvider.rate(chainAddresses.lsd.WSTETH_ADDRESS); + + uint256 expectedDepositPreview = amount * wstethPrice / 1e18; + uint256 previewDeposit = ynEigenToken.previewDeposit(asset, amount); + assertEq(previewDeposit, expectedDepositPreview, "Preview deposit does not match expected value"); + } + + function testPreviewDepositwoETH(uint256 amount) public { + vm.assume( + amount < 10000 ether && amount >= 2 wei + ); + + IERC20 asset = IERC20(chainAddresses.lsd.WOETH_ADDRESS); + + + uint256 woethPrice = rateProvider.rate(chainAddresses.lsd.WOETH_ADDRESS); + + uint256 expectedDepositPreview = amount * woethPrice / 1e18; + uint256 previewDeposit = ynEigenToken.previewDeposit(asset, amount); + assertEq(previewDeposit, expectedDepositPreview, "Preview deposit does not match expected value"); + } + + function testPreviewDepositsfrxETH(uint256 amount) public { + vm.assume( + amount < 10000 ether && amount >= 2 wei + ); + + IERC20 asset = IERC20(chainAddresses.lsd.SFRXETH_ADDRESS); + + uint256 sfrxETHPrice = rateProvider.rate(chainAddresses.lsd.SFRXETH_ADDRESS); + + uint256 expectedDepositPreview = amount * sfrxETHPrice / 1e18; + uint256 previewDeposit = ynEigenToken.previewDeposit(asset, amount); + assertEq(previewDeposit, expectedDepositPreview, "Preview deposit does not match expected value"); + } + + function testConvertToETH() public { + IERC20 asset = IERC20(chainAddresses.lsd.WSTETH_ADDRESS); + uint256 amount = 1 ether; + + uint256 wstethPrice = rateProvider.rate(chainAddresses.lsd.WSTETH_ADDRESS); + + uint256 expectedETHAmount = amount * wstethPrice / 1e18; + + uint256 ethAmount = assetRegistry.convertToUnitOfAccount(asset, amount); + assertEq(ethAmount, expectedETHAmount, "convertToEth does not match expected value"); + } +} + +contract ynTransferPauseTest is ynEigenIntegrationBaseTest { + + TestAssetUtils testAssetUtils; + constructor() { + testAssetUtils = new TestAssetUtils(); + } + + function testTransferFailsForNonWhitelistedAddresses() public { + // Arrange + uint256 transferAmount = 1 ether; + address nonWhitelistedAddress = address(4); // An arbitrary address not in the whitelist + address recipient = address(5); // An arbitrary recipient address + + // Act & Assert + // Ensure transfer from a non-whitelisted address reverts + vm.expectRevert(ynBase.TransfersPaused.selector); + vm.prank(nonWhitelistedAddress); + ynEigenToken.transfer(recipient, transferAmount); + } + + function testTransferSucceedsForWhitelistedAddress() public { + // Arrange + uint256 depositAmount = 1 ether; + address whitelistedAddress = actors.eoa.DEFAULT_SIGNER; // Using the pre-defined whitelisted address from setup + address recipient = address(6); // An arbitrary recipient address + + // 1. Obtain wstETH and Deposit assets to ynEigen by User + IERC20 wstETH = IERC20(chainAddresses.lsd.WSTETH_ADDRESS); + uint256 balance = testAssetUtils.get_wstETH(address(this), depositAmount); + wstETH.approve(address(ynEigenToken), balance); + ynEigenToken.deposit(wstETH, balance, whitelistedAddress); + + uint256 transferAmount = ynEigenToken.balanceOf(whitelistedAddress); + + // Act + address[] memory whitelist = new address[](1); + whitelist[0] = whitelistedAddress; + vm.prank(actors.admin.UNPAUSE_ADMIN); + ynEigenToken.addToPauseWhitelist(whitelist); // Whitelisting the address + vm.prank(whitelistedAddress); + ynEigenToken.transfer(recipient, transferAmount); + + // Assert + uint256 recipientBalance = ynEigenToken.balanceOf(recipient); + assertEq(recipientBalance, transferAmount, "Transfer did not succeed for whitelisted address"); + } + + function testAddToPauseWhitelist() public { + // Arrange + address[] memory addressesToWhitelist = new address[](2); + addressesToWhitelist[0] = address(1); + addressesToWhitelist[1] = address(2); + + // Act + vm.prank(actors.admin.UNPAUSE_ADMIN); + ynEigenToken.addToPauseWhitelist(addressesToWhitelist); + + // Assert + assertTrue(ynEigenToken.pauseWhiteList(addressesToWhitelist[0]), "Address 1 should be whitelisted"); + assertTrue(ynEigenToken.pauseWhiteList(addressesToWhitelist[1]), "Address 2 should be whitelisted"); + } + + function testTransferSucceedsForNewlyWhitelistedAddress() public { + // Arrange + uint256 depositAmount = 1 ether; + address newWhitelistedAddress = vm.addr(7); // Using a new address for whitelisting + address recipient = address(8); // An arbitrary recipient address + + // 1. Obtain wstETH and Deposit assets to ynEigen by User + IERC20 wstETH = IERC20(chainAddresses.lsd.WSTETH_ADDRESS); + uint256 balance = testAssetUtils.get_wstETH(address(this), depositAmount); + + wstETH.approve(address(ynEigenToken), balance); + ynEigenToken.deposit(wstETH, balance, newWhitelistedAddress); + + address[] memory whitelistAddresses = new address[](1); + whitelistAddresses[0] = newWhitelistedAddress; + vm.prank(actors.admin.UNPAUSE_ADMIN); + ynEigenToken.addToPauseWhitelist(whitelistAddresses); // Whitelisting the new address + + uint256 transferAmount = ynEigenToken.balanceOf(newWhitelistedAddress); + + // Act + vm.prank(newWhitelistedAddress); + ynEigenToken.transfer(recipient, transferAmount); + + // Assert + uint256 recipientBalance = ynEigenToken.balanceOf(recipient); + assertEq(recipientBalance, transferAmount, "Transfer did not succeed for newly whitelisted address"); + } + function testTransferEnabledForAnyAddress() public { + // Arrange + uint256 depositAmount = 1 ether; + address arbitraryAddress = vm.addr(9999); // Using an arbitrary address + address recipient = address(10000); // An arbitrary recipient address + + // 1. Obtain wstETH and Deposit assets to ynEigen by User + IERC20 wstETH = IERC20(chainAddresses.lsd.WSTETH_ADDRESS); + uint256 balance = testAssetUtils.get_wstETH(address(this), depositAmount); + wstETH.approve(address(ynEigenToken), balance); + ynEigenToken.deposit(wstETH, balance, arbitraryAddress); + + uint256 transferAmount = ynEigenToken.balanceOf(arbitraryAddress); + + // Act + vm.prank(actors.admin.UNPAUSE_ADMIN); + ynEigenToken.unpauseTransfers(); // Unpausing transfers for all + + vm.prank(arbitraryAddress); + ynEigenToken.transfer(recipient, transferAmount); + + // Assert + uint256 recipientBalance = ynEigenToken.balanceOf(recipient); + assertEq(recipientBalance, transferAmount, "Transfer did not succeed for any address after enabling transfers"); + } + + function testRemoveInitialWhitelistedAddress() public { + // Arrange + address[] memory whitelistAddresses = new address[](1); + whitelistAddresses[0] = actors.eoa.DEFAULT_SIGNER; // EOA address to be removed from whitelist + + // Act + vm.prank(actors.admin.UNPAUSE_ADMIN); + ynEigenToken.removeFromPauseWhitelist(whitelistAddresses); // Removing the EOA address from whitelist + + // Assert + bool isWhitelisted = ynEigenToken.pauseWhiteList(actors.eoa.DEFAULT_SIGNER); + assertFalse(isWhitelisted, "EOA address was not removed from whitelist"); + } + + function testRemoveMultipleNewWhitelistAddresses() public { + // Arrange + address[] memory newWhitelistAddresses = new address[](2); + newWhitelistAddresses[0] = address(20000); // First new whitelist address + newWhitelistAddresses[1] = address(20001); // Second new whitelist address + + // Adding addresses to whitelist first + vm.prank(actors.admin.UNPAUSE_ADMIN); + ynEigenToken.addToPauseWhitelist(newWhitelistAddresses); + + // Act + vm.prank(actors.admin.UNPAUSE_ADMIN); + ynEigenToken.removeFromPauseWhitelist(newWhitelistAddresses); // Removing the new whitelist addresses + + // Assert + bool isFirstAddressWhitelisted = ynEigenToken.pauseWhiteList(newWhitelistAddresses[0]); + bool isSecondAddressWhitelisted = ynEigenToken.pauseWhiteList(newWhitelistAddresses[1]); + assertFalse(isFirstAddressWhitelisted, "First new whitelist address was not removed"); + assertFalse(isSecondAddressWhitelisted, "Second new whitelist address was not removed"); + } +} + +contract ynEigen_retrieveAssetsTest is ynEigenIntegrationBaseTest { + + TestAssetUtils testAssetUtils; + constructor() { + testAssetUtils = new TestAssetUtils(); + } + + function testRetrieveAssetsNotEigenStrategyManager() public { + IERC20 asset = IERC20(chainAddresses.lsd.RETH_ADDRESS); + uint256 amount = 1000; + + vm.prank(actors.ops.STAKING_NODE_CREATOR); + tokenStakingNodesManager.createTokenStakingNode(); + + IERC20[] memory assets = new IERC20[](1); + uint256[] memory amounts = new uint256[](1); + assets[0] = asset; + amounts[0] = amount; + vm.expectRevert(abi.encodeWithSelector(ynEigen.NotStrategyManager.selector, address(this))); + ynEigenToken.retrieveAssets(assets, amounts); + } + + function testRetrieveAssetsUnsupportedAsset() public { + // come back to this + } + + function testRetrieveTransferExceedsBalance() public { + IERC20 asset = IERC20(chainAddresses.lsd.RETH_ADDRESS); + uint256 amount = 1000; + + vm.startPrank(address(eigenStrategyManager)); + IERC20[] memory assets = new IERC20[](1); + uint256[] memory amounts = new uint256[](1); + assets[0] = asset; + amounts[0] = amount; + vm.expectRevert(abi.encodeWithSelector(ynEigen.InsufficientAssetBalance.selector, asset, 0, amount)); + ynEigenToken.retrieveAssets(assets, amounts); + vm.stopPrank(); + } + + function testRetrieveAssetsSuccess() public { + IERC20 asset = IERC20(chainAddresses.lsd.WSTETH_ADDRESS); + uint256 amount = 64 ether; + + vm.prank(actors.ops.STAKING_NODE_CREATOR); + tokenStakingNodesManager.createTokenStakingNode(); + + ITokenStakingNode tokenStakingNode = tokenStakingNodesManager.nodes(0); + vm.deal(address(tokenStakingNode), 1000); + + // 1. Obtain stETH and Deposit assets to ynEigenToken by User + uint256 balance = testAssetUtils.get_wstETH(address(this), amount); + assertEq(compareRebasingTokenBalances(balance, amount), true, "Amount not received"); + + asset.approve(address(ynEigenToken), balance); + ynEigenToken.deposit(asset, balance, address(this)); + + vm.startPrank(address(eigenStrategyManager)); + asset.approve(address(ynEigenToken), 32 ether); + IERC20[] memory assets = new IERC20[](1); + uint256[] memory amounts = new uint256[](1); + assets[0] = asset; + amounts[0] = amount; + ynEigenToken.retrieveAssets(assets, amounts); + vm.stopPrank(); + + uint256 strategyManagerBalance = asset.balanceOf(address(eigenStrategyManager)); + assertEq(strategyManagerBalance, amount, "Strategy manager does not have the correct balance of the token"); + } +} + +contract ynEigenDonationsTest is ynEigenIntegrationBaseTest { + + TestAssetUtils testAssetUtils; + constructor() { + testAssetUtils = new TestAssetUtils(); + } + + function testYnEigendonationToZeroShareAttackResistance() public { + + uint INITIAL_AMOUNT = 10 ether; + + address alice = makeAddr("Alice"); + address bob = makeAddr("Bob"); + + IERC20 assetToken = IERC20(chainAddresses.lsd.WSTETH_ADDRESS); + + // 1. Obtain wstETH and Deposit assets to ynEigen by User + testAssetUtils.get_wstETH(alice, INITIAL_AMOUNT); + testAssetUtils.get_wstETH(bob, INITIAL_AMOUNT); + + vm.prank(alice); + assetToken.approve(address(ynEigenToken), type(uint256).max); + + vm.startPrank(bob); + assetToken.approve(address(ynEigenToken), type(uint256).max); + + // Front-running part + uint256 bobDepositAmount = INITIAL_AMOUNT / 2; + // Alice knows that Bob is about to deposit INITIAL_AMOUNT*0.5 wstETH to the Vault by observing the mempool + vm.startPrank(alice); + uint256 aliceDepositAmount = 1; + uint256 aliceShares = ynEigenToken.deposit(assetToken, aliceDepositAmount, alice); + // Since there are bootstrap funds, this has no effect + assertEq(compareWithThreshold(aliceShares, 1, 1), true, "Alice's shares should be dust"); + // Try to inflate shares value + assetToken.transfer(address(ynEigenToken), bobDepositAmount); + vm.stopPrank(); + + // Check that Bob did not get 0 share when he deposits + vm.prank(bob); + uint256 bobShares = ynEigenToken.deposit(assetToken, bobDepositAmount, bob); + + assertGt(bobShares, 1 wei, "Bob's shares should be greater than 1 wei"); + } +} \ No newline at end of file diff --git a/test/integration/ynEIGEN/ynEigenDepositAdapter.t.sol b/test/integration/ynEIGEN/ynEigenDepositAdapter.t.sol new file mode 100644 index 000000000..a536f2faa --- /dev/null +++ b/test/integration/ynEIGEN/ynEigenDepositAdapter.t.sol @@ -0,0 +1,239 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity 0.8.24; + +import "./ynEigenIntegrationBaseTest.sol"; +import {ProxyAdmin} from "lib/openzeppelin-contracts/contracts/proxy/transparent/ProxyAdmin.sol"; +import {UpgradeableBeacon} from "lib/openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol"; +import {ITransparentUpgradeableProxy} from "lib/openzeppelin-contracts/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; +import {IPausable} from "lib/eigenlayer-contracts/src/contracts/interfaces//IPausable.sol"; +import {ITokenStakingNode} from "src/interfaces/ITokenStakingNode.sol"; +import {ynBase} from "src/ynBase.sol"; + +contract ynEigenDepositAdapterTest is ynEigenIntegrationBaseTest { + + + TestAssetUtils testAssetUtils; + constructor() { + testAssetUtils = new TestAssetUtils(); + } + + function testDepositstETHSuccessWithOneDepositFuzz( + uint256 depositAmount + ) public { + + vm.assume( + depositAmount < 10000 ether && depositAmount >= 2 wei + ); + address depositor = address(0x123); + address receiver = address(0x456); + + + // Arrange: Setup the initial balance of stETH for the depositor + IERC20 stETH = IERC20(chainAddresses.lsd.STETH_ADDRESS); + + uint256 initialSupply = ynEigenToken.totalSupply(); + uint256 initialReceiverBalance = ynEigenToken.balanceOf(receiver); + + // 1. Obtain wstETH and Deposit assets to ynEigen by User + testAssetUtils.get_stETH(depositor, depositAmount * 10); + + // Preview deposit to get expected shares + uint256 expectedShares = ynEigenDepositAdapterInstance.previewDeposit(stETH, depositAmount); + + vm.prank(depositor); + stETH.approve(address(ynEigenDepositAdapterInstance), depositAmount); + // Act: Perform the deposit operation using the ynEigenDepositAdapter + vm.prank(depositor); + uint256 shares = ynEigenDepositAdapterInstance.deposit(stETH, depositAmount, receiver); + + // Assert that the actual shares match the expected shares + assertEq(shares, expectedShares, "Actual shares do not match expected shares"); + + uint256 receiverBalance = ynEigenToken.balanceOf(receiver); + uint256 treshold = depositAmount / 1e17 + 3; + assertTrue( + compareWithThreshold(receiverBalance, depositAmount, treshold), + string.concat("Receiver's balance: ", vm.toString(receiverBalance), ", Expected balance: ", vm.toString(depositAmount)) + ); + + uint256 finalSupply = ynEigenToken.totalSupply(); + uint256 finalReceiverBalance = ynEigenToken.balanceOf(receiver); + + assertEq(finalSupply, initialSupply + shares, "Total supply did not increase correctly"); + + // Verify receiver balance increased + assertEq(finalReceiverBalance, initialReceiverBalance + shares, "Receiver balance did not increase correctly"); + } + + function testDepositOETHSuccessWithOneDeposit( + uint256 depositAmount + ) public { + + vm.assume( + depositAmount < 10000 ether && depositAmount >= 2 wei + ); + address depositor = address(0x789); + address receiver = address(0xABC); + + // Arrange: Setup the initial balance of oETH for the depositor + IERC20 oETH = IERC20(chainAddresses.lsd.OETH_ADDRESS); + + uint256 initialSupply = ynEigenToken.totalSupply(); + uint256 initialReceiverBalance = ynEigenToken.balanceOf(receiver); + + // 1. Obtain woETH and Deposit assets to ynEigen by User + testAssetUtils.get_OETH(depositor, depositAmount * 10); + + // Preview deposit to get expected shares + uint256 expectedShares = ynEigenDepositAdapterInstance.previewDeposit(oETH, depositAmount); + + vm.prank(depositor); + oETH.approve(address(ynEigenDepositAdapterInstance), depositAmount); + // Act: Perform the deposit operation using the ynEigenDepositAdapter + vm.prank(depositor); + uint256 shares = ynEigenDepositAdapterInstance.deposit(oETH, depositAmount, receiver); + + // Assert that the actual shares match the expected shares + assertEq(shares, expectedShares, "Actual shares do not match expected shares"); + + uint256 receiverBalance = ynEigenToken.balanceOf(receiver); + uint256 treshold = depositAmount / 1e17 + 3; + assertTrue( + compareWithThreshold(receiverBalance, depositAmount, treshold), + string.concat("Receiver's balance: ", vm.toString(receiverBalance), ", Expected balance: ", vm.toString(depositAmount)) + ); + + uint256 finalSupply = ynEigenToken.totalSupply(); + uint256 finalReceiverBalance = ynEigenToken.balanceOf(receiver); + + // // // Verify asset balance of ynEigenToken increased + // // assertEq(finalAssetBalance, initialAssetBalance + balance, "Asset balance did not increase correctly"); + // Verify total supply increased + assertEq(finalSupply, initialSupply + shares, "Total supply did not increase correctly"); + + // Verify receiver balance increased + assertEq(finalReceiverBalance, initialReceiverBalance + shares, "Receiver balance did not increase correctly"); + } + + function testDepositwstETHSuccessWithOneDepositFuzzWithAdapter( + uint256 amount + ) public { + vm.assume( + amount < 10000 ether && amount >= 2 wei + ); + + IERC20 wstETH = IERC20(chainAddresses.lsd.WSTETH_ADDRESS); + depositAssetAndVerify(wstETH, amount); + } + + function testDepositsfrxETHSuccessWithOneDepositFuzzWithAdapter( + uint256 amount + ) public { + vm.assume( + amount < 10000 ether && amount >= 2 wei + ); + + IERC20 sfrxETH = IERC20(chainAddresses.lsd.SFRXETH_ADDRESS); + depositAssetAndVerify(sfrxETH, amount); + } + + function testDepositrETHSuccessWithOneDepositFuzzWithAdapter( + uint256 amount + ) public { + vm.assume( + amount < 10000 ether && amount >= 2 wei + ); + + IERC20 rETH = IERC20(chainAddresses.lsd.RETH_ADDRESS); + depositAssetAndVerify(rETH, amount); + } + + function testDepositmETHSuccessWithOneDepositFuzzWithAdapter( + uint256 amount + ) public { + // NOTE: mETH doesn't usually work with 10k amounts at a time to stake ETH and obtain it in 1 tx + vm.assume( + amount < 1000 ether && amount >= 2 wei + ); + + IERC20 mETH = IERC20(chainAddresses.lsd.METH_ADDRESS); + depositAssetAndVerify(mETH, amount); + } + + function depositAssetAndVerify(IERC20 asset, uint256 amount) internal { + address prankedUser = address(0x1234543210); + address receiver = address(0x9876543210); + + uint256 initialSupply = ynEigenToken.totalSupply(); + uint256 initialAssetBalance = asset.balanceOf(address(ynEigenToken)); + uint256 initialReceiverBalance = ynEigenToken.balanceOf(receiver); + + // Obtain asset for prankedUser + uint256 balance = testAssetUtils.get_Asset(address(asset), prankedUser, amount); + + uint256 expectedShares = ynEigenDepositAdapterInstance.previewDeposit(asset, balance); + + vm.startPrank(prankedUser); + asset.approve(address(ynEigenDepositAdapterInstance), balance); + uint256 shares = ynEigenDepositAdapterInstance.deposit(asset, balance, receiver); + vm.stopPrank(); + + // Verify that the actual shares received match the expected shares + assertEq(shares, expectedShares, "Actual shares do not match expected shares"); + + uint256 finalAssetBalance = asset.balanceOf(address(ynEigenToken)); + uint256 finalSupply = ynEigenToken.totalSupply(); + uint256 finalReceiverBalance = ynEigenToken.balanceOf(receiver); + + // Verify asset balance of ynEigenToken increased + assertEq(finalAssetBalance, initialAssetBalance + balance, "Asset balance did not increase correctly"); + // Verify total supply increased + assertEq(finalSupply, initialSupply + shares, "Total supply did not increase correctly"); + + // Verify receiver balance increased + assertEq(finalReceiverBalance, initialReceiverBalance + shares, "Receiver balance did not increase correctly"); + } + + function testDepositWithReferralWstETHFuzz( + uint256 amount, + address receiver, + address referrer + ) public { + + vm.assume(amount >= 2 wei && amount < 10000 ether); + vm.assume(receiver != address(0) && referrer != address(0) && receiver != referrer); + + address prankedUser = address(0x1234543210); + IERC20 wstETH = IERC20(chainAddresses.lsd.WSTETH_ADDRESS); + + uint256 initialSupply = ynEigenToken.totalSupply(); + uint256 initialAssetBalance = wstETH.balanceOf(address(ynEigenToken)); + uint256 initialReceiverBalance = ynEigenToken.balanceOf(receiver); + + // Obtain asset for prankedUser + uint256 balance = testAssetUtils.get_Asset(address(wstETH), prankedUser, amount); + + vm.startPrank(prankedUser); + wstETH.approve(address(ynEigenDepositAdapterInstance), balance); + + uint256 shares = ynEigenDepositAdapterInstance.depositWithReferral(wstETH, balance, receiver, referrer); + vm.stopPrank(); + + uint256 finalAssetBalance = ynEigenToken.assetBalance(wstETH); + uint256 finalSupply = ynEigenToken.totalSupply(); + uint256 finalReceiverBalance = ynEigenToken.balanceOf(receiver); + + // Verify wstETH balance of ynEigenToken increased + assertEq(finalAssetBalance, initialAssetBalance + balance, "wstETH balance did not increase correctly"); + + // Verify total supply increased + assertEq(finalSupply, initialSupply + shares, "Total supply did not increase correctly"); + + // Verify receiver balance increased + assertEq(finalReceiverBalance, initialReceiverBalance + shares, "Receiver balance did not increase correctly"); + + // Verify user balance increased + assertEq(ynEigenToken.balanceOf(receiver), initialReceiverBalance + shares, "User balance did not increase correctly"); + } +} \ No newline at end of file diff --git a/test/integration/ynEIGEN/ynEigenIntegrationBaseTest.sol b/test/integration/ynEIGEN/ynEigenIntegrationBaseTest.sol new file mode 100644 index 000000000..2a442b343 --- /dev/null +++ b/test/integration/ynEIGEN/ynEigenIntegrationBaseTest.sol @@ -0,0 +1,286 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; +import {TransparentUpgradeableProxy} from "lib/openzeppelin-contracts/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import {IStrategyManager} from "lib/eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol"; +import {IDepositContract} from "src/external/ethereum/IDepositContract.sol"; +import {IEigenPodManager} from "lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPodManager.sol"; +import {IStrategy} from "lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; +import {IStakingNodesManager} from "src/interfaces/IStakingNodesManager.sol"; +import {IDelegationManager} from "lib/eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol"; +import {IStakingNodesManager} from "src/interfaces/IStakingNodesManager.sol"; +import {IynETH} from "src/interfaces/IynETH.sol"; +import {Test} from "forge-std/Test.sol"; +import {ynETH} from "src/ynETH.sol"; +import {ynViewer} from "src/ynViewer.sol"; +import {StakingNodesManager} from "src/StakingNodesManager.sol"; +import {StakingNode} from "src/StakingNode.sol"; +import {ContractAddresses} from "script/ContractAddresses.sol"; +import {StakingNode} from "src/StakingNode.sol"; +import {Utils} from "script/Utils.sol"; +import {ActorAddresses} from "script/Actors.sol"; +import {TestAssetUtils} from "test/utils/TestAssetUtils.sol"; +import {LSDRateProvider} from "src/ynEIGEN/LSDRateProvider.sol"; + +import {IynEigen} from "src/interfaces/IynEigen.sol"; +import {IRateProvider} from "src/interfaces/IRateProvider.sol"; +import {IAssetRegistry} from "src/interfaces/IAssetRegistry.sol"; +import {IYieldNestStrategyManager} from "src/interfaces/IYieldNestStrategyManager.sol"; +import {TokenStakingNodesManager} from "src/ynEIGEN/TokenStakingNodesManager.sol"; +import {TokenStakingNode} from "src/ynEIGEN/TokenStakingNode.sol"; +import {AssetRegistry} from "src/ynEIGEN/AssetRegistry.sol"; +import {EigenStrategyManager} from "src/ynEIGEN/EigenStrategyManager.sol"; +import {ynEigen} from "src/ynEIGEN/ynEigen.sol"; +import {ITokenStakingNodesManager} from "src/interfaces/ITokenStakingNodesManager.sol"; +import {ynEigenDepositAdapter} from "src/ynEIGEN/ynEigenDepositAdapter.sol"; +import {IwstETH} from "src/external/lido/IwstETH.sol"; +import {IERC4626} from "lib/openzeppelin-contracts/contracts/interfaces/IERC4626.sol"; + + +contract ynEigenIntegrationBaseTest is Test, Utils { + + // State + bytes constant ZERO_PUBLIC_KEY = hex"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + bytes constant ONE_PUBLIC_KEY = hex"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; + bytes constant TWO_PUBLIC_KEY = hex"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002"; + bytes constant ZERO_SIGNATURE = hex"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + bytes32 constant ZERO_DEPOSIT_ROOT = bytes32(0); + + // Utils + ContractAddresses public contractAddresses; + ContractAddresses.ChainAddresses public chainAddresses; + ActorAddresses public actorAddresses; + ActorAddresses.Actors public actors; + + // Staking + TokenStakingNodesManager public tokenStakingNodesManager; + TokenStakingNode public tokenStakingNodeImplementation; + + // Assets + ynEigen public ynEigenToken; + AssetRegistry public assetRegistry; + LSDRateProvider public rateProvider; + ynEigenDepositAdapter public ynEigenDepositAdapterInstance; + + // Strategy + EigenStrategyManager eigenStrategyManager; + + // Eigen + struct EigenLayer { + IEigenPodManager eigenPodManager; + IDelegationManager delegationManager; + IStrategyManager strategyManager; + } + + EigenLayer public eigenLayer; + + // LSD + IERC20[] public assets; + + + function setUp() public virtual { + + + // Setup Addresses + contractAddresses = new ContractAddresses(); + actorAddresses = new ActorAddresses(); + + // Setup Protocol + setupUtils(); + setupYnEigenProxies(); + setupEigenLayer(); + setupTokenStakingNodesManager(); + setupYnEigen(); + setupEigenStrategyManagerAndAssetRegistry(); + setupYnEigenDepositAdapter(); + } + + function setupYnEigenProxies() public { + TransparentUpgradeableProxy ynEigenProxy; + TransparentUpgradeableProxy eigenStrategyManagerProxy; + TransparentUpgradeableProxy tokenStakingNodesManagerProxy; + TransparentUpgradeableProxy assetRegistryProxy; + TransparentUpgradeableProxy rateProviderProxy; + TransparentUpgradeableProxy ynEigenDepositAdapterProxy; + + ynEigenToken = new ynEigen(); + eigenStrategyManager = new EigenStrategyManager(); + tokenStakingNodesManager = new TokenStakingNodesManager(); + assetRegistry = new AssetRegistry(); + rateProvider = new LSDRateProvider(); + ynEigenDepositAdapterInstance = new ynEigenDepositAdapter(); + + ynEigenProxy = new TransparentUpgradeableProxy(address(ynEigenToken), actors.admin.PROXY_ADMIN_OWNER, ""); + eigenStrategyManagerProxy = new TransparentUpgradeableProxy(address(eigenStrategyManager), actors.admin.PROXY_ADMIN_OWNER, ""); + tokenStakingNodesManagerProxy = new TransparentUpgradeableProxy(address(tokenStakingNodesManager), actors.admin.PROXY_ADMIN_OWNER, ""); + assetRegistryProxy = new TransparentUpgradeableProxy(address(assetRegistry), actors.admin.PROXY_ADMIN_OWNER, ""); + rateProviderProxy = new TransparentUpgradeableProxy(address(rateProvider), actors.admin.PROXY_ADMIN_OWNER, ""); + ynEigenDepositAdapterProxy = new TransparentUpgradeableProxy(address(ynEigenDepositAdapterInstance), actors.admin.PROXY_ADMIN_OWNER, ""); + + // Wrapping proxies with their respective interfaces + ynEigenToken = ynEigen(payable(ynEigenProxy)); + eigenStrategyManager = EigenStrategyManager(payable(eigenStrategyManagerProxy)); + tokenStakingNodesManager = TokenStakingNodesManager(payable(tokenStakingNodesManagerProxy)); + assetRegistry = AssetRegistry(payable(assetRegistryProxy)); + rateProvider = LSDRateProvider(payable(rateProviderProxy)); + ynEigenDepositAdapterInstance = ynEigenDepositAdapter(payable(ynEigenDepositAdapterProxy)); + + // Re-deploying ynEigen and creating its proxy again + ynEigenToken = new ynEigen(); + ynEigenProxy = new TransparentUpgradeableProxy(address(ynEigenToken), actors.admin.PROXY_ADMIN_OWNER, ""); + ynEigenToken = ynEigen(payable(ynEigenProxy)); + + // Re-deploying EigenStrategyManager and creating its proxy again + eigenStrategyManager = new EigenStrategyManager(); + eigenStrategyManagerProxy = new TransparentUpgradeableProxy(address(eigenStrategyManager), actors.admin.PROXY_ADMIN_OWNER, ""); + eigenStrategyManager = EigenStrategyManager(payable(eigenStrategyManagerProxy)); + + // Re-deploying TokenStakingNodesManager and creating its proxy again + tokenStakingNodesManager = new TokenStakingNodesManager(); + tokenStakingNodesManagerProxy = new TransparentUpgradeableProxy(address(tokenStakingNodesManager), actors.admin.PROXY_ADMIN_OWNER, ""); + tokenStakingNodesManager = TokenStakingNodesManager(payable(tokenStakingNodesManagerProxy)); + + // Re-deploying AssetRegistry and creating its proxy again + assetRegistry = new AssetRegistry(); + assetRegistryProxy = new TransparentUpgradeableProxy(address(assetRegistry), actors.admin.PROXY_ADMIN_OWNER, ""); + assetRegistry = AssetRegistry(payable(assetRegistryProxy)); + + // Re-deploying LSDRateProvider and creating its proxy again + rateProvider = new LSDRateProvider(); + rateProviderProxy = new TransparentUpgradeableProxy(address(rateProvider), actors.admin.PROXY_ADMIN_OWNER, ""); + rateProvider = LSDRateProvider(payable(rateProviderProxy)); + + // Re-deploying ynEigenDepositAdapter and creating its proxy again + ynEigenDepositAdapterInstance = new ynEigenDepositAdapter(); + ynEigenDepositAdapterProxy = new TransparentUpgradeableProxy(address(ynEigenDepositAdapterInstance), actors.admin.PROXY_ADMIN_OWNER, ""); + ynEigenDepositAdapterInstance = ynEigenDepositAdapter(payable(ynEigenDepositAdapterProxy)); + } + + function setupUtils() public { + chainAddresses = contractAddresses.getChainAddresses(block.chainid); + actors = actorAddresses.getActors(block.chainid); + } + + function setupEigenLayer() public { + eigenLayer.strategyManager = IStrategyManager(chainAddresses.eigenlayer.STRATEGY_MANAGER_ADDRESS); + eigenLayer.eigenPodManager = IEigenPodManager(chainAddresses.eigenlayer.EIGENPOD_MANAGER_ADDRESS); + eigenLayer.delegationManager = IDelegationManager(chainAddresses.eigenlayer.DELEGATION_MANAGER_ADDRESS); + } + + function setupYnEigen() public { + address[] memory pauseWhitelist = new address[](1); + pauseWhitelist[0] = actors.eoa.DEFAULT_SIGNER; + + ynEigen.Init memory ynEigenInit = ynEigen.Init({ + name: "Eigenlayer YieldNest LSD", + symbol: "ynLSDe", + admin: actors.admin.ADMIN, + pauser: actors.ops.PAUSE_ADMIN, + unpauser: actors.admin.UNPAUSE_ADMIN, + yieldNestStrategyManager: address(eigenStrategyManager), + assetRegistry: IAssetRegistry(address(assetRegistry)), + pauseWhitelist: pauseWhitelist + }); + + ynEigenToken.initialize(ynEigenInit); + } + + function setupTokenStakingNodesManager() public { + tokenStakingNodeImplementation = new TokenStakingNode(); + + TokenStakingNodesManager.Init memory tokenStakingNodesManagerInit = TokenStakingNodesManager.Init({ + strategyManager: eigenLayer.strategyManager, + delegationManager: eigenLayer.delegationManager, + yieldNestStrategyManager: address(eigenStrategyManager), + maxNodeCount: 10, + admin: actors.admin.ADMIN, + pauser: actors.ops.PAUSE_ADMIN, + unpauser: actors.admin.UNPAUSE_ADMIN, + stakingAdmin: actors.admin.STAKING_ADMIN, + tokenStakingNodeOperator: actors.ops.TOKEN_STAKING_NODE_OPERATOR, + tokenStakingNodeCreatorRole: actors.ops.STAKING_NODE_CREATOR, + tokenStakingNodesDelegator: actors.admin.STAKING_NODES_DELEGATOR + }); + + vm.prank(actors.admin.PROXY_ADMIN_OWNER); + tokenStakingNodesManager.initialize(tokenStakingNodesManagerInit); + vm.prank(actors.admin.STAKING_ADMIN); // TokenStakingNodesManager is the only contract that can register a staking node implementation contract + tokenStakingNodesManager.registerTokenStakingNode(address(tokenStakingNodeImplementation)); + } + + function setupEigenStrategyManagerAndAssetRegistry() public { + IERC20[] memory lsdAssets = new IERC20[](5); + IStrategy[] memory strategies = new IStrategy[](5); + + // stETH + // We accept deposits in wstETH, and deploy to the stETH strategy + lsdAssets[0] = IERC20(chainAddresses.lsd.WSTETH_ADDRESS); + strategies[0] = IStrategy(chainAddresses.lsdStrategies.STETH_STRATEGY_ADDRESS); + + // rETH + lsdAssets[1] = IERC20(chainAddresses.lsd.RETH_ADDRESS); + strategies[1] = IStrategy(chainAddresses.lsdStrategies.RETH_STRATEGY_ADDRESS); + + // oETH + // We accept deposits in woETH, and deploy to the oETH strategy + lsdAssets[2] = IERC20(chainAddresses.lsd.WOETH_ADDRESS); + strategies[2] = IStrategy(chainAddresses.lsdStrategies.OETH_STRATEGY_ADDRESS); + + // sfrxETH + // We accept deposits in wsfrxETH, and deploy to the sfrxETH strategy + lsdAssets[3] = IERC20(chainAddresses.lsd.SFRXETH_ADDRESS); + strategies[3] = IStrategy(chainAddresses.lsdStrategies.SFRXETH_STRATEGY_ADDRESS); + + // mETH + // We accept deposits in wmETH, and deploy to the mETH strategy + lsdAssets[4] = IERC20(chainAddresses.lsd.METH_ADDRESS); + strategies[4] = IStrategy(chainAddresses.lsdStrategies.METH_STRATEGY_ADDRESS); + + for (uint i = 0; i < lsdAssets.length; i++) { + assets.push(lsdAssets[i]); + } + + EigenStrategyManager.Init memory eigenStrategyManagerInit = EigenStrategyManager.Init({ + assets: lsdAssets, + strategies: strategies, + ynEigen: IynEigen(address(ynEigenToken)), + strategyManager: IStrategyManager(address(chainAddresses.eigenlayer.STRATEGY_MANAGER_ADDRESS)), + delegationManager: IDelegationManager(address(chainAddresses.eigenlayer.DELEGATION_MANAGER_ADDRESS)), + tokenStakingNodesManager: ITokenStakingNodesManager(address(tokenStakingNodesManager)), + admin: actors.admin.ADMIN, + strategyController: actors.ops.STRATEGY_CONTROLLER, + unpauser: actors.admin.UNPAUSE_ADMIN, + pauser: actors.ops.PAUSE_ADMIN, + strategyAdmin: actors.admin.EIGEN_STRATEGY_ADMIN, + wstETH: IwstETH(chainAddresses.lsd.WSTETH_ADDRESS), + woETH: IERC4626(chainAddresses.lsd.WOETH_ADDRESS) + }); + vm.prank(actors.admin.PROXY_ADMIN_OWNER); + eigenStrategyManager.initialize(eigenStrategyManagerInit); + + AssetRegistry.Init memory assetRegistryInit = AssetRegistry.Init({ + assets: lsdAssets, + rateProvider: IRateProvider(address(rateProvider)), + yieldNestStrategyManager: IYieldNestStrategyManager(address(eigenStrategyManager)), + ynEigen: IynEigen(address(ynEigenToken)), + admin: actors.admin.ADMIN, + pauser: actors.ops.PAUSE_ADMIN, + unpauser: actors.admin.UNPAUSE_ADMIN, + assetManagerRole: actors.admin.ASSET_MANAGER + }); + assetRegistry.initialize(assetRegistryInit); + } + + function setupYnEigenDepositAdapter() public { + ynEigenDepositAdapter.Init memory ynEigenDepositAdapterInit = ynEigenDepositAdapter.Init({ + ynEigen: address(ynEigenToken), + wstETH: chainAddresses.lsd.WSTETH_ADDRESS, + woETH: chainAddresses.lsd.WOETH_ADDRESS, + admin: actors.admin.ADMIN + }); + vm.prank(actors.admin.PROXY_ADMIN_OWNER); + ynEigenDepositAdapterInstance.initialize(ynEigenDepositAdapterInit); + } +} + diff --git a/test/integration/ynEIGEN/ynEigenViewer.t.sol b/test/integration/ynEIGEN/ynEigenViewer.t.sol new file mode 100644 index 000000000..c8d2992ae --- /dev/null +++ b/test/integration/ynEIGEN/ynEigenViewer.t.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity 0.8.24; + +import {IERC20, IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; + +import {ITokenStakingNodesManager,ITokenStakingNode} from "../../../src/interfaces/ITokenStakingNodesManager.sol"; + +import {ynEigenViewer} from "../../../src/ynEIGEN/ynEigenViewer.sol"; +import {console} from "forge-std/console.sol"; +import "./ynEigenIntegrationBaseTest.sol"; + +interface IAssetRegistryView { + function assets() external view returns (IERC20Metadata[] memory); +} + +contract ynEigenViewerTest is ynEigenIntegrationBaseTest { + + ynEigenViewer private _ynEigenViewer; + + function setUp() public override { + super.setUp(); + _ynEigenViewer = new ynEigenViewer( + address(assetRegistry), + address(ynEigenToken), + address(tokenStakingNodesManager), + address(rateProvider) + ); + } + + function testGetAllStakingNodes() public { + ITokenStakingNode[] memory _nodes = _ynEigenViewer.getAllStakingNodes(); + assertEq(_nodes.length, 0, "There should be no nodes"); + } + + function testGetYnEigenAssets() public { + IERC20[] memory _assets = assetRegistry.getAssets(); + assertTrue(_assets.length > 0, "testGetYnEigenAssets: E0"); + + ynEigenViewer.AssetInfo[] memory _assetsInfo = _ynEigenViewer.getYnEigenAssets(); + for (uint256 i = 0; i < _assets.length; ++i) { + assertEq(_assetsInfo[i].asset, address(_assets[i]), "testGetYnEigenAssets: E1"); + assertEq(_assetsInfo[i].name, IERC20Metadata(address(_assets[i])).name(), "testGetYnEigenAssets: E2"); + assertEq(_assetsInfo[i].symbol, IERC20Metadata(address(_assets[i])).symbol(), "testGetYnEigenAssets: E3"); + assertEq(_assetsInfo[i].ratioOfTotalAssets, 0, "testGetYnEigenAssets: E4"); + assertEq(_assetsInfo[i].totalBalance, 0, "testGetYnEigenAssets: E5"); + } + } + + function testPreviewDepositStETH() public { + // Set up test amount + uint256 testAmount = 1 ether; + + // Log STETH_ADDRESS + console.log("STETH_ADDRESS:", address(chainAddresses.lsd.STETH_ADDRESS)); + + // Call previewDeposit + uint256 expectedShares = _ynEigenViewer.previewDeposit(IERC20(chainAddresses.lsd.STETH_ADDRESS), testAmount); + + // Verify the result + assertTrue(expectedShares > 0, "Expected shares should be greater than 0"); + } + + function testGetRate() public { + // Get rate + uint256 rate = _ynEigenViewer.getRate(); + + // Verify that the rate is not zero + assertEq(rate, 1e18, "Rate is 1 with no deposits"); + } +} \ No newline at end of file diff --git a/test/integration/ynLSD.t.sol b/test/integration/ynLSD.t.sol deleted file mode 100644 index 6ee5e6de0..000000000 --- a/test/integration/ynLSD.t.sol +++ /dev/null @@ -1,618 +0,0 @@ -// SPDX-License-Identifier: BSD 3-Clause License -pragma solidity 0.8.24; - -import "./IntegrationBaseTest.sol"; -import {ProxyAdmin} from "lib/openzeppelin-contracts/contracts/proxy/transparent/ProxyAdmin.sol"; -import {UpgradeableBeacon} from "lib/openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol"; -import {ITransparentUpgradeableProxy} from "lib/openzeppelin-contracts/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; -import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; -import {AggregatorV3Interface} from "src/external/chainlink/AggregatorV3Interface.sol"; -import {IPausable} from "lib/eigenlayer-contracts/src/contracts/interfaces//IPausable.sol"; -import {ILSDStakingNode} from "src/interfaces/ILSDStakingNode.sol"; -import {TestLSDStakingNodeV2} from "test/mocks/TestLSDStakingNodeV2.sol"; -import {TestYnLSDV2} from "test/mocks/TestYnLSDV2.sol"; -import {ynBase} from "src/ynBase.sol"; - - -contract ynLSDAssetTest is IntegrationBaseTest { - function testDepositSTETHFailingWhenStrategyIsPaused() public { - IERC20 asset = IERC20(chainAddresses.lsd.STETH_ADDRESS); - uint256 amount = 1 ether; - - vm.prank(actors.ops.STAKING_NODE_CREATOR); - ILSDStakingNode lsdStakingNode = ynlsd.createLSDStakingNode(); - - // 1. Obtain stETH and Deposit assets to ynLSD by User - TestAssetUtils testAssetUtils = new TestAssetUtils(); - uint256 balance = testAssetUtils.get_stETH(address(this), amount); - assertEq(compareRebasingTokenBalances(asset.balanceOf(address(this)), balance), true, "Amount not received"); - vm.stopPrank(); - - asset.approve(address(ynlsd), amount); - - IERC20[] memory assets = new IERC20[](1); - uint256[] memory amounts = new uint256[](1); - assets[0] = asset; - amounts[0] = amount; - - vm.prank(chainAddresses.eigenlayer.STRATEGY_MANAGER_PAUSER_ADDRESS); - IPausable(address(strategyManager)).pause(1); - - vm.expectRevert(bytes("Pausable: index is paused")); - vm.prank(actors.ops.LSD_RESTAKING_MANAGER); - lsdStakingNode.depositAssetsToEigenlayer(assets, amounts); - } - - function testDepositSTETHSuccessWithOneDeposit() public { - IERC20 stETH = IERC20(chainAddresses.lsd.STETH_ADDRESS); - uint256 amount = 32 ether; - - uint256 initialSupply = ynlsd.totalSupply(); - - // 1. Obtain stETH and Deposit assets to ynLSD by User - TestAssetUtils testAssetUtils = new TestAssetUtils(); - uint256 balance = testAssetUtils.get_stETH(address(this), amount); - assertEq(compareRebasingTokenBalances(balance, amount), true, "Amount not received"); - - stETH.approve(address(ynlsd), balance); - ynlsd.deposit(stETH, balance, address(this)); - - assertEq(ynlsd.balanceOf(address(this)), ynlsd.totalSupply() - initialSupply, "ynlsd balance does not match total supply"); - } - - function testDepositSTETHSuccessWithMultipleDeposits() public { - IERC20 stETH = IERC20(chainAddresses.lsd.STETH_ADDRESS); - uint256 amount = 32 ether; - - uint256 initialSupply = ynlsd.totalSupply(); - - // 1. Obtain stETH and Deposit assets to ynLSD by User - TestAssetUtils testAssetUtils = new TestAssetUtils(); - uint256 balance = testAssetUtils.get_stETH(address(this),amount); - assertEq(compareRebasingTokenBalances(balance, amount), true, "Amount not received"); - - stETH.approve(address(ynlsd), 32 ether); - uint256 depositAmountOne = 5 ether; - uint256 depositAmountTwo = 3 ether; - uint256 depositAmountThree = 7 ether; - - ynlsd.deposit(stETH, depositAmountOne, address(this)); - ynlsd.deposit(stETH, depositAmountTwo, address(this)); - ynlsd.deposit(stETH, depositAmountThree, address(this)); - - assertEq(ynlsd.balanceOf(address(this)), ynlsd.totalSupply() - initialSupply, "ynlsd balance does not match total supply"); - } - - function testDespositUnsupportedAsset() public { - IERC20 asset = IERC20(address(1)); - uint256 amount = 1 ether; - address receiver = address(this); - - vm.expectRevert(abi.encodeWithSelector(ynLSD.UnsupportedAsset.selector, address(asset))); - ynlsd.deposit(asset, amount, receiver); - } - - function testDepositWithZeroAmount() public { - IERC20 asset = IERC20(chainAddresses.lsd.STETH_ADDRESS); - uint256 amount = 0; // Zero amount for deposit - address receiver = address(this); - - vm.expectRevert(ynLSD.ZeroAmount.selector); - ynlsd.deposit(asset, amount, receiver); - } - - function testConvertToShares() public { - IERC20 asset = IERC20(address(this)); - uint256 amount = 1000; - vm.expectRevert(abi.encodeWithSelector(ynLSD.UnsupportedAsset.selector, address(asset))); - ynlsd.convertToShares(asset, amount); - } - - function testConvertToSharesBootstrapStrategy() public { - vm.prank(actors.ops.STAKING_NODE_CREATOR); - ynlsd.createLSDStakingNode(); - uint256[] memory totalAssets = ynlsd.getTotalAssets(); - ynlsd.nodes(0); - - uint256 bootstrapAmountUnits = ynlsd.BOOTSTRAP_AMOUNT_UNITS() * 1e18 - 1; - assertTrue(compareWithThreshold(totalAssets[0], bootstrapAmountUnits, 1), "Total assets should be equal to bootstrap amount"); - } - - function testConvertToSharesZeroStrategy() public { - vm.prank(actors.ops.STAKING_NODE_CREATOR); - ynlsd.createLSDStakingNode(); - uint256[] memory totalAssets = ynlsd.getTotalAssets(); - ynlsd.nodes(0); - - assertEq(totalAssets[1], 0, "Total assets should be equal to bootstrap 0"); - } - - function testGetTotalAssets() public { - uint256 totalAssetsInETH = ynlsd.convertToETH(ynlsd.assets(0), ynlsd.BOOTSTRAP_AMOUNT_UNITS() * 1e18 - 1); - uint256 totalAssets = ynlsd.totalAssets(); - assertTrue(compareWithThreshold(totalAssets, totalAssetsInETH, 1), "Total assets should be equal to bootstrap amount converted to its ETH value"); - } - - function testLSDWrongStrategy() public { - // IERC20 asset = IERC20(address(1)); - // vm.expectRevert(abi.encodeWithSelector(ynLSD.UnsupportedAsset.selector, address(asset))); - // TODO: Come back to this - } - - function testGetSharesForAsset() public { - IERC20 asset = IERC20(chainAddresses.lsd.RETH_ADDRESS); - uint256 amount = 1000; - AggregatorV3Interface assetPriceFeed = AggregatorV3Interface(chainAddresses.lsd.RETH_FEED_ADDRESS); - - // Call the getSharesForAsset function - uint256 shares = ynlsd.convertToShares(asset, amount); - (, int256 price, , uint256 timeStamp, ) = assetPriceFeed.latestRoundData(); - - // assertEq(ynlsd.totalAssets(), 0); - // assertEq(ynlsd.totalSupply(), 0); - - assertEq(timeStamp > 0, true, "Zero timestamp"); - assertEq(price > 0, true, "Zero price"); - assertEq(block.timestamp - timeStamp < 86400, true, "Price stale for more than 24 hours"); - assertEq(shares, (uint256(price) * amount) / 1e18, "Total shares don't match"); - } - - function testTotalAssetsAfterDeposit() public { - IERC20 asset = IERC20(chainAddresses.lsd.STETH_ADDRESS); - uint256 amount = 1 ether; - - IPausable pausableStrategyManager = IPausable(address(strategyManager)); - vm.prank(actors.ops.STAKING_NODE_CREATOR); - ILSDStakingNode lsdStakingNode = ynlsd.createLSDStakingNode(); - - address unpauser = pausableStrategyManager.pauserRegistry().unpauser(); - - vm.startPrank(unpauser); - pausableStrategyManager.unpause(0); - vm.stopPrank(); - - uint256 totalAssetsBeforeDeposit = ynlsd.totalAssets(); - - // 1. Obtain stETH and Deposit assets to ynLSD by User - TestAssetUtils testAssetUtils = new TestAssetUtils(); - uint256 balance = testAssetUtils.get_stETH(address(this), amount); - assertEq(compareRebasingTokenBalances(balance, amount), true, "Amount not received"); - asset.approve(address(ynlsd), balance); - ynlsd.deposit(asset, balance, address(this)); - - - { - IERC20[] memory assets = new IERC20[](1); - uint256[] memory amounts = new uint256[](1); - assets[0] = asset; - amounts[0] = amount; - - vm.prank(actors.ops.LSD_RESTAKING_MANAGER); - - lsdStakingNode.depositAssetsToEigenlayer(assets, amounts); - } - - uint256 totalAssetsAfterDeposit = ynlsd.totalAssets(); - - uint256 oraclePrice = yieldNestOracle.getLatestPrice(address(asset)); - - IStrategy strategy = ynlsd.strategies(IERC20(chainAddresses.lsd.STETH_ADDRESS)); - uint256 balanceInStrategyForNode = strategy.userUnderlyingView((address(lsdStakingNode))); - - uint256 expectedBalance = balanceInStrategyForNode * oraclePrice / 1e18; - - // Assert that totalAssets reflects the deposit - assertEq( - compareWithThreshold(totalAssetsAfterDeposit - totalAssetsBeforeDeposit,expectedBalance, 1), true, - "Total assets do not reflect the deposit" - ); - } - - function testPreviewDeposit() public { - IERC20 asset = IERC20(chainAddresses.lsd.STETH_ADDRESS); - uint256 amount = 1 ether; - - AggregatorV3Interface priceFeed = AggregatorV3Interface(chainAddresses.lsd.STETH_FEED_ADDRESS); - (, int256 price,,,) = priceFeed.latestRoundData(); - uint256 stethPrice = uint256(price); - - uint256 expectedDepositPreview = amount * stethPrice / 1e18; - uint256 previewDeposit = ynlsd.previewDeposit(asset, amount); - assertEq(previewDeposit, expectedDepositPreview, "Preview deposit does not match expected value"); - } - - function testConvertToETH() public { - IERC20 asset = IERC20(chainAddresses.lsd.STETH_ADDRESS); - uint256 amount = 1 ether; - - AggregatorV3Interface priceFeed = AggregatorV3Interface(chainAddresses.lsd.STETH_FEED_ADDRESS); - (, int256 price,,,) = priceFeed.latestRoundData(); - uint256 stethPrice = uint256(price); - - uint256 expectedDepositPreview = amount * stethPrice / 1e18; - - uint256 ethAmount = ynlsd.convertToETH(asset, amount); - assertEq(ethAmount, expectedDepositPreview, "convertToEth does not match expected value"); - } -} - -contract ynLSDAdminTest is IntegrationBaseTest { - - function testCreateLSDStakingNode() public { - vm.prank(actors.ops.STAKING_NODE_CREATOR); - ILSDStakingNode lsdStakingNodeInstance = ynlsd.createLSDStakingNode(); - - uint256 expectedNodeId = 0; - assertEq(lsdStakingNodeInstance.nodeId(), expectedNodeId, "Node ID does not match expected value"); - } - - function testCreateStakingNodeLSDOverMax() public { - vm.startPrank(actors.ops.STAKING_NODE_CREATOR); - for (uint256 i = 0; i < 10; i++) { - ynlsd.createLSDStakingNode(); - } - vm.expectRevert(abi.encodeWithSelector(ynLSD.TooManyStakingNodes.selector, 10)); - ynlsd.createLSDStakingNode(); - vm.stopPrank(); - } - - function testCreate2LSDStakingNodes() public { - vm.prank(actors.ops.STAKING_NODE_CREATOR); - ILSDStakingNode lsdStakingNodeInstance1 = ynlsd.createLSDStakingNode(); - uint256 expectedNodeId1 = 0; - assertEq(lsdStakingNodeInstance1.nodeId(), expectedNodeId1, "Node ID for node 1 does not match expected value"); - - vm.prank(actors.ops.STAKING_NODE_CREATOR); - ILSDStakingNode lsdStakingNodeInstance2 = ynlsd.createLSDStakingNode(); - uint256 expectedNodeId2 = 1; - assertEq(lsdStakingNodeInstance2.nodeId(), expectedNodeId2, "Node ID for node 2 does not match expected value"); - } - - function testCreateLSDStakingNodeAfterUpgradeWithoutUpgradeability() public { - // Upgrade the ynLSD implementation to TestYnLSDV2 - address newImplementation = address(new TestYnLSDV2()); - vm.prank(actors.admin.PROXY_ADMIN_OWNER); - ProxyAdmin(getTransparentUpgradeableProxyAdminAddress(address(ynlsd))) - .upgradeAndCall(ITransparentUpgradeableProxy(address(ynlsd)), newImplementation, ""); - - // Attempt to create a LSD staking node after the upgrade - should fail since implementation is not there - vm.expectRevert(); - vm.prank(actors.ops.STAKING_NODE_CREATOR); - ynlsd.createLSDStakingNode(); - } - - function testUpgradeLSDStakingNodeImplementation() public { - vm.prank(actors.ops.STAKING_NODE_CREATOR); - ILSDStakingNode lsdStakingNodeInstance = ynlsd.createLSDStakingNode(); - - // upgrade the ynLSD to support the new initialization version. - address newYnLSDImpl = address(new TestYnLSDV2()); - vm.prank(actors.admin.PROXY_ADMIN_OWNER); - ProxyAdmin(getTransparentUpgradeableProxyAdminAddress(address(ynlsd))) - .upgradeAndCall(ITransparentUpgradeableProxy(address(ynlsd)), newYnLSDImpl, ""); - - TestLSDStakingNodeV2 testLSDStakingNodeV2 = new TestLSDStakingNodeV2(); - vm.prank(actors.admin.STAKING_ADMIN); - ynlsd.upgradeLSDStakingNodeImplementation(address(testLSDStakingNodeV2)); - - UpgradeableBeacon beacon = ynlsd.upgradeableBeacon(); - address upgradedImplementationAddress = beacon.implementation(); - assertEq(upgradedImplementationAddress, address(testLSDStakingNodeV2)); - - TestLSDStakingNodeV2 testLSDStakingNodeV2Instance = TestLSDStakingNodeV2(payable(address(lsdStakingNodeInstance))); - uint256 redundantFunctionResult = testLSDStakingNodeV2Instance.redundantFunction(); - assertEq(redundantFunctionResult, 1234567); - - assertEq(testLSDStakingNodeV2Instance.valueToBeInitialized(), 23, "Value to be initialized does not match expected value"); - } - - function testFailRegisterLSDStakingNodeImplementationTwice() public { - address initialImplementation = address(new TestLSDStakingNodeV2()); - ynlsd.registerLSDStakingNodeImplementationContract(initialImplementation); - - address newImplementation = address(new TestLSDStakingNodeV2()); - vm.expectRevert("ynLSD: Implementation already exists"); - ynlsd.registerLSDStakingNodeImplementationContract(newImplementation); - } - - function testRegisterLSDStakingNodeImplementationAlreadyExists() public { - // address initialImplementation = address(new TestLSDStakingNodeV2()); - // vm.startPrank(actors.STAKING_ADMIN); - // ynlsd.registerLSDStakingNodeImplementationContract(initialImplementation); - - // // vm.expectRevert("ynLSD: Implementation already exists"); - - // ynlsd.registerLSDStakingNodeImplementationContract(initialImplementation); - // vm.stopPrank(); - // TODO: Come back to this - } - - function testRetrieveAssetsNotLSDStakingNode() public { - IERC20 asset = IERC20(chainAddresses.lsd.RETH_ADDRESS); - uint256 amount = 1000; - - vm.prank(actors.ops.STAKING_NODE_CREATOR); - ynlsd.createLSDStakingNode(); - vm.expectRevert(abi.encodeWithSelector(ynLSD.NotLSDStakingNode.selector, address(this), 0)); - ynlsd.retrieveAsset(0, asset, amount); - } - - function testRetrieveAssetsUnsupportedAsset() public { - // come back to this - } - - function testRetrieveTransferExceedsBalance() public { - IERC20 asset = IERC20(chainAddresses.lsd.RETH_ADDRESS); - uint256 amount = 1000; - - vm.prank(actors.ops.STAKING_NODE_CREATOR); - ynlsd.createLSDStakingNode(); - - ILSDStakingNode lsdStakingNode = ynlsd.nodes(0); - - vm.startPrank(address(lsdStakingNode)); - vm.expectRevert(); - ynlsd.retrieveAsset(0, asset, amount); - vm.stopPrank(); - } - - function testRetrieveAssetsSuccess() public { - IERC20 asset = IERC20(chainAddresses.lsd.STETH_ADDRESS); - uint256 amount = 64 ether; - - vm.prank(actors.ops.STAKING_NODE_CREATOR); - ynlsd.createLSDStakingNode(); - - ILSDStakingNode lsdStakingNode = ynlsd.nodes(0); - vm.deal(address(lsdStakingNode), 1000); - - // 1. Obtain stETH and Deposit assets to ynLSD by User - TestAssetUtils testAssetUtils = new TestAssetUtils(); - uint256 balance = testAssetUtils.get_stETH(address(this), amount); - assertEq(compareRebasingTokenBalances(balance, amount), true, "Amount not received"); - - asset.approve(address(ynlsd), balance); - ynlsd.deposit(asset, balance, address(this)); - - vm.startPrank(address(lsdStakingNode)); - asset.approve(address(ynlsd), 32 ether); - ynlsd.retrieveAsset(0, asset, balance); - vm.stopPrank(); - } - - function testSetMaxNodeCount() public { - uint256 maxNodeCount = 10; - vm.prank(actors.admin.STAKING_ADMIN); - ynlsd.setMaxNodeCount(maxNodeCount); - assertEq(ynlsd.maxNodeCount(), maxNodeCount, "Max node count does not match expected value"); - } - - function testPauseDepositsFunctionality() public { - IERC20 stETH = IERC20(chainAddresses.lsd.STETH_ADDRESS); - - uint256 depositAmount = 0.1 ether; - - // 1. Obtain stETH and Deposit assets to ynLSD by User - TestAssetUtils testAssetUtils = new TestAssetUtils(); - uint256 balance = testAssetUtils.get_stETH(address(this), depositAmount); - stETH.approve(address(ynlsd), balance); - - // Arrange - vm.prank(actors.ops.PAUSE_ADMIN); - ynlsd.pauseDeposits(); - - // Act & Assert - bool pauseState = ynlsd.depositsPaused(); - assertTrue(pauseState, "Deposit ETH should be paused after setting pause state to true"); - - // Trying to deposit ETH while pause - vm.expectRevert(ynLSD.Paused.selector); - ynlsd.deposit(stETH, balance, address(this)); - - // Unpause and try depositing again - vm.prank(actors.admin.UNPAUSE_ADMIN); - ynlsd.unpauseDeposits(); - pauseState = ynlsd.depositsPaused(); - - assertFalse(pauseState, "Deposit ETH should be unpaused after setting pause state to false"); - - // Deposit should succeed now - ynlsd.deposit(stETH, balance, address(this)); - assertGt(ynlsd.totalAssets(), 0, "ynLSD balance should be greater than 0 after deposit"); - } - -} - -contract ynLSDTransferPauseTest is IntegrationBaseTest { - - function testTransferFailsForNonWhitelistedAddresses() public { - // Arrange - uint256 transferAmount = 1 ether; - address nonWhitelistedAddress = address(4); // An arbitrary address not in the whitelist - address recipient = address(5); // An arbitrary recipient address - - // Act & Assert - // Ensure transfer from a non-whitelisted address reverts - vm.expectRevert(ynBase.TransfersPaused.selector); - vm.prank(nonWhitelistedAddress); - yneth.transfer(recipient, transferAmount); - } - - function testTransferSucceedsForWhitelistedAddress() public { - // Arrange - uint256 depositAmount = 1 ether; - address whitelistedAddress = actors.eoa.DEFAULT_SIGNER; // Using the pre-defined whitelisted address from setup - address recipient = address(6); // An arbitrary recipient address - - // 1. Obtain stETH and Deposit assets to ynLSD by User - TestAssetUtils testAssetUtils = new TestAssetUtils(); - IERC20 stETH = IERC20(chainAddresses.lsd.STETH_ADDRESS); - uint256 balance = testAssetUtils.get_stETH(address(this), depositAmount); - stETH.approve(address(ynlsd), balance); - ynlsd.deposit(stETH, balance, whitelistedAddress); - - uint256 transferAmount = ynlsd.balanceOf(whitelistedAddress); - - // Act - address[] memory whitelist = new address[](1); - whitelist[0] = whitelistedAddress; - vm.prank(actors.admin.UNPAUSE_ADMIN); - ynlsd.addToPauseWhitelist(whitelist); // Whitelisting the address - vm.prank(whitelistedAddress); - ynlsd.transfer(recipient, transferAmount); - - // Assert - uint256 recipientBalance = ynlsd.balanceOf(recipient); - assertEq(recipientBalance, transferAmount, "Transfer did not succeed for whitelisted address"); - } - - function testAddToPauseWhitelist() public { - // Arrange - address[] memory addressesToWhitelist = new address[](2); - addressesToWhitelist[0] = address(1); - addressesToWhitelist[1] = address(2); - - // Act - vm.prank(actors.admin.UNPAUSE_ADMIN); - ynlsd.addToPauseWhitelist(addressesToWhitelist); - - // Assert - assertTrue(ynlsd.pauseWhiteList(addressesToWhitelist[0]), "Address 1 should be whitelisted"); - assertTrue(ynlsd.pauseWhiteList(addressesToWhitelist[1]), "Address 2 should be whitelisted"); - } - - function testTransferSucceedsForNewlyWhitelistedAddress() public { - // Arrange - uint256 depositAmount = 1 ether; - address newWhitelistedAddress = vm.addr(7); // Using a new address for whitelisting - address recipient = address(8); // An arbitrary recipient address - - // 1. Obtain stETH and Deposit assets to ynLSD by User - TestAssetUtils testAssetUtils = new TestAssetUtils(); - IERC20 stETH = IERC20(chainAddresses.lsd.STETH_ADDRESS); - uint256 balance = testAssetUtils.get_stETH(address(this), depositAmount); - - stETH.approve(address(ynlsd), balance); - ynlsd.deposit(stETH, balance, newWhitelistedAddress); - - address[] memory whitelistAddresses = new address[](1); - whitelistAddresses[0] = newWhitelistedAddress; - vm.prank(actors.admin.UNPAUSE_ADMIN); - ynlsd.addToPauseWhitelist(whitelistAddresses); // Whitelisting the new address - - uint256 transferAmount = ynlsd.balanceOf(newWhitelistedAddress); - - // Act - vm.prank(newWhitelistedAddress); - ynlsd.transfer(recipient, transferAmount); - - // Assert - uint256 recipientBalance = ynlsd.balanceOf(recipient); - assertEq(recipientBalance, transferAmount, "Transfer did not succeed for newly whitelisted address"); - } - - function testTransferEnabledForAnyAddress() public { - // Arrange - uint256 depositAmount = 1 ether; - address arbitraryAddress = vm.addr(9999); // Using an arbitrary address - address recipient = address(10000); // An arbitrary recipient address - - // 1. Obtain stETH and Deposit assets to ynLSD by User - TestAssetUtils testAssetUtils = new TestAssetUtils(); - IERC20 stETH = IERC20(chainAddresses.lsd.STETH_ADDRESS); - uint256 balance = testAssetUtils.get_stETH(address(this), depositAmount); - stETH.approve(address(ynlsd), balance); - ynlsd.deposit(stETH, balance, arbitraryAddress); - - uint256 transferAmount = ynlsd.balanceOf(arbitraryAddress); - - // Act - vm.prank(actors.admin.UNPAUSE_ADMIN); - ynlsd.unpauseTransfers(); // Unpausing transfers for all - - vm.prank(arbitraryAddress); - ynlsd.transfer(recipient, transferAmount); - - // Assert - uint256 recipientBalance = ynlsd.balanceOf(recipient); - assertEq(recipientBalance, transferAmount, "Transfer did not succeed for any address after enabling transfers"); - } - - function testRemoveInitialWhitelistedAddress() public { - // Arrange - address[] memory whitelistAddresses = new address[](1); - whitelistAddresses[0] = actors.eoa.DEFAULT_SIGNER; // EOA address to be removed from whitelist - - // Act - vm.prank(actors.admin.UNPAUSE_ADMIN); - ynlsd.removeFromPauseWhitelist(whitelistAddresses); // Removing the EOA address from whitelist - - // Assert - bool isWhitelisted = ynlsd.pauseWhiteList(actors.eoa.DEFAULT_SIGNER); - assertFalse(isWhitelisted, "EOA address was not removed from whitelist"); - } - - function testRemoveMultipleNewWhitelistAddresses() public { - // Arrange - address[] memory newWhitelistAddresses = new address[](2); - newWhitelistAddresses[0] = address(20000); // First new whitelist address - newWhitelistAddresses[1] = address(20001); // Second new whitelist address - - // Adding addresses to whitelist first - vm.prank(actors.admin.UNPAUSE_ADMIN); - ynlsd.addToPauseWhitelist(newWhitelistAddresses); - - // Act - vm.prank(actors.admin.UNPAUSE_ADMIN); - ynlsd.removeFromPauseWhitelist(newWhitelistAddresses); // Removing the new whitelist addresses - - // Assert - bool isFirstAddressWhitelisted = ynlsd.pauseWhiteList(newWhitelistAddresses[0]); - bool isSecondAddressWhitelisted = ynlsd.pauseWhiteList(newWhitelistAddresses[1]); - assertFalse(isFirstAddressWhitelisted, "First new whitelist address was not removed"); - assertFalse(isSecondAddressWhitelisted, "Second new whitelist address was not removed"); - } -} - - -contract ynLSDDonationsTest is IntegrationBaseTest { - - function testYnLSDdonationToZeroShareAttackResistance() public { - - uint INITIAL_AMOUNT = 10 ether; - - address alice = makeAddr("Alice"); - address bob = makeAddr("Bob"); - - IERC20 assetToken = IERC20(chainAddresses.lsd.STETH_ADDRESS); - - // 1. Obtain stETH and Deposit assets to ynLSD by User - TestAssetUtils testAssetUtils = new TestAssetUtils(); - testAssetUtils.get_stETH(alice, INITIAL_AMOUNT); - testAssetUtils.get_stETH(bob, INITIAL_AMOUNT); - - vm.prank(alice); - assetToken.approve(address(ynlsd), type(uint256).max); - - vm.startPrank(bob); - assetToken.approve(address(ynlsd), type(uint256).max); - - // Front-running part - uint256 bobDepositAmount = INITIAL_AMOUNT / 2; - // Alice knows that Bob is about to deposit INITIAL_AMOUNT*0.5 ATK to the Vault by observing the mempool - vm.startPrank(alice); - uint256 aliceDepositAmount = 1; - uint256 aliceShares = ynlsd.deposit(assetToken, aliceDepositAmount, alice); - // Since there are boostrap funds, this has no effect - assertEq(compareWithThreshold(aliceShares, 1, 1), true, "Alice's shares should be dust"); - // Try to inflate shares value - assetToken.transfer(address(ynlsd), bobDepositAmount); - vm.stopPrank(); - - // Check that Bob did not get 0 share when he deposits - vm.prank(bob); - uint256 bobShares = ynlsd.deposit(assetToken, bobDepositAmount, bob); - - assertGt(bobShares, 1 wei, "Bob's shares should be greater than 1 wei"); - } -} \ No newline at end of file diff --git a/test/mocks/TestLSDStakingNodeV2.sol b/test/mocks/TestTokenStakingNodeV2.sol similarity index 68% rename from test/mocks/TestLSDStakingNodeV2.sol rename to test/mocks/TestTokenStakingNodeV2.sol index 468d2d28d..391431075 100644 --- a/test/mocks/TestLSDStakingNodeV2.sol +++ b/test/mocks/TestTokenStakingNodeV2.sol @@ -1,9 +1,10 @@ // SPDX-License-Identifier: BSD 3-Clause License pragma solidity ^0.8.24; -import "src/LSDStakingNode.sol"; +import {ITokenStakingNode} from "src/interfaces/ITokenStakingNode.sol"; +import {TokenStakingNode} from "src/ynEIGEN/TokenStakingNode.sol"; -contract TestLSDStakingNodeV2 is LSDStakingNode { +contract TestTokenStakingNodeV2 is TokenStakingNode { uint public valueToBeInitialized; diff --git a/test/mocks/TestTokenStakingNodesManagerV2.sol b/test/mocks/TestTokenStakingNodesManagerV2.sol new file mode 100644 index 000000000..fa50553ea --- /dev/null +++ b/test/mocks/TestTokenStakingNodesManagerV2.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {IynEigen} from "src/interfaces/IynEigen.sol"; +import {ITokenStakingNodesManager} from "src/interfaces/ITokenStakingNodesManager.sol"; +import {ITokenStakingNode} from "src/interfaces/ITokenStakingNode.sol"; +import {TestTokenStakingNodeV2} from "test/mocks/TestTokenStakingNodeV2.sol"; +import {TokenStakingNodesManager} from "src/ynEIGEN/TokenStakingNodesManager.sol"; + +contract TestTokenStakingNodesManagerV2 is TokenStakingNodesManager { + function initializeTokenStakingNode(ITokenStakingNode node, uint256 nodeId) internal override { + + uint64 initializedVersion = node.getInitializedVersion(); + if (initializedVersion == 0) { + node.initialize( + ITokenStakingNode.Init(ITokenStakingNodesManager(address(this)), nodeId) + ); + initializedVersion = node.getInitializedVersion(); + } + + if (initializedVersion == 1) { + TestTokenStakingNodeV2(payable(address(node))) + .initializeV2(TestTokenStakingNodeV2.ReInit({valueToBeInitialized: 23})); + } + } +} diff --git a/test/mocks/TestYnLSDV2.sol b/test/mocks/TestYnLSDV2.sol deleted file mode 100644 index 68c8bfef9..000000000 --- a/test/mocks/TestYnLSDV2.sol +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: BSD 3-Clause License -pragma solidity ^0.8.24; - -import {ynLSD} from "src/ynLSD.sol"; -import {IynLSD} from "src/interfaces/IynLSD.sol"; -import {ILSDStakingNode} from "src/interfaces/ILSDStakingNode.sol"; -import {TestLSDStakingNodeV2} from "test/mocks/TestLSDStakingNodeV2.sol"; - -contract TestYnLSDV2 is ynLSD { - function initializeLSDStakingNode(ILSDStakingNode node, uint256 nodeId) override internal { - - uint64 initializedVersion = node.getInitializedVersion(); - if (initializedVersion == 0) { - node.initialize( - ILSDStakingNode.Init(IynLSD(address(this)), nodeId) - ); - initializedVersion = node.getInitializedVersion(); - } - - if (initializedVersion == 1) { - TestLSDStakingNodeV2(payable(address(node))) - .initializeV2(TestLSDStakingNodeV2.ReInit({valueToBeInitialized: 23})); - } - } -} diff --git a/test/scenarios/ScenarioBaseTest.sol b/test/scenarios/ScenarioBaseTest.sol index 56d74069e..7c9c44fb6 100644 --- a/test/scenarios/ScenarioBaseTest.sol +++ b/test/scenarios/ScenarioBaseTest.sol @@ -15,9 +15,6 @@ import {IRewardsDistributor} from "src/interfaces/IRewardsDistributor.sol"; import {IynETH} from "src/interfaces/IynETH.sol"; import {Test} from "forge-std/Test.sol"; import {ynETH} from "src/ynETH.sol"; -import {ynLSD} from "src/ynLSD.sol"; -import {YieldNestOracle} from "src/YieldNestOracle.sol"; -import {LSDStakingNode} from "src/LSDStakingNode.sol"; import {ynViewer} from "src/ynViewer.sol"; import {StakingNodesManager} from "src/StakingNodesManager.sol"; import {StakingNode} from "src/StakingNode.sol"; diff --git a/test/scenarios/ynEIGEN/ynLSDeRoleChangeScenario.s.sol b/test/scenarios/ynEIGEN/ynLSDeRoleChangeScenario.s.sol new file mode 100644 index 000000000..d3df9d534 --- /dev/null +++ b/test/scenarios/ynEIGEN/ynLSDeRoleChangeScenario.s.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {ITransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import {UpgradeableBeacon} from "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; + +import {ITokenStakingNode} from "../../../src/interfaces/ITokenStakingNode.sol"; + +import {HoleskyLSDRateProvider} from "../../../src/testnet/HoleksyLSDRateProvider.sol"; + +import {TestStakingNodesManagerV2} from "../../mocks/TestStakingNodesManagerV2.sol"; +import {TestStakingNodeV2} from "../../mocks/TestStakingNodeV2.sol"; + +import "./ynLSDeScenarioBaseTest.sol"; + +contract ynLSDeRoleChangeScenario is ynLSDeScenarioBaseTest { + + function test_AddDefaultAdminRole_ynLSDe() public { + address newAdmin = address(0x123); // Example new admin address + + vm.startPrank(actors.wallets.YNSecurityCouncil); + yneigen.grantRole(yneigen.DEFAULT_ADMIN_ROLE(), newAdmin); + vm.stopPrank(); + + assertTrue(yneigen.hasRole(yneigen.DEFAULT_ADMIN_ROLE(), newAdmin), "New admin should have DEFAULT_ADMIN_ROLE for ynLSDe"); + } + + function test_AddDefaultAdminRole_TokenStakingNodesManager() public { + address newAdmin = address(0x456); // Example new admin address + + vm.startPrank(actors.wallets.YNSecurityCouncil); + tokenStakingNodesManager.grantRole(tokenStakingNodesManager.DEFAULT_ADMIN_ROLE(), newAdmin); + vm.stopPrank(); + + assertTrue(tokenStakingNodesManager.hasRole(tokenStakingNodesManager.DEFAULT_ADMIN_ROLE(), newAdmin), "New admin should have DEFAULT_ADMIN_ROLE for TokenStakingNodesManager"); + } + + function test_AddDefaultAdminRole_AssetRegistry() public { + address newAdmin = address(0x789); // Example new admin address + + vm.startPrank(actors.wallets.YNSecurityCouncil); + assetRegistry.grantRole(assetRegistry.DEFAULT_ADMIN_ROLE(), newAdmin); + vm.stopPrank(); + + assertTrue(assetRegistry.hasRole(assetRegistry.DEFAULT_ADMIN_ROLE(), newAdmin), "New admin should have DEFAULT_ADMIN_ROLE for AssetRegistry"); + } + + function test_AddDefaultAdminRole_EigenStrategyManager() public { + address newAdmin = address(0xabc); // Example new admin address + + vm.startPrank(actors.wallets.YNSecurityCouncil); + eigenStrategyManager.grantRole(eigenStrategyManager.DEFAULT_ADMIN_ROLE(), newAdmin); + vm.stopPrank(); + + assertTrue(eigenStrategyManager.hasRole(eigenStrategyManager.DEFAULT_ADMIN_ROLE(), newAdmin), "New admin should have DEFAULT_ADMIN_ROLE for EigenStrategyManager"); + } + + function test_AddDefaultAdminRole_ynEigenDepositAdapter() public { + address newAdmin = address(0xfed); // Example new admin address + + vm.startPrank(actors.wallets.YNSecurityCouncil); + ynEigenDepositAdapter_.grantRole(ynEigenDepositAdapter_.DEFAULT_ADMIN_ROLE(), newAdmin); + vm.stopPrank(); + + assertTrue(ynEigenDepositAdapter_.hasRole(ynEigenDepositAdapter_.DEFAULT_ADMIN_ROLE(), newAdmin), "New admin should have DEFAULT_ADMIN_ROLE for ynEigenDepositAdapter"); + } + +} \ No newline at end of file diff --git a/test/scenarios/ynEIGEN/ynLSDeScenarioBaseTest.sol b/test/scenarios/ynEIGEN/ynLSDeScenarioBaseTest.sol new file mode 100644 index 000000000..1e601123f --- /dev/null +++ b/test/scenarios/ynEIGEN/ynLSDeScenarioBaseTest.sol @@ -0,0 +1,82 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {IEigenPodManager} from "@eigenlayer/src/contracts/interfaces/IEigenPodManager.sol"; +import {IDelegationManager} from "@eigenlayer/src/contracts/interfaces/IDelegationManager.sol"; +import {IStrategyManager} from "@eigenlayer/src/contracts/interfaces/IStrategyManager.sol"; + +import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol"; + +import {Utils} from "../../../script/Utils.sol"; +import {ActorAddresses} from "../../../script/Actors.sol"; +import {ContractAddresses} from "../../../script/ContractAddresses.sol"; + +import {TokenStakingNodesManager} from "../../../src/ynEIGEN/TokenStakingNodesManager.sol"; +import {TokenStakingNode} from "../../../src/ynEIGEN/TokenStakingNode.sol"; +import {ynEigen} from "../../../src/ynEIGEN/ynEigen.sol"; +import {AssetRegistry} from "../../../src/ynEIGEN/AssetRegistry.sol"; +import {EigenStrategyManager} from "../../../src/ynEIGEN/EigenStrategyManager.sol"; +import {LSDRateProvider} from "../../../src/ynEIGEN/LSDRateProvider.sol"; +import {ynEigenDepositAdapter} from "../../../src/ynEIGEN/ynEigenDepositAdapter.sol"; + +import {Test} from "forge-std/Test.sol"; + +contract ynLSDeScenarioBaseTest is Test, Utils { + + // Utils + ContractAddresses public contractAddresses; + ContractAddresses.ChainAddresses public chainAddresses; + ActorAddresses public actorAddresses; + ActorAddresses.Actors public actors; + + // ynEIGEN Utils + AssetRegistry public assetRegistry; + EigenStrategyManager public eigenStrategyManager; + LSDRateProvider public lsdRateProvider; + ynEigenDepositAdapter public ynEigenDepositAdapter_; + TimelockController public timelockController; + + // Staking + TokenStakingNodesManager public tokenStakingNodesManager; + TokenStakingNode public tokenStakingNodeImplementation; + + // Assets + ynEigen public yneigen; + + // Eigen + IEigenPodManager public eigenPodManager; + IDelegationManager public delegationManager; + IStrategyManager public strategyManager; + + function setUp() public virtual { + assignContracts(); + } + + function assignContracts() internal { + uint256 chainId = block.chainid; + + contractAddresses = new ContractAddresses(); + chainAddresses = contractAddresses.getChainAddresses(chainId); + + actorAddresses = new ActorAddresses(); + actors = actorAddresses.getActors(block.chainid); + + // Assign Eigenlayer addresses + eigenPodManager = IEigenPodManager(chainAddresses.eigenlayer.EIGENPOD_MANAGER_ADDRESS); + delegationManager = IDelegationManager(chainAddresses.eigenlayer.DELEGATION_MANAGER_ADDRESS); + strategyManager = IStrategyManager(chainAddresses.eigenlayer.STRATEGY_MANAGER_ADDRESS); + + // Assign LSD addresses + // Example: sfrxeth = ISFRXETH(chainAddresses.lsd.SFRXETH_ADDRESS); + + // Assign ynEIGEN addresses + assetRegistry = AssetRegistry(chainAddresses.ynEigen.ASSET_REGISTRY_ADDRESS); + eigenStrategyManager = EigenStrategyManager(chainAddresses.ynEigen.EIGEN_STRATEGY_MANAGER_ADDRESS); + lsdRateProvider = LSDRateProvider(chainAddresses.ynEigen.LSD_RATE_PROVIDER_ADDRESS); + ynEigenDepositAdapter_ = ynEigenDepositAdapter(chainAddresses.ynEigen.YNEIGEN_DEPOSIT_ADAPTER_ADDRESS); + tokenStakingNodesManager = TokenStakingNodesManager(chainAddresses.ynEigen.TOKEN_STAKING_NODES_MANAGER_ADDRESS); + yneigen = ynEigen(chainAddresses.ynEigen.YNEIGEN_ADDRESS); + timelockController = TimelockController(payable(chainAddresses.ynEigen.TIMELOCK_CONTROLLER_ADDRESS)); + + } +} \ No newline at end of file diff --git a/test/scenarios/ynEIGEN/ynLSDeUpgradeScenario.sol b/test/scenarios/ynEIGEN/ynLSDeUpgradeScenario.sol new file mode 100644 index 000000000..5dfc8956a --- /dev/null +++ b/test/scenarios/ynEIGEN/ynLSDeUpgradeScenario.sol @@ -0,0 +1,375 @@ +// SPDX-License-Identifier: BSD 3-Clause License +pragma solidity ^0.8.24; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {ITransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import {UpgradeableBeacon} from "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; + +import {ITokenStakingNode} from "../../../src/interfaces/ITokenStakingNode.sol"; + +import {HoleskyLSDRateProvider} from "../../../src/testnet/HoleksyLSDRateProvider.sol"; + +import {TestStakingNodesManagerV2} from "../../mocks/TestStakingNodesManagerV2.sol"; +import {TestStakingNodeV2} from "../../mocks/TestStakingNodeV2.sol"; + +import "./ynLSDeScenarioBaseTest.sol"; +import {console} from "forge-std/console.sol"; + + +contract ynLSDeUpgradeScenario is ynLSDeScenarioBaseTest { + + function test_Upgrade_ynLSDe_Scenario() public { + + address previousImplementation = getTransparentUpgradeableProxyImplementationAddress(address(yneigen)); + console.log("Total assets before upgrade:", yneigen.totalAssets()); + address newImplementation = address(new ynEigen()); + + uint256 previousTotalAssets = yneigen.totalAssets(); + uint256 previousTotalSupply = IERC20(address(yneigen)).totalSupply(); + + upgradeContract(address(yneigen), newImplementation); + + runUpgradeInvariants(address(yneigen), previousImplementation, newImplementation); + runSystemStateInvariants(previousTotalAssets, previousTotalSupply); + runTransferOwnership(address(yneigen)); + } + + function test_Upgrade_TokenStakingNodesManager_Scenario() public { + + address previousStakingNodesManagerImpl = getTransparentUpgradeableProxyImplementationAddress(address(tokenStakingNodesManager)); + address newStakingNodesManagerImpl = address(new TokenStakingNodesManager()); + + uint256 previousTotalAssets = yneigen.totalAssets(); + uint256 previousTotalSupply = IERC20(address(yneigen)).totalSupply(); + + upgradeContract(address(tokenStakingNodesManager), newStakingNodesManagerImpl); + + runUpgradeInvariants(address(tokenStakingNodesManager), previousStakingNodesManagerImpl, newStakingNodesManagerImpl); + runSystemStateInvariants(previousTotalAssets, previousTotalSupply); + runTransferOwnership(address(tokenStakingNodesManager)); + } + + function test_Upgrade_AssetRegistry() public { + + address previousAssetRegistryImpl = getTransparentUpgradeableProxyImplementationAddress(address(assetRegistry)); + address newAssetRegistryImpl = address(new AssetRegistry()); + + uint256 previousTotalAssets = yneigen.totalAssets(); + uint256 previousTotalSupply = IERC20(address(yneigen)).totalSupply(); + + upgradeContract(address(assetRegistry), newAssetRegistryImpl); + + runUpgradeInvariants(address(assetRegistry), previousAssetRegistryImpl, newAssetRegistryImpl); + runSystemStateInvariants(previousTotalAssets, previousTotalSupply); + runTransferOwnership(address(assetRegistry)); + } + + function test_Upgrade_EigenStrategyManager() public { + + address previousEigenStrategyManagerImpl = getTransparentUpgradeableProxyImplementationAddress(address(eigenStrategyManager)); + address newEigenStrategyManagerImpl = address(new EigenStrategyManager()); + + uint256 previousTotalAssets = yneigen.totalAssets(); + uint256 previousTotalSupply = IERC20(address(yneigen)).totalSupply(); + + upgradeContract(address(eigenStrategyManager), newEigenStrategyManagerImpl); + + runUpgradeInvariants(address(eigenStrategyManager), previousEigenStrategyManagerImpl, newEigenStrategyManagerImpl); + runSystemStateInvariants(previousTotalAssets, previousTotalSupply); + runTransferOwnership(address(eigenStrategyManager)); + } + + function test_Upgrade_LSDRateProvider() public { + + address previousLSDRateProviderImpl = getTransparentUpgradeableProxyImplementationAddress(address(lsdRateProvider)); + address newLSDRateProviderImpl; + if (block.chainid == 17000) { // Holesky + newLSDRateProviderImpl = address(new HoleskyLSDRateProvider()); + } else if (block.chainid == 1) { // Mainnet + newLSDRateProviderImpl = address(new LSDRateProvider()); + } else { + revert("Unsupported chain ID"); + } + + uint256 previousTotalAssets = yneigen.totalAssets(); + uint256 previousTotalSupply = IERC20(address(yneigen)).totalSupply(); + + upgradeContract(address(lsdRateProvider), newLSDRateProviderImpl); + + runUpgradeInvariants(address(lsdRateProvider), previousLSDRateProviderImpl, newLSDRateProviderImpl); + runSystemStateInvariants(previousTotalAssets, previousTotalSupply); + runTransferOwnership(address(lsdRateProvider)); + } + + function test_Upgrade_ynEigenDepositAdapter() public { + + address previousYnEigenDepositAdapterImpl = getTransparentUpgradeableProxyImplementationAddress(address(ynEigenDepositAdapter_)); + address newYnEigenDepositAdapterImpl = address(new ynEigenDepositAdapter()); + + uint256 previousTotalAssets = yneigen.totalAssets(); + uint256 previousTotalSupply = IERC20(address(yneigen)).totalSupply(); + + upgradeContract(address(ynEigenDepositAdapter_), newYnEigenDepositAdapterImpl); + + runUpgradeInvariants(address(ynEigenDepositAdapter_), previousYnEigenDepositAdapterImpl, newYnEigenDepositAdapterImpl); + runSystemStateInvariants(previousTotalAssets, previousTotalSupply); + runTransferOwnership(address(ynEigenDepositAdapter_)); + } + + function test_Upgrade_AllContracts_Batch() public { + address[] memory contracts = new address[](6); + address[] memory newImplementations = new address[](6); + + // YnLSDe + contracts[0] = address(yneigen); + newImplementations[0] = address(new ynEigen()); + + // EigenStrategyManager + contracts[1] = address(eigenStrategyManager); + newImplementations[1] = address(new EigenStrategyManager()); + + // LSDRateProvider + if (block.chainid == 17000) { // Holesky + newImplementations[2] = address(new HoleskyLSDRateProvider()); + } else if (block.chainid == 1) { // Mainnet + newImplementations[2] = address(new LSDRateProvider()); + } else { + revert("Unsupported chain ID"); + } + contracts[2] = address(lsdRateProvider); + + // ynEigenDepositAdapter + contracts[3] = address(ynEigenDepositAdapter_); + newImplementations[3] = address(new ynEigenDepositAdapter()); + + // AssetRegistry + contracts[4] = address(assetRegistry); + newImplementations[4] = address(new AssetRegistry()); + + // TokenStakingNodesManager + contracts[5] = address(tokenStakingNodesManager); + newImplementations[5] = address(new TokenStakingNodesManager()); + + uint256 previousTotalAssets = yneigen.totalAssets(); + uint256 previousTotalSupply = IERC20(address(yneigen)).totalSupply(); + + address[] memory previousImplementations = new address[](contracts.length); + for (uint i = 0; i < contracts.length; i++) { + previousImplementations[i] = getTransparentUpgradeableProxyImplementationAddress(contracts[i]); + } + + upgradeContractBatch(contracts, newImplementations); + + for (uint i = 0; i < contracts.length; i++) { + runUpgradeInvariants(contracts[i], previousImplementations[i], newImplementations[i]); + runTransferOwnership(contracts[i]); + } + + runSystemStateInvariants(previousTotalAssets, previousTotalSupply); + } + + function test_Upgrade_TokenStakingNodeImplementation_Scenario() public { + + ITokenStakingNode[] memory tokenStakingNodesBefore = tokenStakingNodesManager.getAllNodes(); + + uint256 previousTotalAssets = yneigen.totalAssets(); + uint256 previousTotalSupply = IERC20(address(yneigen)).totalSupply(); + + TestStakingNodeV2 testStakingNodeV2 = new TestStakingNodeV2(); + { + bytes memory _data = abi.encodeWithSignature( + "upgradeTokenStakingNode(address)", + payable(testStakingNodeV2) + ); + vm.startPrank(actors.wallets.YNSecurityCouncil); + timelockController.schedule( + address(tokenStakingNodesManager), // target + 0, // value + _data, + bytes32(0), // predecessor + bytes32(0), // salt + timelockController.getMinDelay() // delay + ); + vm.stopPrank(); + + uint256 minDelay; + if (block.chainid == 1) { // Mainnet + minDelay = 3 days; + } else if (block.chainid == 17000) { // Holesky + minDelay = 15 minutes; + } else { + revert("Unsupported chain ID"); + } + skip(minDelay); + + vm.startPrank(actors.wallets.YNSecurityCouncil); + timelockController.execute( + address(tokenStakingNodesManager), // target + 0, // value + _data, + bytes32(0), // predecessor + bytes32(0) // salt + ); + vm.stopPrank(); + } + + + UpgradeableBeacon beacon = tokenStakingNodesManager.upgradeableBeacon(); + address upgradedImplementationAddress = beacon.implementation(); + assertEq(upgradedImplementationAddress, payable(testStakingNodeV2)); + + // check tokenStakingNodesManager.getAllNodes is the same as before + ITokenStakingNode[] memory tokenStakingNodesAfter = tokenStakingNodesManager.getAllNodes(); + assertEq(tokenStakingNodesAfter.length, tokenStakingNodesBefore.length, "TokenStakingNodes length mismatch after upgrade"); + for (uint i = 0; i < tokenStakingNodesAfter.length; i++) { + assertEq(address(tokenStakingNodesAfter[i]), address(tokenStakingNodesBefore[i]), "TokenStakingNode address mismatch after upgrade"); + } + + runSystemStateInvariants(previousTotalAssets, previousTotalSupply); + runTransferOwnership(address(tokenStakingNodesManager)); + } + + function runUpgradeInvariants( + address proxyAddress, + address previousImplementation, + address newImplementation + ) internal { + // Check that the new implementation address is correctly set + address currentImplementation = getTransparentUpgradeableProxyImplementationAddress(proxyAddress); + assertEq(currentImplementation, newImplementation, "Invariant: Implementation address should match the new implementation address"); + // Ensure the implementation address has actually changed + assertNotEq(previousImplementation, newImplementation, "Invariant: New implementation should be different from the previous one"); + } + + function runSystemStateInvariants(uint256 previousTotalAssets, uint256 previousTotalSupply) public { + uint256 threshold = previousTotalAssets / 1e3; + assertTrue(compareWithThreshold(yneigen.totalAssets(), previousTotalAssets, threshold), "Total assets integrity check failed"); + assertEq(yneigen.totalSupply(), previousTotalSupply, "Share mint integrity check failed"); + } + + function upgradeContractBatch(address[] memory _proxyAddresses, address[] memory _newImplementations) public { + require(_proxyAddresses.length == _newImplementations.length, "Arrays must have the same length"); + + address[] memory targets = new address[](_proxyAddresses.length); + uint256[] memory values = new uint256[](_proxyAddresses.length); + bytes[] memory payloads = new bytes[](_proxyAddresses.length); + + for (uint i = 0; i < _proxyAddresses.length; i++) { + targets[i] = getTransparentUpgradeableProxyAdminAddress(_proxyAddresses[i]); + values[i] = 0; + payloads[i] = abi.encodeWithSignature( + "upgradeAndCall(address,address,bytes)", + _proxyAddresses[i], + _newImplementations[i], + "" + ); + } + + vm.startPrank(actors.wallets.YNSecurityCouncil); + timelockController.scheduleBatch( + targets, + values, + payloads, + bytes32(0), // predecessor + bytes32(0), // salt + timelockController.getMinDelay() // delay + ); + vm.stopPrank(); + + uint256 minDelay; + if (block.chainid == 1) { // Mainnet + minDelay = 3 days; + } else if (block.chainid == 17000) { // Holesky + minDelay = 15 minutes; + } else { + revert("Unsupported chain ID"); + } + skip(minDelay); + + vm.startPrank(actors.wallets.YNSecurityCouncil); + timelockController.executeBatch( + targets, + values, + payloads, + bytes32(0), // predecessor + bytes32(0) // salt + ); + vm.stopPrank(); + } + + function upgradeContract(address _proxyAddress, address _newImplementation) public { + bytes memory _data = abi.encodeWithSignature( + "upgradeAndCall(address,address,bytes)", + _proxyAddress, // proxy + _newImplementation, // implementation + "" // no data + ); + vm.startPrank(actors.wallets.YNSecurityCouncil); + timelockController.schedule( + getTransparentUpgradeableProxyAdminAddress(_proxyAddress), // target + 0, // value + _data, + bytes32(0), // predecessor + bytes32(0), // salt + timelockController.getMinDelay() // delay + ); + vm.stopPrank(); + + uint256 minDelay; + if (block.chainid == 1) { // Mainnet + minDelay = 3 days; + } else if (block.chainid == 17000) { // Holesky + minDelay = 15 minutes; + } else { + revert("Unsupported chain ID"); + } + skip(minDelay); + + vm.startPrank(actors.wallets.YNSecurityCouncil); + timelockController.execute( + getTransparentUpgradeableProxyAdminAddress(_proxyAddress), // target + 0, // value + _data, + bytes32(0), // predecessor + bytes32(0) // salt + ); + vm.stopPrank(); + } + + function runTransferOwnership(address _proxy) public { + address _newOwner = address(0x1241242151); + bytes memory _data = abi.encodeWithSignature("transferOwnership(address)", _newOwner); + vm.startPrank(actors.wallets.YNSecurityCouncil); + timelockController.schedule( + getTransparentUpgradeableProxyAdminAddress(address(_proxy)), // target + 0, // value + _data, + bytes32(0), // predecessor + bytes32(0), // salt + timelockController.getMinDelay() // delay + ); + vm.stopPrank(); + + uint256 minDelay; + if (block.chainid == 1) { // Mainnet + minDelay = 3 days; + } else if (block.chainid == 17000) { // Holesky + minDelay = 15 minutes; + } else { + revert("Unsupported chain ID"); + } + skip(minDelay); + + vm.startPrank(actors.wallets.YNSecurityCouncil); + timelockController.execute( + getTransparentUpgradeableProxyAdminAddress(address(_proxy)), // target + 0, // value + _data, + bytes32(0), // predecessor + bytes32(0) // salt + ); + vm.stopPrank(); + assertEq(Ownable(getTransparentUpgradeableProxyAdminAddress(address(_proxy))).owner(), _newOwner, "Ownership transfer failed"); + } +} \ No newline at end of file diff --git a/test/scenarios/ynEigen.spec.sol b/test/scenarios/ynEigen.spec.sol new file mode 100644 index 000000000..cefcf7efa --- /dev/null +++ b/test/scenarios/ynEigen.spec.sol @@ -0,0 +1,219 @@ +// SPDX-License-Identifier: BSD-3-Clause +pragma solidity ^0.8.24; + +import {Invariants} from "./Invariants.sol"; +import "test/integration/ynEIGEN/ynEigenIntegrationBaseTest.sol"; +import {ITokenStakingNode} from "src/interfaces/ITokenStakingNode.sol"; + +contract YnEIGENScenarioTest1 is ynEigenIntegrationBaseTest { + + /** + Scenario 1: Successful ETH Deposit and Share Minting + Objective: Test that a user can deposit ETH and receive + the correct amount of shares in return. + */ + + address user1 = address(0x01); + address user2 = address(0x02); + address user3 = address(0x03); + + function test_ynEIGEN_Scenario_1_Fuzz(uint256 random1, uint256 random2, uint256 random3) public { + + /** + Users deposit random amounts + - Check the total assets of ynEIGEN + - Check the share balance of each user + - Check the total deposited in the pool + - Check total supply of ynEIGEN + */ + + // We assume amounts are greater than 1 wei to avoid potential edge cases with zero or shares. + vm.assume(random1 > 1 && random1 < 100_000_000 ether); + vm.assume(random2 > 1 && random2 < 100_000_000 ether); + vm.assume(random3 > 1 && random3 < 100_000_000 ether); + uint256 previousTotalDeposited; + uint256 previousTotalAssets; + uint256 previousTotalShares; + + address asset = chainAddresses.lsd.WSTETH_ADDRESS; + + // user 1 deposits random1 + uint256 user1Amount = random1; + deal({ token: asset, to: user1, give: user1Amount }); + + uint256 user1Shares = ynEigenToken.previewDeposit(IERC20(asset), user1Amount); + vm.startPrank(user1); + IERC20(asset).approve(address(ynEigenToken), user1Amount); + ynEigenToken.deposit(IERC20(asset), user1Amount, user1); + vm.stopPrank(); + + previousTotalDeposited = 0; + previousTotalAssets = 0; + previousTotalShares = 0; + + runInvariants(IERC20(asset), user1, previousTotalAssets, previousTotalDeposited, previousTotalShares, user1Amount, user1Shares); + + // user 2 deposits random2 + uint256 user2Amount = random2; + deal({ token: asset, to: user2, give: user2Amount }); + + uint256 user2Shares = ynEigenToken.previewDeposit(IERC20(asset), user2Amount); + vm.startPrank(user2); + IERC20(asset).approve(address(ynEigenToken), user2Amount); + ynEigenToken.deposit(IERC20(asset), user2Amount, user2); + vm.stopPrank(); + + previousTotalDeposited += user1Amount; + previousTotalAssets += assetRegistry.convertToUnitOfAccount(IERC20(asset), user1Amount); + previousTotalShares += user1Shares; + + runInvariants(IERC20(asset), user2, previousTotalAssets, previousTotalDeposited, previousTotalShares, user2Amount, user2Shares); + + // user 3 deposits random3 + uint256 user3Amount = random3; + deal({ token: asset, to: user3, give: user3Amount }); + + uint256 user3Shares = ynEigenToken.previewDeposit(IERC20(asset), user3Amount); + vm.startPrank(user3); + IERC20(asset).approve(address(ynEigenToken), user3Amount); + ynEigenToken.deposit(IERC20(asset), user3Amount, user3); + vm.stopPrank(); + + previousTotalDeposited += user2Amount; + previousTotalAssets += assetRegistry.convertToUnitOfAccount(IERC20(asset), user2Amount); + previousTotalShares += user2Shares; + + runInvariants(IERC20(asset), user3, previousTotalAssets, previousTotalDeposited, previousTotalShares, user3Amount, user3Shares); + } + + function runInvariants(IERC20 asset, address user, uint256 previousTotalAssets, uint256 previousTotalDeposited, uint256 previousTotalShares, uint256 userAmount, uint256 userShares) public view { + Invariants.totalDepositIntegrity(ynEigenToken.assetBalance(asset), previousTotalDeposited, userAmount); + Invariants.totalAssetsIntegrity(ynEigenToken.totalAssets(), previousTotalAssets, assetRegistry.convertToUnitOfAccount(asset, userAmount)); + Invariants.shareMintIntegrity(ynEigenToken.totalSupply(), previousTotalShares, userShares); + Invariants.userSharesIntegrity(ynEigenToken.balanceOf(user), 0, userShares); + } +} + +contract YnEIGENScenarioTest2 is ynEigenIntegrationBaseTest { + + error Paused(); + error TransfersPaused(); + + /** + Scenario 2: Deposit Paused + Objective: Ensure that deposits are correctly + paused and resumed, preventing or allowing ETH + deposits accordingly. + */ + + address user1 = address(0x01); + address user2 = address(0x02); + + // pause ynEIGEN and try to deposit fail + function test_ynEIGEN_Scenario_2_Pause() public { + + vm.prank(actors.ops.PAUSE_ADMIN); + ynEigenToken.pauseDeposits(); + + address asset = chainAddresses.lsd.WSTETH_ADDRESS; + deal({ token: asset, to: user1, give: 1 ether }); + vm.startPrank(user1); + IERC20(asset).approve(address(ynEigenToken), 1 ether); + vm.expectRevert(Paused.selector); + ynEigenToken.deposit(IERC20(asset), 1 ether, user1); + vm.stopPrank(); + } + + function test_ynEIGEN_Scenario_2_Unpause() public { + + vm.prank(actors.ops.PAUSE_ADMIN); + ynEigenToken.pauseDeposits(); + assertTrue(ynEigenToken.depositsPaused()); + vm.prank(actors.admin.UNPAUSE_ADMIN); + ynEigenToken.unpauseDeposits(); + assertFalse(ynEigenToken.depositsPaused()); + vm.stopPrank(); + + address asset = chainAddresses.lsd.WSTETH_ADDRESS; + deal({ token: asset, to: user1, give: 1 ether }); + vm.startPrank(user1); + IERC20(asset).approve(address(ynEigenToken), 1 ether); + ynEigenToken.deposit(IERC20(asset), 1 ether, user1); + vm.stopPrank(); + assertEq(ynEigenToken.balanceOf(user1), assetRegistry.convertToUnitOfAccount(IERC20(asset), 1 ether)); + } + + function test_ynEIGEN_Scenario_2_Pause_Transfer(uint256 random1) public { + vm.assume(random1 > 0 && random1 < 100_000_000 ether); + + uint256 amount = random1; + address asset = chainAddresses.lsd.WSTETH_ADDRESS; + deal({ token: asset, to: user1, give: amount }); + vm.startPrank(user1); + IERC20(asset).approve(address(ynEigenToken), amount); + ynEigenToken.deposit(IERC20(asset), amount, user1); + assertEq(ynEigenToken.balanceOf(user1), assetRegistry.convertToUnitOfAccount(IERC20(asset), amount)); + + // should fail when not on the pause whitelist + ynEigenToken.approve(user2, amount); + vm.expectRevert(TransfersPaused.selector); + ynEigenToken.transfer(user2, amount); + vm.stopPrank(); + + // should pass when on the pause whitelist + deal({ token: asset, to: actors.eoa.DEFAULT_SIGNER, give: amount }); + vm.startPrank(actors.eoa.DEFAULT_SIGNER); + IERC20(asset).approve(address(ynEigenToken), amount); + ynEigenToken.deposit(IERC20(asset), amount, actors.eoa.DEFAULT_SIGNER); + + uint256 transferEnabledEOABalance = ynEigenToken.balanceOf(actors.eoa.DEFAULT_SIGNER); + ynEigenToken.transfer(user2, transferEnabledEOABalance); + vm.stopPrank(); + assertEq(ynEigenToken.balanceOf(user2), transferEnabledEOABalance); + } +} + +contract YnEIGENScenarioTest3 is ynEigenIntegrationBaseTest { + + /** + Scenario 3: Deposit LSD to Strategy Manager + Objective: Test that the Strategy Manager + can withdraw ETH from ynEIGEN. + */ + + address user1 = address(0x01); + + function test_ynETH_Scenario_3_Deposit() public { + + depositLSD_and_createNode(); + } + + function depositLSD_and_createNode() public returns (ITokenStakingNode tokenStakingNode) { + IERC20 asset = IERC20(chainAddresses.lsd.WSTETH_ADDRESS); + uint256 amount = 64 ether; + + vm.prank(actors.ops.STAKING_NODE_CREATOR); + tokenStakingNodesManager.createTokenStakingNode(); + + tokenStakingNode = tokenStakingNodesManager.nodes(0); + + deal({ token: address(asset), to: user1, give: amount }); + vm.startPrank(user1); + IERC20(asset).approve(address(ynEigenToken), amount); + ynEigenToken.deposit(IERC20(asset), amount, user1); + vm.stopPrank(); + + { + IERC20[] memory assets = new IERC20[](1); + uint256[] memory amounts = new uint256[](1); + assets[0] = asset; + amounts[0] = amount; + + uint256 nodeId = tokenStakingNode.nodeId(); + vm.prank(actors.ops.STRATEGY_CONTROLLER); + eigenStrategyManager.stakeAssetsToNode(nodeId, assets, amounts); + } + + assertApproxEqAbs(amount, eigenStrategyManager.getStakedAssetBalanceForNode(asset, 0), 2); + } +} \ No newline at end of file diff --git a/test/scenarios/ynLSD.spec.sol b/test/scenarios/ynLSD.spec.sol index a9b45e253..a4550fe41 100644 --- a/test/scenarios/ynLSD.spec.sol +++ b/test/scenarios/ynLSD.spec.sol @@ -8,71 +8,71 @@ import { TestAssetUtils } from "test/utils/TestAssetUtils.sol"; contract YnLSDScenarioTest1 is IntegrationBaseTest { - /** - Scenario 1: Successful LSD Deposit and Share Minting - Objective: Test that a user can deposit stETH and receive - the correct amount of shares in return. - */ + // /** + // Scenario 1: Successful LSD Deposit and Share Minting + // Objective: Test that a user can deposit stETH and receive + // the correct amount of shares in return. + // */ - function test_ynLSD_Scenario_1_Fuzz(uint256 amount1, uint256 amount2, uint256 amount3) public { + // function test_ynLSD_Scenario_1_Fuzz(uint256 amount1, uint256 amount2, uint256 amount3) public { - /** - Users deposit random amounts - - Check the total assets of ynLSD - - Check the share balance of each user - - Check total supply of ynLSD - */ + // /** + // Users deposit random amounts + // - Check the total assets of ynLSD + // - Check the share balance of each user + // - Check total supply of ynLSD + // */ - address asset = chainAddresses.lsd.STETH_ADDRESS; + // address asset = chainAddresses.lsd.STETH_ADDRESS; - User_stETH_deposit(asset, amount1, address(0x01)); - User_stETH_deposit(asset, amount2, address(0x02)); - User_stETH_deposit(asset, amount3, address(0x03)); - } + // User_stETH_deposit(asset, amount1, address(0x01)); + // User_stETH_deposit(asset, amount2, address(0x02)); + // User_stETH_deposit(asset, amount3, address(0x03)); + // } - function User_stETH_deposit(address asset, uint256 amount, address user) public { + // function User_stETH_deposit(address asset, uint256 amount, address user) public { - vm.assume(amount > 1 && amount < 10_000 ether); + // vm.assume(amount > 1 && amount < 10_000 ether); - uint256 previousTotalShares = ynlsd.totalSupply(); - uint256 previousTotalAssets = ynlsd.getTotalAssets()[0]; + // uint256 previousTotalShares = ynlsd.totalSupply(); + // uint256 previousTotalAssets = ynlsd.getTotalAssets()[0]; - vm.startPrank(user); - // 1. Obtain stETH and Deposit assets to ynLSD by User - TestAssetUtils testAssetUtils = new TestAssetUtils(); - IERC20 stETH = IERC20(asset); - uint256 userDeposit = testAssetUtils.get_stETH(address(this), amount); + // vm.startPrank(user); + // // 1. Obtain stETH and Deposit assets to ynLSD by User + // TestAssetUtils testAssetUtils = new TestAssetUtils(); + // IERC20 stETH = IERC20(asset); + // uint256 userDeposit = testAssetUtils.get_stETH(address(this), amount); - stETH.approve(address(ynlsd), userDeposit); - ynlsd.deposit(stETH, userDeposit, user); + // stETH.approve(address(ynlsd), userDeposit); + // ynlsd.deposit(stETH, userDeposit, user); - uint256 userShares = ynlsd.balanceOf(user); + // uint256 userShares = ynlsd.balanceOf(user); - uint256 currentTotalAssets = ynlsd.getTotalAssets()[0]; - uint256 currentTotalShares = ynlsd.totalSupply(); + // uint256 currentTotalAssets = ynlsd.getTotalAssets()[0]; + // uint256 currentTotalShares = ynlsd.totalSupply(); - runInvariants( - user, - previousTotalAssets, - previousTotalShares, - currentTotalAssets, - currentTotalShares, - userDeposit, - userShares - ); - } + // runInvariants( + // user, + // previousTotalAssets, + // previousTotalShares, + // currentTotalAssets, + // currentTotalShares, + // userDeposit, + // userShares + // ); + // } - function runInvariants( - address user, - uint256 previousTotalAssets, - uint256 previousTotalShares, - uint256 currentTotalAssets, - uint256 currentTotalShares, - uint256 userDeposit, - uint256 userShares - ) public view{ - Invariants.totalAssetsIntegrity(currentTotalAssets, previousTotalAssets, userDeposit); - Invariants.shareMintIntegrity(currentTotalShares, previousTotalShares, userShares); - Invariants.userSharesIntegrity(ynlsd.balanceOf(user), 0, userShares); - } + // function runInvariants( + // address user, + // uint256 previousTotalAssets, + // uint256 previousTotalShares, + // uint256 currentTotalAssets, + // uint256 currentTotalShares, + // uint256 userDeposit, + // uint256 userShares + // ) public view{ + // Invariants.totalAssetsIntegrity(currentTotalAssets, previousTotalAssets, userDeposit); + // Invariants.shareMintIntegrity(currentTotalShares, previousTotalShares, userShares); + // Invariants.userSharesIntegrity(ynlsd.balanceOf(user), 0, userShares); + // } } \ No newline at end of file diff --git a/test/utils/NonPayableContract.sol b/test/utils/NonPayableContract.sol new file mode 100644 index 000000000..f99c891e0 --- /dev/null +++ b/test/utils/NonPayableContract.sol @@ -0,0 +1,13 @@ +/// SPDX-License-Identifier: BSD-3-Clause +pragma solidity ^0.8.24; + +contract NonPayableContract { + // This contract does not accept direct payments + receive() external payable { + revert("NonPayableContract: cannot receive ETH"); + } + + fallback() external payable { + revert("NonPayableContract: fallback cannot receive ETH"); + } +} diff --git a/test/utils/TestAssetUtils.sol b/test/utils/TestAssetUtils.sol index 415a4c4e4..2fb0fcef8 100644 --- a/test/utils/TestAssetUtils.sol +++ b/test/utils/TestAssetUtils.sol @@ -4,11 +4,61 @@ pragma solidity ^0.8.24; import {Test} from "lib/forge-std/src/Test.sol"; import {IERC20} from "lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol"; import {ContractAddresses} from "script/ContractAddresses.sol"; +import {IwstETH} from "src/external/lido/IwstETH.sol"; +import {IERC4626} from "lib/openzeppelin-contracts/contracts/interfaces/IERC4626.sol"; +import { IfrxMinter } from "src/external/frax/IfrxMinter.sol"; +import {IrETH} from "src/external/rocketpool/IrETH.sol"; +import { IynEigen } from "src/interfaces/IynEigen.sol"; +import { ImETHStaking } from "src/external/mantle/ImETHStaking.sol"; + +import "forge-std/console.sol"; + +interface IRocketPoolDepositPool { + function deposit() external payable; +} contract TestAssetUtils is Test { + + ContractAddresses.ChainAddresses chainAddresses; + ContractAddresses contractAddresses; + + address public FRX_ETH_WETH_DUAL_ORACLE; + + + constructor() { + contractAddresses = new ContractAddresses(); + chainAddresses = contractAddresses.getChainAddresses(block.chainid); + + if (block.chainid == 1) { + FRX_ETH_WETH_DUAL_ORACLE = 0x350a9841956D8B0212EAdF5E14a449CA85FAE1C0; + } else if (block.chainid == 17000) { + // UNAVAILABLE + FRX_ETH_WETH_DUAL_ORACLE = address(0x0); + } + } + + function get_Asset(address asset, address receiver, uint256 amount) public returns (uint256 balance) { + + if (asset == chainAddresses.lsd.STETH_ADDRESS) { + return get_stETH(receiver, amount); + } else if (asset == chainAddresses.lsd.WSTETH_ADDRESS) { + return get_wstETH(receiver, amount); + } else if (asset == chainAddresses.lsd.OETH_ADDRESS) { + return get_OETH(receiver, amount); + } else if (asset == chainAddresses.lsd.WOETH_ADDRESS) { + return get_wOETH(receiver, amount); + } else if (asset == chainAddresses.lsd.RETH_ADDRESS) { + return get_rETH(receiver, amount); + } else if (asset == chainAddresses.lsd.SFRXETH_ADDRESS) { + return get_sfrxETH(receiver, amount); + } else if (asset == chainAddresses.lsd.METH_ADDRESS) { + return get_mETH(receiver, amount); + } else { + revert("Unsupported asset type"); + } + } + function get_stETH(address receiver, uint256 amount) public returns (uint256 balance) { - ContractAddresses contractAddresses = new ContractAddresses(); - ContractAddresses.ChainAddresses memory chainAddresses = contractAddresses.getChainAddresses(block.chainid); address stETH_Whale = block.chainid == 1 ? 0x93c4b944D05dfe6df7645A86cd2206016c51564D @@ -21,7 +71,133 @@ contract TestAssetUtils is Test { steth.transfer(receiver, amount); vm.stopPrank(); return steth.balanceOf(receiver); - + } + + function get_wstETH(address receiver, uint256 amount) public returns (uint256) { + + IwstETH wsteth = IwstETH(chainAddresses.lsd.WSTETH_ADDRESS); + + // add 1000 wei to guarantee there's always enough + uint256 stETHToMint = amount * wsteth.stEthPerToken() / 1e18 + 1 ether; + IERC20 stETH = IERC20(chainAddresses.lsd.STETH_ADDRESS); + vm.deal(address(this), stETHToMint); + (bool success, ) = address(stETH).call{value: stETHToMint}(""); + require(success, "ETH transfer failed"); + uint256 mintedStETH = stETH.balanceOf(address(this)); + stETH.approve(address(wsteth), mintedStETH); + wsteth.wrap(mintedStETH); + uint256 wstETHAmount = wsteth.balanceOf(address(this)); + require(wstETHAmount > amount, "Insufficient wstETH balance after wrapping"); + wsteth.transfer(receiver, amount); + + return amount; + } + + function get_OETH(address receiver, uint256 amount) public returns (uint256) { + + IERC20 oeth = IERC20(chainAddresses.lsd.OETH_ADDRESS); + + // Simulate obtaining OETH by wrapping ETH + uint256 ethToDeposit = amount; // Assuming 1 ETH = 1 OETH for simplicity + vm.deal(address(this), ethToDeposit); + (bool success, ) = address(chainAddresses.lsd.OETH_ZAPPER_ADDRESS).call{value: ethToDeposit}(""); + require(success, "ETH transfer failed"); + + require(oeth.balanceOf(address(this)) >= amount, "Insufficient OETH balance after deposit"); + oeth.transfer(receiver, amount); + + return amount; + } + + function get_wOETH(address receiver, uint256 amount) public returns (uint256) { + + IERC4626 woeth = IERC4626(chainAddresses.lsd.WOETH_ADDRESS); + IERC20 oeth = IERC20(chainAddresses.lsd.OETH_ADDRESS); + // Calculate the amount of OETH to mint using convertToAssets from the wOETH contract + uint256 oethToMint = woeth.convertToAssets(amount) + 1 ether; // add some extra + uint256 obtainedOETH = get_OETH(address(this), oethToMint); + + // Approve the wOETH contract to take the OETH + oeth.approve(address(woeth), obtainedOETH); + + // Wrap the OETH into wOETH + woeth.deposit(obtainedOETH, address(this)); + + // Transfer the wrapped OETH (wOETH) to the receiver + uint256 wOETHBalance = woeth.balanceOf(address(this)); + require(wOETHBalance >= amount, "Insufficient wOETH balance after wrapping"); + woeth.transfer(receiver, amount); + + return amount; + } + + function get_rETHByDeposit(address receiver, uint256 amount) public returns (uint256) { + + address rocketPoolDepositPool = 0xDD3f50F8A6CafbE9b31a427582963f465E745AF8; + IRocketPoolDepositPool depositPool = IRocketPoolDepositPool(rocketPoolDepositPool); + + IERC20 rETH = IERC20(chainAddresses.lsd.RETH_ADDRESS); + + uint256 rETHExchangeRate = IrETH(chainAddresses.lsd.RETH_ADDRESS).getExchangeRate(); + uint256 ethRequired = amount * 1e18 / rETHExchangeRate + 1 ether; + vm.deal(address(this), ethRequired); + // NOTE: only works if pool is not at max capacity (it may be) + depositPool.deposit{value: ethRequired}(); + + require(rETH.balanceOf(address(this)) >= amount, "Insufficient rETH balance after deposit"); + rETH.transfer(receiver, amount); + + return amount; + } + + function get_rETH(address receiver, uint256 amount) public returns (uint256) { + IERC20 rETH = IERC20(chainAddresses.lsd.RETH_ADDRESS); + address rethWhale = 0xCc9EE9483f662091a1de4795249E24aC0aC2630f; + vm.prank(rethWhale); + rETH.transfer(receiver, amount); + + return amount; + } + + function get_sfrxETH(address receiver, uint256 amount) public returns (uint256) { + + IERC20 sfrxETH = IERC20(chainAddresses.lsd.SFRXETH_ADDRESS); + IERC4626 sfrxETHVault = IERC4626(chainAddresses.lsd.SFRXETH_ADDRESS); + + uint256 rate = sfrxETHVault.totalAssets() * 1e18 / sfrxETHVault.totalSupply(); + + IfrxMinter frxMinter = IfrxMinter(0xbAFA44EFE7901E04E39Dad13167D089C559c1138); + uint256 ethToDeposit = amount * rate / 1e18 + 1 ether; + vm.deal(address(this), ethToDeposit); + frxMinter.submitAndDeposit{value: ethToDeposit}(address(this)); + + uint256 sfrxETHBalance = sfrxETH.balanceOf(address(this)); + require(sfrxETHBalance >= amount, "Insufficient sfrxETH balance after deposit"); + sfrxETH.transfer(receiver, amount); + + return amount; + } + + function get_mETH(address receiver, uint256 amount) public returns (uint256) { + ImETHStaking mETHStaking = ImETHStaking(0xe3cBd06D7dadB3F4e6557bAb7EdD924CD1489E8f); + IERC20 mETH = IERC20(chainAddresses.lsd.METH_ADDRESS); + + uint256 ethRequired = mETHStaking.mETHToETH(amount) + 1 ether; + vm.deal(address(this), ethRequired); + mETHStaking.stake{value: ethRequired}(amount); + + require(mETH.balanceOf(address(this)) >= amount, "Insufficient mETH balance after staking"); + mETH.transfer(receiver, amount); + + return amount; + } + function depositAsset(IynEigen ynEigenToken, address assetAddress, uint256 amount, address user) public { + IERC20 asset = IERC20(assetAddress); + get_Asset(assetAddress, user, amount); + vm.prank(user); + asset.approve(address(ynEigenToken), amount); + vm.prank(user); + ynEigenToken.deposit(asset, amount, user); } } \ No newline at end of file