diff --git a/.gitignore b/.gitignore index 13a730d..357f95f 100644 --- a/.gitignore +++ b/.gitignore @@ -31,7 +31,6 @@ gasReporterOutput.json addresses.json blockchain_db yarn-error.log -broadcast # deployments deployments/localhost diff --git a/broadcast/MigrationOptimizerAPRDAI.s.sol/1/run-1675949226.json b/broadcast/MigrationOptimizerAPRDAI.s.sol/1/run-1675949226.json new file mode 100644 index 0000000..b7bb0a7 --- /dev/null +++ b/broadcast/MigrationOptimizerAPRDAI.s.sol/1/run-1675949226.json @@ -0,0 +1,130 @@ +{ + "transactions": [ + { + "hash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "function": null, + "arguments": [ + "0x05E08E1BF31C1882822Cc48D7d51d6fe49Bca9c2", + "0x1D941EF0D3Bba4ad67DBfBCeE5262F4CEE53A32b", + "0xe6bfbfd8000000000000000000000000c9daabc677f3d1301006e723bd21c60be57a5915000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe" + ], + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x151b8f", + "value": "0x0", + "data": "0x6080604052604051620010bf380380620010bf8339810160408190526200002691620004e6565b828162000036828260006200009a565b5062000066905060017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104620005c6565b6000805160206200107883398151915214620000865762000086620005e8565b6200009182620000d7565b50505062000651565b620000a58362000132565b600082511180620000b35750805b15620000d257620000d083836200017460201b6200028c1760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f62000102620001a5565b604080516001600160a01b03928316815291841660208301520160405180910390a16200012f81620001de565b50565b6200013d8162000293565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200019c8383604051806060016040528060278152602001620010986027913962000347565b90505b92915050565b6000620001cf6000805160206200107883398151915260001b620003c660201b6200022e1760201c565b546001600160a01b0316919050565b6001600160a01b038116620002495760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b80620002726000805160206200107883398151915260001b620003c660201b6200022e1760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b620002a981620003c960201b620002b81760201c565b6200030d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000240565b80620002727f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b620003c660201b6200022e1760201c565b6060600080856001600160a01b031685604051620003669190620005fe565b600060405180830381855af49150503d8060008114620003a3576040519150601f19603f3d011682016040523d82523d6000602084013e620003a8565b606091505b509092509050620003bc86838387620003d8565b9695505050505050565b90565b6001600160a01b03163b151590565b606083156200044c57825160000362000444576001600160a01b0385163b620004445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000240565b508162000458565b62000458838362000460565b949350505050565b815115620004715781518083602001fd5b8060405162461bcd60e51b81526004016200024091906200061c565b80516001600160a01b0381168114620004a557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620004dd578181015183820152602001620004c3565b50506000910152565b600080600060608486031215620004fc57600080fd5b62000507846200048d565b925062000517602085016200048d565b60408501519092506001600160401b03808211156200053557600080fd5b818601915086601f8301126200054a57600080fd5b8151818111156200055f576200055f620004aa565b604051601f8201601f19908116603f011681019083821181831017156200058a576200058a620004aa565b81604052828152896020848701011115620005a457600080fd5b620005b7836020830160208801620004c0565b80955050505050509250925092565b818103818111156200019f57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052600160045260246000fd5b6000825162000612818460208701620004c0565b9190910192915050565b60208152600082518060208401526200063d816040850160208701620004c0565b601f01601f19169190910160400192915050565b610a1780620006616000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100a85780638f283970146100e6578063f851a440146101065761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61011b565b005b61006b61011b565b34801561008157600080fd5b5061006b61009036600461088b565b610135565b61006b6100a33660046108a6565b61017f565b3480156100b457600080fd5b506100bd6101f3565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b5061006b61010136600461088b565b610231565b34801561011257600080fd5b506100bd61025e565b6101236102d4565b61013361012e6103ab565b6103b5565b565b61013d6103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481604051806020016040528060008152506000610419565b50565b61017461011b565b6101876103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101eb576101e68383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610419915050565b505050565b6101e661011b565b60006101fd6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103ab565b905090565b61022e61011b565b90565b6102396103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481610444565b60006102686103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103d9565b60606102b183836040518060600160405280602781526020016109bb602791396104a5565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6102dc6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600061022161052a565b3660008037600080366000845af43d6000803e8080156103d4573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b61042283610552565b60008251118061042f5750805b156101e65761043e838361028c565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61046d6103d9565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a16101748161059f565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516104cf919061094d565b600060405180830381855af49150503d806000811461050a576040519150601f19603f3d011682016040523d82523d6000602084013e61050f565b606091505b5091509150610520868383876106ab565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103fd565b61055b81610753565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b73ffffffffffffffffffffffffffffffffffffffff8116610642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103a2565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b6060831561074157825160000361073a5773ffffffffffffffffffffffffffffffffffffffff85163b61073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103a2565b508161074b565b61074b838361081e565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff81163b6107f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016103a2565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610665565b81511561082e5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a29190610969565b803573ffffffffffffffffffffffffffffffffffffffff8116811461088657600080fd5b919050565b60006020828403121561089d57600080fd5b6102b182610862565b6000806000604084860312156108bb57600080fd5b6108c484610862565b9250602084013567ffffffffffffffff808211156108e157600080fd5b818601915086601f8301126108f557600080fd5b81358181111561090457600080fd5b87602082850101111561091657600080fd5b6020830194508093505050509250925092565b60005b8381101561094457818101518382015260200161092c565b50506000910152565b6000825161095f818460208701610929565b9190910192915050565b6020815260008251806020840152610988816040850160208701610929565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220910985b3eaa4496dd2573db8df24a04823c4165cdd5afb455cf182a9f53be9fb64736f6c63430008110033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656400000000000000000000000005e08e1bf31c1882822cc48d7d51d6fe49bca9c20000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e4e6bfbfd8000000000000000000000000c9daabc677f3d1301006e723bd21c60be57a5915000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe00000000000000000000000000000000000000000000000000000000", + "nonce": "0x3c1", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "function": null, + "arguments": [ + "0xDeEe844C6992F36ADAC59cF38d1F790B2a0313e2", + "0x1D941EF0D3Bba4ad67DBfBCeE5262F4CEE53A32b", + "0x804869910000000000000000000000005577f822a979b7456ca08c5e311067d777e734c400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e364300000000000000000000000000000000000000000000000000000000000001200000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001600000000000000000000000001111111254eeb25477b68fb85ed929f73a9605820000000000000000000000000000000000000000000000000000000000000016436f6d706f756e64204c656e64657220444149207632000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe" + ], + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x187d93", + "value": "0x0", + "data": "0x6080604052604051620010bf380380620010bf8339810160408190526200002691620004e6565b828162000036828260006200009a565b5062000066905060017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104620005c6565b6000805160206200107883398151915214620000865762000086620005e8565b6200009182620000d7565b50505062000651565b620000a58362000132565b600082511180620000b35750805b15620000d257620000d083836200017460201b6200028c1760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f62000102620001a5565b604080516001600160a01b03928316815291841660208301520160405180910390a16200012f81620001de565b50565b6200013d8162000293565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200019c8383604051806060016040528060278152602001620010986027913962000347565b90505b92915050565b6000620001cf6000805160206200107883398151915260001b620003c660201b6200022e1760201c565b546001600160a01b0316919050565b6001600160a01b038116620002495760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b80620002726000805160206200107883398151915260001b620003c660201b6200022e1760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b620002a981620003c960201b620002b81760201c565b6200030d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000240565b80620002727f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b620003c660201b6200022e1760201c565b6060600080856001600160a01b031685604051620003669190620005fe565b600060405180830381855af49150503d8060008114620003a3576040519150601f19603f3d011682016040523d82523d6000602084013e620003a8565b606091505b509092509050620003bc86838387620003d8565b9695505050505050565b90565b6001600160a01b03163b151590565b606083156200044c57825160000362000444576001600160a01b0385163b620004445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000240565b508162000458565b62000458838362000460565b949350505050565b815115620004715781518083602001fd5b8060405162461bcd60e51b81526004016200024091906200061c565b80516001600160a01b0381168114620004a557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620004dd578181015183820152602001620004c3565b50506000910152565b600080600060608486031215620004fc57600080fd5b62000507846200048d565b925062000517602085016200048d565b60408501519092506001600160401b03808211156200053557600080fd5b818601915086601f8301126200054a57600080fd5b8151818111156200055f576200055f620004aa565b604051601f8201601f19908116603f011681019083821181831017156200058a576200058a620004aa565b81604052828152896020848701011115620005a457600080fd5b620005b7836020830160208801620004c0565b80955050505050509250925092565b818103818111156200019f57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052600160045260246000fd5b6000825162000612818460208701620004c0565b9190910192915050565b60208152600082518060208401526200063d816040850160208701620004c0565b601f01601f19169190910160400192915050565b610a1780620006616000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100a85780638f283970146100e6578063f851a440146101065761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61011b565b005b61006b61011b565b34801561008157600080fd5b5061006b61009036600461088b565b610135565b61006b6100a33660046108a6565b61017f565b3480156100b457600080fd5b506100bd6101f3565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b5061006b61010136600461088b565b610231565b34801561011257600080fd5b506100bd61025e565b6101236102d4565b61013361012e6103ab565b6103b5565b565b61013d6103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481604051806020016040528060008152506000610419565b50565b61017461011b565b6101876103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101eb576101e68383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610419915050565b505050565b6101e661011b565b60006101fd6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103ab565b905090565b61022e61011b565b90565b6102396103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481610444565b60006102686103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103d9565b60606102b183836040518060600160405280602781526020016109bb602791396104a5565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6102dc6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600061022161052a565b3660008037600080366000845af43d6000803e8080156103d4573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b61042283610552565b60008251118061042f5750805b156101e65761043e838361028c565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61046d6103d9565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a16101748161059f565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516104cf919061094d565b600060405180830381855af49150503d806000811461050a576040519150601f19603f3d011682016040523d82523d6000602084013e61050f565b606091505b5091509150610520868383876106ab565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103fd565b61055b81610753565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b73ffffffffffffffffffffffffffffffffffffffff8116610642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103a2565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b6060831561074157825160000361073a5773ffffffffffffffffffffffffffffffffffffffff85163b61073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103a2565b508161074b565b61074b838361081e565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff81163b6107f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016103a2565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610665565b81511561082e5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a29190610969565b803573ffffffffffffffffffffffffffffffffffffffff8116811461088657600080fd5b919050565b60006020828403121561089d57600080fd5b6102b182610862565b6000806000604084860312156108bb57600080fd5b6108c484610862565b9250602084013567ffffffffffffffff808211156108e157600080fd5b818601915086601f8301126108f557600080fd5b81358181111561090457600080fd5b87602082850101111561091657600080fd5b6020830194508093505050509250925092565b60005b8381101561094457818101518382015260200161092c565b50506000910152565b6000825161095f818460208701610929565b9190910192915050565b6020815260008251806020840152610988816040850160208701610929565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220910985b3eaa4496dd2573db8df24a04823c4165cdd5afb455cf182a9f53be9fb64736f6c63430008110033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564000000000000000000000000deee844c6992f36adac59cf38d1f790b2a0313e20000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c4804869910000000000000000000000005577f822a979b7456ca08c5e311067d777e734c400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e364300000000000000000000000000000000000000000000000000000000000001200000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001600000000000000000000000001111111254eeb25477b68fb85ed929f73a9605820000000000000000000000000000000000000000000000000000000000000016436f6d706f756e64204c656e64657220444149207632000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe00000000000000000000000000000000000000000000000000000000", + "nonce": "0x3c2", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "function": null, + "arguments": [ + "0x14bA0B82f1940e35Af39c364e8Fa99408881Ae30", + "0x1D941EF0D3Bba4ad67DBfBCeE5262F4CEE53A32b", + "0x67f52b630000000000000000000000005577f822a979b7456ca08c5e311067d777e734c400000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001600000000000000000000000001111111254eeb25477b68fb85ed929f73a960582000000000000000000000000000000000000000000000000000000000000001241617665204c656e6465722044414920763200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe" + ], + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x1af9f5", + "value": "0x0", + "data": "0x6080604052604051620010bf380380620010bf8339810160408190526200002691620004e6565b828162000036828260006200009a565b5062000066905060017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104620005c6565b6000805160206200107883398151915214620000865762000086620005e8565b6200009182620000d7565b50505062000651565b620000a58362000132565b600082511180620000b35750805b15620000d257620000d083836200017460201b6200028c1760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f62000102620001a5565b604080516001600160a01b03928316815291841660208301520160405180910390a16200012f81620001de565b50565b6200013d8162000293565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200019c8383604051806060016040528060278152602001620010986027913962000347565b90505b92915050565b6000620001cf6000805160206200107883398151915260001b620003c660201b6200022e1760201c565b546001600160a01b0316919050565b6001600160a01b038116620002495760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b80620002726000805160206200107883398151915260001b620003c660201b6200022e1760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b620002a981620003c960201b620002b81760201c565b6200030d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000240565b80620002727f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b620003c660201b6200022e1760201c565b6060600080856001600160a01b031685604051620003669190620005fe565b600060405180830381855af49150503d8060008114620003a3576040519150601f19603f3d011682016040523d82523d6000602084013e620003a8565b606091505b509092509050620003bc86838387620003d8565b9695505050505050565b90565b6001600160a01b03163b151590565b606083156200044c57825160000362000444576001600160a01b0385163b620004445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000240565b508162000458565b62000458838362000460565b949350505050565b815115620004715781518083602001fd5b8060405162461bcd60e51b81526004016200024091906200061c565b80516001600160a01b0381168114620004a557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620004dd578181015183820152602001620004c3565b50506000910152565b600080600060608486031215620004fc57600080fd5b62000507846200048d565b925062000517602085016200048d565b60408501519092506001600160401b03808211156200053557600080fd5b818601915086601f8301126200054a57600080fd5b8151818111156200055f576200055f620004aa565b604051601f8201601f19908116603f011681019083821181831017156200058a576200058a620004aa565b81604052828152896020848701011115620005a457600080fd5b620005b7836020830160208801620004c0565b80955050505050509250925092565b818103818111156200019f57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052600160045260246000fd5b6000825162000612818460208701620004c0565b9190910192915050565b60208152600082518060208401526200063d816040850160208701620004c0565b601f01601f19169190910160400192915050565b610a1780620006616000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100a85780638f283970146100e6578063f851a440146101065761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61011b565b005b61006b61011b565b34801561008157600080fd5b5061006b61009036600461088b565b610135565b61006b6100a33660046108a6565b61017f565b3480156100b457600080fd5b506100bd6101f3565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b5061006b61010136600461088b565b610231565b34801561011257600080fd5b506100bd61025e565b6101236102d4565b61013361012e6103ab565b6103b5565b565b61013d6103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481604051806020016040528060008152506000610419565b50565b61017461011b565b6101876103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101eb576101e68383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610419915050565b505050565b6101e661011b565b60006101fd6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103ab565b905090565b61022e61011b565b90565b6102396103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481610444565b60006102686103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103d9565b60606102b183836040518060600160405280602781526020016109bb602791396104a5565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6102dc6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600061022161052a565b3660008037600080366000845af43d6000803e8080156103d4573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b61042283610552565b60008251118061042f5750805b156101e65761043e838361028c565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61046d6103d9565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a16101748161059f565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516104cf919061094d565b600060405180830381855af49150503d806000811461050a576040519150601f19603f3d011682016040523d82523d6000602084013e61050f565b606091505b5091509150610520868383876106ab565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103fd565b61055b81610753565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b73ffffffffffffffffffffffffffffffffffffffff8116610642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103a2565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b6060831561074157825160000361073a5773ffffffffffffffffffffffffffffffffffffffff85163b61073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103a2565b508161074b565b61074b838361081e565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff81163b6107f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016103a2565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610665565b81511561082e5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a29190610969565b803573ffffffffffffffffffffffffffffffffffffffff8116811461088657600080fd5b919050565b60006020828403121561089d57600080fd5b6102b182610862565b6000806000604084860312156108bb57600080fd5b6108c484610862565b9250602084013567ffffffffffffffff808211156108e157600080fd5b818601915086601f8301126108f557600080fd5b81358181111561090457600080fd5b87602082850101111561091657600080fd5b6020830194508093505050509250925092565b60005b8381101561094457818101518382015260200161092c565b50506000910152565b6000825161095f818460208701610929565b9190910192915050565b6020815260008251806020840152610988816040850160208701610929565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220910985b3eaa4496dd2573db8df24a04823c4165cdd5afb455cf182a9f53be9fb64736f6c63430008110033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656400000000000000000000000014ba0b82f1940e35af39c364e8fa99408881ae300000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c467f52b630000000000000000000000005577f822a979b7456ca08c5e311067d777e734c400000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001600000000000000000000000001111111254eeb25477b68fb85ed929f73a960582000000000000000000000000000000000000000000000000000000000000001241617665204c656e6465722044414920763200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe00000000000000000000000000000000000000000000000000000000", + "nonce": "0x3c3", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0x8b95d4edd036b79f10cad9c2670da9af4b8ac4fe6a51b47a0ac1e0c89ef46939", + "transactionType": "CREATE", + "contractName": "GenericEuler", + "contractAddress": "0x1F25FABC5Bf3F3a185cA051de22511A4e9b3e86A", + "function": null, + "arguments": null, + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x42b977", + "value": "0x0", + "data": "0x60806040523480156200001157600080fd5b50600054610100900460ff166200002f5760005460ff161562000039565b62000039620000de565b620000a15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b600054610100900460ff16158015620000c4576000805461ffff19166101011790555b8015620000d7576000805461ff00191690555b5062000102565b6000620000f630620000fc60201b620011241760201c565b15905090565b3b151590565b613bc680620001126000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c8063853828b61161010f578063b82c4dc1116100a2578063d0e30db011610071578063d0e30db014610491578063d547741f14610499578063dc4c90d3146104ac578063ecf609ae146104cc57600080fd5b8063b82c4dc11461045b578063b8dc491b1461046e578063c1590cd714610481578063c6afba3c1461048957600080fd5b8063a217fddf116100de578063a217fddf146103e3578063a73e0f3b146103eb578063a7d385e214610428578063a8c62e761461043b57600080fd5b8063853828b6146103935780638b2021761461039b57806391d14854146103b0578063953d9cf1146103c357600080fd5b80632e779525116101875780635312ea8e116101565780635312ea8e1461033957806357ded9c91461034c578063580b7c2e146103545780635be9b2d31461037b57600080fd5b80632e779525146102e45780632f2ff15d146102ec578063364bc15a146102ff57806336568abe1461032657600080fd5b80631f1fcd51116101c35780631f1fcd5114610241578063248a9ca31461028657806324ea54f4146102aa5780632e1a7d4d146102d157600080fd5b806305b41934146101f55780630948c0b61461020a5780630b6d1d171461021d578063116ac4a314610239575b600080fd5b610208610203366004613209565b6104df565b005b610208610218366004613299565b6105e8565b61022660375481565b6040519081526020015b60405180910390f35b61022661065b565b6036546102619073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610230565b6102266102943660046132b6565b6000908152600160208190526040909120015490565b6102267f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504181565b6102266102df3660046132b6565b610680565b6102086106bf565b6102086102fa3660046132cf565b6106c9565b6102267ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab81565b6102086103343660046132cf565b6106f5565b6102086103473660046132b6565b610787565b6102266108f9565b6102267f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c81565b610383610908565b6040519015158152602001610230565b610383610927565b6103a3610977565b6040516102309190613323565b6103836103be3660046132cf565b610a05565b6067546102619073ffffffffffffffffffffffffffffffffffffffff1681565b610226600081565b6067546104139074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610230565b6102266104363660046132b6565b610a3f565b6035546102619073ffffffffffffffffffffffffffffffffffffffff1681565b6102086104693660046133c0565b610a4a565b61020861047c36600461345a565b610b51565b610226610cde565b610226610ce8565b610208610d8d565b6102086104a73660046132cf565b610ed3565b6034546102619073ffffffffffffffffffffffffffffffffffffffff1681565b6102086104da366004613506565b610efa565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab61050a813361112a565b603854604051600091829173ffffffffffffffffffffffffffffffffffffffff909116906105399086906135d8565b6000604051808303816000865af19150503d8060008114610576576040519150601f19603f3d011682016040523d82523d6000602084013e61057b565b606091505b50915091508161058e5761058e816111d3565b6000818060200190518101906105a491906135f4565b9050858110156105e0576040517f22313ae900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610613813361112a565b50603880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600080610666611214565b9050610670611220565b61067a908261363c565b91505090565b60007f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c6106ad813361112a565b6106b6836112c6565b91505b50919050565b6106c76116cd565b565b600082815260016020819052604090912001546106e6813361112a565b6106f08383611905565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610779576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f373100000000000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b610783828261199b565b5050565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50416107b2813361112a565b6067546040517f441a3e70000000000000000000000000000000000000000000000000000000008152600060048201526024810184905273ffffffffffffffffffffffffffffffffffffffff9091169063441a3e7090604401600060405180830381600087803b15801561082557600080fd5b505af1158015610839573d6000803e3d6000fd5b50506034546036546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152610783945073ffffffffffffffffffffffffffffffffffffffff92831693509116906370a0823190602401602060405180830381865afa1580156108b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d991906135f4565b60365473ffffffffffffffffffffffffffffffffffffffff169190611a2d565b6000610903611214565b905090565b6000603754600a610919919061363c565b610921611220565b11905090565b60007f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c610954813361112a565b600061095e611220565b9050600061096b826112c6565b91909110159250505090565b6033805461098490613653565b80601f01602080910402602001604051908101604052809291908181526020018280546109b090613653565b80156109fd5780601f106109d2576101008083540402835291602001916109fd565b820191906000526020600020905b8154815290600101906020018083116109e057829003601f168201915b505050505081565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff165b92915050565b6000610a3982611b01565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610a75813361112a565b8584141580610a845750858214155b15610abb576040517f46282e8d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8560005b81811015610b4657610b36898983818110610adc57610adc6136a0565b9050602002016020810190610af19190613299565b888884818110610b0357610b036136a0565b9050602002016020810190610b189190613299565b878785818110610b2a57610b2a6136a0565b90506020020135611d8a565b610b3f816136cf565b9050610abf565b505050505050505050565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610b7c813361112a565b6000610b86611e99565b805190915060005b81811015610c2457828181518110610ba857610ba86136a0565b602002602001015173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603610c14576040517f093e1cdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c1d816136cf565b9050610b8e565b506040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152610cd790859073ffffffffffffffffffffffffffffffffffffffff8816906370a0823190602401602060405180830381865afa158015610c95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb991906135f4565b73ffffffffffffffffffffffffffffffffffffffff88169190611a2d565b5050505050565b6000610903611220565b600080806067546040517f3af9e669000000000000000000000000000000000000000000000000000000008152306004820152919250829173ffffffffffffffffffffffffffffffffffffffff90911690633af9e66990602401602060405180830381865afa158015610d5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8391906135f4565b61067a9190613707565b7f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c610db8813361112a565b6036546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610e27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4b91906135f4565b6067546040517fe2bbb158000000000000000000000000000000000000000000000000000000008152600060048201526024810183905291925073ffffffffffffffffffffffffffffffffffffffff169063e2bbb15890604401600060405180830381600087803b158015610ebf57600080fd5b505af11580156105e0573d6000803e3d6000fd5b60008281526001602081905260409091200154610ef0813361112a565b6106f0838361199b565b610f08868686868686611f53565b6036546040517f8948874900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152733520d5a913427e6f0d6a83e07ccd4a4da316e4d390638948874990602401602060405180830381865afa158015610f8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fae919061371a565b606780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9283161790556036546040517f1b30058200000000000000000000000000000000000000000000000000000000815291166004820152733520d5a913427e6f0d6a83e07ccd4a4da316e4d390631b30058290602401602060405180830381865afa15801561105b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107f919061371a565b606680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169190911790556110cc6116cd565b6036546105e09073ffffffffffffffffffffffffffffffffffffffff167327182842e098f60e3d576794a5bffb0777e025d37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61258e565b3b151590565b6111348282610a05565b610783576111598173ffffffffffffffffffffffffffffffffffffffff166014612710565b611164836020612710565b604051602001611175929190613737565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261077091600401613323565b8051156111e257805181602001fd5b6040517fc76d51a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006109036000611b01565b600061122a610ce8565b6036546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015611298573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bc91906135f4565b6109039190613707565b600080806067546040517f3af9e66900000000000000000000000000000000000000000000000000000000815230600482015291925060009173ffffffffffffffffffffffffffffffffffffffff90911690633af9e66990602401602060405180830381865afa15801561133e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136291906135f4565b6036546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291925060009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa1580156113d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113fa91906135f4565b90506000816114098486613707565b6114139190613707565b905080861115611421578095505b85821061145c576035546036546114529173ffffffffffffffffffffffffffffffffffffffff918216911688611a2d565b5093949350505050565b6036546040517f70a082310000000000000000000000000000000000000000000000000000000081527327182842e098f60e3d576794a5bffb0777e025d3600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156114df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150391906135f4565b9050600181111561160357600061151a84896137b8565b905060008282116115575761152f8587613707565b821161153c576000611550565b6115468587613707565b61155090836137b8565b9050611575565b85831161156557600061156f565b61156f86846137b8565b90508291505b6067546040517f441a3e70000000000000000000000000000000000000000000000000000000008152600060048201526024810184905273ffffffffffffffffffffffffffffffffffffffff9091169063441a3e7090604401600060405180830381600087803b1580156115e857600080fd5b505af11580156115fc573d6000803e3d6000fd5b5050505050505b6036546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015611671573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169591906135f4565b6035546036549194506116c29173ffffffffffffffffffffffffffffffffffffffff908116911685611a2d565b509095945050505050565b6036546040517fb409dd9b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152600090733520d5a913427e6f0d6a83e07ccd4a4da316e4d39063b409dd9b90602401602060405180830381865afa158015611752573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177691906135f4565b6040517fcab65f01000000000000000000000000000000000000000000000000000000008152600481018290529091506000907327182842e098f60e3d576794a5bffb0777e025d39063cab65f0190602401602060405180830381865afa1580156117e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611809919061371a565b606580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116919091179091556036546040517fb74b1ed500000000000000000000000000000000000000000000000000000000815291166004820152909150733520d5a913427e6f0d6a83e07ccd4a4da316e4d39063b74b1ed590602401602060405180830381865afa1580156118bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e191906137cb565b606760146101000a81548163ffffffff021916908363ffffffff1602179055505050565b61190f8282610a05565b61078357600082815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616808652925280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6119a58282610a05565b1561078357600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526106f09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261295a565b600080606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9591906135f4565b90506000606760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fea61faa6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c2a91906135f4565b905060008412611c4557611c3e8482613707565b9050611c5b565b611c4e846137f1565b611c5890826137b8565b90505b60008115611d76576000670de0b6b3a764000083611c7d63ffffffff8361363c565b611c87908761363c565b611c919190613829565b611c9b9190613829565b6065546036546040517fd50c08f800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015263ffffffff8416602482015292935060009291169063d50c08f890604401602060405180830381865afa158015611d1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d439190613864565b6bffffffffffffffffffffffff169050611d71818686606760149054906101000a900463ffffffff16612a66565b925050505b611d81600082613707565b95945050505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff83811660248301526000919085169063dd62ed3e90604401602060405180830381865afa158015611e00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2491906135f4565b905081811015611e5f57611e5a83611e3c83856137b8565b73ffffffffffffffffffffffffffffffffffffffff87169190612af6565b611e93565b81811115611e9357611e9383611e7584846137b8565b73ffffffffffffffffffffffffffffffffffffffff87169190612bf4565b50505050565b604080516002808252606080830184529260009291906020830190803683375050603654825192935073ffffffffffffffffffffffffffffffffffffffff1691839150600090611eeb57611eeb6136a0565b73ffffffffffffffffffffffffffffffffffffffff9283166020918202929092010152606754825191169082906001908110611f2957611f296136a0565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152919050565b600054610100900460ff16611f6e5760005460ff1615611f72565b303b155b611ffe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610770565b600054610100900460ff1615801561203d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b6038805473ffffffffffffffffffffffffffffffffffffffff8085167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560358054928a169290911682179055604080517fdc4c90d3000000000000000000000000000000000000000000000000000000008152905163dc4c90d3916004808201926020929091908290030181865afa1580156120e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612108919061371a565b603480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169182179055604080517ffc0c546a000000000000000000000000000000000000000000000000000000008152905163fc0c546a916004808201926020929091908290030181865afa1580156121a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c4919061371a565b603680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055603361221587826138cd565b5060345461225a907f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419073ffffffffffffffffffffffffffffffffffffffff16612d7a565b845160005b818110156122bd576122ad7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504160001b8883815181106122a0576122a06136a0565b6020026020010151612d7a565b6122b6816136cf565b905061225f565b506122e87ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab86612d7a565b835160005b8181101561233e5761232e7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab60001b8783815181106122a0576122a06136a0565b612337816136cf565b90506122ed565b506123897ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041612d84565b6123b37f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504187612d7a565b6123dd7f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c8a612d7a565b6124277f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50417f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c612d84565b6124717f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041612d84565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250291906139e7565b61250d90600a613b2a565b6037556036546125549073ffffffffffffffffffffffffffffffffffffffff168a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61258e565b5050801561258557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50505050505050565b80158061262e57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061262c91906135f4565b155b6126ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610770565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526106f09084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611a7f565b6060600061271f83600261363c565b61272a906002613707565b67ffffffffffffffff81111561274257612742613115565b6040519080825280601f01601f19166020018201604052801561276c576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106127a3576127a36136a0565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612806576128066136a0565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061284284600261363c565b61284d906001613707565b90505b60018111156128ea577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061288e5761288e6136a0565b1a60f81b8282815181106128a4576128a46136a0565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c936128e381613b39565b9050612850565b508315612953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610770565b9392505050565b60006129bc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612ddb9092919063ffffffff16565b8051909150156106f057808060200190518101906129da9190613b6e565b6106f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610770565b60008083612a74868861363c565b612a7e9190613829565b905063ee6b2800612a9563ffffffff8516826137b8565b612a9f908361363c565b612aa99190613829565b9050633b9aca006b033b2e3c9fd0803ce8000000612ad8836301e133806b033b2e3c9fd0803ce8000000612df2565b612ae291906137b8565b612aec9190613829565b9695505050505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612b6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9191906135f4565b612b9b9190613707565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150611e939085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611a7f565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff83811660248301526000919085169063dd62ed3e90604401602060405180830381865afa158015612c6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c8e91906135f4565b905081811015612d20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5361666545524332303a2064656372656173656420616c6c6f77616e6365206260448201527f656c6f77207a65726f00000000000000000000000000000000000000000000006064820152608401610770565b60405173ffffffffffffffffffffffffffffffffffffffff841660248201528282036044820181905290610cd79086907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611a7f565b6107838282611905565b60008281526001602081905260409091200154819060405184907fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff90600090a4600091825260016020819052604090922090910155565b6060612dea8484600085612f1d565b949350505050565b6000821580612dff575083155b15612e0b575080612953565b6000612e18600284613829565b90506000612e276001866137b8565b9050600060028611612e3a576000612e45565b612e456002876137b8565b905060008584612e558a8061363c565b612e5f9190613707565b612e699190613829565b905060008685612e798b8561363c565b612e839190613707565b612e8d9190613829565b90506000600283612e9e878c61363c565b612ea8919061363c565b612eb29190613829565b9050600060068386612ec4898e61363c565b612ece919061363c565b612ed8919061363c565b612ee29190613829565b90508082612ef08c8e61363c565b612efa908c613707565b612f049190613707565b612f0e9190613707565b9b9a5050505050505050505050565b606082471015612faf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610770565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612fd891906135d8565b60006040518083038185875af1925050503d8060008114613015576040519150601f19603f3d011682016040523d82523d6000602084013e61301a565b606091505b509150915061302b87838387613036565b979650505050505050565b606083156130cc5782516000036130c55773ffffffffffffffffffffffffffffffffffffffff85163b6130c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610770565b5081612dea565b612dea83838151156130e15781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107709190613323565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561318b5761318b613115565b604052919050565b600067ffffffffffffffff8311156131ad576131ad613115565b6131de60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601613144565b90508281528383830111156131f257600080fd5b828260208301376000602084830101529392505050565b6000806040838503121561321c57600080fd5b82359150602083013567ffffffffffffffff81111561323a57600080fd5b8301601f8101851361324b57600080fd5b61325a85823560208401613193565b9150509250929050565b73ffffffffffffffffffffffffffffffffffffffff8116811461328657600080fd5b50565b803561329481613264565b919050565b6000602082840312156132ab57600080fd5b813561295381613264565b6000602082840312156132c857600080fd5b5035919050565b600080604083850312156132e257600080fd5b8235915060208301356132f481613264565b809150509250929050565b60005b8381101561331a578181015183820152602001613302565b50506000910152565b60208152600082518060208401526133428160408501602087016132ff565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008083601f84011261338657600080fd5b50813567ffffffffffffffff81111561339e57600080fd5b6020830191508360208260051b85010111156133b957600080fd5b9250929050565b600080600080600080606087890312156133d957600080fd5b863567ffffffffffffffff808211156133f157600080fd5b6133fd8a838b01613374565b9098509650602089013591508082111561341657600080fd5b6134228a838b01613374565b9096509450604089013591508082111561343b57600080fd5b5061344889828a01613374565b979a9699509497509295939492505050565b6000806040838503121561346d57600080fd5b823561347881613264565b915060208301356132f481613264565b600082601f83011261349957600080fd5b8135602067ffffffffffffffff8211156134b5576134b5613115565b8160051b6134c4828201613144565b92835284810182019282810190878511156134de57600080fd5b83870192505b8483101561302b5782356134f781613264565b825291830191908301906134e4565b60008060008060008060c0878903121561351f57600080fd5b863561352a81613264565b9550602087013567ffffffffffffffff8082111561354757600080fd5b818901915089601f83011261355b57600080fd5b61356a8a833560208501613193565b9650604089013591508082111561358057600080fd5b61358c8a838b01613488565b955061359a60608a01613289565b945060808901359150808211156135b057600080fd5b506135bd89828a01613488565b9250506135cc60a08801613289565b90509295509295509295565b600082516135ea8184602087016132ff565b9190910192915050565b60006020828403121561360657600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417610a3957610a3961360d565b600181811c9082168061366757607f821691505b6020821081036106b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036137005761370061360d565b5060010190565b80820180821115610a3957610a3961360d565b60006020828403121561372c57600080fd5b815161295381613264565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161376f8160178501602088016132ff565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516137ac8160288401602088016132ff565b01602801949350505050565b81810381811115610a3957610a3961360d565b6000602082840312156137dd57600080fd5b815163ffffffff8116811461295357600080fd5b60007f800000000000000000000000000000000000000000000000000000000000000082036138225761382261360d565b5060000390565b60008261385f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60006020828403121561387657600080fd5b815180600b0b811461295357600080fd5b601f8211156106f057600081815260208120601f850160051c810160208610156138ae5750805b601f850160051c820191505b818110156105e0578281556001016138ba565b815167ffffffffffffffff8111156138e7576138e7613115565b6138fb816138f58454613653565b84613887565b602080601f83116001811461394e57600084156139185750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556105e0565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561399b5788860151825594840194600190910190840161397c565b50858210156139d757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156139f957600080fd5b815160ff8116811461295357600080fd5b600181815b80851115613a6357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613a4957613a4961360d565b80851615613a5657918102915b93841c9390800290613a0f565b509250929050565b600082613a7a57506001610a39565b81613a8757506000610a39565b8160018114613a9d5760028114613aa757613ac3565b6001915050610a39565b60ff841115613ab857613ab861360d565b50506001821b610a39565b5060208310610133831016604e8410600b8410161715613ae6575081810a610a39565b613af08383613a0a565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613b2257613b2261360d565b029392505050565b600061295360ff841683613a6b565b600081613b4857613b4861360d565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600060208284031215613b8057600080fd5b8151801515811461295357600080fdfea2646970667358221220109542d765fdea225dd59f6dcaa8772d28421b7c63dbcf19982cefe9a0682dc664736f6c63430008110033", + "nonce": "0x3c4", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "function": null, + "arguments": [ + "0x1F25FABC5Bf3F3a185cA051de22511A4e9b3e86A", + "0x1D941EF0D3Bba4ad67DBfBCeE5262F4CEE53A32b", + "0xecf609ae0000000000000000000000005577f822a979b7456ca08c5e311067d777e734c400000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001400000000000000000000000001111111254eeb25477b68fb85ed929f73a960582000000000000000000000000000000000000000000000000000000000000001045756c6572204c656e64657220444149000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe" + ], + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x193a72", + "value": "0x0", + "data": "0x6080604052604051620010bf380380620010bf8339810160408190526200002691620004e6565b828162000036828260006200009a565b5062000066905060017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104620005c6565b6000805160206200107883398151915214620000865762000086620005e8565b6200009182620000d7565b50505062000651565b620000a58362000132565b600082511180620000b35750805b15620000d257620000d083836200017460201b6200028c1760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f62000102620001a5565b604080516001600160a01b03928316815291841660208301520160405180910390a16200012f81620001de565b50565b6200013d8162000293565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200019c8383604051806060016040528060278152602001620010986027913962000347565b90505b92915050565b6000620001cf6000805160206200107883398151915260001b620003c660201b6200022e1760201c565b546001600160a01b0316919050565b6001600160a01b038116620002495760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b80620002726000805160206200107883398151915260001b620003c660201b6200022e1760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b620002a981620003c960201b620002b81760201c565b6200030d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000240565b80620002727f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b620003c660201b6200022e1760201c565b6060600080856001600160a01b031685604051620003669190620005fe565b600060405180830381855af49150503d8060008114620003a3576040519150601f19603f3d011682016040523d82523d6000602084013e620003a8565b606091505b509092509050620003bc86838387620003d8565b9695505050505050565b90565b6001600160a01b03163b151590565b606083156200044c57825160000362000444576001600160a01b0385163b620004445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000240565b508162000458565b62000458838362000460565b949350505050565b815115620004715781518083602001fd5b8060405162461bcd60e51b81526004016200024091906200061c565b80516001600160a01b0381168114620004a557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620004dd578181015183820152602001620004c3565b50506000910152565b600080600060608486031215620004fc57600080fd5b62000507846200048d565b925062000517602085016200048d565b60408501519092506001600160401b03808211156200053557600080fd5b818601915086601f8301126200054a57600080fd5b8151818111156200055f576200055f620004aa565b604051601f8201601f19908116603f011681019083821181831017156200058a576200058a620004aa565b81604052828152896020848701011115620005a457600080fd5b620005b7836020830160208801620004c0565b80955050505050509250925092565b818103818111156200019f57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052600160045260246000fd5b6000825162000612818460208701620004c0565b9190910192915050565b60208152600082518060208401526200063d816040850160208701620004c0565b601f01601f19169190910160400192915050565b610a1780620006616000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100a85780638f283970146100e6578063f851a440146101065761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61011b565b005b61006b61011b565b34801561008157600080fd5b5061006b61009036600461088b565b610135565b61006b6100a33660046108a6565b61017f565b3480156100b457600080fd5b506100bd6101f3565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b5061006b61010136600461088b565b610231565b34801561011257600080fd5b506100bd61025e565b6101236102d4565b61013361012e6103ab565b6103b5565b565b61013d6103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481604051806020016040528060008152506000610419565b50565b61017461011b565b6101876103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101eb576101e68383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610419915050565b505050565b6101e661011b565b60006101fd6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103ab565b905090565b61022e61011b565b90565b6102396103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481610444565b60006102686103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103d9565b60606102b183836040518060600160405280602781526020016109bb602791396104a5565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6102dc6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600061022161052a565b3660008037600080366000845af43d6000803e8080156103d4573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b61042283610552565b60008251118061042f5750805b156101e65761043e838361028c565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61046d6103d9565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a16101748161059f565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516104cf919061094d565b600060405180830381855af49150503d806000811461050a576040519150601f19603f3d011682016040523d82523d6000602084013e61050f565b606091505b5091509150610520868383876106ab565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103fd565b61055b81610753565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b73ffffffffffffffffffffffffffffffffffffffff8116610642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103a2565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b6060831561074157825160000361073a5773ffffffffffffffffffffffffffffffffffffffff85163b61073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103a2565b508161074b565b61074b838361081e565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff81163b6107f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016103a2565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610665565b81511561082e5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a29190610969565b803573ffffffffffffffffffffffffffffffffffffffff8116811461088657600080fd5b919050565b60006020828403121561089d57600080fd5b6102b182610862565b6000806000604084860312156108bb57600080fd5b6108c484610862565b9250602084013567ffffffffffffffff808211156108e157600080fd5b818601915086601f8301126108f557600080fd5b81358181111561090457600080fd5b87602082850101111561091657600080fd5b6020830194508093505050509250925092565b60005b8381101561094457818101518382015260200161092c565b50506000910152565b6000825161095f818460208701610929565b9190910192915050565b6020815260008251806020840152610988816040850160208701610929565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220910985b3eaa4496dd2573db8df24a04823c4165cdd5afb455cf182a9f53be9fb64736f6c63430008110033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65640000000000000000000000001f25fabc5bf3f3a185ca051de22511a4e9b3e86a0000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001a4ecf609ae0000000000000000000000005577f822a979b7456ca08c5e311067d777e734c400000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001400000000000000000000000001111111254eeb25477b68fb85ed929f73a960582000000000000000000000000000000000000000000000000000000000000001045756c6572204c656e64657220444149000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe00000000000000000000000000000000000000000000000000000000", + "nonce": "0x3c5", + "accessList": [] + }, + "additionalContracts": [] + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "0x8b95d4edd036b79f10cad9c2670da9af4b8ac4fe6a51b47a0ac1e0c89ef46939", + "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60" + ], + "path": "/Users/gnervo/Documents/Angle/strategies-dev/broadcast/MigrationOptimizerAPRDAI.s.sol/1/run-latest.json", + "returns": {}, + "timestamp": 1675949226, + "chain": 1, + "multi": false, + "commit": "1d1272f" +} \ No newline at end of file diff --git a/broadcast/MigrationOptimizerAPRDAI.s.sol/1/run-1675949233.json b/broadcast/MigrationOptimizerAPRDAI.s.sol/1/run-1675949233.json new file mode 100644 index 0000000..20ce664 --- /dev/null +++ b/broadcast/MigrationOptimizerAPRDAI.s.sol/1/run-1675949233.json @@ -0,0 +1,1075 @@ +{ + "transactions": [ + { + "hash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "function": null, + "arguments": [ + "0x05E08E1BF31C1882822Cc48D7d51d6fe49Bca9c2", + "0x1D941EF0D3Bba4ad67DBfBCeE5262F4CEE53A32b", + "0xe6bfbfd8000000000000000000000000c9daabc677f3d1301006e723bd21c60be57a5915000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe" + ], + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x151b8f", + "value": "0x0", + "data": "0x6080604052604051620010bf380380620010bf8339810160408190526200002691620004e6565b828162000036828260006200009a565b5062000066905060017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104620005c6565b6000805160206200107883398151915214620000865762000086620005e8565b6200009182620000d7565b50505062000651565b620000a58362000132565b600082511180620000b35750805b15620000d257620000d083836200017460201b6200028c1760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f62000102620001a5565b604080516001600160a01b03928316815291841660208301520160405180910390a16200012f81620001de565b50565b6200013d8162000293565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200019c8383604051806060016040528060278152602001620010986027913962000347565b90505b92915050565b6000620001cf6000805160206200107883398151915260001b620003c660201b6200022e1760201c565b546001600160a01b0316919050565b6001600160a01b038116620002495760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b80620002726000805160206200107883398151915260001b620003c660201b6200022e1760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b620002a981620003c960201b620002b81760201c565b6200030d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000240565b80620002727f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b620003c660201b6200022e1760201c565b6060600080856001600160a01b031685604051620003669190620005fe565b600060405180830381855af49150503d8060008114620003a3576040519150601f19603f3d011682016040523d82523d6000602084013e620003a8565b606091505b509092509050620003bc86838387620003d8565b9695505050505050565b90565b6001600160a01b03163b151590565b606083156200044c57825160000362000444576001600160a01b0385163b620004445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000240565b508162000458565b62000458838362000460565b949350505050565b815115620004715781518083602001fd5b8060405162461bcd60e51b81526004016200024091906200061c565b80516001600160a01b0381168114620004a557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620004dd578181015183820152602001620004c3565b50506000910152565b600080600060608486031215620004fc57600080fd5b62000507846200048d565b925062000517602085016200048d565b60408501519092506001600160401b03808211156200053557600080fd5b818601915086601f8301126200054a57600080fd5b8151818111156200055f576200055f620004aa565b604051601f8201601f19908116603f011681019083821181831017156200058a576200058a620004aa565b81604052828152896020848701011115620005a457600080fd5b620005b7836020830160208801620004c0565b80955050505050509250925092565b818103818111156200019f57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052600160045260246000fd5b6000825162000612818460208701620004c0565b9190910192915050565b60208152600082518060208401526200063d816040850160208701620004c0565b601f01601f19169190910160400192915050565b610a1780620006616000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100a85780638f283970146100e6578063f851a440146101065761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61011b565b005b61006b61011b565b34801561008157600080fd5b5061006b61009036600461088b565b610135565b61006b6100a33660046108a6565b61017f565b3480156100b457600080fd5b506100bd6101f3565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b5061006b61010136600461088b565b610231565b34801561011257600080fd5b506100bd61025e565b6101236102d4565b61013361012e6103ab565b6103b5565b565b61013d6103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481604051806020016040528060008152506000610419565b50565b61017461011b565b6101876103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101eb576101e68383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610419915050565b505050565b6101e661011b565b60006101fd6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103ab565b905090565b61022e61011b565b90565b6102396103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481610444565b60006102686103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103d9565b60606102b183836040518060600160405280602781526020016109bb602791396104a5565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6102dc6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600061022161052a565b3660008037600080366000845af43d6000803e8080156103d4573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b61042283610552565b60008251118061042f5750805b156101e65761043e838361028c565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61046d6103d9565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a16101748161059f565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516104cf919061094d565b600060405180830381855af49150503d806000811461050a576040519150601f19603f3d011682016040523d82523d6000602084013e61050f565b606091505b5091509150610520868383876106ab565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103fd565b61055b81610753565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b73ffffffffffffffffffffffffffffffffffffffff8116610642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103a2565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b6060831561074157825160000361073a5773ffffffffffffffffffffffffffffffffffffffff85163b61073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103a2565b508161074b565b61074b838361081e565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff81163b6107f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016103a2565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610665565b81511561082e5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a29190610969565b803573ffffffffffffffffffffffffffffffffffffffff8116811461088657600080fd5b919050565b60006020828403121561089d57600080fd5b6102b182610862565b6000806000604084860312156108bb57600080fd5b6108c484610862565b9250602084013567ffffffffffffffff808211156108e157600080fd5b818601915086601f8301126108f557600080fd5b81358181111561090457600080fd5b87602082850101111561091657600080fd5b6020830194508093505050509250925092565b60005b8381101561094457818101518382015260200161092c565b50506000910152565b6000825161095f818460208701610929565b9190910192915050565b6020815260008251806020840152610988816040850160208701610929565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220910985b3eaa4496dd2573db8df24a04823c4165cdd5afb455cf182a9f53be9fb64736f6c63430008110033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656400000000000000000000000005e08e1bf31c1882822cc48d7d51d6fe49bca9c20000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e4e6bfbfd8000000000000000000000000c9daabc677f3d1301006e723bd21c60be57a5915000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe00000000000000000000000000000000000000000000000000000000", + "nonce": "0x3c1", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "function": null, + "arguments": [ + "0xDeEe844C6992F36ADAC59cF38d1F790B2a0313e2", + "0x1D941EF0D3Bba4ad67DBfBCeE5262F4CEE53A32b", + "0x804869910000000000000000000000005577f822a979b7456ca08c5e311067d777e734c400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e364300000000000000000000000000000000000000000000000000000000000001200000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001600000000000000000000000001111111254eeb25477b68fb85ed929f73a9605820000000000000000000000000000000000000000000000000000000000000016436f6d706f756e64204c656e64657220444149207632000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe" + ], + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x187d93", + "value": "0x0", + "data": "0x6080604052604051620010bf380380620010bf8339810160408190526200002691620004e6565b828162000036828260006200009a565b5062000066905060017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104620005c6565b6000805160206200107883398151915214620000865762000086620005e8565b6200009182620000d7565b50505062000651565b620000a58362000132565b600082511180620000b35750805b15620000d257620000d083836200017460201b6200028c1760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f62000102620001a5565b604080516001600160a01b03928316815291841660208301520160405180910390a16200012f81620001de565b50565b6200013d8162000293565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200019c8383604051806060016040528060278152602001620010986027913962000347565b90505b92915050565b6000620001cf6000805160206200107883398151915260001b620003c660201b6200022e1760201c565b546001600160a01b0316919050565b6001600160a01b038116620002495760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b80620002726000805160206200107883398151915260001b620003c660201b6200022e1760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b620002a981620003c960201b620002b81760201c565b6200030d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000240565b80620002727f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b620003c660201b6200022e1760201c565b6060600080856001600160a01b031685604051620003669190620005fe565b600060405180830381855af49150503d8060008114620003a3576040519150601f19603f3d011682016040523d82523d6000602084013e620003a8565b606091505b509092509050620003bc86838387620003d8565b9695505050505050565b90565b6001600160a01b03163b151590565b606083156200044c57825160000362000444576001600160a01b0385163b620004445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000240565b508162000458565b62000458838362000460565b949350505050565b815115620004715781518083602001fd5b8060405162461bcd60e51b81526004016200024091906200061c565b80516001600160a01b0381168114620004a557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620004dd578181015183820152602001620004c3565b50506000910152565b600080600060608486031215620004fc57600080fd5b62000507846200048d565b925062000517602085016200048d565b60408501519092506001600160401b03808211156200053557600080fd5b818601915086601f8301126200054a57600080fd5b8151818111156200055f576200055f620004aa565b604051601f8201601f19908116603f011681019083821181831017156200058a576200058a620004aa565b81604052828152896020848701011115620005a457600080fd5b620005b7836020830160208801620004c0565b80955050505050509250925092565b818103818111156200019f57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052600160045260246000fd5b6000825162000612818460208701620004c0565b9190910192915050565b60208152600082518060208401526200063d816040850160208701620004c0565b601f01601f19169190910160400192915050565b610a1780620006616000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100a85780638f283970146100e6578063f851a440146101065761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61011b565b005b61006b61011b565b34801561008157600080fd5b5061006b61009036600461088b565b610135565b61006b6100a33660046108a6565b61017f565b3480156100b457600080fd5b506100bd6101f3565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b5061006b61010136600461088b565b610231565b34801561011257600080fd5b506100bd61025e565b6101236102d4565b61013361012e6103ab565b6103b5565b565b61013d6103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481604051806020016040528060008152506000610419565b50565b61017461011b565b6101876103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101eb576101e68383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610419915050565b505050565b6101e661011b565b60006101fd6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103ab565b905090565b61022e61011b565b90565b6102396103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481610444565b60006102686103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103d9565b60606102b183836040518060600160405280602781526020016109bb602791396104a5565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6102dc6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600061022161052a565b3660008037600080366000845af43d6000803e8080156103d4573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b61042283610552565b60008251118061042f5750805b156101e65761043e838361028c565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61046d6103d9565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a16101748161059f565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516104cf919061094d565b600060405180830381855af49150503d806000811461050a576040519150601f19603f3d011682016040523d82523d6000602084013e61050f565b606091505b5091509150610520868383876106ab565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103fd565b61055b81610753565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b73ffffffffffffffffffffffffffffffffffffffff8116610642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103a2565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b6060831561074157825160000361073a5773ffffffffffffffffffffffffffffffffffffffff85163b61073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103a2565b508161074b565b61074b838361081e565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff81163b6107f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016103a2565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610665565b81511561082e5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a29190610969565b803573ffffffffffffffffffffffffffffffffffffffff8116811461088657600080fd5b919050565b60006020828403121561089d57600080fd5b6102b182610862565b6000806000604084860312156108bb57600080fd5b6108c484610862565b9250602084013567ffffffffffffffff808211156108e157600080fd5b818601915086601f8301126108f557600080fd5b81358181111561090457600080fd5b87602082850101111561091657600080fd5b6020830194508093505050509250925092565b60005b8381101561094457818101518382015260200161092c565b50506000910152565b6000825161095f818460208701610929565b9190910192915050565b6020815260008251806020840152610988816040850160208701610929565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220910985b3eaa4496dd2573db8df24a04823c4165cdd5afb455cf182a9f53be9fb64736f6c63430008110033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564000000000000000000000000deee844c6992f36adac59cf38d1f790b2a0313e20000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c4804869910000000000000000000000005577f822a979b7456ca08c5e311067d777e734c400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e364300000000000000000000000000000000000000000000000000000000000001200000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001600000000000000000000000001111111254eeb25477b68fb85ed929f73a9605820000000000000000000000000000000000000000000000000000000000000016436f6d706f756e64204c656e64657220444149207632000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe00000000000000000000000000000000000000000000000000000000", + "nonce": "0x3c2", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "function": null, + "arguments": [ + "0x14bA0B82f1940e35Af39c364e8Fa99408881Ae30", + "0x1D941EF0D3Bba4ad67DBfBCeE5262F4CEE53A32b", + "0x67f52b630000000000000000000000005577f822a979b7456ca08c5e311067d777e734c400000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001600000000000000000000000001111111254eeb25477b68fb85ed929f73a960582000000000000000000000000000000000000000000000000000000000000001241617665204c656e6465722044414920763200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe" + ], + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x1af9f5", + "value": "0x0", + "data": "0x6080604052604051620010bf380380620010bf8339810160408190526200002691620004e6565b828162000036828260006200009a565b5062000066905060017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104620005c6565b6000805160206200107883398151915214620000865762000086620005e8565b6200009182620000d7565b50505062000651565b620000a58362000132565b600082511180620000b35750805b15620000d257620000d083836200017460201b6200028c1760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f62000102620001a5565b604080516001600160a01b03928316815291841660208301520160405180910390a16200012f81620001de565b50565b6200013d8162000293565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200019c8383604051806060016040528060278152602001620010986027913962000347565b90505b92915050565b6000620001cf6000805160206200107883398151915260001b620003c660201b6200022e1760201c565b546001600160a01b0316919050565b6001600160a01b038116620002495760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b80620002726000805160206200107883398151915260001b620003c660201b6200022e1760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b620002a981620003c960201b620002b81760201c565b6200030d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000240565b80620002727f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b620003c660201b6200022e1760201c565b6060600080856001600160a01b031685604051620003669190620005fe565b600060405180830381855af49150503d8060008114620003a3576040519150601f19603f3d011682016040523d82523d6000602084013e620003a8565b606091505b509092509050620003bc86838387620003d8565b9695505050505050565b90565b6001600160a01b03163b151590565b606083156200044c57825160000362000444576001600160a01b0385163b620004445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000240565b508162000458565b62000458838362000460565b949350505050565b815115620004715781518083602001fd5b8060405162461bcd60e51b81526004016200024091906200061c565b80516001600160a01b0381168114620004a557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620004dd578181015183820152602001620004c3565b50506000910152565b600080600060608486031215620004fc57600080fd5b62000507846200048d565b925062000517602085016200048d565b60408501519092506001600160401b03808211156200053557600080fd5b818601915086601f8301126200054a57600080fd5b8151818111156200055f576200055f620004aa565b604051601f8201601f19908116603f011681019083821181831017156200058a576200058a620004aa565b81604052828152896020848701011115620005a457600080fd5b620005b7836020830160208801620004c0565b80955050505050509250925092565b818103818111156200019f57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052600160045260246000fd5b6000825162000612818460208701620004c0565b9190910192915050565b60208152600082518060208401526200063d816040850160208701620004c0565b601f01601f19169190910160400192915050565b610a1780620006616000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100a85780638f283970146100e6578063f851a440146101065761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61011b565b005b61006b61011b565b34801561008157600080fd5b5061006b61009036600461088b565b610135565b61006b6100a33660046108a6565b61017f565b3480156100b457600080fd5b506100bd6101f3565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b5061006b61010136600461088b565b610231565b34801561011257600080fd5b506100bd61025e565b6101236102d4565b61013361012e6103ab565b6103b5565b565b61013d6103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481604051806020016040528060008152506000610419565b50565b61017461011b565b6101876103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101eb576101e68383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610419915050565b505050565b6101e661011b565b60006101fd6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103ab565b905090565b61022e61011b565b90565b6102396103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481610444565b60006102686103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103d9565b60606102b183836040518060600160405280602781526020016109bb602791396104a5565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6102dc6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600061022161052a565b3660008037600080366000845af43d6000803e8080156103d4573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b61042283610552565b60008251118061042f5750805b156101e65761043e838361028c565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61046d6103d9565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a16101748161059f565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516104cf919061094d565b600060405180830381855af49150503d806000811461050a576040519150601f19603f3d011682016040523d82523d6000602084013e61050f565b606091505b5091509150610520868383876106ab565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103fd565b61055b81610753565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b73ffffffffffffffffffffffffffffffffffffffff8116610642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103a2565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b6060831561074157825160000361073a5773ffffffffffffffffffffffffffffffffffffffff85163b61073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103a2565b508161074b565b61074b838361081e565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff81163b6107f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016103a2565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610665565b81511561082e5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a29190610969565b803573ffffffffffffffffffffffffffffffffffffffff8116811461088657600080fd5b919050565b60006020828403121561089d57600080fd5b6102b182610862565b6000806000604084860312156108bb57600080fd5b6108c484610862565b9250602084013567ffffffffffffffff808211156108e157600080fd5b818601915086601f8301126108f557600080fd5b81358181111561090457600080fd5b87602082850101111561091657600080fd5b6020830194508093505050509250925092565b60005b8381101561094457818101518382015260200161092c565b50506000910152565b6000825161095f818460208701610929565b9190910192915050565b6020815260008251806020840152610988816040850160208701610929565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220910985b3eaa4496dd2573db8df24a04823c4165cdd5afb455cf182a9f53be9fb64736f6c63430008110033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656400000000000000000000000014ba0b82f1940e35af39c364e8fa99408881ae300000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c467f52b630000000000000000000000005577f822a979b7456ca08c5e311067d777e734c400000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001600000000000000000000000001111111254eeb25477b68fb85ed929f73a960582000000000000000000000000000000000000000000000000000000000000001241617665204c656e6465722044414920763200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe00000000000000000000000000000000000000000000000000000000", + "nonce": "0x3c3", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0x8b95d4edd036b79f10cad9c2670da9af4b8ac4fe6a51b47a0ac1e0c89ef46939", + "transactionType": "CREATE", + "contractName": "GenericEuler", + "contractAddress": "0x1F25FABC5Bf3F3a185cA051de22511A4e9b3e86A", + "function": null, + "arguments": null, + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x42b977", + "value": "0x0", + "data": "0x60806040523480156200001157600080fd5b50600054610100900460ff166200002f5760005460ff161562000039565b62000039620000de565b620000a15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b600054610100900460ff16158015620000c4576000805461ffff19166101011790555b8015620000d7576000805461ff00191690555b5062000102565b6000620000f630620000fc60201b620011241760201c565b15905090565b3b151590565b613bc680620001126000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c8063853828b61161010f578063b82c4dc1116100a2578063d0e30db011610071578063d0e30db014610491578063d547741f14610499578063dc4c90d3146104ac578063ecf609ae146104cc57600080fd5b8063b82c4dc11461045b578063b8dc491b1461046e578063c1590cd714610481578063c6afba3c1461048957600080fd5b8063a217fddf116100de578063a217fddf146103e3578063a73e0f3b146103eb578063a7d385e214610428578063a8c62e761461043b57600080fd5b8063853828b6146103935780638b2021761461039b57806391d14854146103b0578063953d9cf1146103c357600080fd5b80632e779525116101875780635312ea8e116101565780635312ea8e1461033957806357ded9c91461034c578063580b7c2e146103545780635be9b2d31461037b57600080fd5b80632e779525146102e45780632f2ff15d146102ec578063364bc15a146102ff57806336568abe1461032657600080fd5b80631f1fcd51116101c35780631f1fcd5114610241578063248a9ca31461028657806324ea54f4146102aa5780632e1a7d4d146102d157600080fd5b806305b41934146101f55780630948c0b61461020a5780630b6d1d171461021d578063116ac4a314610239575b600080fd5b610208610203366004613209565b6104df565b005b610208610218366004613299565b6105e8565b61022660375481565b6040519081526020015b60405180910390f35b61022661065b565b6036546102619073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610230565b6102266102943660046132b6565b6000908152600160208190526040909120015490565b6102267f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504181565b6102266102df3660046132b6565b610680565b6102086106bf565b6102086102fa3660046132cf565b6106c9565b6102267ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab81565b6102086103343660046132cf565b6106f5565b6102086103473660046132b6565b610787565b6102266108f9565b6102267f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c81565b610383610908565b6040519015158152602001610230565b610383610927565b6103a3610977565b6040516102309190613323565b6103836103be3660046132cf565b610a05565b6067546102619073ffffffffffffffffffffffffffffffffffffffff1681565b610226600081565b6067546104139074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610230565b6102266104363660046132b6565b610a3f565b6035546102619073ffffffffffffffffffffffffffffffffffffffff1681565b6102086104693660046133c0565b610a4a565b61020861047c36600461345a565b610b51565b610226610cde565b610226610ce8565b610208610d8d565b6102086104a73660046132cf565b610ed3565b6034546102619073ffffffffffffffffffffffffffffffffffffffff1681565b6102086104da366004613506565b610efa565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab61050a813361112a565b603854604051600091829173ffffffffffffffffffffffffffffffffffffffff909116906105399086906135d8565b6000604051808303816000865af19150503d8060008114610576576040519150601f19603f3d011682016040523d82523d6000602084013e61057b565b606091505b50915091508161058e5761058e816111d3565b6000818060200190518101906105a491906135f4565b9050858110156105e0576040517f22313ae900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610613813361112a565b50603880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600080610666611214565b9050610670611220565b61067a908261363c565b91505090565b60007f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c6106ad813361112a565b6106b6836112c6565b91505b50919050565b6106c76116cd565b565b600082815260016020819052604090912001546106e6813361112a565b6106f08383611905565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610779576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f373100000000000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b610783828261199b565b5050565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50416107b2813361112a565b6067546040517f441a3e70000000000000000000000000000000000000000000000000000000008152600060048201526024810184905273ffffffffffffffffffffffffffffffffffffffff9091169063441a3e7090604401600060405180830381600087803b15801561082557600080fd5b505af1158015610839573d6000803e3d6000fd5b50506034546036546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152610783945073ffffffffffffffffffffffffffffffffffffffff92831693509116906370a0823190602401602060405180830381865afa1580156108b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d991906135f4565b60365473ffffffffffffffffffffffffffffffffffffffff169190611a2d565b6000610903611214565b905090565b6000603754600a610919919061363c565b610921611220565b11905090565b60007f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c610954813361112a565b600061095e611220565b9050600061096b826112c6565b91909110159250505090565b6033805461098490613653565b80601f01602080910402602001604051908101604052809291908181526020018280546109b090613653565b80156109fd5780601f106109d2576101008083540402835291602001916109fd565b820191906000526020600020905b8154815290600101906020018083116109e057829003601f168201915b505050505081565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff165b92915050565b6000610a3982611b01565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610a75813361112a565b8584141580610a845750858214155b15610abb576040517f46282e8d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8560005b81811015610b4657610b36898983818110610adc57610adc6136a0565b9050602002016020810190610af19190613299565b888884818110610b0357610b036136a0565b9050602002016020810190610b189190613299565b878785818110610b2a57610b2a6136a0565b90506020020135611d8a565b610b3f816136cf565b9050610abf565b505050505050505050565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610b7c813361112a565b6000610b86611e99565b805190915060005b81811015610c2457828181518110610ba857610ba86136a0565b602002602001015173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603610c14576040517f093e1cdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c1d816136cf565b9050610b8e565b506040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152610cd790859073ffffffffffffffffffffffffffffffffffffffff8816906370a0823190602401602060405180830381865afa158015610c95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb991906135f4565b73ffffffffffffffffffffffffffffffffffffffff88169190611a2d565b5050505050565b6000610903611220565b600080806067546040517f3af9e669000000000000000000000000000000000000000000000000000000008152306004820152919250829173ffffffffffffffffffffffffffffffffffffffff90911690633af9e66990602401602060405180830381865afa158015610d5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8391906135f4565b61067a9190613707565b7f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c610db8813361112a565b6036546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610e27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4b91906135f4565b6067546040517fe2bbb158000000000000000000000000000000000000000000000000000000008152600060048201526024810183905291925073ffffffffffffffffffffffffffffffffffffffff169063e2bbb15890604401600060405180830381600087803b158015610ebf57600080fd5b505af11580156105e0573d6000803e3d6000fd5b60008281526001602081905260409091200154610ef0813361112a565b6106f0838361199b565b610f08868686868686611f53565b6036546040517f8948874900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152733520d5a913427e6f0d6a83e07ccd4a4da316e4d390638948874990602401602060405180830381865afa158015610f8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fae919061371a565b606780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9283161790556036546040517f1b30058200000000000000000000000000000000000000000000000000000000815291166004820152733520d5a913427e6f0d6a83e07ccd4a4da316e4d390631b30058290602401602060405180830381865afa15801561105b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107f919061371a565b606680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169190911790556110cc6116cd565b6036546105e09073ffffffffffffffffffffffffffffffffffffffff167327182842e098f60e3d576794a5bffb0777e025d37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61258e565b3b151590565b6111348282610a05565b610783576111598173ffffffffffffffffffffffffffffffffffffffff166014612710565b611164836020612710565b604051602001611175929190613737565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261077091600401613323565b8051156111e257805181602001fd5b6040517fc76d51a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006109036000611b01565b600061122a610ce8565b6036546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015611298573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bc91906135f4565b6109039190613707565b600080806067546040517f3af9e66900000000000000000000000000000000000000000000000000000000815230600482015291925060009173ffffffffffffffffffffffffffffffffffffffff90911690633af9e66990602401602060405180830381865afa15801561133e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136291906135f4565b6036546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291925060009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa1580156113d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113fa91906135f4565b90506000816114098486613707565b6114139190613707565b905080861115611421578095505b85821061145c576035546036546114529173ffffffffffffffffffffffffffffffffffffffff918216911688611a2d565b5093949350505050565b6036546040517f70a082310000000000000000000000000000000000000000000000000000000081527327182842e098f60e3d576794a5bffb0777e025d3600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156114df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150391906135f4565b9050600181111561160357600061151a84896137b8565b905060008282116115575761152f8587613707565b821161153c576000611550565b6115468587613707565b61155090836137b8565b9050611575565b85831161156557600061156f565b61156f86846137b8565b90508291505b6067546040517f441a3e70000000000000000000000000000000000000000000000000000000008152600060048201526024810184905273ffffffffffffffffffffffffffffffffffffffff9091169063441a3e7090604401600060405180830381600087803b1580156115e857600080fd5b505af11580156115fc573d6000803e3d6000fd5b5050505050505b6036546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015611671573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169591906135f4565b6035546036549194506116c29173ffffffffffffffffffffffffffffffffffffffff908116911685611a2d565b509095945050505050565b6036546040517fb409dd9b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152600090733520d5a913427e6f0d6a83e07ccd4a4da316e4d39063b409dd9b90602401602060405180830381865afa158015611752573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177691906135f4565b6040517fcab65f01000000000000000000000000000000000000000000000000000000008152600481018290529091506000907327182842e098f60e3d576794a5bffb0777e025d39063cab65f0190602401602060405180830381865afa1580156117e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611809919061371a565b606580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116919091179091556036546040517fb74b1ed500000000000000000000000000000000000000000000000000000000815291166004820152909150733520d5a913427e6f0d6a83e07ccd4a4da316e4d39063b74b1ed590602401602060405180830381865afa1580156118bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e191906137cb565b606760146101000a81548163ffffffff021916908363ffffffff1602179055505050565b61190f8282610a05565b61078357600082815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616808652925280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6119a58282610a05565b1561078357600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526106f09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261295a565b600080606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9591906135f4565b90506000606760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fea61faa6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c2a91906135f4565b905060008412611c4557611c3e8482613707565b9050611c5b565b611c4e846137f1565b611c5890826137b8565b90505b60008115611d76576000670de0b6b3a764000083611c7d63ffffffff8361363c565b611c87908761363c565b611c919190613829565b611c9b9190613829565b6065546036546040517fd50c08f800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015263ffffffff8416602482015292935060009291169063d50c08f890604401602060405180830381865afa158015611d1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d439190613864565b6bffffffffffffffffffffffff169050611d71818686606760149054906101000a900463ffffffff16612a66565b925050505b611d81600082613707565b95945050505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff83811660248301526000919085169063dd62ed3e90604401602060405180830381865afa158015611e00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2491906135f4565b905081811015611e5f57611e5a83611e3c83856137b8565b73ffffffffffffffffffffffffffffffffffffffff87169190612af6565b611e93565b81811115611e9357611e9383611e7584846137b8565b73ffffffffffffffffffffffffffffffffffffffff87169190612bf4565b50505050565b604080516002808252606080830184529260009291906020830190803683375050603654825192935073ffffffffffffffffffffffffffffffffffffffff1691839150600090611eeb57611eeb6136a0565b73ffffffffffffffffffffffffffffffffffffffff9283166020918202929092010152606754825191169082906001908110611f2957611f296136a0565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152919050565b600054610100900460ff16611f6e5760005460ff1615611f72565b303b155b611ffe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610770565b600054610100900460ff1615801561203d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b6038805473ffffffffffffffffffffffffffffffffffffffff8085167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560358054928a169290911682179055604080517fdc4c90d3000000000000000000000000000000000000000000000000000000008152905163dc4c90d3916004808201926020929091908290030181865afa1580156120e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612108919061371a565b603480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169182179055604080517ffc0c546a000000000000000000000000000000000000000000000000000000008152905163fc0c546a916004808201926020929091908290030181865afa1580156121a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c4919061371a565b603680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055603361221587826138cd565b5060345461225a907f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419073ffffffffffffffffffffffffffffffffffffffff16612d7a565b845160005b818110156122bd576122ad7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504160001b8883815181106122a0576122a06136a0565b6020026020010151612d7a565b6122b6816136cf565b905061225f565b506122e87ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab86612d7a565b835160005b8181101561233e5761232e7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab60001b8783815181106122a0576122a06136a0565b612337816136cf565b90506122ed565b506123897ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041612d84565b6123b37f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504187612d7a565b6123dd7f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c8a612d7a565b6124277f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50417f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c612d84565b6124717f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041612d84565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250291906139e7565b61250d90600a613b2a565b6037556036546125549073ffffffffffffffffffffffffffffffffffffffff168a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61258e565b5050801561258557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50505050505050565b80158061262e57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061262c91906135f4565b155b6126ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610770565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526106f09084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611a7f565b6060600061271f83600261363c565b61272a906002613707565b67ffffffffffffffff81111561274257612742613115565b6040519080825280601f01601f19166020018201604052801561276c576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106127a3576127a36136a0565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612806576128066136a0565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061284284600261363c565b61284d906001613707565b90505b60018111156128ea577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061288e5761288e6136a0565b1a60f81b8282815181106128a4576128a46136a0565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c936128e381613b39565b9050612850565b508315612953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610770565b9392505050565b60006129bc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612ddb9092919063ffffffff16565b8051909150156106f057808060200190518101906129da9190613b6e565b6106f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610770565b60008083612a74868861363c565b612a7e9190613829565b905063ee6b2800612a9563ffffffff8516826137b8565b612a9f908361363c565b612aa99190613829565b9050633b9aca006b033b2e3c9fd0803ce8000000612ad8836301e133806b033b2e3c9fd0803ce8000000612df2565b612ae291906137b8565b612aec9190613829565b9695505050505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612b6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9191906135f4565b612b9b9190613707565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150611e939085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611a7f565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff83811660248301526000919085169063dd62ed3e90604401602060405180830381865afa158015612c6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c8e91906135f4565b905081811015612d20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5361666545524332303a2064656372656173656420616c6c6f77616e6365206260448201527f656c6f77207a65726f00000000000000000000000000000000000000000000006064820152608401610770565b60405173ffffffffffffffffffffffffffffffffffffffff841660248201528282036044820181905290610cd79086907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611a7f565b6107838282611905565b60008281526001602081905260409091200154819060405184907fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff90600090a4600091825260016020819052604090922090910155565b6060612dea8484600085612f1d565b949350505050565b6000821580612dff575083155b15612e0b575080612953565b6000612e18600284613829565b90506000612e276001866137b8565b9050600060028611612e3a576000612e45565b612e456002876137b8565b905060008584612e558a8061363c565b612e5f9190613707565b612e699190613829565b905060008685612e798b8561363c565b612e839190613707565b612e8d9190613829565b90506000600283612e9e878c61363c565b612ea8919061363c565b612eb29190613829565b9050600060068386612ec4898e61363c565b612ece919061363c565b612ed8919061363c565b612ee29190613829565b90508082612ef08c8e61363c565b612efa908c613707565b612f049190613707565b612f0e9190613707565b9b9a5050505050505050505050565b606082471015612faf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610770565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612fd891906135d8565b60006040518083038185875af1925050503d8060008114613015576040519150601f19603f3d011682016040523d82523d6000602084013e61301a565b606091505b509150915061302b87838387613036565b979650505050505050565b606083156130cc5782516000036130c55773ffffffffffffffffffffffffffffffffffffffff85163b6130c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610770565b5081612dea565b612dea83838151156130e15781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107709190613323565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561318b5761318b613115565b604052919050565b600067ffffffffffffffff8311156131ad576131ad613115565b6131de60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601613144565b90508281528383830111156131f257600080fd5b828260208301376000602084830101529392505050565b6000806040838503121561321c57600080fd5b82359150602083013567ffffffffffffffff81111561323a57600080fd5b8301601f8101851361324b57600080fd5b61325a85823560208401613193565b9150509250929050565b73ffffffffffffffffffffffffffffffffffffffff8116811461328657600080fd5b50565b803561329481613264565b919050565b6000602082840312156132ab57600080fd5b813561295381613264565b6000602082840312156132c857600080fd5b5035919050565b600080604083850312156132e257600080fd5b8235915060208301356132f481613264565b809150509250929050565b60005b8381101561331a578181015183820152602001613302565b50506000910152565b60208152600082518060208401526133428160408501602087016132ff565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008083601f84011261338657600080fd5b50813567ffffffffffffffff81111561339e57600080fd5b6020830191508360208260051b85010111156133b957600080fd5b9250929050565b600080600080600080606087890312156133d957600080fd5b863567ffffffffffffffff808211156133f157600080fd5b6133fd8a838b01613374565b9098509650602089013591508082111561341657600080fd5b6134228a838b01613374565b9096509450604089013591508082111561343b57600080fd5b5061344889828a01613374565b979a9699509497509295939492505050565b6000806040838503121561346d57600080fd5b823561347881613264565b915060208301356132f481613264565b600082601f83011261349957600080fd5b8135602067ffffffffffffffff8211156134b5576134b5613115565b8160051b6134c4828201613144565b92835284810182019282810190878511156134de57600080fd5b83870192505b8483101561302b5782356134f781613264565b825291830191908301906134e4565b60008060008060008060c0878903121561351f57600080fd5b863561352a81613264565b9550602087013567ffffffffffffffff8082111561354757600080fd5b818901915089601f83011261355b57600080fd5b61356a8a833560208501613193565b9650604089013591508082111561358057600080fd5b61358c8a838b01613488565b955061359a60608a01613289565b945060808901359150808211156135b057600080fd5b506135bd89828a01613488565b9250506135cc60a08801613289565b90509295509295509295565b600082516135ea8184602087016132ff565b9190910192915050565b60006020828403121561360657600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417610a3957610a3961360d565b600181811c9082168061366757607f821691505b6020821081036106b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036137005761370061360d565b5060010190565b80820180821115610a3957610a3961360d565b60006020828403121561372c57600080fd5b815161295381613264565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161376f8160178501602088016132ff565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516137ac8160288401602088016132ff565b01602801949350505050565b81810381811115610a3957610a3961360d565b6000602082840312156137dd57600080fd5b815163ffffffff8116811461295357600080fd5b60007f800000000000000000000000000000000000000000000000000000000000000082036138225761382261360d565b5060000390565b60008261385f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60006020828403121561387657600080fd5b815180600b0b811461295357600080fd5b601f8211156106f057600081815260208120601f850160051c810160208610156138ae5750805b601f850160051c820191505b818110156105e0578281556001016138ba565b815167ffffffffffffffff8111156138e7576138e7613115565b6138fb816138f58454613653565b84613887565b602080601f83116001811461394e57600084156139185750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556105e0565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561399b5788860151825594840194600190910190840161397c565b50858210156139d757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156139f957600080fd5b815160ff8116811461295357600080fd5b600181815b80851115613a6357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613a4957613a4961360d565b80851615613a5657918102915b93841c9390800290613a0f565b509250929050565b600082613a7a57506001610a39565b81613a8757506000610a39565b8160018114613a9d5760028114613aa757613ac3565b6001915050610a39565b60ff841115613ab857613ab861360d565b50506001821b610a39565b5060208310610133831016604e8410600b8410161715613ae6575081810a610a39565b613af08383613a0a565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613b2257613b2261360d565b029392505050565b600061295360ff841683613a6b565b600081613b4857613b4861360d565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600060208284031215613b8057600080fd5b8151801515811461295357600080fdfea2646970667358221220109542d765fdea225dd59f6dcaa8772d28421b7c63dbcf19982cefe9a0682dc664736f6c63430008110033", + "nonce": "0x3c4", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "function": null, + "arguments": [ + "0x1F25FABC5Bf3F3a185cA051de22511A4e9b3e86A", + "0x1D941EF0D3Bba4ad67DBfBCeE5262F4CEE53A32b", + "0xecf609ae0000000000000000000000005577f822a979b7456ca08c5e311067d777e734c400000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001400000000000000000000000001111111254eeb25477b68fb85ed929f73a960582000000000000000000000000000000000000000000000000000000000000001045756c6572204c656e64657220444149000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe" + ], + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x193a72", + "value": "0x0", + "data": "0x6080604052604051620010bf380380620010bf8339810160408190526200002691620004e6565b828162000036828260006200009a565b5062000066905060017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104620005c6565b6000805160206200107883398151915214620000865762000086620005e8565b6200009182620000d7565b50505062000651565b620000a58362000132565b600082511180620000b35750805b15620000d257620000d083836200017460201b6200028c1760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f62000102620001a5565b604080516001600160a01b03928316815291841660208301520160405180910390a16200012f81620001de565b50565b6200013d8162000293565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200019c8383604051806060016040528060278152602001620010986027913962000347565b90505b92915050565b6000620001cf6000805160206200107883398151915260001b620003c660201b6200022e1760201c565b546001600160a01b0316919050565b6001600160a01b038116620002495760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b80620002726000805160206200107883398151915260001b620003c660201b6200022e1760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b620002a981620003c960201b620002b81760201c565b6200030d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000240565b80620002727f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b620003c660201b6200022e1760201c565b6060600080856001600160a01b031685604051620003669190620005fe565b600060405180830381855af49150503d8060008114620003a3576040519150601f19603f3d011682016040523d82523d6000602084013e620003a8565b606091505b509092509050620003bc86838387620003d8565b9695505050505050565b90565b6001600160a01b03163b151590565b606083156200044c57825160000362000444576001600160a01b0385163b620004445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000240565b508162000458565b62000458838362000460565b949350505050565b815115620004715781518083602001fd5b8060405162461bcd60e51b81526004016200024091906200061c565b80516001600160a01b0381168114620004a557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620004dd578181015183820152602001620004c3565b50506000910152565b600080600060608486031215620004fc57600080fd5b62000507846200048d565b925062000517602085016200048d565b60408501519092506001600160401b03808211156200053557600080fd5b818601915086601f8301126200054a57600080fd5b8151818111156200055f576200055f620004aa565b604051601f8201601f19908116603f011681019083821181831017156200058a576200058a620004aa565b81604052828152896020848701011115620005a457600080fd5b620005b7836020830160208801620004c0565b80955050505050509250925092565b818103818111156200019f57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052600160045260246000fd5b6000825162000612818460208701620004c0565b9190910192915050565b60208152600082518060208401526200063d816040850160208701620004c0565b601f01601f19169190910160400192915050565b610a1780620006616000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100a85780638f283970146100e6578063f851a440146101065761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61011b565b005b61006b61011b565b34801561008157600080fd5b5061006b61009036600461088b565b610135565b61006b6100a33660046108a6565b61017f565b3480156100b457600080fd5b506100bd6101f3565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b5061006b61010136600461088b565b610231565b34801561011257600080fd5b506100bd61025e565b6101236102d4565b61013361012e6103ab565b6103b5565b565b61013d6103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481604051806020016040528060008152506000610419565b50565b61017461011b565b6101876103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101eb576101e68383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610419915050565b505050565b6101e661011b565b60006101fd6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103ab565b905090565b61022e61011b565b90565b6102396103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481610444565b60006102686103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103d9565b60606102b183836040518060600160405280602781526020016109bb602791396104a5565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6102dc6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600061022161052a565b3660008037600080366000845af43d6000803e8080156103d4573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b61042283610552565b60008251118061042f5750805b156101e65761043e838361028c565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61046d6103d9565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a16101748161059f565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516104cf919061094d565b600060405180830381855af49150503d806000811461050a576040519150601f19603f3d011682016040523d82523d6000602084013e61050f565b606091505b5091509150610520868383876106ab565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103fd565b61055b81610753565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b73ffffffffffffffffffffffffffffffffffffffff8116610642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103a2565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b6060831561074157825160000361073a5773ffffffffffffffffffffffffffffffffffffffff85163b61073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103a2565b508161074b565b61074b838361081e565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff81163b6107f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016103a2565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610665565b81511561082e5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a29190610969565b803573ffffffffffffffffffffffffffffffffffffffff8116811461088657600080fd5b919050565b60006020828403121561089d57600080fd5b6102b182610862565b6000806000604084860312156108bb57600080fd5b6108c484610862565b9250602084013567ffffffffffffffff808211156108e157600080fd5b818601915086601f8301126108f557600080fd5b81358181111561090457600080fd5b87602082850101111561091657600080fd5b6020830194508093505050509250925092565b60005b8381101561094457818101518382015260200161092c565b50506000910152565b6000825161095f818460208701610929565b9190910192915050565b6020815260008251806020840152610988816040850160208701610929565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220910985b3eaa4496dd2573db8df24a04823c4165cdd5afb455cf182a9f53be9fb64736f6c63430008110033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65640000000000000000000000001f25fabc5bf3f3a185ca051de22511a4e9b3e86a0000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001a4ecf609ae0000000000000000000000005577f822a979b7456ca08c5e311067d777e734c400000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001400000000000000000000000001111111254eeb25477b68fb85ed929f73a960582000000000000000000000000000000000000000000000000000000000000001045756c6572204c656e64657220444149000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe00000000000000000000000000000000000000000000000000000000", + "nonce": "0x3c5", + "accessList": [] + }, + "additionalContracts": [] + } + ], + "receipts": [ + { + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0x42e646", + "gasUsed": "0x103c96", + "contractAddress": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "logs": [ + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x00000000000000000000000005e08e1bf31c1882822cc48d7d51d6fe49bca9c2" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x50", + "removed": false + }, + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d430", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x51", + "removed": false + }, + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c8", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x52", + "removed": false + }, + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe562", + "0x000000000000000000000000c9daabc677f3d1301006e723bd21c60be57a5915", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x53", + "removed": false + }, + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe562", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe562" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x54", + "removed": false + }, + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe562" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x55", + "removed": false + }, + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x56", + "removed": false + }, + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x57", + "removed": false + }, + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x58", + "removed": false + }, + { + "address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x0000000000000000000000005577f822a979b7456ca08c5e311067d777e734c4", + "0x000000000000000000000000c9daabc677f3d1301006e723bd21c60be57a5915" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x59", + "removed": false + }, + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x5a", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000004800000000800000000000000482000000000000000000000000000000000001000000000000000001000000000800000000000000000000000200040000020110000000000200008000003000000000000800000000000000000000012000000020000400000000000000800000000800000400000000000000000000200000000000000000000000000010100000002000000000000000200a04000020000000000000000000000000000000000020000000000001000000000081000000020020800000000000000020000000902000400000100000000000020000010040000002000000000000000000000000000000004000100000000040000", + "type": "0x2", + "effectiveGasPrice": "0x674f8c02f" + }, + { + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0x55bd06", + "gasUsed": "0x12d6c0", + "contractAddress": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "logs": [ + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000deee844c6992f36adac59cf38d1f790b2a0313e2" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x5b", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x000000000000000000000000c9daabc677f3d1301006e723bd21c60be57a5915", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x5c", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c8", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x5d", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x0000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d430", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x5e", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x5f", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x60", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x61", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d430", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x62", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c", + "0x0000000000000000000000005577f822a979b7456ca08c5e311067d777e734c4", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x63", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x64", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x65", + "removed": false + }, + { + "address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x0000000000000000000000006e97be3e5c6e7167287e208a32720068fd9a9e06", + "0x0000000000000000000000005577f822a979b7456ca08c5e311067d777e734c4" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x66", + "removed": false + }, + { + "address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x0000000000000000000000006e97be3e5c6e7167287e208a32720068fd9a9e06", + "0x0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e3643" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x67", + "removed": false + }, + { + "address": "0xc00e94Cb662C3520282E6f5717214004A7f26888", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x0000000000000000000000006e97be3e5c6e7167287e208a32720068fd9a9e06", + "0x0000000000000000000000001111111254eeb25477b68fb85ed929f73a960582" + ], + "data": "0x0000000000000000000000000000000000000000ffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x68", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x69", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000004800000000800002000000000482000000000000040000000000000000000080000000000000000001000080000800000000000000000000000200040080020100000080200000008000003000000000000801000000000000000000010000000028000400000000000000800000000800000400000000010000000000200000000000000000000000001000100000002200002000000200200a04000020000000000000000000000000004000000000000000000001000000800081000000420020000000000000000000000000902000400000100000000000020000010800000002000000400000080000000000800000004000100000000040000", + "type": "0x2", + "effectiveGasPrice": "0x674f8c02f" + }, + { + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0x6a7d4d", + "gasUsed": "0x14c047", + "contractAddress": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "logs": [ + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x00000000000000000000000014ba0b82f1940e35af39c364e8fa99408881ae30" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x6a", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x000000000000000000000000c9daabc677f3d1301006e723bd21c60be57a5915", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x6b", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c8", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x6c", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x0000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d430", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x6d", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x6e", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x6f", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x70", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d430", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x71", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c", + "0x0000000000000000000000005577f822a979b7456ca08c5e311067d777e734c4", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x72", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x73", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x74", + "removed": false + }, + { + "address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x00000000000000000000000053890a56d175fb8123cc1b430e8407aa20928792", + "0x0000000000000000000000005577f822a979b7456ca08c5e311067d777e734c4" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x75", + "removed": false + }, + { + "address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x00000000000000000000000053890a56d175fb8123cc1b430e8407aa20928792", + "0x0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a9" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x76", + "removed": false + }, + { + "address": "0x4da27a545c0c5B758a6BA100e3a049001de870f5", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x00000000000000000000000053890a56d175fb8123cc1b430e8407aa20928792", + "0x0000000000000000000000001111111254eeb25477b68fb85ed929f73a960582" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x77", + "removed": false + }, + { + "address": "0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x00000000000000000000000053890a56d175fb8123cc1b430e8407aa20928792", + "0x0000000000000000000000001111111254eeb25477b68fb85ed929f73a960582" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x78", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x79", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x000000048000000008000020000000004820000000000000002000000000000000000000000000000000000010000000008004000000000008000000002000420800201000000800000800080000030000000000008000000000000000000000100000000280004000000000000008880000008000004000000000000000000002000a0000000200000001000000000100000002000000000000000200a04200020000000000000000000000000004000000000000000000001000000000081000000020020000000000000000000000004902000400000100002000000020000010000000002000000400000000000100000000000004004100000000040000", + "type": "0x2", + "effectiveGasPrice": "0x674f8c02f" + }, + { + "transactionHash": "0x8b95d4edd036b79f10cad9c2670da9af4b8ac4fe6a51b47a0ac1e0c89ef46939", + "transactionIndex": "0x2e", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0x9dd0e4", + "gasUsed": "0x335397", + "contractAddress": "0x1F25FABC5Bf3F3a185cA051de22511A4e9b3e86A", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x674f8c02f" + }, + { + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0xb138ed", + "gasUsed": "0x136809", + "contractAddress": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "logs": [ + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x0000000000000000000000001f25fabc5bf3f3a185ca051de22511a4e9b3e86a" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x7a", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x000000000000000000000000c9daabc677f3d1301006e723bd21c60be57a5915", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x7b", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c8", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x7c", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x0000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d430", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x7d", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x7e", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x7f", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x80", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d430", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x81", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c", + "0x0000000000000000000000005577f822a979b7456ca08c5e311067d777e734c4", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x82", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x83", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x84", + "removed": false + }, + { + "address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000ced32e95c971610adf264ec8f619fcbf242d64d7", + "0x0000000000000000000000005577f822a979b7456ca08c5e311067d777e734c4" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x85", + "removed": false + }, + { + "address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000ced32e95c971610adf264ec8f619fcbf242d64d7", + "0x00000000000000000000000027182842e098f60e3d576794a5bffb0777e025d3" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x86", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x87", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000004800000000800002000000000482000000000000000000000000000000800000000000000000000001000000000800000000000000000000000600040080020100000000000000028000003000000000000800000000000000000000010000000028000402000000000000800000000800004400000020000000000000200000000000001000000000000000100004002000000000000000200a04000020000004000000000000000000000000000000000000000001000000000081000000020020000000000000000000000000902000400000100000000000020000010000000002000402020000000000000000000000004000100000000040000", + "type": "0x2", + "effectiveGasPrice": "0x674f8c02f" + } + ], + "libraries": [], + "pending": [], + "path": "/Users/gnervo/Documents/Angle/strategies-dev/broadcast/MigrationOptimizerAPRDAI.s.sol/1/run-latest.json", + "returns": {}, + "timestamp": 1675949233, + "chain": 1, + "multi": false, + "commit": "1d1272f" +} \ No newline at end of file diff --git a/broadcast/MigrationOptimizerAPRDAI.s.sol/1/run-1675949322.json b/broadcast/MigrationOptimizerAPRDAI.s.sol/1/run-1675949322.json new file mode 100644 index 0000000..2e2a6de --- /dev/null +++ b/broadcast/MigrationOptimizerAPRDAI.s.sol/1/run-1675949322.json @@ -0,0 +1,1075 @@ +{ + "transactions": [ + { + "hash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "function": null, + "arguments": [ + "0x05E08E1BF31C1882822Cc48D7d51d6fe49Bca9c2", + "0x1D941EF0D3Bba4ad67DBfBCeE5262F4CEE53A32b", + "0xe6bfbfd8000000000000000000000000c9daabc677f3d1301006e723bd21c60be57a5915000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe" + ], + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x151b8f", + "value": "0x0", + "data": "0x6080604052604051620010bf380380620010bf8339810160408190526200002691620004e6565b828162000036828260006200009a565b5062000066905060017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104620005c6565b6000805160206200107883398151915214620000865762000086620005e8565b6200009182620000d7565b50505062000651565b620000a58362000132565b600082511180620000b35750805b15620000d257620000d083836200017460201b6200028c1760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f62000102620001a5565b604080516001600160a01b03928316815291841660208301520160405180910390a16200012f81620001de565b50565b6200013d8162000293565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200019c8383604051806060016040528060278152602001620010986027913962000347565b90505b92915050565b6000620001cf6000805160206200107883398151915260001b620003c660201b6200022e1760201c565b546001600160a01b0316919050565b6001600160a01b038116620002495760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b80620002726000805160206200107883398151915260001b620003c660201b6200022e1760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b620002a981620003c960201b620002b81760201c565b6200030d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000240565b80620002727f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b620003c660201b6200022e1760201c565b6060600080856001600160a01b031685604051620003669190620005fe565b600060405180830381855af49150503d8060008114620003a3576040519150601f19603f3d011682016040523d82523d6000602084013e620003a8565b606091505b509092509050620003bc86838387620003d8565b9695505050505050565b90565b6001600160a01b03163b151590565b606083156200044c57825160000362000444576001600160a01b0385163b620004445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000240565b508162000458565b62000458838362000460565b949350505050565b815115620004715781518083602001fd5b8060405162461bcd60e51b81526004016200024091906200061c565b80516001600160a01b0381168114620004a557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620004dd578181015183820152602001620004c3565b50506000910152565b600080600060608486031215620004fc57600080fd5b62000507846200048d565b925062000517602085016200048d565b60408501519092506001600160401b03808211156200053557600080fd5b818601915086601f8301126200054a57600080fd5b8151818111156200055f576200055f620004aa565b604051601f8201601f19908116603f011681019083821181831017156200058a576200058a620004aa565b81604052828152896020848701011115620005a457600080fd5b620005b7836020830160208801620004c0565b80955050505050509250925092565b818103818111156200019f57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052600160045260246000fd5b6000825162000612818460208701620004c0565b9190910192915050565b60208152600082518060208401526200063d816040850160208701620004c0565b601f01601f19169190910160400192915050565b610a1780620006616000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100a85780638f283970146100e6578063f851a440146101065761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61011b565b005b61006b61011b565b34801561008157600080fd5b5061006b61009036600461088b565b610135565b61006b6100a33660046108a6565b61017f565b3480156100b457600080fd5b506100bd6101f3565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b5061006b61010136600461088b565b610231565b34801561011257600080fd5b506100bd61025e565b6101236102d4565b61013361012e6103ab565b6103b5565b565b61013d6103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481604051806020016040528060008152506000610419565b50565b61017461011b565b6101876103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101eb576101e68383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610419915050565b505050565b6101e661011b565b60006101fd6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103ab565b905090565b61022e61011b565b90565b6102396103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481610444565b60006102686103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103d9565b60606102b183836040518060600160405280602781526020016109bb602791396104a5565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6102dc6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600061022161052a565b3660008037600080366000845af43d6000803e8080156103d4573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b61042283610552565b60008251118061042f5750805b156101e65761043e838361028c565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61046d6103d9565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a16101748161059f565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516104cf919061094d565b600060405180830381855af49150503d806000811461050a576040519150601f19603f3d011682016040523d82523d6000602084013e61050f565b606091505b5091509150610520868383876106ab565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103fd565b61055b81610753565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b73ffffffffffffffffffffffffffffffffffffffff8116610642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103a2565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b6060831561074157825160000361073a5773ffffffffffffffffffffffffffffffffffffffff85163b61073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103a2565b508161074b565b61074b838361081e565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff81163b6107f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016103a2565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610665565b81511561082e5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a29190610969565b803573ffffffffffffffffffffffffffffffffffffffff8116811461088657600080fd5b919050565b60006020828403121561089d57600080fd5b6102b182610862565b6000806000604084860312156108bb57600080fd5b6108c484610862565b9250602084013567ffffffffffffffff808211156108e157600080fd5b818601915086601f8301126108f557600080fd5b81358181111561090457600080fd5b87602082850101111561091657600080fd5b6020830194508093505050509250925092565b60005b8381101561094457818101518382015260200161092c565b50506000910152565b6000825161095f818460208701610929565b9190910192915050565b6020815260008251806020840152610988816040850160208701610929565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220910985b3eaa4496dd2573db8df24a04823c4165cdd5afb455cf182a9f53be9fb64736f6c63430008110033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656400000000000000000000000005e08e1bf31c1882822cc48d7d51d6fe49bca9c20000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e4e6bfbfd8000000000000000000000000c9daabc677f3d1301006e723bd21c60be57a5915000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe00000000000000000000000000000000000000000000000000000000", + "nonce": "0x3c1", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "function": null, + "arguments": [ + "0xDeEe844C6992F36ADAC59cF38d1F790B2a0313e2", + "0x1D941EF0D3Bba4ad67DBfBCeE5262F4CEE53A32b", + "0x804869910000000000000000000000005577f822a979b7456ca08c5e311067d777e734c400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e364300000000000000000000000000000000000000000000000000000000000001200000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001600000000000000000000000001111111254eeb25477b68fb85ed929f73a9605820000000000000000000000000000000000000000000000000000000000000016436f6d706f756e64204c656e64657220444149207632000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe" + ], + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x187d93", + "value": "0x0", + "data": "0x6080604052604051620010bf380380620010bf8339810160408190526200002691620004e6565b828162000036828260006200009a565b5062000066905060017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104620005c6565b6000805160206200107883398151915214620000865762000086620005e8565b6200009182620000d7565b50505062000651565b620000a58362000132565b600082511180620000b35750805b15620000d257620000d083836200017460201b6200028c1760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f62000102620001a5565b604080516001600160a01b03928316815291841660208301520160405180910390a16200012f81620001de565b50565b6200013d8162000293565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200019c8383604051806060016040528060278152602001620010986027913962000347565b90505b92915050565b6000620001cf6000805160206200107883398151915260001b620003c660201b6200022e1760201c565b546001600160a01b0316919050565b6001600160a01b038116620002495760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b80620002726000805160206200107883398151915260001b620003c660201b6200022e1760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b620002a981620003c960201b620002b81760201c565b6200030d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000240565b80620002727f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b620003c660201b6200022e1760201c565b6060600080856001600160a01b031685604051620003669190620005fe565b600060405180830381855af49150503d8060008114620003a3576040519150601f19603f3d011682016040523d82523d6000602084013e620003a8565b606091505b509092509050620003bc86838387620003d8565b9695505050505050565b90565b6001600160a01b03163b151590565b606083156200044c57825160000362000444576001600160a01b0385163b620004445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000240565b508162000458565b62000458838362000460565b949350505050565b815115620004715781518083602001fd5b8060405162461bcd60e51b81526004016200024091906200061c565b80516001600160a01b0381168114620004a557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620004dd578181015183820152602001620004c3565b50506000910152565b600080600060608486031215620004fc57600080fd5b62000507846200048d565b925062000517602085016200048d565b60408501519092506001600160401b03808211156200053557600080fd5b818601915086601f8301126200054a57600080fd5b8151818111156200055f576200055f620004aa565b604051601f8201601f19908116603f011681019083821181831017156200058a576200058a620004aa565b81604052828152896020848701011115620005a457600080fd5b620005b7836020830160208801620004c0565b80955050505050509250925092565b818103818111156200019f57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052600160045260246000fd5b6000825162000612818460208701620004c0565b9190910192915050565b60208152600082518060208401526200063d816040850160208701620004c0565b601f01601f19169190910160400192915050565b610a1780620006616000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100a85780638f283970146100e6578063f851a440146101065761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61011b565b005b61006b61011b565b34801561008157600080fd5b5061006b61009036600461088b565b610135565b61006b6100a33660046108a6565b61017f565b3480156100b457600080fd5b506100bd6101f3565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b5061006b61010136600461088b565b610231565b34801561011257600080fd5b506100bd61025e565b6101236102d4565b61013361012e6103ab565b6103b5565b565b61013d6103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481604051806020016040528060008152506000610419565b50565b61017461011b565b6101876103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101eb576101e68383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610419915050565b505050565b6101e661011b565b60006101fd6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103ab565b905090565b61022e61011b565b90565b6102396103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481610444565b60006102686103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103d9565b60606102b183836040518060600160405280602781526020016109bb602791396104a5565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6102dc6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600061022161052a565b3660008037600080366000845af43d6000803e8080156103d4573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b61042283610552565b60008251118061042f5750805b156101e65761043e838361028c565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61046d6103d9565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a16101748161059f565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516104cf919061094d565b600060405180830381855af49150503d806000811461050a576040519150601f19603f3d011682016040523d82523d6000602084013e61050f565b606091505b5091509150610520868383876106ab565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103fd565b61055b81610753565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b73ffffffffffffffffffffffffffffffffffffffff8116610642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103a2565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b6060831561074157825160000361073a5773ffffffffffffffffffffffffffffffffffffffff85163b61073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103a2565b508161074b565b61074b838361081e565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff81163b6107f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016103a2565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610665565b81511561082e5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a29190610969565b803573ffffffffffffffffffffffffffffffffffffffff8116811461088657600080fd5b919050565b60006020828403121561089d57600080fd5b6102b182610862565b6000806000604084860312156108bb57600080fd5b6108c484610862565b9250602084013567ffffffffffffffff808211156108e157600080fd5b818601915086601f8301126108f557600080fd5b81358181111561090457600080fd5b87602082850101111561091657600080fd5b6020830194508093505050509250925092565b60005b8381101561094457818101518382015260200161092c565b50506000910152565b6000825161095f818460208701610929565b9190910192915050565b6020815260008251806020840152610988816040850160208701610929565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220910985b3eaa4496dd2573db8df24a04823c4165cdd5afb455cf182a9f53be9fb64736f6c63430008110033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564000000000000000000000000deee844c6992f36adac59cf38d1f790b2a0313e20000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c4804869910000000000000000000000005577f822a979b7456ca08c5e311067d777e734c400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e364300000000000000000000000000000000000000000000000000000000000001200000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001600000000000000000000000001111111254eeb25477b68fb85ed929f73a9605820000000000000000000000000000000000000000000000000000000000000016436f6d706f756e64204c656e64657220444149207632000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe00000000000000000000000000000000000000000000000000000000", + "nonce": "0x3c2", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "function": null, + "arguments": [ + "0x14bA0B82f1940e35Af39c364e8Fa99408881Ae30", + "0x1D941EF0D3Bba4ad67DBfBCeE5262F4CEE53A32b", + "0x67f52b630000000000000000000000005577f822a979b7456ca08c5e311067d777e734c400000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001600000000000000000000000001111111254eeb25477b68fb85ed929f73a960582000000000000000000000000000000000000000000000000000000000000001241617665204c656e6465722044414920763200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe" + ], + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x1af9f5", + "value": "0x0", + "data": "0x6080604052604051620010bf380380620010bf8339810160408190526200002691620004e6565b828162000036828260006200009a565b5062000066905060017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104620005c6565b6000805160206200107883398151915214620000865762000086620005e8565b6200009182620000d7565b50505062000651565b620000a58362000132565b600082511180620000b35750805b15620000d257620000d083836200017460201b6200028c1760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f62000102620001a5565b604080516001600160a01b03928316815291841660208301520160405180910390a16200012f81620001de565b50565b6200013d8162000293565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200019c8383604051806060016040528060278152602001620010986027913962000347565b90505b92915050565b6000620001cf6000805160206200107883398151915260001b620003c660201b6200022e1760201c565b546001600160a01b0316919050565b6001600160a01b038116620002495760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b80620002726000805160206200107883398151915260001b620003c660201b6200022e1760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b620002a981620003c960201b620002b81760201c565b6200030d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000240565b80620002727f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b620003c660201b6200022e1760201c565b6060600080856001600160a01b031685604051620003669190620005fe565b600060405180830381855af49150503d8060008114620003a3576040519150601f19603f3d011682016040523d82523d6000602084013e620003a8565b606091505b509092509050620003bc86838387620003d8565b9695505050505050565b90565b6001600160a01b03163b151590565b606083156200044c57825160000362000444576001600160a01b0385163b620004445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000240565b508162000458565b62000458838362000460565b949350505050565b815115620004715781518083602001fd5b8060405162461bcd60e51b81526004016200024091906200061c565b80516001600160a01b0381168114620004a557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620004dd578181015183820152602001620004c3565b50506000910152565b600080600060608486031215620004fc57600080fd5b62000507846200048d565b925062000517602085016200048d565b60408501519092506001600160401b03808211156200053557600080fd5b818601915086601f8301126200054a57600080fd5b8151818111156200055f576200055f620004aa565b604051601f8201601f19908116603f011681019083821181831017156200058a576200058a620004aa565b81604052828152896020848701011115620005a457600080fd5b620005b7836020830160208801620004c0565b80955050505050509250925092565b818103818111156200019f57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052600160045260246000fd5b6000825162000612818460208701620004c0565b9190910192915050565b60208152600082518060208401526200063d816040850160208701620004c0565b601f01601f19169190910160400192915050565b610a1780620006616000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100a85780638f283970146100e6578063f851a440146101065761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61011b565b005b61006b61011b565b34801561008157600080fd5b5061006b61009036600461088b565b610135565b61006b6100a33660046108a6565b61017f565b3480156100b457600080fd5b506100bd6101f3565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b5061006b61010136600461088b565b610231565b34801561011257600080fd5b506100bd61025e565b6101236102d4565b61013361012e6103ab565b6103b5565b565b61013d6103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481604051806020016040528060008152506000610419565b50565b61017461011b565b6101876103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101eb576101e68383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610419915050565b505050565b6101e661011b565b60006101fd6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103ab565b905090565b61022e61011b565b90565b6102396103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481610444565b60006102686103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103d9565b60606102b183836040518060600160405280602781526020016109bb602791396104a5565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6102dc6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600061022161052a565b3660008037600080366000845af43d6000803e8080156103d4573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b61042283610552565b60008251118061042f5750805b156101e65761043e838361028c565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61046d6103d9565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a16101748161059f565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516104cf919061094d565b600060405180830381855af49150503d806000811461050a576040519150601f19603f3d011682016040523d82523d6000602084013e61050f565b606091505b5091509150610520868383876106ab565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103fd565b61055b81610753565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b73ffffffffffffffffffffffffffffffffffffffff8116610642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103a2565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b6060831561074157825160000361073a5773ffffffffffffffffffffffffffffffffffffffff85163b61073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103a2565b508161074b565b61074b838361081e565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff81163b6107f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016103a2565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610665565b81511561082e5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a29190610969565b803573ffffffffffffffffffffffffffffffffffffffff8116811461088657600080fd5b919050565b60006020828403121561089d57600080fd5b6102b182610862565b6000806000604084860312156108bb57600080fd5b6108c484610862565b9250602084013567ffffffffffffffff808211156108e157600080fd5b818601915086601f8301126108f557600080fd5b81358181111561090457600080fd5b87602082850101111561091657600080fd5b6020830194508093505050509250925092565b60005b8381101561094457818101518382015260200161092c565b50506000910152565b6000825161095f818460208701610929565b9190910192915050565b6020815260008251806020840152610988816040850160208701610929565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220910985b3eaa4496dd2573db8df24a04823c4165cdd5afb455cf182a9f53be9fb64736f6c63430008110033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656400000000000000000000000014ba0b82f1940e35af39c364e8fa99408881ae300000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c467f52b630000000000000000000000005577f822a979b7456ca08c5e311067d777e734c400000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001600000000000000000000000001111111254eeb25477b68fb85ed929f73a960582000000000000000000000000000000000000000000000000000000000000001241617665204c656e6465722044414920763200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe00000000000000000000000000000000000000000000000000000000", + "nonce": "0x3c3", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0x8b95d4edd036b79f10cad9c2670da9af4b8ac4fe6a51b47a0ac1e0c89ef46939", + "transactionType": "CREATE", + "contractName": "GenericEuler", + "contractAddress": "0x1F25FABC5Bf3F3a185cA051de22511A4e9b3e86A", + "function": null, + "arguments": null, + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x42b977", + "value": "0x0", + "data": "0x60806040523480156200001157600080fd5b50600054610100900460ff166200002f5760005460ff161562000039565b62000039620000de565b620000a15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b600054610100900460ff16158015620000c4576000805461ffff19166101011790555b8015620000d7576000805461ff00191690555b5062000102565b6000620000f630620000fc60201b620011241760201c565b15905090565b3b151590565b613bc680620001126000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c8063853828b61161010f578063b82c4dc1116100a2578063d0e30db011610071578063d0e30db014610491578063d547741f14610499578063dc4c90d3146104ac578063ecf609ae146104cc57600080fd5b8063b82c4dc11461045b578063b8dc491b1461046e578063c1590cd714610481578063c6afba3c1461048957600080fd5b8063a217fddf116100de578063a217fddf146103e3578063a73e0f3b146103eb578063a7d385e214610428578063a8c62e761461043b57600080fd5b8063853828b6146103935780638b2021761461039b57806391d14854146103b0578063953d9cf1146103c357600080fd5b80632e779525116101875780635312ea8e116101565780635312ea8e1461033957806357ded9c91461034c578063580b7c2e146103545780635be9b2d31461037b57600080fd5b80632e779525146102e45780632f2ff15d146102ec578063364bc15a146102ff57806336568abe1461032657600080fd5b80631f1fcd51116101c35780631f1fcd5114610241578063248a9ca31461028657806324ea54f4146102aa5780632e1a7d4d146102d157600080fd5b806305b41934146101f55780630948c0b61461020a5780630b6d1d171461021d578063116ac4a314610239575b600080fd5b610208610203366004613209565b6104df565b005b610208610218366004613299565b6105e8565b61022660375481565b6040519081526020015b60405180910390f35b61022661065b565b6036546102619073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610230565b6102266102943660046132b6565b6000908152600160208190526040909120015490565b6102267f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504181565b6102266102df3660046132b6565b610680565b6102086106bf565b6102086102fa3660046132cf565b6106c9565b6102267ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab81565b6102086103343660046132cf565b6106f5565b6102086103473660046132b6565b610787565b6102266108f9565b6102267f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c81565b610383610908565b6040519015158152602001610230565b610383610927565b6103a3610977565b6040516102309190613323565b6103836103be3660046132cf565b610a05565b6067546102619073ffffffffffffffffffffffffffffffffffffffff1681565b610226600081565b6067546104139074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610230565b6102266104363660046132b6565b610a3f565b6035546102619073ffffffffffffffffffffffffffffffffffffffff1681565b6102086104693660046133c0565b610a4a565b61020861047c36600461345a565b610b51565b610226610cde565b610226610ce8565b610208610d8d565b6102086104a73660046132cf565b610ed3565b6034546102619073ffffffffffffffffffffffffffffffffffffffff1681565b6102086104da366004613506565b610efa565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab61050a813361112a565b603854604051600091829173ffffffffffffffffffffffffffffffffffffffff909116906105399086906135d8565b6000604051808303816000865af19150503d8060008114610576576040519150601f19603f3d011682016040523d82523d6000602084013e61057b565b606091505b50915091508161058e5761058e816111d3565b6000818060200190518101906105a491906135f4565b9050858110156105e0576040517f22313ae900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610613813361112a565b50603880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600080610666611214565b9050610670611220565b61067a908261363c565b91505090565b60007f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c6106ad813361112a565b6106b6836112c6565b91505b50919050565b6106c76116cd565b565b600082815260016020819052604090912001546106e6813361112a565b6106f08383611905565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610779576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f373100000000000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b610783828261199b565b5050565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50416107b2813361112a565b6067546040517f441a3e70000000000000000000000000000000000000000000000000000000008152600060048201526024810184905273ffffffffffffffffffffffffffffffffffffffff9091169063441a3e7090604401600060405180830381600087803b15801561082557600080fd5b505af1158015610839573d6000803e3d6000fd5b50506034546036546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152610783945073ffffffffffffffffffffffffffffffffffffffff92831693509116906370a0823190602401602060405180830381865afa1580156108b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d991906135f4565b60365473ffffffffffffffffffffffffffffffffffffffff169190611a2d565b6000610903611214565b905090565b6000603754600a610919919061363c565b610921611220565b11905090565b60007f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c610954813361112a565b600061095e611220565b9050600061096b826112c6565b91909110159250505090565b6033805461098490613653565b80601f01602080910402602001604051908101604052809291908181526020018280546109b090613653565b80156109fd5780601f106109d2576101008083540402835291602001916109fd565b820191906000526020600020905b8154815290600101906020018083116109e057829003601f168201915b505050505081565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff165b92915050565b6000610a3982611b01565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610a75813361112a565b8584141580610a845750858214155b15610abb576040517f46282e8d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8560005b81811015610b4657610b36898983818110610adc57610adc6136a0565b9050602002016020810190610af19190613299565b888884818110610b0357610b036136a0565b9050602002016020810190610b189190613299565b878785818110610b2a57610b2a6136a0565b90506020020135611d8a565b610b3f816136cf565b9050610abf565b505050505050505050565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610b7c813361112a565b6000610b86611e99565b805190915060005b81811015610c2457828181518110610ba857610ba86136a0565b602002602001015173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603610c14576040517f093e1cdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c1d816136cf565b9050610b8e565b506040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152610cd790859073ffffffffffffffffffffffffffffffffffffffff8816906370a0823190602401602060405180830381865afa158015610c95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb991906135f4565b73ffffffffffffffffffffffffffffffffffffffff88169190611a2d565b5050505050565b6000610903611220565b600080806067546040517f3af9e669000000000000000000000000000000000000000000000000000000008152306004820152919250829173ffffffffffffffffffffffffffffffffffffffff90911690633af9e66990602401602060405180830381865afa158015610d5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8391906135f4565b61067a9190613707565b7f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c610db8813361112a565b6036546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610e27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4b91906135f4565b6067546040517fe2bbb158000000000000000000000000000000000000000000000000000000008152600060048201526024810183905291925073ffffffffffffffffffffffffffffffffffffffff169063e2bbb15890604401600060405180830381600087803b158015610ebf57600080fd5b505af11580156105e0573d6000803e3d6000fd5b60008281526001602081905260409091200154610ef0813361112a565b6106f0838361199b565b610f08868686868686611f53565b6036546040517f8948874900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152733520d5a913427e6f0d6a83e07ccd4a4da316e4d390638948874990602401602060405180830381865afa158015610f8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fae919061371a565b606780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9283161790556036546040517f1b30058200000000000000000000000000000000000000000000000000000000815291166004820152733520d5a913427e6f0d6a83e07ccd4a4da316e4d390631b30058290602401602060405180830381865afa15801561105b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107f919061371a565b606680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169190911790556110cc6116cd565b6036546105e09073ffffffffffffffffffffffffffffffffffffffff167327182842e098f60e3d576794a5bffb0777e025d37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61258e565b3b151590565b6111348282610a05565b610783576111598173ffffffffffffffffffffffffffffffffffffffff166014612710565b611164836020612710565b604051602001611175929190613737565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261077091600401613323565b8051156111e257805181602001fd5b6040517fc76d51a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006109036000611b01565b600061122a610ce8565b6036546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015611298573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bc91906135f4565b6109039190613707565b600080806067546040517f3af9e66900000000000000000000000000000000000000000000000000000000815230600482015291925060009173ffffffffffffffffffffffffffffffffffffffff90911690633af9e66990602401602060405180830381865afa15801561133e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136291906135f4565b6036546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291925060009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa1580156113d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113fa91906135f4565b90506000816114098486613707565b6114139190613707565b905080861115611421578095505b85821061145c576035546036546114529173ffffffffffffffffffffffffffffffffffffffff918216911688611a2d565b5093949350505050565b6036546040517f70a082310000000000000000000000000000000000000000000000000000000081527327182842e098f60e3d576794a5bffb0777e025d3600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156114df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150391906135f4565b9050600181111561160357600061151a84896137b8565b905060008282116115575761152f8587613707565b821161153c576000611550565b6115468587613707565b61155090836137b8565b9050611575565b85831161156557600061156f565b61156f86846137b8565b90508291505b6067546040517f441a3e70000000000000000000000000000000000000000000000000000000008152600060048201526024810184905273ffffffffffffffffffffffffffffffffffffffff9091169063441a3e7090604401600060405180830381600087803b1580156115e857600080fd5b505af11580156115fc573d6000803e3d6000fd5b5050505050505b6036546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015611671573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169591906135f4565b6035546036549194506116c29173ffffffffffffffffffffffffffffffffffffffff908116911685611a2d565b509095945050505050565b6036546040517fb409dd9b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152600090733520d5a913427e6f0d6a83e07ccd4a4da316e4d39063b409dd9b90602401602060405180830381865afa158015611752573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177691906135f4565b6040517fcab65f01000000000000000000000000000000000000000000000000000000008152600481018290529091506000907327182842e098f60e3d576794a5bffb0777e025d39063cab65f0190602401602060405180830381865afa1580156117e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611809919061371a565b606580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116919091179091556036546040517fb74b1ed500000000000000000000000000000000000000000000000000000000815291166004820152909150733520d5a913427e6f0d6a83e07ccd4a4da316e4d39063b74b1ed590602401602060405180830381865afa1580156118bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e191906137cb565b606760146101000a81548163ffffffff021916908363ffffffff1602179055505050565b61190f8282610a05565b61078357600082815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616808652925280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6119a58282610a05565b1561078357600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526106f09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261295a565b600080606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9591906135f4565b90506000606760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fea61faa6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c2a91906135f4565b905060008412611c4557611c3e8482613707565b9050611c5b565b611c4e846137f1565b611c5890826137b8565b90505b60008115611d76576000670de0b6b3a764000083611c7d63ffffffff8361363c565b611c87908761363c565b611c919190613829565b611c9b9190613829565b6065546036546040517fd50c08f800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015263ffffffff8416602482015292935060009291169063d50c08f890604401602060405180830381865afa158015611d1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d439190613864565b6bffffffffffffffffffffffff169050611d71818686606760149054906101000a900463ffffffff16612a66565b925050505b611d81600082613707565b95945050505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff83811660248301526000919085169063dd62ed3e90604401602060405180830381865afa158015611e00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2491906135f4565b905081811015611e5f57611e5a83611e3c83856137b8565b73ffffffffffffffffffffffffffffffffffffffff87169190612af6565b611e93565b81811115611e9357611e9383611e7584846137b8565b73ffffffffffffffffffffffffffffffffffffffff87169190612bf4565b50505050565b604080516002808252606080830184529260009291906020830190803683375050603654825192935073ffffffffffffffffffffffffffffffffffffffff1691839150600090611eeb57611eeb6136a0565b73ffffffffffffffffffffffffffffffffffffffff9283166020918202929092010152606754825191169082906001908110611f2957611f296136a0565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152919050565b600054610100900460ff16611f6e5760005460ff1615611f72565b303b155b611ffe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610770565b600054610100900460ff1615801561203d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b6038805473ffffffffffffffffffffffffffffffffffffffff8085167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560358054928a169290911682179055604080517fdc4c90d3000000000000000000000000000000000000000000000000000000008152905163dc4c90d3916004808201926020929091908290030181865afa1580156120e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612108919061371a565b603480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169182179055604080517ffc0c546a000000000000000000000000000000000000000000000000000000008152905163fc0c546a916004808201926020929091908290030181865afa1580156121a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c4919061371a565b603680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055603361221587826138cd565b5060345461225a907f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419073ffffffffffffffffffffffffffffffffffffffff16612d7a565b845160005b818110156122bd576122ad7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504160001b8883815181106122a0576122a06136a0565b6020026020010151612d7a565b6122b6816136cf565b905061225f565b506122e87ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab86612d7a565b835160005b8181101561233e5761232e7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab60001b8783815181106122a0576122a06136a0565b612337816136cf565b90506122ed565b506123897ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041612d84565b6123b37f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504187612d7a565b6123dd7f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c8a612d7a565b6124277f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50417f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c612d84565b6124717f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041612d84565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250291906139e7565b61250d90600a613b2a565b6037556036546125549073ffffffffffffffffffffffffffffffffffffffff168a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61258e565b5050801561258557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50505050505050565b80158061262e57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061262c91906135f4565b155b6126ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610770565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526106f09084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611a7f565b6060600061271f83600261363c565b61272a906002613707565b67ffffffffffffffff81111561274257612742613115565b6040519080825280601f01601f19166020018201604052801561276c576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106127a3576127a36136a0565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612806576128066136a0565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061284284600261363c565b61284d906001613707565b90505b60018111156128ea577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061288e5761288e6136a0565b1a60f81b8282815181106128a4576128a46136a0565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c936128e381613b39565b9050612850565b508315612953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610770565b9392505050565b60006129bc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612ddb9092919063ffffffff16565b8051909150156106f057808060200190518101906129da9190613b6e565b6106f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610770565b60008083612a74868861363c565b612a7e9190613829565b905063ee6b2800612a9563ffffffff8516826137b8565b612a9f908361363c565b612aa99190613829565b9050633b9aca006b033b2e3c9fd0803ce8000000612ad8836301e133806b033b2e3c9fd0803ce8000000612df2565b612ae291906137b8565b612aec9190613829565b9695505050505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612b6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9191906135f4565b612b9b9190613707565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150611e939085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611a7f565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff83811660248301526000919085169063dd62ed3e90604401602060405180830381865afa158015612c6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c8e91906135f4565b905081811015612d20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5361666545524332303a2064656372656173656420616c6c6f77616e6365206260448201527f656c6f77207a65726f00000000000000000000000000000000000000000000006064820152608401610770565b60405173ffffffffffffffffffffffffffffffffffffffff841660248201528282036044820181905290610cd79086907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611a7f565b6107838282611905565b60008281526001602081905260409091200154819060405184907fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff90600090a4600091825260016020819052604090922090910155565b6060612dea8484600085612f1d565b949350505050565b6000821580612dff575083155b15612e0b575080612953565b6000612e18600284613829565b90506000612e276001866137b8565b9050600060028611612e3a576000612e45565b612e456002876137b8565b905060008584612e558a8061363c565b612e5f9190613707565b612e699190613829565b905060008685612e798b8561363c565b612e839190613707565b612e8d9190613829565b90506000600283612e9e878c61363c565b612ea8919061363c565b612eb29190613829565b9050600060068386612ec4898e61363c565b612ece919061363c565b612ed8919061363c565b612ee29190613829565b90508082612ef08c8e61363c565b612efa908c613707565b612f049190613707565b612f0e9190613707565b9b9a5050505050505050505050565b606082471015612faf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610770565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612fd891906135d8565b60006040518083038185875af1925050503d8060008114613015576040519150601f19603f3d011682016040523d82523d6000602084013e61301a565b606091505b509150915061302b87838387613036565b979650505050505050565b606083156130cc5782516000036130c55773ffffffffffffffffffffffffffffffffffffffff85163b6130c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610770565b5081612dea565b612dea83838151156130e15781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107709190613323565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561318b5761318b613115565b604052919050565b600067ffffffffffffffff8311156131ad576131ad613115565b6131de60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601613144565b90508281528383830111156131f257600080fd5b828260208301376000602084830101529392505050565b6000806040838503121561321c57600080fd5b82359150602083013567ffffffffffffffff81111561323a57600080fd5b8301601f8101851361324b57600080fd5b61325a85823560208401613193565b9150509250929050565b73ffffffffffffffffffffffffffffffffffffffff8116811461328657600080fd5b50565b803561329481613264565b919050565b6000602082840312156132ab57600080fd5b813561295381613264565b6000602082840312156132c857600080fd5b5035919050565b600080604083850312156132e257600080fd5b8235915060208301356132f481613264565b809150509250929050565b60005b8381101561331a578181015183820152602001613302565b50506000910152565b60208152600082518060208401526133428160408501602087016132ff565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008083601f84011261338657600080fd5b50813567ffffffffffffffff81111561339e57600080fd5b6020830191508360208260051b85010111156133b957600080fd5b9250929050565b600080600080600080606087890312156133d957600080fd5b863567ffffffffffffffff808211156133f157600080fd5b6133fd8a838b01613374565b9098509650602089013591508082111561341657600080fd5b6134228a838b01613374565b9096509450604089013591508082111561343b57600080fd5b5061344889828a01613374565b979a9699509497509295939492505050565b6000806040838503121561346d57600080fd5b823561347881613264565b915060208301356132f481613264565b600082601f83011261349957600080fd5b8135602067ffffffffffffffff8211156134b5576134b5613115565b8160051b6134c4828201613144565b92835284810182019282810190878511156134de57600080fd5b83870192505b8483101561302b5782356134f781613264565b825291830191908301906134e4565b60008060008060008060c0878903121561351f57600080fd5b863561352a81613264565b9550602087013567ffffffffffffffff8082111561354757600080fd5b818901915089601f83011261355b57600080fd5b61356a8a833560208501613193565b9650604089013591508082111561358057600080fd5b61358c8a838b01613488565b955061359a60608a01613289565b945060808901359150808211156135b057600080fd5b506135bd89828a01613488565b9250506135cc60a08801613289565b90509295509295509295565b600082516135ea8184602087016132ff565b9190910192915050565b60006020828403121561360657600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417610a3957610a3961360d565b600181811c9082168061366757607f821691505b6020821081036106b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036137005761370061360d565b5060010190565b80820180821115610a3957610a3961360d565b60006020828403121561372c57600080fd5b815161295381613264565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161376f8160178501602088016132ff565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516137ac8160288401602088016132ff565b01602801949350505050565b81810381811115610a3957610a3961360d565b6000602082840312156137dd57600080fd5b815163ffffffff8116811461295357600080fd5b60007f800000000000000000000000000000000000000000000000000000000000000082036138225761382261360d565b5060000390565b60008261385f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60006020828403121561387657600080fd5b815180600b0b811461295357600080fd5b601f8211156106f057600081815260208120601f850160051c810160208610156138ae5750805b601f850160051c820191505b818110156105e0578281556001016138ba565b815167ffffffffffffffff8111156138e7576138e7613115565b6138fb816138f58454613653565b84613887565b602080601f83116001811461394e57600084156139185750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556105e0565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561399b5788860151825594840194600190910190840161397c565b50858210156139d757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156139f957600080fd5b815160ff8116811461295357600080fd5b600181815b80851115613a6357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613a4957613a4961360d565b80851615613a5657918102915b93841c9390800290613a0f565b509250929050565b600082613a7a57506001610a39565b81613a8757506000610a39565b8160018114613a9d5760028114613aa757613ac3565b6001915050610a39565b60ff841115613ab857613ab861360d565b50506001821b610a39565b5060208310610133831016604e8410600b8410161715613ae6575081810a610a39565b613af08383613a0a565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613b2257613b2261360d565b029392505050565b600061295360ff841683613a6b565b600081613b4857613b4861360d565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600060208284031215613b8057600080fd5b8151801515811461295357600080fdfea2646970667358221220109542d765fdea225dd59f6dcaa8772d28421b7c63dbcf19982cefe9a0682dc664736f6c63430008110033", + "nonce": "0x3c4", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "function": null, + "arguments": [ + "0x1F25FABC5Bf3F3a185cA051de22511A4e9b3e86A", + "0x1D941EF0D3Bba4ad67DBfBCeE5262F4CEE53A32b", + "0xecf609ae0000000000000000000000005577f822a979b7456ca08c5e311067d777e734c400000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001400000000000000000000000001111111254eeb25477b68fb85ed929f73a960582000000000000000000000000000000000000000000000000000000000000001045756c6572204c656e64657220444149000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe" + ], + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x193a72", + "value": "0x0", + "data": "0x6080604052604051620010bf380380620010bf8339810160408190526200002691620004e6565b828162000036828260006200009a565b5062000066905060017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104620005c6565b6000805160206200107883398151915214620000865762000086620005e8565b6200009182620000d7565b50505062000651565b620000a58362000132565b600082511180620000b35750805b15620000d257620000d083836200017460201b6200028c1760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f62000102620001a5565b604080516001600160a01b03928316815291841660208301520160405180910390a16200012f81620001de565b50565b6200013d8162000293565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200019c8383604051806060016040528060278152602001620010986027913962000347565b90505b92915050565b6000620001cf6000805160206200107883398151915260001b620003c660201b6200022e1760201c565b546001600160a01b0316919050565b6001600160a01b038116620002495760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b80620002726000805160206200107883398151915260001b620003c660201b6200022e1760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b620002a981620003c960201b620002b81760201c565b6200030d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000240565b80620002727f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b620003c660201b6200022e1760201c565b6060600080856001600160a01b031685604051620003669190620005fe565b600060405180830381855af49150503d8060008114620003a3576040519150601f19603f3d011682016040523d82523d6000602084013e620003a8565b606091505b509092509050620003bc86838387620003d8565b9695505050505050565b90565b6001600160a01b03163b151590565b606083156200044c57825160000362000444576001600160a01b0385163b620004445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000240565b508162000458565b62000458838362000460565b949350505050565b815115620004715781518083602001fd5b8060405162461bcd60e51b81526004016200024091906200061c565b80516001600160a01b0381168114620004a557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620004dd578181015183820152602001620004c3565b50506000910152565b600080600060608486031215620004fc57600080fd5b62000507846200048d565b925062000517602085016200048d565b60408501519092506001600160401b03808211156200053557600080fd5b818601915086601f8301126200054a57600080fd5b8151818111156200055f576200055f620004aa565b604051601f8201601f19908116603f011681019083821181831017156200058a576200058a620004aa565b81604052828152896020848701011115620005a457600080fd5b620005b7836020830160208801620004c0565b80955050505050509250925092565b818103818111156200019f57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052600160045260246000fd5b6000825162000612818460208701620004c0565b9190910192915050565b60208152600082518060208401526200063d816040850160208701620004c0565b601f01601f19169190910160400192915050565b610a1780620006616000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100a85780638f283970146100e6578063f851a440146101065761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61011b565b005b61006b61011b565b34801561008157600080fd5b5061006b61009036600461088b565b610135565b61006b6100a33660046108a6565b61017f565b3480156100b457600080fd5b506100bd6101f3565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b5061006b61010136600461088b565b610231565b34801561011257600080fd5b506100bd61025e565b6101236102d4565b61013361012e6103ab565b6103b5565b565b61013d6103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481604051806020016040528060008152506000610419565b50565b61017461011b565b6101876103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101eb576101e68383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610419915050565b505050565b6101e661011b565b60006101fd6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103ab565b905090565b61022e61011b565b90565b6102396103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481610444565b60006102686103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103d9565b60606102b183836040518060600160405280602781526020016109bb602791396104a5565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6102dc6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600061022161052a565b3660008037600080366000845af43d6000803e8080156103d4573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b61042283610552565b60008251118061042f5750805b156101e65761043e838361028c565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61046d6103d9565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a16101748161059f565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516104cf919061094d565b600060405180830381855af49150503d806000811461050a576040519150601f19603f3d011682016040523d82523d6000602084013e61050f565b606091505b5091509150610520868383876106ab565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103fd565b61055b81610753565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b73ffffffffffffffffffffffffffffffffffffffff8116610642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103a2565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b6060831561074157825160000361073a5773ffffffffffffffffffffffffffffffffffffffff85163b61073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103a2565b508161074b565b61074b838361081e565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff81163b6107f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016103a2565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610665565b81511561082e5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a29190610969565b803573ffffffffffffffffffffffffffffffffffffffff8116811461088657600080fd5b919050565b60006020828403121561089d57600080fd5b6102b182610862565b6000806000604084860312156108bb57600080fd5b6108c484610862565b9250602084013567ffffffffffffffff808211156108e157600080fd5b818601915086601f8301126108f557600080fd5b81358181111561090457600080fd5b87602082850101111561091657600080fd5b6020830194508093505050509250925092565b60005b8381101561094457818101518382015260200161092c565b50506000910152565b6000825161095f818460208701610929565b9190910192915050565b6020815260008251806020840152610988816040850160208701610929565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220910985b3eaa4496dd2573db8df24a04823c4165cdd5afb455cf182a9f53be9fb64736f6c63430008110033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65640000000000000000000000001f25fabc5bf3f3a185ca051de22511a4e9b3e86a0000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001a4ecf609ae0000000000000000000000005577f822a979b7456ca08c5e311067d777e734c400000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001400000000000000000000000001111111254eeb25477b68fb85ed929f73a960582000000000000000000000000000000000000000000000000000000000000001045756c6572204c656e64657220444149000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe00000000000000000000000000000000000000000000000000000000", + "nonce": "0x3c5", + "accessList": [] + }, + "additionalContracts": [] + } + ], + "receipts": [ + { + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0x42e646", + "gasUsed": "0x103c96", + "contractAddress": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "logs": [ + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x00000000000000000000000005e08e1bf31c1882822cc48d7d51d6fe49bca9c2" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x50", + "removed": false + }, + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d430", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x51", + "removed": false + }, + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c8", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x52", + "removed": false + }, + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe562", + "0x000000000000000000000000c9daabc677f3d1301006e723bd21c60be57a5915", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x53", + "removed": false + }, + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe562", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe562" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x54", + "removed": false + }, + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe562" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x55", + "removed": false + }, + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x56", + "removed": false + }, + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x57", + "removed": false + }, + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x58", + "removed": false + }, + { + "address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x0000000000000000000000005577f822a979b7456ca08c5e311067d777e734c4", + "0x000000000000000000000000c9daabc677f3d1301006e723bd21c60be57a5915" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x59", + "removed": false + }, + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x5a", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000004800000000800000000000000482000000000000000000000000000000000001000000000000000001000000000800000000000000000000000200040000020110000000000200008000003000000000000800000000000000000000012000000020000400000000000000800000000800000400000000000000000000200000000000000000000000000010100000002000000000000000200a04000020000000000000000000000000000000000020000000000001000000000081000000020020800000000000000020000000902000400000100000000000020000010040000002000000000000000000000000000000004000100000000040000", + "type": "0x2", + "effectiveGasPrice": "0x674f8c02f" + }, + { + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0x55bd06", + "gasUsed": "0x12d6c0", + "contractAddress": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "logs": [ + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000deee844c6992f36adac59cf38d1f790b2a0313e2" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x5b", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x000000000000000000000000c9daabc677f3d1301006e723bd21c60be57a5915", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x5c", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c8", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x5d", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x0000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d430", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x5e", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x5f", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x60", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x61", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d430", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x62", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c", + "0x0000000000000000000000005577f822a979b7456ca08c5e311067d777e734c4", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x63", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x64", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x65", + "removed": false + }, + { + "address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x0000000000000000000000006e97be3e5c6e7167287e208a32720068fd9a9e06", + "0x0000000000000000000000005577f822a979b7456ca08c5e311067d777e734c4" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x66", + "removed": false + }, + { + "address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x0000000000000000000000006e97be3e5c6e7167287e208a32720068fd9a9e06", + "0x0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e3643" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x67", + "removed": false + }, + { + "address": "0xc00e94Cb662C3520282E6f5717214004A7f26888", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x0000000000000000000000006e97be3e5c6e7167287e208a32720068fd9a9e06", + "0x0000000000000000000000001111111254eeb25477b68fb85ed929f73a960582" + ], + "data": "0x0000000000000000000000000000000000000000ffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x68", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x69", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000004800000000800002000000000482000000000000040000000000000000000080000000000000000001000080000800000000000000000000000200040080020100000080200000008000003000000000000801000000000000000000010000000028000400000000000000800000000800000400000000010000000000200000000000000000000000001000100000002200002000000200200a04000020000000000000000000000000004000000000000000000001000000800081000000420020000000000000000000000000902000400000100000000000020000010800000002000000400000080000000000800000004000100000000040000", + "type": "0x2", + "effectiveGasPrice": "0x674f8c02f" + }, + { + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0x6a7d4d", + "gasUsed": "0x14c047", + "contractAddress": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "logs": [ + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x00000000000000000000000014ba0b82f1940e35af39c364e8fa99408881ae30" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x6a", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x000000000000000000000000c9daabc677f3d1301006e723bd21c60be57a5915", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x6b", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c8", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x6c", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x0000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d430", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x6d", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x6e", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x6f", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x70", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d430", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x71", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c", + "0x0000000000000000000000005577f822a979b7456ca08c5e311067d777e734c4", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x72", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x73", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x74", + "removed": false + }, + { + "address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x00000000000000000000000053890a56d175fb8123cc1b430e8407aa20928792", + "0x0000000000000000000000005577f822a979b7456ca08c5e311067d777e734c4" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x75", + "removed": false + }, + { + "address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x00000000000000000000000053890a56d175fb8123cc1b430e8407aa20928792", + "0x0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a9" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x76", + "removed": false + }, + { + "address": "0x4da27a545c0c5B758a6BA100e3a049001de870f5", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x00000000000000000000000053890a56d175fb8123cc1b430e8407aa20928792", + "0x0000000000000000000000001111111254eeb25477b68fb85ed929f73a960582" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x77", + "removed": false + }, + { + "address": "0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x00000000000000000000000053890a56d175fb8123cc1b430e8407aa20928792", + "0x0000000000000000000000001111111254eeb25477b68fb85ed929f73a960582" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x78", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x79", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x000000048000000008000020000000004820000000000000002000000000000000000000000000000000000010000000008004000000000008000000002000420800201000000800000800080000030000000000008000000000000000000000100000000280004000000000000008880000008000004000000000000000000002000a0000000200000001000000000100000002000000000000000200a04200020000000000000000000000000004000000000000000000001000000000081000000020020000000000000000000000004902000400000100002000000020000010000000002000000400000000000100000000000004004100000000040000", + "type": "0x2", + "effectiveGasPrice": "0x674f8c02f" + }, + { + "transactionHash": "0x8b95d4edd036b79f10cad9c2670da9af4b8ac4fe6a51b47a0ac1e0c89ef46939", + "transactionIndex": "0x2e", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0x9dd0e4", + "gasUsed": "0x335397", + "contractAddress": "0x1F25FABC5Bf3F3a185cA051de22511A4e9b3e86A", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x674f8c02f" + }, + { + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0xb138ed", + "gasUsed": "0x136809", + "contractAddress": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "logs": [ + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x0000000000000000000000001f25fabc5bf3f3a185ca051de22511a4e9b3e86a" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x7a", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x000000000000000000000000c9daabc677f3d1301006e723bd21c60be57a5915", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x7b", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c8", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x7c", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x0000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d430", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x7d", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x7e", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x7f", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x80", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d430", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x81", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c", + "0x0000000000000000000000005577f822a979b7456ca08c5e311067d777e734c4", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x82", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x83", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x84", + "removed": false + }, + { + "address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000ced32e95c971610adf264ec8f619fcbf242d64d7", + "0x0000000000000000000000005577f822a979b7456ca08c5e311067d777e734c4" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x85", + "removed": false + }, + { + "address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000ced32e95c971610adf264ec8f619fcbf242d64d7", + "0x00000000000000000000000027182842e098f60e3d576794a5bffb0777e025d3" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x86", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x87", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000004800000000800002000000000482000000000000000000000000000000800000000000000000000001000000000800000000000000000000000600040080020100000000000000028000003000000000000800000000000000000000010000000028000402000000000000800000000800004400000020000000000000200000000000001000000000000000100004002000000000000000200a04000020000004000000000000000000000000000000000000000001000000000081000000020020000000000000000000000000902000400000100000000000020000010000000002000402020000000000000000000000004000100000000040000", + "type": "0x2", + "effectiveGasPrice": "0x674f8c02f" + } + ], + "libraries": [], + "pending": [], + "path": "/Users/gnervo/Documents/Angle/strategies-dev/broadcast/MigrationOptimizerAPRDAI.s.sol/1/run-latest.json", + "returns": {}, + "timestamp": 1675949322, + "chain": 1, + "multi": false, + "commit": "1d1272f" +} \ No newline at end of file diff --git a/broadcast/MigrationOptimizerAPRDAI.s.sol/1/run-latest.json b/broadcast/MigrationOptimizerAPRDAI.s.sol/1/run-latest.json new file mode 100644 index 0000000..2e2a6de --- /dev/null +++ b/broadcast/MigrationOptimizerAPRDAI.s.sol/1/run-latest.json @@ -0,0 +1,1075 @@ +{ + "transactions": [ + { + "hash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "function": null, + "arguments": [ + "0x05E08E1BF31C1882822Cc48D7d51d6fe49Bca9c2", + "0x1D941EF0D3Bba4ad67DBfBCeE5262F4CEE53A32b", + "0xe6bfbfd8000000000000000000000000c9daabc677f3d1301006e723bd21c60be57a5915000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe" + ], + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x151b8f", + "value": "0x0", + "data": "0x6080604052604051620010bf380380620010bf8339810160408190526200002691620004e6565b828162000036828260006200009a565b5062000066905060017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104620005c6565b6000805160206200107883398151915214620000865762000086620005e8565b6200009182620000d7565b50505062000651565b620000a58362000132565b600082511180620000b35750805b15620000d257620000d083836200017460201b6200028c1760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f62000102620001a5565b604080516001600160a01b03928316815291841660208301520160405180910390a16200012f81620001de565b50565b6200013d8162000293565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200019c8383604051806060016040528060278152602001620010986027913962000347565b90505b92915050565b6000620001cf6000805160206200107883398151915260001b620003c660201b6200022e1760201c565b546001600160a01b0316919050565b6001600160a01b038116620002495760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b80620002726000805160206200107883398151915260001b620003c660201b6200022e1760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b620002a981620003c960201b620002b81760201c565b6200030d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000240565b80620002727f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b620003c660201b6200022e1760201c565b6060600080856001600160a01b031685604051620003669190620005fe565b600060405180830381855af49150503d8060008114620003a3576040519150601f19603f3d011682016040523d82523d6000602084013e620003a8565b606091505b509092509050620003bc86838387620003d8565b9695505050505050565b90565b6001600160a01b03163b151590565b606083156200044c57825160000362000444576001600160a01b0385163b620004445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000240565b508162000458565b62000458838362000460565b949350505050565b815115620004715781518083602001fd5b8060405162461bcd60e51b81526004016200024091906200061c565b80516001600160a01b0381168114620004a557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620004dd578181015183820152602001620004c3565b50506000910152565b600080600060608486031215620004fc57600080fd5b62000507846200048d565b925062000517602085016200048d565b60408501519092506001600160401b03808211156200053557600080fd5b818601915086601f8301126200054a57600080fd5b8151818111156200055f576200055f620004aa565b604051601f8201601f19908116603f011681019083821181831017156200058a576200058a620004aa565b81604052828152896020848701011115620005a457600080fd5b620005b7836020830160208801620004c0565b80955050505050509250925092565b818103818111156200019f57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052600160045260246000fd5b6000825162000612818460208701620004c0565b9190910192915050565b60208152600082518060208401526200063d816040850160208701620004c0565b601f01601f19169190910160400192915050565b610a1780620006616000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100a85780638f283970146100e6578063f851a440146101065761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61011b565b005b61006b61011b565b34801561008157600080fd5b5061006b61009036600461088b565b610135565b61006b6100a33660046108a6565b61017f565b3480156100b457600080fd5b506100bd6101f3565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b5061006b61010136600461088b565b610231565b34801561011257600080fd5b506100bd61025e565b6101236102d4565b61013361012e6103ab565b6103b5565b565b61013d6103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481604051806020016040528060008152506000610419565b50565b61017461011b565b6101876103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101eb576101e68383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610419915050565b505050565b6101e661011b565b60006101fd6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103ab565b905090565b61022e61011b565b90565b6102396103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481610444565b60006102686103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103d9565b60606102b183836040518060600160405280602781526020016109bb602791396104a5565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6102dc6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600061022161052a565b3660008037600080366000845af43d6000803e8080156103d4573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b61042283610552565b60008251118061042f5750805b156101e65761043e838361028c565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61046d6103d9565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a16101748161059f565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516104cf919061094d565b600060405180830381855af49150503d806000811461050a576040519150601f19603f3d011682016040523d82523d6000602084013e61050f565b606091505b5091509150610520868383876106ab565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103fd565b61055b81610753565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b73ffffffffffffffffffffffffffffffffffffffff8116610642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103a2565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b6060831561074157825160000361073a5773ffffffffffffffffffffffffffffffffffffffff85163b61073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103a2565b508161074b565b61074b838361081e565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff81163b6107f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016103a2565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610665565b81511561082e5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a29190610969565b803573ffffffffffffffffffffffffffffffffffffffff8116811461088657600080fd5b919050565b60006020828403121561089d57600080fd5b6102b182610862565b6000806000604084860312156108bb57600080fd5b6108c484610862565b9250602084013567ffffffffffffffff808211156108e157600080fd5b818601915086601f8301126108f557600080fd5b81358181111561090457600080fd5b87602082850101111561091657600080fd5b6020830194508093505050509250925092565b60005b8381101561094457818101518382015260200161092c565b50506000910152565b6000825161095f818460208701610929565b9190910192915050565b6020815260008251806020840152610988816040850160208701610929565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220910985b3eaa4496dd2573db8df24a04823c4165cdd5afb455cf182a9f53be9fb64736f6c63430008110033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656400000000000000000000000005e08e1bf31c1882822cc48d7d51d6fe49bca9c20000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e4e6bfbfd8000000000000000000000000c9daabc677f3d1301006e723bd21c60be57a5915000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe00000000000000000000000000000000000000000000000000000000", + "nonce": "0x3c1", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "function": null, + "arguments": [ + "0xDeEe844C6992F36ADAC59cF38d1F790B2a0313e2", + "0x1D941EF0D3Bba4ad67DBfBCeE5262F4CEE53A32b", + "0x804869910000000000000000000000005577f822a979b7456ca08c5e311067d777e734c400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e364300000000000000000000000000000000000000000000000000000000000001200000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001600000000000000000000000001111111254eeb25477b68fb85ed929f73a9605820000000000000000000000000000000000000000000000000000000000000016436f6d706f756e64204c656e64657220444149207632000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe" + ], + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x187d93", + "value": "0x0", + "data": "0x6080604052604051620010bf380380620010bf8339810160408190526200002691620004e6565b828162000036828260006200009a565b5062000066905060017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104620005c6565b6000805160206200107883398151915214620000865762000086620005e8565b6200009182620000d7565b50505062000651565b620000a58362000132565b600082511180620000b35750805b15620000d257620000d083836200017460201b6200028c1760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f62000102620001a5565b604080516001600160a01b03928316815291841660208301520160405180910390a16200012f81620001de565b50565b6200013d8162000293565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200019c8383604051806060016040528060278152602001620010986027913962000347565b90505b92915050565b6000620001cf6000805160206200107883398151915260001b620003c660201b6200022e1760201c565b546001600160a01b0316919050565b6001600160a01b038116620002495760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b80620002726000805160206200107883398151915260001b620003c660201b6200022e1760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b620002a981620003c960201b620002b81760201c565b6200030d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000240565b80620002727f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b620003c660201b6200022e1760201c565b6060600080856001600160a01b031685604051620003669190620005fe565b600060405180830381855af49150503d8060008114620003a3576040519150601f19603f3d011682016040523d82523d6000602084013e620003a8565b606091505b509092509050620003bc86838387620003d8565b9695505050505050565b90565b6001600160a01b03163b151590565b606083156200044c57825160000362000444576001600160a01b0385163b620004445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000240565b508162000458565b62000458838362000460565b949350505050565b815115620004715781518083602001fd5b8060405162461bcd60e51b81526004016200024091906200061c565b80516001600160a01b0381168114620004a557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620004dd578181015183820152602001620004c3565b50506000910152565b600080600060608486031215620004fc57600080fd5b62000507846200048d565b925062000517602085016200048d565b60408501519092506001600160401b03808211156200053557600080fd5b818601915086601f8301126200054a57600080fd5b8151818111156200055f576200055f620004aa565b604051601f8201601f19908116603f011681019083821181831017156200058a576200058a620004aa565b81604052828152896020848701011115620005a457600080fd5b620005b7836020830160208801620004c0565b80955050505050509250925092565b818103818111156200019f57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052600160045260246000fd5b6000825162000612818460208701620004c0565b9190910192915050565b60208152600082518060208401526200063d816040850160208701620004c0565b601f01601f19169190910160400192915050565b610a1780620006616000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100a85780638f283970146100e6578063f851a440146101065761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61011b565b005b61006b61011b565b34801561008157600080fd5b5061006b61009036600461088b565b610135565b61006b6100a33660046108a6565b61017f565b3480156100b457600080fd5b506100bd6101f3565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b5061006b61010136600461088b565b610231565b34801561011257600080fd5b506100bd61025e565b6101236102d4565b61013361012e6103ab565b6103b5565b565b61013d6103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481604051806020016040528060008152506000610419565b50565b61017461011b565b6101876103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101eb576101e68383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610419915050565b505050565b6101e661011b565b60006101fd6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103ab565b905090565b61022e61011b565b90565b6102396103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481610444565b60006102686103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103d9565b60606102b183836040518060600160405280602781526020016109bb602791396104a5565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6102dc6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600061022161052a565b3660008037600080366000845af43d6000803e8080156103d4573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b61042283610552565b60008251118061042f5750805b156101e65761043e838361028c565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61046d6103d9565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a16101748161059f565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516104cf919061094d565b600060405180830381855af49150503d806000811461050a576040519150601f19603f3d011682016040523d82523d6000602084013e61050f565b606091505b5091509150610520868383876106ab565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103fd565b61055b81610753565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b73ffffffffffffffffffffffffffffffffffffffff8116610642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103a2565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b6060831561074157825160000361073a5773ffffffffffffffffffffffffffffffffffffffff85163b61073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103a2565b508161074b565b61074b838361081e565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff81163b6107f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016103a2565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610665565b81511561082e5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a29190610969565b803573ffffffffffffffffffffffffffffffffffffffff8116811461088657600080fd5b919050565b60006020828403121561089d57600080fd5b6102b182610862565b6000806000604084860312156108bb57600080fd5b6108c484610862565b9250602084013567ffffffffffffffff808211156108e157600080fd5b818601915086601f8301126108f557600080fd5b81358181111561090457600080fd5b87602082850101111561091657600080fd5b6020830194508093505050509250925092565b60005b8381101561094457818101518382015260200161092c565b50506000910152565b6000825161095f818460208701610929565b9190910192915050565b6020815260008251806020840152610988816040850160208701610929565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220910985b3eaa4496dd2573db8df24a04823c4165cdd5afb455cf182a9f53be9fb64736f6c63430008110033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564000000000000000000000000deee844c6992f36adac59cf38d1f790b2a0313e20000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c4804869910000000000000000000000005577f822a979b7456ca08c5e311067d777e734c400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e364300000000000000000000000000000000000000000000000000000000000001200000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001600000000000000000000000001111111254eeb25477b68fb85ed929f73a9605820000000000000000000000000000000000000000000000000000000000000016436f6d706f756e64204c656e64657220444149207632000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe00000000000000000000000000000000000000000000000000000000", + "nonce": "0x3c2", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "function": null, + "arguments": [ + "0x14bA0B82f1940e35Af39c364e8Fa99408881Ae30", + "0x1D941EF0D3Bba4ad67DBfBCeE5262F4CEE53A32b", + "0x67f52b630000000000000000000000005577f822a979b7456ca08c5e311067d777e734c400000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001600000000000000000000000001111111254eeb25477b68fb85ed929f73a960582000000000000000000000000000000000000000000000000000000000000001241617665204c656e6465722044414920763200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe" + ], + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x1af9f5", + "value": "0x0", + "data": "0x6080604052604051620010bf380380620010bf8339810160408190526200002691620004e6565b828162000036828260006200009a565b5062000066905060017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104620005c6565b6000805160206200107883398151915214620000865762000086620005e8565b6200009182620000d7565b50505062000651565b620000a58362000132565b600082511180620000b35750805b15620000d257620000d083836200017460201b6200028c1760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f62000102620001a5565b604080516001600160a01b03928316815291841660208301520160405180910390a16200012f81620001de565b50565b6200013d8162000293565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200019c8383604051806060016040528060278152602001620010986027913962000347565b90505b92915050565b6000620001cf6000805160206200107883398151915260001b620003c660201b6200022e1760201c565b546001600160a01b0316919050565b6001600160a01b038116620002495760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b80620002726000805160206200107883398151915260001b620003c660201b6200022e1760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b620002a981620003c960201b620002b81760201c565b6200030d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000240565b80620002727f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b620003c660201b6200022e1760201c565b6060600080856001600160a01b031685604051620003669190620005fe565b600060405180830381855af49150503d8060008114620003a3576040519150601f19603f3d011682016040523d82523d6000602084013e620003a8565b606091505b509092509050620003bc86838387620003d8565b9695505050505050565b90565b6001600160a01b03163b151590565b606083156200044c57825160000362000444576001600160a01b0385163b620004445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000240565b508162000458565b62000458838362000460565b949350505050565b815115620004715781518083602001fd5b8060405162461bcd60e51b81526004016200024091906200061c565b80516001600160a01b0381168114620004a557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620004dd578181015183820152602001620004c3565b50506000910152565b600080600060608486031215620004fc57600080fd5b62000507846200048d565b925062000517602085016200048d565b60408501519092506001600160401b03808211156200053557600080fd5b818601915086601f8301126200054a57600080fd5b8151818111156200055f576200055f620004aa565b604051601f8201601f19908116603f011681019083821181831017156200058a576200058a620004aa565b81604052828152896020848701011115620005a457600080fd5b620005b7836020830160208801620004c0565b80955050505050509250925092565b818103818111156200019f57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052600160045260246000fd5b6000825162000612818460208701620004c0565b9190910192915050565b60208152600082518060208401526200063d816040850160208701620004c0565b601f01601f19169190910160400192915050565b610a1780620006616000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100a85780638f283970146100e6578063f851a440146101065761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61011b565b005b61006b61011b565b34801561008157600080fd5b5061006b61009036600461088b565b610135565b61006b6100a33660046108a6565b61017f565b3480156100b457600080fd5b506100bd6101f3565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b5061006b61010136600461088b565b610231565b34801561011257600080fd5b506100bd61025e565b6101236102d4565b61013361012e6103ab565b6103b5565b565b61013d6103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481604051806020016040528060008152506000610419565b50565b61017461011b565b6101876103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101eb576101e68383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610419915050565b505050565b6101e661011b565b60006101fd6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103ab565b905090565b61022e61011b565b90565b6102396103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481610444565b60006102686103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103d9565b60606102b183836040518060600160405280602781526020016109bb602791396104a5565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6102dc6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600061022161052a565b3660008037600080366000845af43d6000803e8080156103d4573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b61042283610552565b60008251118061042f5750805b156101e65761043e838361028c565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61046d6103d9565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a16101748161059f565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516104cf919061094d565b600060405180830381855af49150503d806000811461050a576040519150601f19603f3d011682016040523d82523d6000602084013e61050f565b606091505b5091509150610520868383876106ab565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103fd565b61055b81610753565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b73ffffffffffffffffffffffffffffffffffffffff8116610642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103a2565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b6060831561074157825160000361073a5773ffffffffffffffffffffffffffffffffffffffff85163b61073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103a2565b508161074b565b61074b838361081e565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff81163b6107f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016103a2565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610665565b81511561082e5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a29190610969565b803573ffffffffffffffffffffffffffffffffffffffff8116811461088657600080fd5b919050565b60006020828403121561089d57600080fd5b6102b182610862565b6000806000604084860312156108bb57600080fd5b6108c484610862565b9250602084013567ffffffffffffffff808211156108e157600080fd5b818601915086601f8301126108f557600080fd5b81358181111561090457600080fd5b87602082850101111561091657600080fd5b6020830194508093505050509250925092565b60005b8381101561094457818101518382015260200161092c565b50506000910152565b6000825161095f818460208701610929565b9190910192915050565b6020815260008251806020840152610988816040850160208701610929565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220910985b3eaa4496dd2573db8df24a04823c4165cdd5afb455cf182a9f53be9fb64736f6c63430008110033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656400000000000000000000000014ba0b82f1940e35af39c364e8fa99408881ae300000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c467f52b630000000000000000000000005577f822a979b7456ca08c5e311067d777e734c400000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001600000000000000000000000001111111254eeb25477b68fb85ed929f73a960582000000000000000000000000000000000000000000000000000000000000001241617665204c656e6465722044414920763200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe00000000000000000000000000000000000000000000000000000000", + "nonce": "0x3c3", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0x8b95d4edd036b79f10cad9c2670da9af4b8ac4fe6a51b47a0ac1e0c89ef46939", + "transactionType": "CREATE", + "contractName": "GenericEuler", + "contractAddress": "0x1F25FABC5Bf3F3a185cA051de22511A4e9b3e86A", + "function": null, + "arguments": null, + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x42b977", + "value": "0x0", + "data": "0x60806040523480156200001157600080fd5b50600054610100900460ff166200002f5760005460ff161562000039565b62000039620000de565b620000a15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b600054610100900460ff16158015620000c4576000805461ffff19166101011790555b8015620000d7576000805461ff00191690555b5062000102565b6000620000f630620000fc60201b620011241760201c565b15905090565b3b151590565b613bc680620001126000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c8063853828b61161010f578063b82c4dc1116100a2578063d0e30db011610071578063d0e30db014610491578063d547741f14610499578063dc4c90d3146104ac578063ecf609ae146104cc57600080fd5b8063b82c4dc11461045b578063b8dc491b1461046e578063c1590cd714610481578063c6afba3c1461048957600080fd5b8063a217fddf116100de578063a217fddf146103e3578063a73e0f3b146103eb578063a7d385e214610428578063a8c62e761461043b57600080fd5b8063853828b6146103935780638b2021761461039b57806391d14854146103b0578063953d9cf1146103c357600080fd5b80632e779525116101875780635312ea8e116101565780635312ea8e1461033957806357ded9c91461034c578063580b7c2e146103545780635be9b2d31461037b57600080fd5b80632e779525146102e45780632f2ff15d146102ec578063364bc15a146102ff57806336568abe1461032657600080fd5b80631f1fcd51116101c35780631f1fcd5114610241578063248a9ca31461028657806324ea54f4146102aa5780632e1a7d4d146102d157600080fd5b806305b41934146101f55780630948c0b61461020a5780630b6d1d171461021d578063116ac4a314610239575b600080fd5b610208610203366004613209565b6104df565b005b610208610218366004613299565b6105e8565b61022660375481565b6040519081526020015b60405180910390f35b61022661065b565b6036546102619073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610230565b6102266102943660046132b6565b6000908152600160208190526040909120015490565b6102267f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504181565b6102266102df3660046132b6565b610680565b6102086106bf565b6102086102fa3660046132cf565b6106c9565b6102267ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab81565b6102086103343660046132cf565b6106f5565b6102086103473660046132b6565b610787565b6102266108f9565b6102267f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c81565b610383610908565b6040519015158152602001610230565b610383610927565b6103a3610977565b6040516102309190613323565b6103836103be3660046132cf565b610a05565b6067546102619073ffffffffffffffffffffffffffffffffffffffff1681565b610226600081565b6067546104139074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610230565b6102266104363660046132b6565b610a3f565b6035546102619073ffffffffffffffffffffffffffffffffffffffff1681565b6102086104693660046133c0565b610a4a565b61020861047c36600461345a565b610b51565b610226610cde565b610226610ce8565b610208610d8d565b6102086104a73660046132cf565b610ed3565b6034546102619073ffffffffffffffffffffffffffffffffffffffff1681565b6102086104da366004613506565b610efa565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab61050a813361112a565b603854604051600091829173ffffffffffffffffffffffffffffffffffffffff909116906105399086906135d8565b6000604051808303816000865af19150503d8060008114610576576040519150601f19603f3d011682016040523d82523d6000602084013e61057b565b606091505b50915091508161058e5761058e816111d3565b6000818060200190518101906105a491906135f4565b9050858110156105e0576040517f22313ae900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610613813361112a565b50603880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600080610666611214565b9050610670611220565b61067a908261363c565b91505090565b60007f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c6106ad813361112a565b6106b6836112c6565b91505b50919050565b6106c76116cd565b565b600082815260016020819052604090912001546106e6813361112a565b6106f08383611905565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610779576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f373100000000000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b610783828261199b565b5050565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50416107b2813361112a565b6067546040517f441a3e70000000000000000000000000000000000000000000000000000000008152600060048201526024810184905273ffffffffffffffffffffffffffffffffffffffff9091169063441a3e7090604401600060405180830381600087803b15801561082557600080fd5b505af1158015610839573d6000803e3d6000fd5b50506034546036546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152610783945073ffffffffffffffffffffffffffffffffffffffff92831693509116906370a0823190602401602060405180830381865afa1580156108b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d991906135f4565b60365473ffffffffffffffffffffffffffffffffffffffff169190611a2d565b6000610903611214565b905090565b6000603754600a610919919061363c565b610921611220565b11905090565b60007f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c610954813361112a565b600061095e611220565b9050600061096b826112c6565b91909110159250505090565b6033805461098490613653565b80601f01602080910402602001604051908101604052809291908181526020018280546109b090613653565b80156109fd5780601f106109d2576101008083540402835291602001916109fd565b820191906000526020600020905b8154815290600101906020018083116109e057829003601f168201915b505050505081565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff165b92915050565b6000610a3982611b01565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610a75813361112a565b8584141580610a845750858214155b15610abb576040517f46282e8d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8560005b81811015610b4657610b36898983818110610adc57610adc6136a0565b9050602002016020810190610af19190613299565b888884818110610b0357610b036136a0565b9050602002016020810190610b189190613299565b878785818110610b2a57610b2a6136a0565b90506020020135611d8a565b610b3f816136cf565b9050610abf565b505050505050505050565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610b7c813361112a565b6000610b86611e99565b805190915060005b81811015610c2457828181518110610ba857610ba86136a0565b602002602001015173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603610c14576040517f093e1cdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c1d816136cf565b9050610b8e565b506040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152610cd790859073ffffffffffffffffffffffffffffffffffffffff8816906370a0823190602401602060405180830381865afa158015610c95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb991906135f4565b73ffffffffffffffffffffffffffffffffffffffff88169190611a2d565b5050505050565b6000610903611220565b600080806067546040517f3af9e669000000000000000000000000000000000000000000000000000000008152306004820152919250829173ffffffffffffffffffffffffffffffffffffffff90911690633af9e66990602401602060405180830381865afa158015610d5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8391906135f4565b61067a9190613707565b7f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c610db8813361112a565b6036546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610e27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4b91906135f4565b6067546040517fe2bbb158000000000000000000000000000000000000000000000000000000008152600060048201526024810183905291925073ffffffffffffffffffffffffffffffffffffffff169063e2bbb15890604401600060405180830381600087803b158015610ebf57600080fd5b505af11580156105e0573d6000803e3d6000fd5b60008281526001602081905260409091200154610ef0813361112a565b6106f0838361199b565b610f08868686868686611f53565b6036546040517f8948874900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152733520d5a913427e6f0d6a83e07ccd4a4da316e4d390638948874990602401602060405180830381865afa158015610f8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fae919061371a565b606780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9283161790556036546040517f1b30058200000000000000000000000000000000000000000000000000000000815291166004820152733520d5a913427e6f0d6a83e07ccd4a4da316e4d390631b30058290602401602060405180830381865afa15801561105b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107f919061371a565b606680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169190911790556110cc6116cd565b6036546105e09073ffffffffffffffffffffffffffffffffffffffff167327182842e098f60e3d576794a5bffb0777e025d37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61258e565b3b151590565b6111348282610a05565b610783576111598173ffffffffffffffffffffffffffffffffffffffff166014612710565b611164836020612710565b604051602001611175929190613737565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261077091600401613323565b8051156111e257805181602001fd5b6040517fc76d51a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006109036000611b01565b600061122a610ce8565b6036546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015611298573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bc91906135f4565b6109039190613707565b600080806067546040517f3af9e66900000000000000000000000000000000000000000000000000000000815230600482015291925060009173ffffffffffffffffffffffffffffffffffffffff90911690633af9e66990602401602060405180830381865afa15801561133e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136291906135f4565b6036546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291925060009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa1580156113d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113fa91906135f4565b90506000816114098486613707565b6114139190613707565b905080861115611421578095505b85821061145c576035546036546114529173ffffffffffffffffffffffffffffffffffffffff918216911688611a2d565b5093949350505050565b6036546040517f70a082310000000000000000000000000000000000000000000000000000000081527327182842e098f60e3d576794a5bffb0777e025d3600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156114df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150391906135f4565b9050600181111561160357600061151a84896137b8565b905060008282116115575761152f8587613707565b821161153c576000611550565b6115468587613707565b61155090836137b8565b9050611575565b85831161156557600061156f565b61156f86846137b8565b90508291505b6067546040517f441a3e70000000000000000000000000000000000000000000000000000000008152600060048201526024810184905273ffffffffffffffffffffffffffffffffffffffff9091169063441a3e7090604401600060405180830381600087803b1580156115e857600080fd5b505af11580156115fc573d6000803e3d6000fd5b5050505050505b6036546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015611671573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169591906135f4565b6035546036549194506116c29173ffffffffffffffffffffffffffffffffffffffff908116911685611a2d565b509095945050505050565b6036546040517fb409dd9b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152600090733520d5a913427e6f0d6a83e07ccd4a4da316e4d39063b409dd9b90602401602060405180830381865afa158015611752573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177691906135f4565b6040517fcab65f01000000000000000000000000000000000000000000000000000000008152600481018290529091506000907327182842e098f60e3d576794a5bffb0777e025d39063cab65f0190602401602060405180830381865afa1580156117e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611809919061371a565b606580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116919091179091556036546040517fb74b1ed500000000000000000000000000000000000000000000000000000000815291166004820152909150733520d5a913427e6f0d6a83e07ccd4a4da316e4d39063b74b1ed590602401602060405180830381865afa1580156118bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e191906137cb565b606760146101000a81548163ffffffff021916908363ffffffff1602179055505050565b61190f8282610a05565b61078357600082815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616808652925280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6119a58282610a05565b1561078357600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526106f09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261295a565b600080606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9591906135f4565b90506000606760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fea61faa6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c2a91906135f4565b905060008412611c4557611c3e8482613707565b9050611c5b565b611c4e846137f1565b611c5890826137b8565b90505b60008115611d76576000670de0b6b3a764000083611c7d63ffffffff8361363c565b611c87908761363c565b611c919190613829565b611c9b9190613829565b6065546036546040517fd50c08f800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015263ffffffff8416602482015292935060009291169063d50c08f890604401602060405180830381865afa158015611d1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d439190613864565b6bffffffffffffffffffffffff169050611d71818686606760149054906101000a900463ffffffff16612a66565b925050505b611d81600082613707565b95945050505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff83811660248301526000919085169063dd62ed3e90604401602060405180830381865afa158015611e00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2491906135f4565b905081811015611e5f57611e5a83611e3c83856137b8565b73ffffffffffffffffffffffffffffffffffffffff87169190612af6565b611e93565b81811115611e9357611e9383611e7584846137b8565b73ffffffffffffffffffffffffffffffffffffffff87169190612bf4565b50505050565b604080516002808252606080830184529260009291906020830190803683375050603654825192935073ffffffffffffffffffffffffffffffffffffffff1691839150600090611eeb57611eeb6136a0565b73ffffffffffffffffffffffffffffffffffffffff9283166020918202929092010152606754825191169082906001908110611f2957611f296136a0565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152919050565b600054610100900460ff16611f6e5760005460ff1615611f72565b303b155b611ffe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610770565b600054610100900460ff1615801561203d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b6038805473ffffffffffffffffffffffffffffffffffffffff8085167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560358054928a169290911682179055604080517fdc4c90d3000000000000000000000000000000000000000000000000000000008152905163dc4c90d3916004808201926020929091908290030181865afa1580156120e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612108919061371a565b603480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169182179055604080517ffc0c546a000000000000000000000000000000000000000000000000000000008152905163fc0c546a916004808201926020929091908290030181865afa1580156121a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c4919061371a565b603680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055603361221587826138cd565b5060345461225a907f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419073ffffffffffffffffffffffffffffffffffffffff16612d7a565b845160005b818110156122bd576122ad7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504160001b8883815181106122a0576122a06136a0565b6020026020010151612d7a565b6122b6816136cf565b905061225f565b506122e87ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab86612d7a565b835160005b8181101561233e5761232e7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab60001b8783815181106122a0576122a06136a0565b612337816136cf565b90506122ed565b506123897ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041612d84565b6123b37f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504187612d7a565b6123dd7f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c8a612d7a565b6124277f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50417f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c612d84565b6124717f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041612d84565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250291906139e7565b61250d90600a613b2a565b6037556036546125549073ffffffffffffffffffffffffffffffffffffffff168a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61258e565b5050801561258557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50505050505050565b80158061262e57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061262c91906135f4565b155b6126ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610770565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526106f09084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611a7f565b6060600061271f83600261363c565b61272a906002613707565b67ffffffffffffffff81111561274257612742613115565b6040519080825280601f01601f19166020018201604052801561276c576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106127a3576127a36136a0565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612806576128066136a0565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061284284600261363c565b61284d906001613707565b90505b60018111156128ea577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061288e5761288e6136a0565b1a60f81b8282815181106128a4576128a46136a0565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c936128e381613b39565b9050612850565b508315612953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610770565b9392505050565b60006129bc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612ddb9092919063ffffffff16565b8051909150156106f057808060200190518101906129da9190613b6e565b6106f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610770565b60008083612a74868861363c565b612a7e9190613829565b905063ee6b2800612a9563ffffffff8516826137b8565b612a9f908361363c565b612aa99190613829565b9050633b9aca006b033b2e3c9fd0803ce8000000612ad8836301e133806b033b2e3c9fd0803ce8000000612df2565b612ae291906137b8565b612aec9190613829565b9695505050505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612b6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9191906135f4565b612b9b9190613707565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150611e939085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611a7f565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff83811660248301526000919085169063dd62ed3e90604401602060405180830381865afa158015612c6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c8e91906135f4565b905081811015612d20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5361666545524332303a2064656372656173656420616c6c6f77616e6365206260448201527f656c6f77207a65726f00000000000000000000000000000000000000000000006064820152608401610770565b60405173ffffffffffffffffffffffffffffffffffffffff841660248201528282036044820181905290610cd79086907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611a7f565b6107838282611905565b60008281526001602081905260409091200154819060405184907fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff90600090a4600091825260016020819052604090922090910155565b6060612dea8484600085612f1d565b949350505050565b6000821580612dff575083155b15612e0b575080612953565b6000612e18600284613829565b90506000612e276001866137b8565b9050600060028611612e3a576000612e45565b612e456002876137b8565b905060008584612e558a8061363c565b612e5f9190613707565b612e699190613829565b905060008685612e798b8561363c565b612e839190613707565b612e8d9190613829565b90506000600283612e9e878c61363c565b612ea8919061363c565b612eb29190613829565b9050600060068386612ec4898e61363c565b612ece919061363c565b612ed8919061363c565b612ee29190613829565b90508082612ef08c8e61363c565b612efa908c613707565b612f049190613707565b612f0e9190613707565b9b9a5050505050505050505050565b606082471015612faf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610770565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612fd891906135d8565b60006040518083038185875af1925050503d8060008114613015576040519150601f19603f3d011682016040523d82523d6000602084013e61301a565b606091505b509150915061302b87838387613036565b979650505050505050565b606083156130cc5782516000036130c55773ffffffffffffffffffffffffffffffffffffffff85163b6130c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610770565b5081612dea565b612dea83838151156130e15781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107709190613323565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561318b5761318b613115565b604052919050565b600067ffffffffffffffff8311156131ad576131ad613115565b6131de60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601613144565b90508281528383830111156131f257600080fd5b828260208301376000602084830101529392505050565b6000806040838503121561321c57600080fd5b82359150602083013567ffffffffffffffff81111561323a57600080fd5b8301601f8101851361324b57600080fd5b61325a85823560208401613193565b9150509250929050565b73ffffffffffffffffffffffffffffffffffffffff8116811461328657600080fd5b50565b803561329481613264565b919050565b6000602082840312156132ab57600080fd5b813561295381613264565b6000602082840312156132c857600080fd5b5035919050565b600080604083850312156132e257600080fd5b8235915060208301356132f481613264565b809150509250929050565b60005b8381101561331a578181015183820152602001613302565b50506000910152565b60208152600082518060208401526133428160408501602087016132ff565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008083601f84011261338657600080fd5b50813567ffffffffffffffff81111561339e57600080fd5b6020830191508360208260051b85010111156133b957600080fd5b9250929050565b600080600080600080606087890312156133d957600080fd5b863567ffffffffffffffff808211156133f157600080fd5b6133fd8a838b01613374565b9098509650602089013591508082111561341657600080fd5b6134228a838b01613374565b9096509450604089013591508082111561343b57600080fd5b5061344889828a01613374565b979a9699509497509295939492505050565b6000806040838503121561346d57600080fd5b823561347881613264565b915060208301356132f481613264565b600082601f83011261349957600080fd5b8135602067ffffffffffffffff8211156134b5576134b5613115565b8160051b6134c4828201613144565b92835284810182019282810190878511156134de57600080fd5b83870192505b8483101561302b5782356134f781613264565b825291830191908301906134e4565b60008060008060008060c0878903121561351f57600080fd5b863561352a81613264565b9550602087013567ffffffffffffffff8082111561354757600080fd5b818901915089601f83011261355b57600080fd5b61356a8a833560208501613193565b9650604089013591508082111561358057600080fd5b61358c8a838b01613488565b955061359a60608a01613289565b945060808901359150808211156135b057600080fd5b506135bd89828a01613488565b9250506135cc60a08801613289565b90509295509295509295565b600082516135ea8184602087016132ff565b9190910192915050565b60006020828403121561360657600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417610a3957610a3961360d565b600181811c9082168061366757607f821691505b6020821081036106b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036137005761370061360d565b5060010190565b80820180821115610a3957610a3961360d565b60006020828403121561372c57600080fd5b815161295381613264565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161376f8160178501602088016132ff565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516137ac8160288401602088016132ff565b01602801949350505050565b81810381811115610a3957610a3961360d565b6000602082840312156137dd57600080fd5b815163ffffffff8116811461295357600080fd5b60007f800000000000000000000000000000000000000000000000000000000000000082036138225761382261360d565b5060000390565b60008261385f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60006020828403121561387657600080fd5b815180600b0b811461295357600080fd5b601f8211156106f057600081815260208120601f850160051c810160208610156138ae5750805b601f850160051c820191505b818110156105e0578281556001016138ba565b815167ffffffffffffffff8111156138e7576138e7613115565b6138fb816138f58454613653565b84613887565b602080601f83116001811461394e57600084156139185750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556105e0565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561399b5788860151825594840194600190910190840161397c565b50858210156139d757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156139f957600080fd5b815160ff8116811461295357600080fd5b600181815b80851115613a6357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613a4957613a4961360d565b80851615613a5657918102915b93841c9390800290613a0f565b509250929050565b600082613a7a57506001610a39565b81613a8757506000610a39565b8160018114613a9d5760028114613aa757613ac3565b6001915050610a39565b60ff841115613ab857613ab861360d565b50506001821b610a39565b5060208310610133831016604e8410600b8410161715613ae6575081810a610a39565b613af08383613a0a565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613b2257613b2261360d565b029392505050565b600061295360ff841683613a6b565b600081613b4857613b4861360d565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600060208284031215613b8057600080fd5b8151801515811461295357600080fdfea2646970667358221220109542d765fdea225dd59f6dcaa8772d28421b7c63dbcf19982cefe9a0682dc664736f6c63430008110033", + "nonce": "0x3c4", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "function": null, + "arguments": [ + "0x1F25FABC5Bf3F3a185cA051de22511A4e9b3e86A", + "0x1D941EF0D3Bba4ad67DBfBCeE5262F4CEE53A32b", + "0xecf609ae0000000000000000000000005577f822a979b7456ca08c5e311067d777e734c400000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001400000000000000000000000001111111254eeb25477b68fb85ed929f73a960582000000000000000000000000000000000000000000000000000000000000001045756c6572204c656e64657220444149000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe" + ], + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x193a72", + "value": "0x0", + "data": "0x6080604052604051620010bf380380620010bf8339810160408190526200002691620004e6565b828162000036828260006200009a565b5062000066905060017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104620005c6565b6000805160206200107883398151915214620000865762000086620005e8565b6200009182620000d7565b50505062000651565b620000a58362000132565b600082511180620000b35750805b15620000d257620000d083836200017460201b6200028c1760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f62000102620001a5565b604080516001600160a01b03928316815291841660208301520160405180910390a16200012f81620001de565b50565b6200013d8162000293565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200019c8383604051806060016040528060278152602001620010986027913962000347565b90505b92915050565b6000620001cf6000805160206200107883398151915260001b620003c660201b6200022e1760201c565b546001600160a01b0316919050565b6001600160a01b038116620002495760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b80620002726000805160206200107883398151915260001b620003c660201b6200022e1760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b620002a981620003c960201b620002b81760201c565b6200030d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000240565b80620002727f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b620003c660201b6200022e1760201c565b6060600080856001600160a01b031685604051620003669190620005fe565b600060405180830381855af49150503d8060008114620003a3576040519150601f19603f3d011682016040523d82523d6000602084013e620003a8565b606091505b509092509050620003bc86838387620003d8565b9695505050505050565b90565b6001600160a01b03163b151590565b606083156200044c57825160000362000444576001600160a01b0385163b620004445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000240565b508162000458565b62000458838362000460565b949350505050565b815115620004715781518083602001fd5b8060405162461bcd60e51b81526004016200024091906200061c565b80516001600160a01b0381168114620004a557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620004dd578181015183820152602001620004c3565b50506000910152565b600080600060608486031215620004fc57600080fd5b62000507846200048d565b925062000517602085016200048d565b60408501519092506001600160401b03808211156200053557600080fd5b818601915086601f8301126200054a57600080fd5b8151818111156200055f576200055f620004aa565b604051601f8201601f19908116603f011681019083821181831017156200058a576200058a620004aa565b81604052828152896020848701011115620005a457600080fd5b620005b7836020830160208801620004c0565b80955050505050509250925092565b818103818111156200019f57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052600160045260246000fd5b6000825162000612818460208701620004c0565b9190910192915050565b60208152600082518060208401526200063d816040850160208701620004c0565b601f01601f19169190910160400192915050565b610a1780620006616000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100a85780638f283970146100e6578063f851a440146101065761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61011b565b005b61006b61011b565b34801561008157600080fd5b5061006b61009036600461088b565b610135565b61006b6100a33660046108a6565b61017f565b3480156100b457600080fd5b506100bd6101f3565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b5061006b61010136600461088b565b610231565b34801561011257600080fd5b506100bd61025e565b6101236102d4565b61013361012e6103ab565b6103b5565b565b61013d6103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481604051806020016040528060008152506000610419565b50565b61017461011b565b6101876103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101eb576101e68383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610419915050565b505050565b6101e661011b565b60006101fd6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103ab565b905090565b61022e61011b565b90565b6102396103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481610444565b60006102686103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103d9565b60606102b183836040518060600160405280602781526020016109bb602791396104a5565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6102dc6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600061022161052a565b3660008037600080366000845af43d6000803e8080156103d4573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b61042283610552565b60008251118061042f5750805b156101e65761043e838361028c565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61046d6103d9565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a16101748161059f565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516104cf919061094d565b600060405180830381855af49150503d806000811461050a576040519150601f19603f3d011682016040523d82523d6000602084013e61050f565b606091505b5091509150610520868383876106ab565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103fd565b61055b81610753565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b73ffffffffffffffffffffffffffffffffffffffff8116610642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103a2565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b6060831561074157825160000361073a5773ffffffffffffffffffffffffffffffffffffffff85163b61073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103a2565b508161074b565b61074b838361081e565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff81163b6107f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016103a2565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610665565b81511561082e5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a29190610969565b803573ffffffffffffffffffffffffffffffffffffffff8116811461088657600080fd5b919050565b60006020828403121561089d57600080fd5b6102b182610862565b6000806000604084860312156108bb57600080fd5b6108c484610862565b9250602084013567ffffffffffffffff808211156108e157600080fd5b818601915086601f8301126108f557600080fd5b81358181111561090457600080fd5b87602082850101111561091657600080fd5b6020830194508093505050509250925092565b60005b8381101561094457818101518382015260200161092c565b50506000910152565b6000825161095f818460208701610929565b9190910192915050565b6020815260008251806020840152610988816040850160208701610929565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220910985b3eaa4496dd2573db8df24a04823c4165cdd5afb455cf182a9f53be9fb64736f6c63430008110033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65640000000000000000000000001f25fabc5bf3f3a185ca051de22511a4e9b3e86a0000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001a4ecf609ae0000000000000000000000005577f822a979b7456ca08c5e311067d777e734c400000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001400000000000000000000000001111111254eeb25477b68fb85ed929f73a960582000000000000000000000000000000000000000000000000000000000000001045756c6572204c656e64657220444149000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe00000000000000000000000000000000000000000000000000000000", + "nonce": "0x3c5", + "accessList": [] + }, + "additionalContracts": [] + } + ], + "receipts": [ + { + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0x42e646", + "gasUsed": "0x103c96", + "contractAddress": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "logs": [ + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x00000000000000000000000005e08e1bf31c1882822cc48d7d51d6fe49bca9c2" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x50", + "removed": false + }, + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d430", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x51", + "removed": false + }, + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c8", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x52", + "removed": false + }, + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe562", + "0x000000000000000000000000c9daabc677f3d1301006e723bd21c60be57a5915", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x53", + "removed": false + }, + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe562", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe562" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x54", + "removed": false + }, + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe562" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x55", + "removed": false + }, + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x56", + "removed": false + }, + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x57", + "removed": false + }, + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x58", + "removed": false + }, + { + "address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x0000000000000000000000005577f822a979b7456ca08c5e311067d777e734c4", + "0x000000000000000000000000c9daabc677f3d1301006e723bd21c60be57a5915" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x59", + "removed": false + }, + { + "address": "0x5577f822A979b7456ca08C5E311067d777e734c4", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x3cba0d5469e2df7e6879f89d5c2fba824b7004fa4171be52385e24ad52e97851", + "transactionIndex": "0x2b", + "logIndex": "0x5a", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000004800000000800000000000000482000000000000000000000000000000000001000000000000000001000000000800000000000000000000000200040000020110000000000200008000003000000000000800000000000000000000012000000020000400000000000000800000000800000400000000000000000000200000000000000000000000000010100000002000000000000000200a04000020000000000000000000000000000000000020000000000001000000000081000000020020800000000000000020000000902000400000100000000000020000010040000002000000000000000000000000000000004000100000000040000", + "type": "0x2", + "effectiveGasPrice": "0x674f8c02f" + }, + { + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0x55bd06", + "gasUsed": "0x12d6c0", + "contractAddress": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "logs": [ + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000deee844c6992f36adac59cf38d1f790b2a0313e2" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x5b", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x000000000000000000000000c9daabc677f3d1301006e723bd21c60be57a5915", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x5c", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c8", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x5d", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x0000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d430", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x5e", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x5f", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x60", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x61", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d430", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x62", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c", + "0x0000000000000000000000005577f822a979b7456ca08c5e311067d777e734c4", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x63", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x64", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x65", + "removed": false + }, + { + "address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x0000000000000000000000006e97be3e5c6e7167287e208a32720068fd9a9e06", + "0x0000000000000000000000005577f822a979b7456ca08c5e311067d777e734c4" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x66", + "removed": false + }, + { + "address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x0000000000000000000000006e97be3e5c6e7167287e208a32720068fd9a9e06", + "0x0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e3643" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x67", + "removed": false + }, + { + "address": "0xc00e94Cb662C3520282E6f5717214004A7f26888", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x0000000000000000000000006e97be3e5c6e7167287e208a32720068fd9a9e06", + "0x0000000000000000000000001111111254eeb25477b68fb85ed929f73a960582" + ], + "data": "0x0000000000000000000000000000000000000000ffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x68", + "removed": false + }, + { + "address": "0x6e97bE3E5C6e7167287E208A32720068fd9A9E06", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0xe3e48e24c0659c608dde070335068b0723a989e774451abb7aaacc8e96f1c576", + "transactionIndex": "0x2c", + "logIndex": "0x69", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000004800000000800002000000000482000000000000040000000000000000000080000000000000000001000080000800000000000000000000000200040080020100000080200000008000003000000000000801000000000000000000010000000028000400000000000000800000000800000400000000010000000000200000000000000000000000001000100000002200002000000200200a04000020000000000000000000000000004000000000000000000001000000800081000000420020000000000000000000000000902000400000100000000000020000010800000002000000400000080000000000800000004000100000000040000", + "type": "0x2", + "effectiveGasPrice": "0x674f8c02f" + }, + { + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0x6a7d4d", + "gasUsed": "0x14c047", + "contractAddress": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "logs": [ + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x00000000000000000000000014ba0b82f1940e35af39c364e8fa99408881ae30" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x6a", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x000000000000000000000000c9daabc677f3d1301006e723bd21c60be57a5915", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x6b", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c8", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x6c", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x0000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d430", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x6d", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x6e", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x6f", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x70", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d430", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x71", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c", + "0x0000000000000000000000005577f822a979b7456ca08c5e311067d777e734c4", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x72", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x73", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x74", + "removed": false + }, + { + "address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x00000000000000000000000053890a56d175fb8123cc1b430e8407aa20928792", + "0x0000000000000000000000005577f822a979b7456ca08c5e311067d777e734c4" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x75", + "removed": false + }, + { + "address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x00000000000000000000000053890a56d175fb8123cc1b430e8407aa20928792", + "0x0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a9" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x76", + "removed": false + }, + { + "address": "0x4da27a545c0c5B758a6BA100e3a049001de870f5", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x00000000000000000000000053890a56d175fb8123cc1b430e8407aa20928792", + "0x0000000000000000000000001111111254eeb25477b68fb85ed929f73a960582" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x77", + "removed": false + }, + { + "address": "0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x00000000000000000000000053890a56d175fb8123cc1b430e8407aa20928792", + "0x0000000000000000000000001111111254eeb25477b68fb85ed929f73a960582" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x78", + "removed": false + }, + { + "address": "0x53890A56D175fb8123cC1b430e8407aa20928792", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x2cbdd45059a989c96baf4125cd42cad205b4d54932ef766fa07bdf42532f2de3", + "transactionIndex": "0x2d", + "logIndex": "0x79", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x000000048000000008000020000000004820000000000000002000000000000000000000000000000000000010000000008004000000000008000000002000420800201000000800000800080000030000000000008000000000000000000000100000000280004000000000000008880000008000004000000000000000000002000a0000000200000001000000000100000002000000000000000200a04200020000000000000000000000000004000000000000000000001000000000081000000020020000000000000000000000004902000400000100002000000020000010000000002000000400000000000100000000000004004100000000040000", + "type": "0x2", + "effectiveGasPrice": "0x674f8c02f" + }, + { + "transactionHash": "0x8b95d4edd036b79f10cad9c2670da9af4b8ac4fe6a51b47a0ac1e0c89ef46939", + "transactionIndex": "0x2e", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0x9dd0e4", + "gasUsed": "0x335397", + "contractAddress": "0x1F25FABC5Bf3F3a185cA051de22511A4e9b3e86A", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x674f8c02f" + }, + { + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0xb138ed", + "gasUsed": "0x136809", + "contractAddress": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "logs": [ + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x0000000000000000000000001f25fabc5bf3f3a185ca051de22511a4e9b3e86a" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x7a", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x000000000000000000000000c9daabc677f3d1301006e723bd21c60be57a5915", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x7b", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c8", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x7c", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x0000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d430", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x7d", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x7e", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x7f", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x80", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d430", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x81", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c", + "0x0000000000000000000000005577f822a979b7456ca08c5e311067d777e734c4", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x82", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x83", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041" + ], + "data": "0x", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x84", + "removed": false + }, + { + "address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000ced32e95c971610adf264ec8f619fcbf242d64d7", + "0x0000000000000000000000005577f822a979b7456ca08c5e311067d777e734c4" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x85", + "removed": false + }, + { + "address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000ced32e95c971610adf264ec8f619fcbf242d64d7", + "0x00000000000000000000000027182842e098f60e3d576794a5bffb0777e025d3" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x86", + "removed": false + }, + { + "address": "0xceD32E95C971610AdF264EC8f619fCBf242D64D7", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b", + "blockHash": "0x87ac9f6659173e818e5cb9999ced827ab70e384a716669a12465dee5f8b9bc64", + "blockNumber": "0xfd2a80", + "transactionHash": "0x516156f69b87ada58e0090d64f8328842e62b90db9a77efe35f9c6ed019a6b60", + "transactionIndex": "0x2f", + "logIndex": "0x87", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000004800000000800002000000000482000000000000000000000000000000800000000000000000000001000000000800000000000000000000000600040080020100000000000000028000003000000000000800000000000000000000010000000028000402000000000000800000000800004400000020000000000000200000000000001000000000000000100004002000000000000000200a04000020000004000000000000000000000000000000000000000001000000000081000000020020000000000000000000000000902000400000100000000000020000010000000002000402020000000000000000000000004000100000000040000", + "type": "0x2", + "effectiveGasPrice": "0x674f8c02f" + } + ], + "libraries": [], + "pending": [], + "path": "/Users/gnervo/Documents/Angle/strategies-dev/broadcast/MigrationOptimizerAPRDAI.s.sol/1/run-latest.json", + "returns": {}, + "timestamp": 1675949322, + "chain": 1, + "multi": false, + "commit": "1d1272f" +} \ No newline at end of file diff --git a/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-1675863870.json b/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-1675863870.json new file mode 100644 index 0000000..8b2b83f --- /dev/null +++ b/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-1675863870.json @@ -0,0 +1,190 @@ +{ + "transactions": [ + { + "hash": "0x5382fd037f49f38aead835fdd346291ef48fc0807d3b24492cac6929d1e5f2d9", + "transactionType": "CREATE", + "contractName": "OptimizerAPRStrategy", + "contractAddress": "0xa693aBabF230397B3e6385ff7eE09607f562af8c", + "function": null, + "arguments": null, + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x5965d1", + "value": "0x0", + "data": "0x60808060405234620000d3576000549060ff8260081c169081600014620000c857303b155b156200006f57501590816200005c575b506200004b575b60405161508c9081620000d98239f35b61ff0019600054166000556200003b565b61ffff1916610101176000553862000034565b62461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b60ff83161562000024565b600080fdfe6101006040908082526004918236101561001857600080fd5b600092833560e01c9283630b6d1d1714612087575082630c016dc01461202e5782630e6e15f014611ff35782630f969b8714611f855782631d12f28b14611f485782631f1fcd5114611ef557826322f3e2d414611eb1578263248a9ca314611e6857826324ea54f414611e0f5782632e1a7d4d14611d9c5782632f2ff15d14611ca5578263364bc15a14611c4c57826336568abe14611b8e5782634641257d14611b575782634786b0cb14611b165782635641ec0314611ad45782635a5cd45e14611a99578263708ba9bd1461199a57826376ee75d8146119515782637985fd51146119145782638baf2957146118cb57826391d1485414611859578263929eea21146117d557826393084b34146115db578263a217fddf146115a2578263a526d83b1461148b578263af648c3d146112eb578263b8dc491b14611120578263bb927c46146110e3578263ce5c7f611461104c578263d547741f14610ff2578263dc4c90d314610f9c578263ddc6326214610f50578263e6a69ab814610f13578263e6bfbfd8146106a3578263ec342ad014610662578263efbb5cb014610620578263fcc5f59a1461026157505063fcf2d0ad146101d557600080fd5b3461025e57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e5761020c336125d8565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0060335416176033557f17fa25a1c2ac074f71f0cf4f6af525c06fab7d83eff5ffcf6df5277f2919ae248180a180f35b80fd5b83903461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760655461029d816121c8565b916102aa85519384612187565b8183527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06102d7836121c8565b01845b818110610605575050835b8281106103a557505050825191602080840190808552835180925285850181878460051b880101950193965b83881061031e5786860387f35b90919293948380827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a60019503018652885190610364825160808084528301906122a3565b918381015184830152868101518783015273ffffffffffffffffffffffffffffffffffffffff60608092015116910152970193019701969093929193610311565b6103ad6142f0565b6103b6826121e0565b905488517f8b2021760000000000000000000000000000000000000000000000000000000081528881878173ffffffffffffffffffffffffffffffffffffffff8096600398891b1c165afa9081156105fb578991610576575b5083528061041c856121e0565b905490841b1c16606084015280610432856121e0565b905490841b1c1691895180937fc1590cd7000000000000000000000000000000000000000000000000000000008252818860209687935afa90811561056c579187939185938c91610534575b508387015261048c876121e0565b9054911b1c168a51928380927f57ded9c90000000000000000000000000000000000000000000000000000000082525afa91821561052a5788926104f6575b5050878201526104f191906104e08287612e1e565b526104eb8186612e1e565b50612df1565b6102e5565b90809250813d8311610523575b61050d8183612187565b8101031261051f57516104f1896104cb565b8680fd5b503d610503565b89513d8a823e3d90fd5b929450509181813d8311610565575b61054d8183612187565b81010312610561579183918793518d61047e565b8980fd5b503d610543565b8b513d8c823e3d90fd5b90503d808a833e6105878183612187565b81019060209081818403126105f75780519067ffffffffffffffff82116105f357019082601f830112156105f757908b92918151926105d16105c885612246565b95519586612187565b8385528184840101116105f3576105ed92918482019101612280565b8a61040f565b8b80fd5b8a80fd5b8a513d8b823e3d90fd5b6020906106106142f0565b828288010152016102da565b5080fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b6143f2565b9051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209051670de0b6b3a76400008152f35b915034610f0f5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576106dc6120e9565b6106e46120c1565b916044359173ffffffffffffffffffffffffffffffffffffffff9182841691828503610f0b576064359267ffffffffffffffff8411610bcc5736602385011215610bcc578388013596610736886121c8565b9061074385519283612187565b8882526020958683016024809b60051b83010191368311610dea578b01905b828210610eef575050508a549760ff93848a60081c1680600014610ee657303b155b15610e655789898f928f90159d8e610e37575b506033547fffffffffffffffffffffff0000000000000000000000000000000000000000ff74ffffffffffffffffffffffffffffffffffffffff008c60081b1691161790816033558b51809481937ffc0c546a00000000000000000000000000000000000000000000000000000000835260081c165afa908115610e2d578b8f928c928591610e00575b5016807fffffffffffffffffffffffff000000000000000000000000000000000000000060345416176034558a51928380927f313ce5670000000000000000000000000000000000000000000000000000000082525afa918215610df557908792610db7575b5016604d8111610d8c57600a0a6035558015908115610d81575b8115610d75575b50610d4d578b949392916108be6108c392612a4e565b612a4e565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5629182855260019384885288878720911690818752885281878720541615610ce7575b50908291859387965284885284868520015492807fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9481868880a480868887200155857f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419786898098528383838320015489898480a42001558151908d5b828110610be157505050507ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab808c5283875283868d200154918c80a4828920015568056bc75e2d63100000603655603354927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00841660335580603454169360081c168151917fdd62ed3e000000000000000000000000000000000000000000000000000000008352308884015281878401528383604481885afa928315610bd7578993610ba4575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301809311610b7957517f095ea7b3000000000000000000000000000000000000000000000000000000009381019390935273ffffffffffffffffffffffffffffffffffffffff168583019081526020810191909152610b049290610aff9083906040015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101845283612187565b614e53565b610b4e575b603554916103e89280840293840403610b2457505060665580f35b601184917f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff8354168355610b09565b868960118a7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b9092508381813d8311610bd0575b610bbc8183612187565b81010312610bcc57519138610a4c565b8880fd5b503d610bb2565b81513d8b823e3d90fd5b90919293945089610bf28286612e1e565b511615610cbf57808e8b610c09610c4e9488612e1e565b51167ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab808352898d528b83208284528d52858c8420541615610c59575b505050612df1565b908694939291610984565b808352898d528b83208284528d528b83208a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d339380a48e3880610c46565b8c88517fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b8386528488528686208187528852868620857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790553390847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8880a438610906565b8a86517fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b905088831614386108a8565b838a161591506108a1565b8b8e60118f7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8092508a8092503d8311610dee575b610dd08183612187565b81010312610dea57518581168103610dea57859038610887565b8d80fd5b503d610dc6565b8951903d90823e3d90fd5b610e209150833d8511610e26575b610e188183612187565b810190612e45565b38610821565b503d610e0e565b89513d84823e3d90fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661010117845538610797565b60848d602e8e8c8c51937f08c379a00000000000000000000000000000000000000000000000000000000085528401528201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152fd5b858b1615610784565b81358a81168103610f07578152908801908801610762565b8e80fd5b8780fd5b8280fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090516301e185588152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f8933612769565b610f91612c08565b610f99613e5c565b80f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209073ffffffffffffffffffffffffffffffffffffffff60335460081c169051908152f35b915034610f0f57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57610f99913561104760016110346120c1565b93838752816020528620015433906128fa565b612b2a565b915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f578282359267ffffffffffffffff841161061c573660238501121561061c57830135926110b46110ab85612246565b93519384612187565b838352366024858301011161061c5783610f999460246020930183860137830101526110de612c08565b6132ff565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906065549051908152f35b915034610f0f57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576111586120e9565b6111606120c1565b9061116a336122e6565b73ffffffffffffffffffffffffffffffffffffffff908180603454169116918183146112c35784519061119c8261214f565b60018252602092838301843682378351156112975752815191885b83811061124e57505050508351947f70a0823100000000000000000000000000000000000000000000000000000000865230908601528085602481855afa9384156112455750859361120f575b50610f999350614df4565b90925083813d831161123e575b6112268183612187565b8101031261123a57610f9992519138611204565b8380fd5b503d61121c565b513d87823e3d90fd5b826112598284612e1e565b5116861461126f5761126a90612df1565b6111b7565b8888517fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b60248a60328b7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8585517fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576113256120e9565b9161132f336125d8565b837f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504180825260016020528282209373ffffffffffffffffffffffffffffffffffffffff8096169485845260205260ff8484205416611425575b60655495835b878110611399578480f35b816113a3826121e0565b90549060031b1c16803b156114215785809160448951809481937fd547741f0000000000000000000000000000000000000000000000000000000083528a8a8401528d60248401525af18015611417579061140392916114085750612df1565b61138e565b6114119061210c565b386104eb565b87513d88823e3d90fd5b8580fd5b81835260016020528383208584526020528383207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690553385837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b8680a4611388565b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57906114c66120e9565b906114d0336125d8565b6114d982612a4e565b8360655493819373ffffffffffffffffffffffffffffffffffffffff809116945b868110611505578380f35b8161150f826121e0565b90549060031b1c16803b1561159e5784809160448851809481937f2f2ff15d0000000000000000000000000000000000000000000000000000000083527f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50418a8401528c60248401525af18015611594579061158f92916114085750612df1565b6114fa565b86513d87823e3d90fd5b8480fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5751908152602090f35b83823461061c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57823573ffffffffffffffffffffffffffffffffffffffff918282169283830361159e57611638336122e6565b81517fa8c62e760000000000000000000000000000000000000000000000000000000081526020818881885afa9081156117cb5786916117ad575b5081309116036117855760655491855b838110611737575050506801000000000000000081101561170b57906116b28260016116e494016065556121e0565b90919082549060031b9173ffffffffffffffffffffffffffffffffffffffff9283811b93849216901b16911916179055565b7f1e7b117a6591133f0b36fc2c24d59f8465d806fdcad63aa33246b45fd62c89ff8280a280f35b6024846041877f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b82611741826121e0565b90549060031b1c16861461175d5761175890612df1565b611683565b8782517f7cc7731c000000000000000000000000000000000000000000000000000000008152fd5b8582517feeacc72d000000000000000000000000000000000000000000000000000000008152fd5b6117c5915060203d8111610e2657610e188183612187565b87611673565b83513d88823e3d90fd5b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f5735606554811015610f0f5773ffffffffffffffffffffffffffffffffffffffff906065602094527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70154169051908152f35b90915034610f0f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f578160209360ff926118996120c1565b903582526001865273ffffffffffffffffffffffffffffffffffffffff83832091168252855220541690519015158152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f996119066120e9565b61190f33612769565b614ae4565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906066549051908152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f9961198c6120e9565b611995336122e6565b614841565b833461025e57602091827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57803567ffffffffffffffff9182821161123a573660238301121561123a578101356119f6816121c8565b92611a0387519485612187565b81845260248685019260051b8401019236841161142157959695602401915b838310611a7b5750505050611a3690614585565b9190835194848695860192865281860152835180925280606086019401925b828110611a6457505050500390f35b835185528695509381019392810192600101611a55565b8297969735828116810361051f578152959695918701918701611a22565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b61449b565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209060ff6033541690519015158152f35b83903461061c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57611b50336122e6565b3560665580f35b833461025e57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f91612c08565b83903461061c57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57611bc66120c1565b903373ffffffffffffffffffffffffffffffffffffffff831603611bef5790610f999135612b2a565b60649060208551917f08c379a0000000000000000000000000000000000000000000000000000000008352820152600260248201527f37310000000000000000000000000000000000000000000000000000000000006044820152fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab8152f35b90915034610f0f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f573590611ce06120c1565b908284526001602052611cfa6001828620015433906128fa565b828452600160205273ffffffffffffffffffffffffffffffffffffffff81852092169182855260205260ff818520541615611d33578380f35b8284526001602052808420828552602052832060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905533917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8480a43880808380f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e5750611de090611dda336125d8565b3561422c565b611e03823373ffffffffffffffffffffffffffffffffffffffff60345416614df4565b82519182526020820152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50418152f35b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57816020936001923581528285522001549051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090611eec6143f2565b15159051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209073ffffffffffffffffffffffffffffffffffffffff603454169051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906036549051908152f35b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f577fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a8600916020913590611fe7336122e6565b8160365551908152a180f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b614326565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5628152f35b84903461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906035548152f35b6024359073ffffffffffffffffffffffffffffffffffffffff821682036120e457565b600080fd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036120e457565b67ffffffffffffffff811161212057604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761212057604052565b6080810190811067ffffffffffffffff82111761212057604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761212057604052565b67ffffffffffffffff81116121205760051b60200190565b6065548110156122175760656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b67ffffffffffffffff811161212057601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381106122935750506000910152565b8181015183820152602001612283565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936122df81518092818752878088019101612280565b0116010190565b73ffffffffffffffffffffffffffffffffffffffff1660008181527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db6020908152604080832054909391927f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419290916001919060ff161561236957505050505050565b61237290614c6e565b9285519161237f8361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116124e05750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b8401917f206973206d697373696e6720726f6c6520000000000000000000000000000000603784015251809386840190612280565b01036028810187520185612187565b519283927f08c379a0000000000000000000000000000000000000000000000000000000008452600484015260248301906122a3565b0390fd5b6064848651907f08c379a000000000000000000000000000000000000000000000000000000000825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a61251d8587614c5d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191906123ac565b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526032600452fd5b73ffffffffffffffffffffffffffffffffffffffff1660008181527f015260285f12fe1d77221203cd7e5aa67b79d47399b4bedd98b8730e56d911bf6020908152604080832054909391927f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5629290916001919060ff161561265b57505050505050565b61266490614c6e565b928551916126718361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116126f85750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a6127358587614c5d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01919061269e565b73ffffffffffffffffffffffffffffffffffffffff1660008181527f10c15aae13326e9b33c92ffbb94efb7492c500f0cca324caca9bd1aca194ed186020908152604080832054909391927ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab9290916001919060ff16156127ec57505050505050565b6127f590614c6e565b928551916128028361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116128895750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a6128c68587614c5d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01919061282f565b60009080825260019160209280845260409473ffffffffffffffffffffffffffffffffffffffff868420911690818452855260ff86842054161561294057505050505050565b61294990614c6e565b928551916129568361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116129dd5750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a612a1a8587614c5d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019190612983565b73ffffffffffffffffffffffffffffffffffffffff1660008181527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db60205260408120549091907f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419060ff1615612ac457505050565b8083526001602052604083208284526020526040832060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d339380a4565b90600091808352600160205273ffffffffffffffffffffffffffffffffffffffff6040842092169182845260205260ff604084205416612b6957505050565b808352600160205260408320828452602052604083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b339380a4565b91908203918211612bd957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080603354916040918251937fbf3759b500000000000000000000000000000000000000000000000000000000855273ffffffffffffffffffffffffffffffffffffffff90602086600481858560081c165afa958615612de7578496612db3575b5060ff1615612d7757612c83612c7e6143f2565b61422c565b508580821015612d5457612c98929350612bcc565b905b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d5096080612cc78488612bcc565b965b86519086825285602083015288888301526060820152a160335460081c16803b156120e45760009283606492865197889586947fa1d9bafc0000000000000000000000000000000000000000000000000000000086526004860152602485015260448401525af1908115612d4a5750612d3f5750565b612d489061210c565b565b513d6000823e3d90fd5b90818111612d64575b5050612c9a565b612d6f929450612bcc565b918438612d5d565b84925060809150612da87f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d50995612e7e565b969193909394612cc9565b9095506020813d8211612ddf575b81612dce60209383612187565b8101031261123a57519460ff612c6a565b3d9150612dc1565b85513d86823e3d90fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612bd95760010190565b80518210156122175760209160051b010190565b81810292918115918404141715612bd957565b908160209103126120e4575173ffffffffffffffffffffffffffffffffffffffff811681036120e45790565b91908201809211612bd957565b9060008091828492612e8e614326565b9573ffffffffffffffffffffffffffffffffffffffff908160345416906040938451998a927f70a08231000000000000000000000000000000000000000000000000000000009485855230600486015284602460209687935afa9b8c156131c257889c6131ef575b50612f01828d612e71565b91156131cc5750602460608660335460081c168851928380927f39ebf8230000000000000000000000000000000000000000000000000000000082523060048301525afa9081156131c2579084918991613133575b500151918282111561305f575090612f6d91612bcc565b98612f78888b612e71565b9384151580613056575b612f90575b50505050505050565b612fa3612f9e849387612bcc565b613efb565b506034541692602486518095819382523060048301525afa93841561304d5750849361301d575b50508110612fdd575b8080808080612f87565b91928286929611600014612ff757505092905b3880612fd3565b9094918561300491612bcc565b91508082101561301657505b90612ff0565b9050613010565b9080929350813d8311613046575b6130358183612187565b81010312610f0f5751903880612fca565b503d61302b565b513d86823e3d90fd5b50848210612f82565b9a995061306b91612bcc565b97613076888a612e71565b938415158061312a575b61308d5750505050505050565b61309b612f9e849387612bcc565b506034541692602486518095819382523060048301525afa93841561304d575084936130fa575b505081106130d4578080808080612f87565b919282859295116000146130ed57505091903880612fd3565b9093918461300491612bcc565b9080929350813d8311613123575b6131128183612187565b81010312610f0f57519038806130c2565b503d613108565b50848210613080565b9150506060813d82116131ba575b8161314e60609383612187565b81010312610f0b578651906060820182811067ffffffffffffffff82111761318d57885280518252808501518286015287015187820152839038612f56565b60248a7f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b3d9150613141565b87513d8a823e3d90fd5b955050505050508592939450949094116131e7575b50829190565b9150386131e1565b909b508381813d8311613217575b6132078183612187565b81010312610f0b57519a38612ef6565b503d6131fd565b60405190606554808352826020918282019060656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c7936000905b82821061327157505050612d4892500383612187565b855473ffffffffffffffffffffffffffffffffffffffff168452600195860195889550938101939091019061325b565b908160209103126120e4575180151581036120e45790565b7f80000000000000000000000000000000000000000000000000000000000000008114612bd95760000390565b81810392916000138015828513169184121617612bd957565b60ff6033541661387a5761331161321e565b8060c05251806080521561387a5780518101906020818184019303126120e457602081015167ffffffffffffffff918282116120e457019180603f840112156120e457602083015191613363836121c8565b936133716040519586612187565b8385526040602086019460051b8201019283116120e457604001925b828410613e0a5750505050600090606060a0528051613df7575b50600090600060e052600090816024602073ffffffffffffffffffffffffffffffffffffffff60345416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa908115613dea5760e05191613db2575b5060e051908182908260c05151917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061346461344e856121c8565b9461345c6040519687612187565b8086526121c8565b0136602085013760c05151937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60e05190603554915b878110613b22575050508561393e575b5050505050505010600014613775575050600090815b6080518110156135de5760006134d88260a051612e1e565b51126134ed575b6134e890612df1565b6134c0565b9160006135056134ff8560a051612e1e565b516132b9565b602073ffffffffffffffffffffffffffffffffffffffff6135288760c051612e1e565b5116602461353b6134ff8960a051612e1e565b60405195869384927f2e1a7d4d00000000000000000000000000000000000000000000000000000000845260048401525af19182156135d25760009261359c575b509161358e613594926134e894612bcc565b90612e71565b9290506134df565b90916020823d6020116135ca575b816135b760209383612187565b8101031261025e5750519061358e61357c565b3d91506135aa565b6040513d6000823e3d90fd5b5090606654811161374b576000905b60805182101561374757806136048360a051612e1e565b511315613705576136219061361b8360a051612e1e565b516132e6565b61362d8260a051612e1e565b5260009061368373ffffffffffffffffffffffffffffffffffffffff6034541673ffffffffffffffffffffffffffffffffffffffff61366e8460c051612e1e565b511661367c8460a051612e1e565b5191614df4565b73ffffffffffffffffffffffffffffffffffffffff6136a48260c051612e1e565b5116803b15610f0f578280916004604051809481937fd0e30db00000000000000000000000000000000000000000000000000000000083525af180156136fa57906136f492916114085750612df1565b906135ed565b6040513d85823e3d90fd5b9060006137148260a051612e1e565b5113613724575b6136f490612df1565b9061373f6136f4916137388460a051612e1e565b5190612bcc565b91905061371b565b5050565b60046040517f5c3810af000000000000000000000000000000000000000000000000000000008152fd5b6138af575b5073ffffffffffffffffffffffffffffffffffffffff603454166040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152602081602481855afa9081156135d25760009161387d575b50806137e2575050565b6138119173ffffffffffffffffffffffffffffffffffffffff61380960e05160c051612e1e565b511690614df4565b73ffffffffffffffffffffffffffffffffffffffff61383460e05160c051612e1e565b5116803b156120e457600080916004604051809481937fd0e30db00000000000000000000000000000000000000000000000000000000083525af180156135d257612d3f575b50565b906020823d6020116138a7575b8161389760209383612187565b8101031261025e575051386137d8565b3d915061388a565b602073ffffffffffffffffffffffffffffffffffffffff6138d460009360c051612e1e565b51166004604051809481937f853828b60000000000000000000000000000000000000000000000000000000083525af180156135d2571561377a576139309060203d602011613937575b6139288183612187565b8101906132a1565b503861377a565b503d61391e565b94965088958695869590915b81871061399e575050505050505080851180613991575b1561398057505061397490600193613e23565b388080808080806134aa565b61398c92919450613e23565b613974565b50600160c0515111613961565b9091929394959660e0518814600014613ad7576139c89061358e836139c38988612e71565b612e32565b9684151580613acd575b6139eb575b6139e090612df1565b95949392919061394a565b9a6139ff856139fa8887612e71565b612e71565b73ffffffffffffffffffffffffffffffffffffffff613a2260e05160c051612e1e565b5116906020613a318989612e71565b6024604051809581937fa7d385e200000000000000000000000000000000000000000000000000000000835260048301525afa918215613ac2578b92613a8c575b509161358e613a84926139e094612e32565b9b90506139d7565b9091506020813d602011613aba575b81613aa860209383612187565b810103126105f757519061358e613a72565b3d9150613a9b565b6040513d8d823e3d90fd5b50600183116139d2565b878d03613afc57613af66139e091613aef8a8a612e1e565b5190612e71565b97612df1565b613b1c889c613aef613b156139e094613aef8d8d612e1e565b9a8a612e1e565b9b612df1565b602498602073ffffffffffffffffffffffffffffffffffffffff613b488460c051612e1e565b51166040519b8c80927fa7d385e20000000000000000000000000000000000000000000000000000000082528b60048301525afa998a15613da5578e9a613d70575b50600490602073ffffffffffffffffffffffffffffffffffffffff613bb18560c051612e1e565b5116604051938480927fc1590cd70000000000000000000000000000000000000000000000000000000082525afa918215613cf0578f92613d3a575b5081613bf891612e71565b998b8111613d2a575b50600a848102048403613cfd5783600a028111613c28575b50613c2390612df1565b61349a565b6004602073ffffffffffffffffffffffffffffffffffffffff613c4d8560c051612e1e565b5116604051928380927f57ded9c90000000000000000000000000000000000000000000000000000000082525afa908115613cf0578f91613cbe575b50613c948282612e32565b613c9e848b612e1e565b52838110613cad575b50613c19565b925094509c50613c238d9038613ca7565b90506020813d602011613ce8575b81613cd960209383612187565b81010312610f07575138613c89565b3d9150613ccc565b8f604051903d90823e3d90fd5b60248e7f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b60e08390529a5093508338613c01565b9091506020813d602011613d68575b81613d5660209383612187565b81010312610f07575190613bf8613bed565b3d9150613d49565b9099506020813d602011613d9d575b81613d8c60209383612187565b81010312610dea5751986004613b8a565b3d9150613d7f565b8e604051903d90823e3d90fd5b90506020813d602011613de2575b81613dcd60209383612187565b81010312613ddc575138613413565b60e05180fd5b3d9150613dc0565b6040513d60e051823e3d90fd5b613e019150614585565b60a052386133a7565b835182811681036120e45781526020938401930161338d565b8115613e2d570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6040516020908181019067ffffffffffffffff928183108484111761212057929082604052600081526040519360408501918180870152518092526060850193926000905b838210613ee2575050505050906110de81612d4893037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612187565b8451811686529482019493820193600190910190613ea1565b600080613f0661321e565b928351928315614224576066549485831061421b5781959395935b613f2b8185612bcc565b871015614212577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff968397845b8881106140cb57505073ffffffffffffffffffffffffffffffffffffffff9788613f828286612e1e565b51166040998a51928380937f5be9b2d3000000000000000000000000000000000000000000000000000000008252602094859160049788915afa9081156140c15789916140a4575b50156140955760248392613fdf8e938a612e1e565b51169489613fed888d612bcc565b935196879485937f2e1a7d4d0000000000000000000000000000000000000000000000000000000085528401525af1998a1561124557508599614061575b505061403a8861404092612e71565b95612df1565b961561405757600687101561405757959395613f21565b5050505091505090565b9080929950813d831161408e575b6140798183612187565b8101031261123a57519661403a61404061402b565b503d61406f565b50505050965050505050505090565b6140bb9150843d8611613937576139288183612187565b38613fca565b8d513d8b823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff806140eb8388612e1e565b5116906040918251918280927f5be9b2d3000000000000000000000000000000000000000000000000000000008252602093849160049687915afa908115614208578b916141eb575b5061414c575b5050505061414790612df1565b613f58565b8190614158868b612e1e565b51168451938480927f57ded9c90000000000000000000000000000000000000000000000000000000082525afa9283156141e2575088926141b4575b50508281106141a6575b80808061413a565b91509850614147899061419e565b90809250813d83116141db575b6141cb8183612187565b8101031261051f57513880614194565b503d6141c1565b513d8a823e3d90fd5b6142029150833d8511613937576139288183612187565b38614134565b85513d8d823e3d90fd5b50505050505090565b50935050505090565b935050505090565b6024602073ffffffffffffffffffffffffffffffffffffffff60345416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9081156135d2576000916142bf575b50818110614299575090600090565b806139fa612f9e6142aa9385612bcc565b8181106142b8575090600090565b9160009150565b906020823d82116142e8575b816142d860209383612187565b8101031261025e5750513861428a565b3d91506142cb565b604051906080820182811067ffffffffffffffff8211176121205760405260006060838181528260208201528260408201520152565b600060655481905b80821061433a57505090565b9091614345836121e0565b9054906040918251917fc1590cd70000000000000000000000000000000000000000000000000000000083528260048173ffffffffffffffffffffffffffffffffffffffff602095869560031b1c165afa928315612d4a57506000926143c1575b50506143b5906143bb92612e71565b92612df1565b9061432e565b81819392933d83116143eb575b6143d88183612187565b8101031261025e575051816143b56143a6565b503d6143ce565b6024906143fd614326565b602073ffffffffffffffffffffffffffffffffffffffff60345416604051948580927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9283156135d257600093614468575b50916144659192612e71565b90565b6020813d8211614493575b8161448060209383612187565b8101031261123a57519250614465614459565b3d9150614473565b6144a36143f2565b90811561457f576000916065549280935b8085106144c75750614465929350613e23565b906144d1856121e0565b9054906040918251917f116ac4a30000000000000000000000000000000000000000000000000000000083528260048173ffffffffffffffffffffffffffffffffffffffff602095869560031b1c165afa928315612d4a575060009261454e575b50506145419061454792612e71565b94612df1565b93906144b4565b81819392933d8311614578575b6145658183612187565b8101031261025e57505181614541614532565b503d61455b565b60009150565b600090600091606554614597816121c8565b926040916145a783519586612187565b8085527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06145d4826121c8565b016020903682880137859683518303614818576145ef6143f2565b96871561480a57509291908380935b8385106146495750505050506127100361462057509061461d91613e23565b91565b600490517f6edcc523000000000000000000000000000000000000000000000000000000008152fd5b909192939661271061468761467467ffffffffffffffff988961466c8d88612e1e565b511690612e71565b9761467f8b86612e1e565b51168b612e32565b04614691896121e0565b9190548951927fc1590cd70000000000000000000000000000000000000000000000000000000084526004938881868173ffffffffffffffffffffffffffffffffffffffff8097600397881b1c165afa90811561480057918f8a94928f948b916147b5575b5084602494939261471561470d61471b948b6132e6565b978892612e1e565b526121e0565b9054911b1c16948c5195869384927fa7d385e20000000000000000000000000000000000000000000000000000000084528301525afa9182156147ab57859261477a575b509161358e613af69261477194612e32565b939291906145fe565b9091508581813d83116147a4575b6147928183612187565b8101031261159e57519061358e61475f565b503d614788565b89513d87823e3d90fd5b9395929450505081813d83116147f9575b6147d08183612187565b81010312610f0b5788928f9261471b8f809561471561470d6024975194505050929394506146f6565b503d6147c6565b8c513d8a823e3d90fd5b989750955050505050509190565b600485517fcdeedcbd000000000000000000000000000000000000000000000000000000008152fd5b61484961321e565b9081519160005b8381106148815760046040517f30990b67000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff806148a18385612e1e565b5116908085169182146148be5750506148b990612df1565b614850565b909460009450816148d184869596612e1e565b511692604094855180957f853828b600000000000000000000000000000000000000000000000000000000825260209687918160049b8c925af18015614ad957614abc575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92838101908111614a8e5784818303614a6d575b5050505060659081548015614a3f5784939291019061498f61496d836121e0565b73ffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055565b55603454169360248451809681937f70a0823100000000000000000000000000000000000000000000000000000000835230908301525afa918215612d4a5750600091614a13575b509050614a06575b7f95c84dbc5fd872c46b0e4290775a1a4ea1c8d760f9e4d38f48ba71b6f9a667db600080a2565b614a0e613e5c565b6149df565b82813d8311614a38575b614a278183612187565b8101031261025e57505180386149d7565b503d614a1d565b6031877f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b614a7d6116b292614a8595612e1e565b5116916121e0565b3880808461494c565b6011887f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b614ad290863d8811613937576139288183612187565b5038614916565b87513d6000823e3d90fd5b614aec61321e565b9081519160005b838110614b245760046040517f30990b67000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff80614b448385612e1e565b511690808516918214614b61575050614b5c90612df1565b614af3565b90946000945081614b7484869596612e1e565b511692604094855180957f853828b600000000000000000000000000000000000000000000000000000000825260209687918160049b8c925af1908115614ad957600091614c40575b5015614c18577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92838101908111614a8e5784818303614a6d575050505060659081548015614a3f5784939291019061498f61496d836121e0565b8686517fa1248235000000000000000000000000000000000000000000000000000000008152fd5b614c579150863d8811613937576139288183612187565b38614bbd565b908151811015612217570160200190565b604051906060820182811067ffffffffffffffff82111761212057604052602a82526020820160403682378251156122175760309053815160019081101561221757607860218401536029905b808211614d29575050614ccb5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015614dc6577f3031323334353637383961626364656600000000000000000000000000000000901a614d658486614c5d565b5360041c918015614d98577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190614cbb565b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff90921660248301526044820192909252612d4891610aff8260648101610ad3565b604051614edd9173ffffffffffffffffffffffffffffffffffffffff16614e798261214f565b6000806020958685527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656487860152868151910182855af13d15614f86573d91614ec183612246565b92614ecf6040519485612187565b83523d60008785013e614f8a565b80519081614eea57505050565b8280614efa9383010191016132a1565b15614f025750565b608490604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b6060915b919290156150055750815115614f9e575090565b3b15614fa75790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156150185750805190602001fd5b612480906040519182917f08c379a00000000000000000000000000000000000000000000000000000000083526020600484015260248301906122a356fea26469706673582212205d4371146c49584a2effa728df6c1c9f6fc2afa78935429a6b14719f26cf70c164736f6c63430008110033", + "nonce": "0x3ad", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0xb15f678d8fe2bd3a0bd0f347863d1458112e94b2553214497ecceed33f6734e0", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0xBfa4459868C60da9edd835F0be684EDeC054557b", + "function": null, + "arguments": [ + "0xa693aBabF230397B3e6385ff7eE09607f562af8c", + "0x1D941EF0D3Bba4ad67DBfBCeE5262F4CEE53A32b", + "0xe6bfbfd8000000000000000000000000e9f183fc656656f1f17af1f2b0df79b8ff9ad8ed000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe" + ], + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x16306b", + "value": "0x0", + "data": "0x60406080815262000f548038038062000018816200030b565b9283398101906060818303126200030657620000348162000347565b916020926200004584840162000347565b8584015190936001600160401b0391908282116200030657019280601f850112156200030657835193620000836200007d866200035c565b6200030b565b948086528786019288828401011162000306578288620000a4930162000378565b823b15620002ac577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b03199081166001600160a01b0386811691821790935590959194600093909290917fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8580a2805115801590620002a4575b620001f5575b50505050507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103937f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f86865493815196818616885216958684820152a18315620001a357501617905551610afd9081620004578239f35b60849086519062461bcd60e51b82526004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152fd5b895194606086019081118682101762000290578a52602785527f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c89860152660819985a5b195960ca1b8a860152516200027a9493929183918291845af4903d1562000286573d6200026a6200007d826200035c565b90815280938a3d92013e6200039d565b5038808080806200012d565b606092506200039d565b634e487b7160e01b85526041600452602485fd5b508362000127565b865162461bcd60e51b815260048101879052602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608490fd5b600080fd5b6040519190601f01601f191682016001600160401b038111838210176200033157604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036200030657565b6001600160401b0381116200033157601f01601f191660200190565b60005b8381106200038c5750506000910152565b81810151838201526020016200037b565b91929015620004025750815115620003b3575090565b3b15620003bd5790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015620004165750805190602001fd5b6044604051809262461bcd60e51b82526020600483015262000448815180928160248601526020868601910162000378565b601f01601f19168101030190fdfe6080604052600436101561002c575b361561001f575b61001d6107b1565b005b6100276107b1565b610015565b6000803560e01c9081633659cfe614610093575080634f1ef2861461008a5780635c60da1b146100815780638f283970146100785763f851a4400361000e57610073610455565b61000e565b506100736102f0565b5061007361023b565b50610073610157565b3461012c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261012c576100ca61012f565b73ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541633146000146101235761012090610117610511565b908382526105cb565b80f35b506101206107b1565b80fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361015257565b600080fd5b5060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525761018a61012f565b60243567ffffffffffffffff9182821161015257366023830112156101525781600401359283116101525736602484840101116101525773ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416331460001461023057600060208480602461021e61021961001d99610582565b61053e565b9682885201838701378401015261070b565b50505061001d6107b1565b50346101525760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610152576020600073ffffffffffffffffffffffffffffffffffffffff90817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541633146000146102e25750807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416905b60405191168152f35b906102eb6107b1565b6102d9565b50346101525760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525761032861012f565b73ffffffffffffffffffffffffffffffffffffffff907fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610391808354163314600014610230577f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f604084549281519481851686521693846020820152a181156103d1577fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b50346101525760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610152576020600073ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038181541633146000146104d85754604051911681529050f35b506102eb6107b1565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051906020820182811067ffffffffffffffff82111761053157604052565b6105396104e1565b604052565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f604051930116820182811067ffffffffffffffff82111761053157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff81116105be575b01160190565b6105c66104e1565b6105b8565b803b156106875773ffffffffffffffffffffffffffffffffffffffff81167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc817fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a281511580159061067f575b61066a575050565b61067c916106766108dd565b9161095b565b50565b506000610662565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152fd5b803b156106875773ffffffffffffffffffffffffffffffffffffffff81167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc817fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a28151158015906107a95761066a575050565b506001610662565b5073ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354163314610833577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc54166000808092368280378136915af43d82803e1561082f573d90f35b3d90fd5b60a46040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f65740000000000000000000000000000000000000000000000000000000000006084820152fd5b604051906060820182811067ffffffffffffffff82111761094e575b604052602782527f206661696c6564000000000000000000000000000000000000000000000000006040837f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c60208201520152565b6109566104e1565b6108f9565b6000806109909493602081519101845af43d15610993573d9161098061021984610582565b9283523d6000602085013e610a00565b90565b606091610a00565b156109a257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b91929015610a205750815115610a14575090565b610990903b151561099b565b825190915015610a335750805190602001fd5b604051907f08c379a000000000000000000000000000000000000000000000000000000000825281602080600483015282519283602484015260005b848110610ab0575050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000604480968601015201168101030190fd5b818101830151868201604401528593508201610a6f56fea26469706673582212201c39b75ea59593d8670f804896fbda9470452421c2de5834b8a62b5fdb34806664736f6c63430008110033000000000000000000000000a693ababf230397b3e6385ff7ee09607f562af8c0000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e4e6bfbfd8000000000000000000000000e9f183fc656656f1f17af1f2b0df79b8ff9ad8ed000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe00000000000000000000000000000000000000000000000000000000", + "nonce": "0x3ae", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0xf943e18b4748f5a473cf0c8f62fbcf23b832e025207bbaafa5120fb571732208", + "transactionType": "CREATE", + "contractName": "GenericCompoundUpgradeable", + "contractAddress": "0xDeEe844C6992F36ADAC59cF38d1F790B2a0313e2", + "function": null, + "arguments": null, + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x53ea5b", + "value": "0x0", + "data": "0x60808060405234620000d3576000549060ff8260081c169081600014620000c857303b155b156200006f57501590816200005c575b506200004b575b604051614b839081620000d98239f35b61ff0019600054166000556200003b565b61ffff1916610101176000553862000034565b62461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b60ff83161562000024565b600080fdfe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806305b41934146102eb5780630948c0b6146102e25780630b6d1d17146102d9578063109d0af8146102d0578063116ac4a3146102c75780631f1fcd51146102be578063248a9ca3146102b557806324ea54f4146102ac5780632e1a7d4d146102a35780632f2ff15d1461029a578063364bc15a1461029157806336568abe146102885780633e0c06291461027f578063437552c0146102765780635312ea8e1461026d57806357ded9c914610264578063580b7c2e1461025b5780635be9b2d3146102525780635fe3b5671461024957806369e527da146102405780637dc0d1d014610237578063804869911461022e578063853828b6146102255780638b2021761461021c57806391d1485414610213578063a217fddf1461020a578063a7d385e214610201578063a8c62e76146101f8578063b82c4dc1146101ef578063b8dc491b146101e6578063c1590cd7146101dd578063c6afba3c146101d4578063d0e30db0146101cb578063d37db1d2146101c2578063d547741f146101b95763dc4c90d30361000e576101b4611f4b565b61000e565b506101b4611ee8565b506101b4611eab565b506101b4611d06565b506101b4611ccc565b506101b4611c92565b506101b4611b23565b506101b4611909565b506101b4611885565b506101b461138d565b506101b4611352565b506101b46112cf565b506101b46111ad565b506101b4611097565b506101b4610fd5565b506101b4610f08565b506101b4610eb5565b506101b4610e67565b506101b4610e05565b506101b4610dab565b506101b4610d71565b506101b4610ba1565b506101b4610b60565b506101b4610ab6565b506101b46109f3565b506101b4610999565b506101b461085a565b506101b4610814565b506101b46107ba565b506101b461076c565b506101b4610719565b506101b46106c6565b506101b4610678565b506101b461063b565b506101b46105a7565b506101b4610443565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161033857604052565b6103406102f4565b604052565b6040810190811067ffffffffffffffff82111761033857604052565b6080810190811067ffffffffffffffff82111761033857604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761033857604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff81116103fa575b01160190565b6104026102f4565b6103f4565b929192610413826103be565b91610421604051938461037d565b82948184528183011161043e578281602093846000960137010152565b600080fd5b503461043e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e5760243567ffffffffffffffff811161043e573660238201121561043e5760006104a781923690602481600401359101610407565b6104b033611fb5565b73ffffffffffffffffffffffffffffffffffffffff6038541682602083519301915af16104db6129be565b9015610529576104f881519160208060043594830101910161282f565b106104ff57005b60046040517f22313ae9000000000000000000000000000000000000000000000000000000008152fd5b8051908161055b5760046040517fc76d51a1000000000000000000000000000000000000000000000000000000008152fd5b602001fd5b73ffffffffffffffffffffffffffffffffffffffff81160361043e57565b6044359061058b82610560565b565b6084359061058b82610560565b60c4359061058b82610560565b503461043e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e5773ffffffffffffffffffffffffffffffffffffffff6004356105f881610560565b610601336121c3565b167fffffffffffffffffffffffff00000000000000000000000000000000000000006038541617603855600080f35b600091031261043e57565b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e576020603754604051908152f35b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e57602060405173c00e94cb662c3520282e6f5717214004a7f268888152f35b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e5760206107116107036135c6565b61070b612858565b9061281c565b604051908152f35b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e57602073ffffffffffffffffffffffffffffffffffffffff60365416604051908152f35b503461043e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e5760043560005260016020526020600160406000200154604051908152f35b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e5760206040517f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50418152f35b503461043e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e5761084d336122e2565b60206107116004356137e2565b503461043e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e5760043560243561089981610560565b60009180835260016020526108b660016040852001543390612401565b808352600160205260ff6108ed83604086209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b5416156108f8578280f35b808352600160205261092d82604085209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8480a438808280f35b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e5760206040517ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab8152f35b503461043e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e57602435610a2f81610560565b3373ffffffffffffffffffffffffffffffffffffffff821603610a5857610019906004356126d7565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f37310000000000000000000000000000000000000000000000000000000000006044820152fd5b503461043e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e576000808080600435610af781610560565b60243590610b04336121c3565b82908215610b56575b73ffffffffffffffffffffffffffffffffffffffff1690f115610b2c57005b60046040517f72de3212000000000000000000000000000000000000000000000000000000008152fd5b6108fc9150610b0d565b503461043e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e57610b99336121c3565b600435606655005b503461043e576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e5761001990610bdf336121c3565b610c1a610c0160655473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b8160405180927f852a12e300000000000000000000000000000000000000000000000000000000825281600081610c5b600435600483019190602083019252565b03925af18015610d64575b610d47575b5060365473ffffffffffffffffffffffffffffffffffffffff16610ca7610c0160345473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152909190838160248173ffffffffffffffffffffffffffffffffffffffff86165afa938415610d3a575b600094610d0b575b50506142aa565b610d2b929450803d10610d33575b610d23818361037d565b81019061282f565b913880610d04565b503d610d19565b610d4261283e565b610cfc565b610d5d90823d8411610d3357610d23818361037d565b5038610c6b565b610d6c61283e565b610c66565b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e5760206107116135c6565b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e5760206040517f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c8152f35b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e576020610e3f612858565b60375480600a0290600a820403610e5a575b60405191118152f35b610e626127b5565b610e51565b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e576020604051733d9819210a31b4961b30ef54be2aed79b9c9cd3b8152f35b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e57602073ffffffffffffffffffffffffffffffffffffffff60655416604051908152f35b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e57602060405173dbd020caef83efd542f4de03e3cf0c28a4428bd58152f35b9080601f8301121561043e5781359067ffffffffffffffff8211610fc8575b8160051b60405193602093610f8c8584018761037d565b8552838086019282010192831161043e578301905b828210610faf575050505090565b8380918335610fbd81610560565b815201910190610fa1565b610fd06102f4565b610f75565b503461043e5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e5760043561101181610560565b67ffffffffffffffff9060243582811161043e573660238201121561043e57611044903690602481600401359101610407565b61104c61057e565b60643584811161043e57611064903690600401610f56565b61106c61058d565b9160a43595861161043e57611088610019963690600401610f56565b9361109161059a565b95612a10565b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e576110d0336122e2565b60206110da612858565b6110e3816137e2565b1015604051908152f35b90600182811c92168015611136575b602083101461110757565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916110fc565b60005b8381106111535750506000910152565b8181015183820152602001611143565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f604093602084526111a68151809281602088015260208888019101611140565b0116010190565b503461043e576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126112cc5760405190806033546111ef816110ed565b808552916001918083169081156112845750600114611229575b611225856112198187038261037d565b60405191829182611163565b0390f35b9250603383527f82a75bdeeae8604d839476ae9efd8b0e15aa447e21bfd7f41283bb54e22c9a825b82841061126c57505050810160200161121982611225611209565b80546020858701810191909152909301928101611251565b869550611225969350602092506112199491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001682840152151560051b8201019293611209565b80fd5b503461043e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e57602060ff61134660243561131281610560565b6004356000526001845260406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54166040519015158152f35b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e57602060405160008152f35b503461043e576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e57611225906116bf6004916116b96116b38435926113f3610c0160365473ffffffffffffffffffffffffffffffffffffffff1690565b9581611417610c0160655473ffffffffffffffffffffffffffffffffffffffff1690565b97604098899783895180947f70a082310000000000000000000000000000000000000000000000000000000082528180611470878b830191909173ffffffffffffffffffffffffffffffffffffffff6020820193169052565b03915afa928315611878575b600093611859575b508851927f47bd371800000000000000000000000000000000000000000000000000000000845284848781865afa93841561184c575b60009461182d575b508951957f8f840ddd00000000000000000000000000000000000000000000000000000000875285878281875afa968715611820575b600097611801575b508a517f173b990400000000000000000000000000000000000000000000000000000000815286818381885afa9081156117f4575b6000916117d7575b508b51947ff3fdb15a0000000000000000000000000000000000000000000000000000000086528c88878581855afa9687156117ca575b600097611791575b5061160684611614928b88958251927f18160ddd00000000000000000000000000000000000000000000000000000000845282848681855afa938415611784575b600094611765575b5051938480927f182df0f50000000000000000000000000000000000000000000000000000000082525afa918215611758575b600092611739575b5061281c565b670de0b6b3a7640000900490565b93600086126116f857509061164c8561164673ffffffffffffffffffffffffffffffffffffffff96976116979561284b565b9661284b565b9c5b51988997889687957fb816881600000000000000000000000000000000000000000000000000000000875286019094939260609260808301968352602083015260408201520152565b0392165afa9182156116eb575b6000926116ce575b50506127e5565b91613d9a565b9061284b565b90519081529081906020820190565b6116e49250803d10610d3357610d23818361037d565b38806116ac565b6116f361283e565b6116a4565b61169792915073ffffffffffffffffffffffffffffffffffffffff9461172761172d611733936117278a61358b565b906129ee565b9761358b565b9c61164e565b6117519192508c8d3d10610d3357610d23818361037d565b9038611600565b61176061283e565b6115f8565b61177d919450833d8511610d3357610d23818361037d565b92386115c5565b61178c61283e565b6115bd565b611614919750846117ba611606928c8d3d106117c3575b6117b2818361037d565b8101906129fb565b9892505061157c565b503d6117a8565b6117d261283e565b611574565b6117ee9150873d8911610d3357610d23818361037d565b3861153d565b6117fc61283e565b611535565b611819919750863d8811610d3357610d23818361037d565b9538611500565b61182861283e565b6114f8565b611845919450853d8711610d3357610d23818361037d565b92386114c2565b61185461283e565b6114ba565b611871919350843d8611610d3357610d23818361037d565b9138611484565b61188061283e565b61147c565b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e57602073ffffffffffffffffffffffffffffffffffffffff60355416604051908152f35b9181601f8401121561043e5782359167ffffffffffffffff831161043e576020808501948460051b01011161043e57565b503461043e5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e57600467ffffffffffffffff813581811161043e5761195a90369084016118d8565b92909160243581811161043e5761197490369084016118d8565b93909160443590811161043e5761198e90369085016118d8565b91611998336121c3565b858714801590611b19575b611af05760005b8781106119b357005b806119c2611a94928a856129a0565b356119cc81610560565b6119d7828a896129a0565b35906119e282610560565b6119ed8388886129a0565b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152308c820190815273ffffffffffffffffffffffffffffffffffffffff8616602082810191909152933595939283918391829101038173ffffffffffffffffffffffffffffffffffffffff88165afa918215611ae3575b600092611ac6575b505083811015611a9957611a8990611a8f946129ee565b916146e3565b612902565b6119aa565b838111611aaa575b50505050612902565b611abd93611ab7916129ee565b9161480d565b38808080611aa1565b611adc9250803d10610d3357610d23818361037d565b3880611a72565b611aeb61283e565b611a6a565b846040517f46282e8d000000000000000000000000000000000000000000000000000000008152fd5b50828714156119a3565b503461043e576040807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e576004803590611b6282610560565b60243592611b6f84610560565b611b78336121c3565b611b80614003565b80519073ffffffffffffffffffffffffffffffffffffffff60009516945b828110611c2b5783517f70a08231000000000000000000000000000000000000000000000000000000008152308187019081526100199190899089906020908490819083010381845afa928315611c1e575b600093611bfe575b506142aa565b611c1791935060203d8111610d3357610d23818361037d565b9184611bf8565b611c2661283e565b611bf0565b611c55610c01611c3b838561297e565b5173ffffffffffffffffffffffffffffffffffffffff1690565b8614611c6957611c6490612902565b611b9e565b505050517f093e1cdb000000000000000000000000000000000000000000000000000000008152fd5b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e576020610711612858565b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e57602061071161346e565b503461043e576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126112cc57611d40336122e2565b611d62610c0160365473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260209183918391611e1291908390829060249082905afa908115611e9e575b8491611e81575b50611dd7610c0160655473ffffffffffffffffffffffffffffffffffffffff1690565b906040519485809481937fa0712d68000000000000000000000000000000000000000000000000000000008352600483019190602083019252565b03925af1918215611e74575b8392611e57575b5050611e2e5780f35b60046040517e48195d000000000000000000000000000000000000000000000000000000008152fd5b611e6d9250803d10610d3357610d23818361037d565b3880611e25565b611e7c61283e565b611e1e565b611e989150833d8511610d3357610d23818361037d565b38611db4565b611ea661283e565b611dad565b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e5760206040516223dbb08152f35b503461043e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e57610019602435600435611f2a82610560565b806000526001602052611f466001604060002001543390612401565b6126d7565b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e57602073ffffffffffffffffffffffffffffffffffffffff60345416604051908152f35b90611fb160209282815194859201611140565b0190565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f10c15aae13326e9b33c92ffbb94efb7492c500f0cca324caca9bd1aca194ed1860205260409020547ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab9160019160ff161561202c57505050565b73ffffffffffffffffffffffffffffffffffffffff61204b911661416d565b91612054614091565b91603061206084612968565b53607861206c846140ac565b536041905b808211612166576121626037612130876121048861208f8915614108565b6120fe6040519586947f416363657373436f6e74726f6c3a206163636f756e742000000000000000000060208701526120d1815180926020858a019101611140565b8501016011907f206973206d697373696e6720726f6c652000000000000000000000000000000081520190565b90611f9e565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261037d565b6040519182917f08c379a000000000000000000000000000000000000000000000000000000000835260048301611163565b0390fd5b9091807f3031323334353637383961626364656600000000000000000000000000000000600f6121b0931660108110156121b6575b1a6121a685876140bd565b5360041c926140dc565b90612071565b6121be612938565b61219b565b73ffffffffffffffffffffffffffffffffffffffff811660009081527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db60205260409020547f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419160019160ff161561223a57505050565b73ffffffffffffffffffffffffffffffffffffffff612259911661416d565b91612262614091565b91603061226e84612968565b53607861227a846140ac565b536041905b80821161229d576121626037612130876121048861208f8915614108565b9091807f3031323334353637383961626364656600000000000000000000000000000000600f6122dc931660108110156121b6571a6121a685876140bd565b9061227f565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f21d442261a7cc2346fd3ca5e1f22fe015f6b71188f57ab4761df2e3faed3703f60205260409020547f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c9160019160ff161561235957505050565b73ffffffffffffffffffffffffffffffffffffffff612378911661416d565b91612381614091565b91603061238d84612968565b536078612399846140ac565b536041905b8082116123bc576121626037612130876121048861208f8915614108565b9091807f3031323334353637383961626364656600000000000000000000000000000000600f6123fb931660108110156121b6571a6121a685876140bd565b9061239e565b9081600052600160205260ff61243b8260406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b541615612446575050565b6121306121629261210461247a61247473ffffffffffffffffffffffffffffffffffffffff6048961661416d565b9261422f565b6040519485937f416363657373436f6e74726f6c3a206163636f756e742000000000000000000060208601526124ba815180926020603789019101611140565b84017f206973206d697373696e6720726f6c652000000000000000000000000000000060378201520190611f9e565b73ffffffffffffffffffffffffffffffffffffffff811660009081527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db602052604081207f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419060ff905b54161561255f57505050565b808252600160205261259483604084209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d73ffffffffffffffffffffffffffffffffffffffff3394169280a4565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f10c15aae13326e9b33c92ffbb94efb7492c500f0cca324caca9bd1aca194ed18602052604081207ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab9060ff90612553565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f21d442261a7cc2346fd3ca5e1f22fe015f6b71188f57ab4761df2e3faed3703f602052604081207f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c9060ff90612553565b600090808252600160205260ff61271184604085209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b541661271c57505050565b808252600160205261275183604084209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b73ffffffffffffffffffffffffffffffffffffffff3394169280a4565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b906223dbb0918281029281840414901517156127fd57565b61058b6127b5565b9061251c918281029281840414901517156127fd57565b818102929181159184041417156127fd57565b9081602091031261043e575190565b506040513d6000823e3d90fd5b919082018092116127fd57565b6024602073ffffffffffffffffffffffffffffffffffffffff60365416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9081156128f5575b6000916128d7575b506128c061346e565b81018091116128cc5790565b6128d46127b5565b90565b6128ef915060203d8111610d3357610d23818361037d565b386128b7565b6128fd61283e565b6128af565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612930570190565b611fb16127b5565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602090805115612976570190565b611fb1612938565b6020918151811015612993575b60051b010190565b61299b612938565b61298b565b91908110156129b1575b60051b0190565b6129b9612938565b6129aa565b3d156129e9573d906129cf826103be565b916129dd604051938461037d565b82523d6000602084013e565b606090565b919082039182116127fd57565b9081602091031261043e57516128d481610560565b939594909291956000549260ff8460081c169384600014612c915750303b155b15612c0d57612a47948794159687612ba757612e94565b612b75575b73ffffffffffffffffffffffffffffffffffffffff60046020828516612aad8173ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006065541617606555565b604051928380927f6f307dc30000000000000000000000000000000000000000000000000000000082525afa908115612b68575b600091612b4a575b5060365473ffffffffffffffffffffffffffffffffffffffff1691808316911603612b205761058b92612b1b916143c1565b6144c4565b60046040517f0766ebc2000000000000000000000000000000000000000000000000000000008152fd5b612b62915060203d81116117c3576117b2818361037d565b38612ae9565b612b7061283e565b612ae1565b612ba27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff60005416600055565b612a4c565b612bd86101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff6000541617600055565b612c0860017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000541617600055565b612e94565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152fd5b60ff1615612a30565b601f8111612ca6575050565b600090603382527f82a75bdeeae8604d839476ae9efd8b0e15aa447e21bfd7f41283bb54e22c9a82906020601f850160051c83019410612d01575b601f0160051c01915b828110612cf657505050565b818155600101612cea565b9092508290612ce1565b90815167ffffffffffffffff8111612e4f575b612d3281612d2d6033546110ed565b612c9a565b602080601f8311600114612d8b5750819293600092612d80575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c191617603355565b015190503880612d4c565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0831694612ddc60336000527f82a75bdeeae8604d839476ae9efd8b0e15aa447e21bfd7f41283bb54e22c9a8290565b926000905b878210612e37575050836001959610612e00575b505050811b01603355565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055388080612df5565b80600185968294968601518155019501930190612de1565b612e576102f4565b612d1e565b9081602091031261043e575160ff8116810361043e5790565b60ff16604d8111612e87575b600a0a90565b612e8f6127b5565b612e81565b94612ede909492919473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006038541617603855565b612f238573ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006035541617603555565b61307c612f4b610c01610c0160355473ffffffffffffffffffffffffffffffffffffffff1690565b9461307760405180977fdc4c90d300000000000000000000000000000000000000000000000000000000825281600460209a8b935afa908115613248575b60009161322b575b50603480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff928316179055600488612ff8610c0160345473ffffffffffffffffffffffffffffffffffffffff1690565b604051928380927ffc0c546a0000000000000000000000000000000000000000000000000000000082525afa90811561321e575b600091613201575b501673ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006036541617603655565b612d0b565b6130a66130a1610c0160345473ffffffffffffffffffffffffffffffffffffffff1690565b6124e9565b80519060005b8281106131e8575050506130bf826125fb565b80519060005b8281106131ca5750505061316d61058b93926130e6613172936130a1613255565b6130ef84612669565b6130f76132f5565b6130ff613395565b60048161312a610c01610c01610c0160365473ffffffffffffffffffffffffffffffffffffffff1690565b604051928380927f313ce5670000000000000000000000000000000000000000000000000000000082525afa9182156131bd575b600092613190575b5050612e75565b603755565b60365473ffffffffffffffffffffffffffffffffffffffff166143c1565b6131af9250803d106131b6575b6131a7818361037d565b810190612e5c565b3880613166565b503d61319d565b6131c561283e565b61315e565b80611a8f6131de611c3b6131e3948661297e565b6125fb565b6130c5565b80611a8f6130a1611c3b6131fc948661297e565b6130ac565b6132189150893d8b116117c3576117b2818361037d565b38613034565b61322661283e565b61302c565b6132429150883d8a116117c3576117b2818361037d565b38612f91565b61325061283e565b612f89565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab600081815260016020527f10c15aae13326e9b33c92ffbb94efb7492c500f0cca324caca9bd1aca194ed19547f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419283927fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9080a4600160406000200155565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041600081815260016020527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5dc547f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c9283927fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9080a4600160406000200155565b7f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c600081815260016020527f21d442261a7cc2346fd3ca5e1f22fe015f6b71188f57ab4761df2e3faed37040547f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419283927fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9080a4600160406000200155565b811561343f570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b613490610c0160655473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529060208083602481855afa92831561357e575b60009361355f575b50826134e557505050600090565b6128d49260048261160694604051928380927f182df0f50000000000000000000000000000000000000000000000000000000082525afa928315613552575b600093613533575b505061281c565b61354a929350803d10610d3357610d23818361037d565b90388061352c565b61355a61283e565b613524565b816135779294503d8511610d3357610d23818361037d565b91386134d7565b61358661283e565b6134cf565b7f800000000000000000000000000000000000000000000000000000000000000081146135b9575b60000390565b6135c16127b5565b6135b3565b6128d46135eb610c0160655473ffffffffffffffffffffffffffffffffffffffff1690565b6116b96116b361160660046040517f18160ddd00000000000000000000000000000000000000000000000000000000815261367f6020938285818682968c5afa908115613703575b6000916136e6575b50604051907f182df0f5000000000000000000000000000000000000000000000000000000008252848287818d5afa9182156136d9575b6000926136c1575061281c565b95604051928380927fae9d70b00000000000000000000000000000000000000000000000000000000082525afa9182156116eb576000926116ce5750506127e5565b611751919250853d8711610d3357610d23818361037d565b6136e161283e565b613672565b6136fd9150843d8611610d3357610d23818361037d565b3861363b565b61370b61283e565b613633565b6040519061371d82610345565b6001825260203681840137565b9291906080840160808552815180915260a085019060208093019060005b8181106137b8575050508481038286015281808451928381520193019160005b82811061378e5750505050606061058b91936137876040820160019052565b0160019052565b835173ffffffffffffffffffffffffffffffffffffffff1685529381019392810192600101613768565b825173ffffffffffffffffffffffffffffffffffffffff1684529284019291840191600101613748565b613804610c0160655473ffffffffffffffffffffffffffffffffffffffff1690565b604080517f3af9e66900000000000000000000000000000000000000000000000000000000815230600480830191909152929391926020929091908382806024810103816000809a5af1918215613d8d575b8692613d6e575b5060365473ffffffffffffffffffffffffffffffffffffffff1685517f70a0823100000000000000000000000000000000000000000000000000000000808252308683019081529093929082906020010394878373ffffffffffffffffffffffffffffffffffffffff97818986165afa928315613d61575b8a93613d3e575b50826138e79161284b565b808411613d36575b5082821015613d0857506139798389938893848b613925610c0160365473ffffffffffffffffffffffffffffffffffffffff1690565b8b613948610c0160655473ffffffffffffffffffffffffffffffffffffffff1690565b96879351988994859384938452830191909173ffffffffffffffffffffffffffffffffffffffff6020820193169052565b03915afa938415613cfb575b8694613cdc575b5060018411613b43575b5050505050506139a4613710565b6139ac613710565b906139d5306139ba83612968565b9073ffffffffffffffffffffffffffffffffffffffff169052565b613a036139fa610c0160655473ffffffffffffffffffffffffffffffffffffffff1690565b6139ba84612968565b733d9819210a31b4961b30ef54be2aed79b9c9cd3b90813b15613b3f57888796949293613aa7989694613a6493838c518096819582947f6810dfa60000000000000000000000000000000000000000000000000000000084528c840161372a565b03925af18015613b32575b613b19575b5060365473ffffffffffffffffffffffffffffffffffffffff169651908152309281019283529485928391829160200190565b039187165afa938415613b0c575b93613ae7575b5050816128d491613ae160355473ffffffffffffffffffffffffffffffffffffffff1690565b906142aa565b6128d49293509081613b0492903d10610d3357610d23818361037d565b919038613abb565b613b1461283e565b613ab5565b80613b26613b2c92610324565b80610630565b38613a74565b613b3a61283e565b613a6f565b8880fd5b613b4c916129ee565b91606654831015613b5e575b80613996565b808311613c3b575050613bc690613b8d610c0160655473ffffffffffffffffffffffffffffffffffffffff1690565b9089519485809481937f852a12e30000000000000000000000000000000000000000000000000000000083528b83019190602083019252565b03925af1908115613c2e575b8791613c11575b50613be9575b8584388080613b58565b8285517f3c9bb3ca000000000000000000000000000000000000000000000000000000008152fd5b613c289150853d8711610d3357610d23818361037d565b38613bd9565b613c3661283e565b613bd2565b89517f852a12e3000000000000000000000000000000000000000000000000000000008152888101918252948593508391829060200103925af1908115613ccf575b8791613cb2575b5015613bdf578285517f3c9bb3ca000000000000000000000000000000000000000000000000000000008152fd5b613cc99150853d8711610d3357610d23818361037d565b38613c84565b613cd761283e565b613c7d565b613cf4919450853d8711610d3357610d23818361037d565b923861398c565b613d0361283e565b613985565b945050955050506128d49250839150613ae160355473ffffffffffffffffffffffffffffffffffffffff1690565b9250386138ef565b6138e7919350613d5a90893d8b11610d3357610d23818361037d565b92906138dc565b613d6961283e565b6138d5565b613d86919250843d8611610d3357610d23818361037d565b903861385d565b613d9561283e565b613856565b613e316128d491613e1c73ffffffffffffffffffffffffffffffffffffffff60655416604051907f6aa875b50000000000000000000000000000000000000000000000000000000082526004820152602081602481733d9819210a31b4961b30ef54be2aed79b9c9cd3b5afa908115613e89575b600091613e6b575b50613edf565b9080613e395750613e2c906127e5565b612805565b612710900490565b613e45613e2c926127e5565b670de0b6b3a764000090818102918183041490151761343557613e666127b5565b613435565b613e83915060203d8111610d3357610d23818361037d565b38613e16565b613e9161283e565b613e0e565b519069ffffffffffffffffffff8216820361043e57565b908160a091031261043e57613ec181613e96565b916020820151916040810151916128d4608060608401519301613e96565b8015613ffd576040517ffeaf968c00000000000000000000000000000000000000000000000000000000815260a08160048173dbd020caef83efd542f4de03e3cf0c28a4428bd55afa8015613ff0575b600080928192613fb9575b508215918215613f9f575b5050613f7557613f5b613f64916128d49361281c565b6037549061281c565b6a52b7d2dcc80cd2e4000000900490565b60046040517f4e596b31000000000000000000000000000000000000000000000000000000008152fd5b69ffffffffffffffffffff90811691161190503880613f45565b915050613fdd915060a03d8111613fe9575b613fd5818361037d565b810190613ead565b92939150389050613f3a565b503d613fcb565b613ff861283e565b613f2f565b50600090565b6040516060810181811067ffffffffffffffff821117614084575b6040526002815260208101604036823773ffffffffffffffffffffffffffffffffffffffff90816036541690835115614077575b526065541681516001101561406a575b604082015290565b614072612938565b614062565b61407f612938565b614052565b61408c6102f4565b61401e565b6040519061409e82610361565b604282526060366020840137565b602190805160011015612976570190565b9060209180518210156140cf57010190565b6140d7612938565b010190565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908015612930570190565b1561410f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b604051906060820182811067ffffffffffffffff821117614222575b604052602a8252604036602084013760306141a383612968565b5360786141af836140ac565b536029905b600182116141c7576128d4915015614108565b807f3031323334353637383961626364656600000000000000000000000000000000600f61420f93166010811015614215575b1a61420584866140bd565b5360041c916140dc565b906141b4565b61421d612938565b6141fa565b61422a6102f4565b614189565b614237614091565b90603061424383612968565b53607861424f836140ac565b536041905b60018211614267576128d4915015614108565b807f3031323334353637383961626364656600000000000000000000000000000000600f6142a493166010811015614215571a61420584866140bd565b90614254565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff9092166024830152604482019290925261058b9161433182606481015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810184528361037d565b6149a3565b1561433d57565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152fd5b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015261058b939291614436906020816044818787165afa9081156144b7575b600091614499575b5015614336565b604051927f095ea7b30000000000000000000000000000000000000000000000000000000060208501521660248301527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60448301526044825261433182610361565b6144b1915060203d8111610d3357610d23818361037d565b3861442f565b6144bf61283e565b614427565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8216602482015260209161461091600090819073c00e94cb662c3520282e6f5717214004a7f268889061454f908781604481865afa9081156146d6575b84916146bf575015614336565b6040519373ffffffffffffffffffffffffffffffffffffffff878601917f095ea7b30000000000000000000000000000000000000000000000000000000083521660248601527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6044860152604485526145c885610361565b82604051956145d687610345565b8887527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648988015251925af161460a6129be565b90614a48565b80518061461c57505050565b8183918101031261043e5781015180159081150361043e5761463b5750565b608490604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b6144b19150883d8a11610d3357610d23818361037d565b6146de61283e565b614542565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8316602482015261058b939092906020848060448101038173ffffffffffffffffffffffffffffffffffffffff87165afa938415614800575b6000946147da575b50906143319184018094116147cd575b6040517f095ea7b300000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff909116602482015260448101939093528260648101614305565b6147d56127b5565b614775565b614331929194506147f89060203d8111610d3357610d23818361037d565b939091614765565b61480861283e565b61475d565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8316602482015292916020848060448101038173ffffffffffffffffffffffffffffffffffffffff86165afa938415614996575b600094614976575b508284106148f2576040517f095ea7b300000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff909116602482015291909203604482015261058b916143318260648101614305565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5361666545524332303a2064656372656173656420616c6c6f77616e6365206260448201527f656c6f77207a65726f00000000000000000000000000000000000000000000006064820152fd5b61498f91945060203d8111610d3357610d23818361037d565b923861488a565b61499e61283e565b614882565b73ffffffffffffffffffffffffffffffffffffffff1690614a106040516149c981610345565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af1614a0a6129be565b91614b1d565b805180614a1e575b50505050565b81849181010312614a4457820151908115918215036112cc575061463b57808080614a18565b5080fd5b90919015614ad75750805115614a5b5790565b73c00e94cb662c3520282e6f5717214004a7f268883b15614a795790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b815115614ae75750805190602001fd5b612162906040519182917f08c379a000000000000000000000000000000000000000000000000000000000835260048301611163565b91929015614b3a5750815115614b31575090565b3b15614a795790565b825190915015614ae75750805190602001fdfea2646970667358221220c4ba1bb9a8e87eeb1f7c937c6947a0e147265a99c391aa68a10fc9973167538f64736f6c63430008110033", + "nonce": "0x3af", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0x64173877fc5a6e2f36eb7b7d68cd8ed8f91ab9ae4b88f77c34fe17dfbcac74bc", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0xE2773fB045e53De5344f245E03eA614AF1064Ce3", + "function": null, + "arguments": [ + "0xDeEe844C6992F36ADAC59cF38d1F790B2a0313e2", + "0x1D941EF0D3Bba4ad67DBfBCeE5262F4CEE53A32b", + "0x80486991000000000000000000000000bfa4459868c60da9edd835f0be684edec054557b00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000039aa39c021dfbae8fac545936693ac917d5e756300000000000000000000000000000000000000000000000000000000000001200000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001600000000000000000000000001111111254eeb25477b68fb85ed929f73a9605820000000000000000000000000000000000000000000000000000000000000017436f6d706f756e64204c656e64657220555344432076320000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe" + ], + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x19b062", + "value": "0x0", + "data": "0x60406080815262000f548038038062000018816200030b565b9283398101906060818303126200030657620000348162000347565b916020926200004584840162000347565b8584015190936001600160401b0391908282116200030657019280601f850112156200030657835193620000836200007d866200035c565b6200030b565b948086528786019288828401011162000306578288620000a4930162000378565b823b15620002ac577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b03199081166001600160a01b0386811691821790935590959194600093909290917fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8580a2805115801590620002a4575b620001f5575b50505050507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103937f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f86865493815196818616885216958684820152a18315620001a357501617905551610afd9081620004578239f35b60849086519062461bcd60e51b82526004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152fd5b895194606086019081118682101762000290578a52602785527f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c89860152660819985a5b195960ca1b8a860152516200027a9493929183918291845af4903d1562000286573d6200026a6200007d826200035c565b90815280938a3d92013e6200039d565b5038808080806200012d565b606092506200039d565b634e487b7160e01b85526041600452602485fd5b508362000127565b865162461bcd60e51b815260048101879052602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608490fd5b600080fd5b6040519190601f01601f191682016001600160401b038111838210176200033157604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036200030657565b6001600160401b0381116200033157601f01601f191660200190565b60005b8381106200038c5750506000910152565b81810151838201526020016200037b565b91929015620004025750815115620003b3575090565b3b15620003bd5790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015620004165750805190602001fd5b6044604051809262461bcd60e51b82526020600483015262000448815180928160248601526020868601910162000378565b601f01601f19168101030190fdfe6080604052600436101561002c575b361561001f575b61001d6107b1565b005b6100276107b1565b610015565b6000803560e01c9081633659cfe614610093575080634f1ef2861461008a5780635c60da1b146100815780638f283970146100785763f851a4400361000e57610073610455565b61000e565b506100736102f0565b5061007361023b565b50610073610157565b3461012c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261012c576100ca61012f565b73ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541633146000146101235761012090610117610511565b908382526105cb565b80f35b506101206107b1565b80fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361015257565b600080fd5b5060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525761018a61012f565b60243567ffffffffffffffff9182821161015257366023830112156101525781600401359283116101525736602484840101116101525773ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416331460001461023057600060208480602461021e61021961001d99610582565b61053e565b9682885201838701378401015261070b565b50505061001d6107b1565b50346101525760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610152576020600073ffffffffffffffffffffffffffffffffffffffff90817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541633146000146102e25750807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416905b60405191168152f35b906102eb6107b1565b6102d9565b50346101525760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525761032861012f565b73ffffffffffffffffffffffffffffffffffffffff907fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610391808354163314600014610230577f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f604084549281519481851686521693846020820152a181156103d1577fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b50346101525760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610152576020600073ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038181541633146000146104d85754604051911681529050f35b506102eb6107b1565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051906020820182811067ffffffffffffffff82111761053157604052565b6105396104e1565b604052565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f604051930116820182811067ffffffffffffffff82111761053157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff81116105be575b01160190565b6105c66104e1565b6105b8565b803b156106875773ffffffffffffffffffffffffffffffffffffffff81167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc817fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a281511580159061067f575b61066a575050565b61067c916106766108dd565b9161095b565b50565b506000610662565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152fd5b803b156106875773ffffffffffffffffffffffffffffffffffffffff81167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc817fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a28151158015906107a95761066a575050565b506001610662565b5073ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354163314610833577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc54166000808092368280378136915af43d82803e1561082f573d90f35b3d90fd5b60a46040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f65740000000000000000000000000000000000000000000000000000000000006084820152fd5b604051906060820182811067ffffffffffffffff82111761094e575b604052602782527f206661696c6564000000000000000000000000000000000000000000000000006040837f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c60208201520152565b6109566104e1565b6108f9565b6000806109909493602081519101845af43d15610993573d9161098061021984610582565b9283523d6000602085013e610a00565b90565b606091610a00565b156109a257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b91929015610a205750815115610a14575090565b610990903b151561099b565b825190915015610a335750805190602001fd5b604051907f08c379a000000000000000000000000000000000000000000000000000000000825281602080600483015282519283602484015260005b848110610ab0575050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000604480968601015201168101030190fd5b818101830151868201604401528593508201610a6f56fea26469706673582212201c39b75ea59593d8670f804896fbda9470452421c2de5834b8a62b5fdb34806664736f6c63430008110033000000000000000000000000deee844c6992f36adac59cf38d1f790b2a0313e20000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c480486991000000000000000000000000bfa4459868c60da9edd835f0be684edec054557b00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000039aa39c021dfbae8fac545936693ac917d5e756300000000000000000000000000000000000000000000000000000000000001200000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001600000000000000000000000001111111254eeb25477b68fb85ed929f73a9605820000000000000000000000000000000000000000000000000000000000000017436f6d706f756e64204c656e64657220555344432076320000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe00000000000000000000000000000000000000000000000000000000", + "nonce": "0x3b0", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0x9c0c3c8ce0dcd25ce0ed004e36dba167d476fdcbb041f3dd21fc5843d9100e87", + "transactionType": "CREATE", + "contractName": "GenericAaveNoStaker", + "contractAddress": "0x14bA0B82f1940e35Af39c364e8Fa99408881Ae30", + "function": null, + "arguments": null, + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x5f6eec", + "value": "0x0", + "data": "0x60808060405234620000d3576000549060ff8260081c169081600014620000c857303b155b156200006f57501590816200005c575b506200004b575b60405161560d9081620000d98239f35b61ff0019600054166000556200003b565b61ffff1916610101176000553862000034565b62461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b60ff83161562000024565b600080fdfe60806040526004361015610013575b600080fd5b60003560e01c806305b41934146103165780630948c0b61461030d5780630b6d1d1714610304578063116ac4a3146102fb5780631f1fcd51146102f257806320f98f3f146102e9578063248a9ca3146102e057806324ea54f4146102d75780632e1a7d4d146102ce5780632f2ff15d146102c557806332b79021146102bc578063364bc15a146102b357806336568abe146102aa578063372500ab146102a157806344040261146102985780634c3f425f1461028f5780635312ea8e1461028657806357ded9c91461027d578063580b7c2e146102745780635be9b2d31461026b5780636314e8841461026257806367f52b6314610235578063787a08a614610259578063853828b6146102505780638b2021761461024757806391d148541461023e578063962e371514610235578063a217fddf1461022c578063a7d385e214610223578063a8c62e761461021a578063b8221bc414610211578063b82c4dc114610208578063b8dc491b146101ff578063c1590cd7146101f6578063c6afba3c146101ed578063d0e30db0146101e4578063d547741f146101db578063dc4c90d3146101d25763fd464918146101ca57600080fd5b61000e6120bc565b5061000e612069565b5061000e612006565b5061000e611fc5565b5061000e611f8b565b5061000e611f51565b5061000e611de2565b5061000e611bc8565b5061000e611b5a565b5061000e611b07565b5061000e61171a565b5061000e6116df565b5061000e6112ad565b5061000e61165c565b5061000e61153d565b5061000e611427565b5061000e61137b565b5061000e6111e7565b5061000e611185565b5061000e61112b565b5061000e6110f1565b5061000e610f11565b5061000e610ed9565b5061000e610e97565b5061000e610b44565b5061000e610a7f565b5061000e610a25565b5061000e6109e0565b5061000e6108a1565b5061000e61085b565b5061000e610801565b5061000e6107b3565b5061000e61073c565b5061000e6106e9565b5061000e610696565b5061000e610659565b5061000e6105c5565b5061000e61048a565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161036357604052565b61036b61031f565b604052565b6040810190811067ffffffffffffffff82111761036357604052565b6080810190811067ffffffffffffffff82111761036357604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761036357604052565b60405190610180820182811067ffffffffffffffff82111761036357604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610446575b01160190565b61044e61031f565b610440565b92919261045f8261040a565b9161046d60405193846103a8565b82948184528183011161000e578281602093846000960137010152565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760243567ffffffffffffffff811161000e573660238201121561000e5760006104ee81923690602481600401359101610453565b6104f733612142565b73ffffffffffffffffffffffffffffffffffffffff6038541682602083519301915af1610522612b6b565b90156105705761053f8151916020806004359483010191016129dc565b1061054657005b60046040517f22313ae9000000000000000000000000000000000000000000000000000000008152fd5b805190816105a25760046040517fc76d51a1000000000000000000000000000000000000000000000000000000008152fd5b602001fd5b73ffffffffffffffffffffffffffffffffffffffff81160361000e57565b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5773ffffffffffffffffffffffffffffffffffffffff600435610616816105a7565b61061f33612350565b167fffffffffffffffffffffffff00000000000000000000000000000000000000006038541617603855600080f35b600091031261000e57565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576020603754604051908152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760206106e16106d3613cef565b6106db612a05565b906129c9565b604051908152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602073ffffffffffffffffffffffffffffffffffffffff60365416604051908152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5761077533612350565b6067547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff61ff0060ff8360081c161560081b16911617606755600080f35b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760043560005260016020526020600160406000200154604051908152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760206040517f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50418152f35b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576108943361246f565b60206106e1600435614090565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576004356024356108e0816105a7565b60009180835260016020526108fd6001604085200154339061258e565b808352600160205260ff61093483604086209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54161561093f578280f35b808352600160205261097482604085209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8480a438808280f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602060ff60675460081c166040519015158152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760206040517ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab8152f35b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602435610abb816105a7565b3373ffffffffffffffffffffffffffffffffffffffff821603610ae657610ae490600435612864565b005b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f37310000000000000000000000000000000000000000000000000000000000006044820152fd5b503461000e576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e9457610b7e33612142565b80610b87613c0a565b80151580610e83575b610d5f575b5050610c3f6020610ba4613b58565b610c0a610be6610bcd60675473ffffffffffffffffffffffffffffffffffffffff9060101c1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b610bef83612b15565b9073ffffffffffffffffffffffffffffffffffffffff169052565b604051809381927f3111e7b3000000000000000000000000000000000000000000000000000000008352309060048401613b72565b03818573d784927ff2f95ba542bfc824c8a8a98f3495f6b55af18015610d52575b610d24575b50610c6e613c0a565b60675460ff169081610d1a575b5080610d0b575b610c895780f35b80734da27a545c0c5b758a6ba100e3a049001de870f5803b15610d085781906004604051809481937f787a08a60000000000000000000000000000000000000000000000000000000083525af18015610cfb575b610ce5575080f35b80610cf2610cf89261034f565b8061064e565b80f35b610d036129eb565b610cdd565b50fd5b50610d1461471b565b15610c82565b9050151538610c7b565b610d449060203d8111610d4b575b610d3c81836103a8565b8101906129dc565b5038610c65565b503d610d32565b610d5a6129eb565b610c60565b734da27a545c0c5b758a6ba100e3a049001de870f590813b15610e5f576040517f9a99b4f00000000000000000000000000000000000000000000000000000000081523060048201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6024820152838160448183875af18015610e76575b610e63575b50813b15610e5f576040517f1e9a6950000000000000000000000000000000000000000000000000000000008152306004820152602481019190915291908290604490829084905af18015610e52575b610e3f575b8190610b95565b80610cf2610e4c9261034f565b38610e38565b610e5a6129eb565b610e33565b5050fd5b80610cf2610e709261034f565b38610de3565b610e7e6129eb565b610dde565b506001610e8e61471b565b14610b90565b80fd5b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602060ff606754166040519015158152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57610ae46144e1565b503461000e576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57610ae490610f4f33612350565b610fd481610f75610bcd60365473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f69328dec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048083019190915235602482015230604482015291829081906064820190565b03816000737d2768de32b0b80b7a3454c06bdac94a69ddc7a95af180156110e4575b6110c7575b5060365473ffffffffffffffffffffffffffffffffffffffff16611037610bcd60345473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152909190838160248173ffffffffffffffffffffffffffffffffffffffff86165afa9384156110ba575b60009461109b575b5050614a9e565b6110b2929450803d10610d4b57610d3c81836103a8565b913880611094565b6110c26129eb565b61108c565b6110dd90823d8411610d4b57610d3c81836103a8565b5038610ffb565b6110ec6129eb565b610ff6565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760206106e1613cef565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760206040517f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c8152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760206111bf612a05565b60375480600a0290600a8204036111da575b60405191118152f35b6111e2612942565b6111d1565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576020606654604051908152f35b8015150361000e57565b9080601f8301121561000e5781359067ffffffffffffffff82116112a0575b8160051b60405193602093611264858401876103a8565b8552838086019282010192831161000e578301905b828210611287575050505090565b8380918335611295816105a7565b815201910190611279565b6112a861031f565b61124d565b503461000e5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576004356112e9816105a7565b67ffffffffffffffff9060243582811161000e573660238201121561000e5761131c903690602481600401359101610453565b60443561132881611224565b60643584811161000e5761134090369060040161122e565b6084359161134d836105a7565b60a43595861161000e57611368610ae496369060040161122e565b9360c43595611376876105a7565b612bbd565b503461000e576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e94576113b533612142565b80734da27a545c0c5b758a6ba100e3a049001de870f5803b15610d085781906004604051809481937f787a08a60000000000000000000000000000000000000000000000000000000083525af1801561141a575b611411575080f35b610cf89061034f565b6114226129eb565b611409565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576114603361246f565b602061146a612a05565b61147381614090565b1015604051908152f35b90600182811c921680156114c6575b602083101461149757565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161148c565b60005b8381106114e35750506000910152565b81810151838201526020016114d3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6040936020845261153681518092816020880152602088880191016114d0565b0116010190565b503461000e576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e9457604051908060335461157f8161147d565b8085529160019180831690811561161457506001146115b9575b6115b5856115a9818703826103a8565b604051918291826114f3565b0390f35b9250603383527f82a75bdeeae8604d839476ae9efd8b0e15aa447e21bfd7f41283bb54e22c9a825b8284106115fc5750505081016020016115a9826115b5611599565b805460208587018101919091529093019281016115e1565b8695506115b5969350602092506115a99491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001682840152151560051b8201019293611599565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602060ff6116d360243561169f816105a7565b6004356000526001845260406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54166040519015158152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602060405160008152f35b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576115b561199d600435611775610bcd60365473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f35ea6a750000000000000000000000000000000000000000000000000000000080825273ffffffffffffffffffffffffffffffffffffffff83166004830152919290610180908181602481737d2768de32b0b80b7a3454c06bdac94a69ddc7a95afa918215611afa575b600092611acd575b505060405192835273ffffffffffffffffffffffffffffffffffffffff841660048401526101409073057835ad21a177dbdd3090bb1cae03eacf78fc6d908285602481855afa918215611ac0575b6000809581978295611a72575b509761196160609593838a9b8a97956000821215600014611a565761186b92506129f8565b9788945b6040517f3e15014100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152928290849060249082905afa928315611a49575b600093611a02575b5001516118f190610bcd9073ffffffffffffffffffffffffffffffffffffffff1681565b946040519b8c97889687967f9584df28000000000000000000000000000000000000000000000000000000008852600488019260a094919796959273ffffffffffffffffffffffffffffffffffffffff60c086019916855260208501526040840152606083015260808201520152565b03915afa9384156119f5575b6000946119ad575b50633b9aca009261198c61199693611991936129f8565b6129f8565b613dfc565b91046129f8565b6040519081529081906020820190565b6119919194509261198c611996936119e0633b9aca009660603d81116119ee575b6119d881836103a8565b810190613b04565b505096935093505092611975565b503d6119ce565b6119fd6129eb565b61196d565b610bcd91935082611a2e610bcd926118f1953d8411611a42575b611a2681836103a8565b810190613a91565b5050505050935050505094925092506118cd565b503d611a1c565b611a516129eb565b6118c5565b5090611a64611a6a92613a56565b90612b9b565b97889461186f565b9092965061196193975060609450611aa09150853d8711611ab9575b611a9881836103a8565b810190613a09565b50959d969c919a50959890979550935061184692505050565b503d611a8e565b611ac86129eb565b611839565b611aec9250803d10611af3575b611ae481836103a8565b810190613928565b38806117eb565b503d611ada565b611b026129eb565b6117e3565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602073ffffffffffffffffffffffffffffffffffffffff60355416604051908152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576020606554604051908152f35b9181601f8401121561000e5782359167ffffffffffffffff831161000e576020808501948460051b01011161000e57565b503461000e5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57600467ffffffffffffffff813581811161000e57611c199036908401611b97565b92909160243581811161000e57611c339036908401611b97565b93909160443590811161000e57611c4d9036908501611b97565b91611c5733612350565b858714801590611dd8575b611daf5760005b878110611c7257005b80611c81611d53928a85612b4d565b35611c8b816105a7565b611c96828a89612b4d565b3590611ca1826105a7565b611cac838888612b4d565b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152308c820190815273ffffffffffffffffffffffffffffffffffffffff8616602082810191909152933595939283918391829101038173ffffffffffffffffffffffffffffffffffffffff88165afa918215611da2575b600092611d85575b505083811015611d5857611d4890611d4e94612b9b565b91615176565b612aaf565b611c69565b838111611d69575b50505050612aaf565b611d7c93611d7691612b9b565b916152a0565b38808080611d60565b611d9b9250803d10610d4b57610d3c81836103a8565b3880611d31565b611daa6129eb565b611d29565b846040517f46282e8d000000000000000000000000000000000000000000000000000000008152fd5b5082871415611c62565b503461000e576040807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576004803590611e21826105a7565b60243592611e2e846105a7565b611e3733612350565b611e3f6147f4565b80519073ffffffffffffffffffffffffffffffffffffffff60009516945b828110611eea5783517f70a0823100000000000000000000000000000000000000000000000000000000815230818701908152610ae49190899089906020908490819083010381845afa928315611edd575b600093611ebd575b50614a9e565b611ed691935060203d8111610d4b57610d3c81836103a8565b9184611eb7565b611ee56129eb565b611eaf565b611f14610bcd611efa8385612b2b565b5173ffffffffffffffffffffffffffffffffffffffff1690565b8614611f2857611f2390612aaf565b611e5d565b505050517f093e1cdb000000000000000000000000000000000000000000000000000000008152fd5b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760206106e1612a05565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760206106e1613c8b565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57611ffe3361246f565b610ae4613679565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57610ae4602435600435612048826105a7565b806000526001602052612064600160406000200154339061258e565b612864565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602073ffffffffffffffffffffffffffffffffffffffff60345416604051908152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576120f533612350565b6067547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0060ff8083161516911617606755600080f35b9061213e602092828151948592016114d0565b0190565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f10c15aae13326e9b33c92ffbb94efb7492c500f0cca324caca9bd1aca194ed1860205260409020547ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab9160019160ff16156121b957505050565b73ffffffffffffffffffffffffffffffffffffffff6121d89116614961565b916121e1614885565b9160306121ed84612b15565b5360786121f9846148a0565b536041905b8082116122f3576122ef60376122bd876122918861221c89156148fc565b61228b6040519586947f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000602087015261225e815180926020858a0191016114d0565b8501016011907f206973206d697373696e6720726f6c652000000000000000000000000000000081520190565b9061212b565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018352826103a8565b6040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352600483016114f3565b0390fd5b9091807f3031323334353637383961626364656600000000000000000000000000000000600f61233d93166010811015612343575b1a61233385876148b1565b5360041c926148d0565b906121fe565b61234b612ae5565b612328565b73ffffffffffffffffffffffffffffffffffffffff811660009081527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db60205260409020547f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419160019160ff16156123c757505050565b73ffffffffffffffffffffffffffffffffffffffff6123e69116614961565b916123ef614885565b9160306123fb84612b15565b536078612407846148a0565b536041905b80821161242a576122ef60376122bd876122918861221c89156148fc565b9091807f3031323334353637383961626364656600000000000000000000000000000000600f61246993166010811015612343571a61233385876148b1565b9061240c565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f21d442261a7cc2346fd3ca5e1f22fe015f6b71188f57ab4761df2e3faed3703f60205260409020547f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c9160019160ff16156124e657505050565b73ffffffffffffffffffffffffffffffffffffffff6125059116614961565b9161250e614885565b91603061251a84612b15565b536078612526846148a0565b536041905b808211612549576122ef60376122bd876122918861221c89156148fc565b9091807f3031323334353637383961626364656600000000000000000000000000000000600f61258893166010811015612343571a61233385876148b1565b9061252b565b9081600052600160205260ff6125c88260406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b5416156125d3575050565b6122bd6122ef9261229161260761260173ffffffffffffffffffffffffffffffffffffffff60489616614961565b92614a23565b6040519485937f416363657373436f6e74726f6c3a206163636f756e742000000000000000000060208601526126478151809260206037890191016114d0565b84017f206973206d697373696e6720726f6c65200000000000000000000000000000006037820152019061212b565b73ffffffffffffffffffffffffffffffffffffffff811660009081527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db602052604081207f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419060ff905b5416156126ec57505050565b808252600160205261272183604084209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d73ffffffffffffffffffffffffffffffffffffffff3394169280a4565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f10c15aae13326e9b33c92ffbb94efb7492c500f0cca324caca9bd1aca194ed18602052604081207ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab9060ff906126e0565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f21d442261a7cc2346fd3ca5e1f22fe015f6b71188f57ab4761df2e3faed3703f602052604081207f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c9060ff906126e0565b600090808252600160205260ff61289e84604085209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54166128a957505050565b80825260016020526128de83604084209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b73ffffffffffffffffffffffffffffffffffffffff3394169280a4565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b906301e133809182810292818404149015171561298b57565b612993612942565b565b90670de0b6b3a76400009182810292818404149015171561298b57565b9061251c9182810292818404149015171561298b57565b8181029291811591840414171561298b57565b9081602091031261000e575190565b506040513d6000823e3d90fd5b9190820180921161298b57565b6024602073ffffffffffffffffffffffffffffffffffffffff60365416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa908115612aa2575b600091612a84575b50612a6d613c8b565b8101809111612a795790565b612a81612942565b90565b612a9c915060203d8111610d4b57610d3c81836103a8565b38612a64565b612aaa6129eb565b612a5c565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612add570190565b61213e612942565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602090805115612b23570190565b61213e612ae5565b6020918151811015612b40575b60051b010190565b612b48612ae5565b612b38565b9190811015612b5e575b60051b0190565b612b66612ae5565b612b57565b3d15612b96573d90612b7c8261040a565b91612b8a60405193846103a8565b82523d6000602084013e565b606090565b9190820391821161298b57565b9081602091031261000e5751612a81816105a7565b92612bcd94918796939794612d71565b612bd56144e1565b8180612cb2575b612c8857612c1d612993927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff61ff0060675492151560081b16911617606755565b612c4d60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006067541617606755565b612c7a612c75610bcd610bcd60365473ffffffffffffffffffffffffffffffffffffffff1690565b614bb5565b612c8381614cda565b614ef9565b60046040517f5e7bb0f9000000000000000000000000000000000000000000000000000000008152fd5b5073ffffffffffffffffffffffffffffffffffffffff60046020612cf2610bcd60675473ffffffffffffffffffffffffffffffffffffffff9060101c1690565b604051928380927f75d264130000000000000000000000000000000000000000000000000000000082525afa908115612d64575b600091612d36575b501615612bdc565b612d57915060203d8111612d5d575b612d4f81836103a8565b810190612ba8565b38612d2e565b503d612d45565b612d6c6129eb565b612d26565b94929093916000549460ff8660081c169586600014612ec15750303b155b15612e3d57612da495159687612dd7576130d8565b612daa57565b6129937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff60005416600055565b612e086101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff6000541617600055565b612e3860017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000541617600055565b6130d8565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152fd5b60ff1615612d8f565b5190612993826105a7565b601f8111612ee1575050565b600090603382527f82a75bdeeae8604d839476ae9efd8b0e15aa447e21bfd7f41283bb54e22c9a82906020601f850160051c83019410612f3c575b601f0160051c01915b828110612f3157505050565b818155600101612f25565b9092508290612f1c565b90815167ffffffffffffffff811161308a575b612f6d81612f6860335461147d565b612ed5565b602080601f8311600114612fc65750819293600092612fbb575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c191617603355565b015190503880612f87565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083169461301760336000527f82a75bdeeae8604d839476ae9efd8b0e15aa447e21bfd7f41283bb54e22c9a8290565b926000905b87821061307257505083600195961061303b575b505050811b01603355565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055388080613030565b8060018596829496860151815501950193019061301c565b61309261031f565b612f59565b519060ff8216820361000e57565b9081602091031261000e57612a8190613097565b60ff16604d81116130cb575b600a0a90565b6130d3612942565b6130c5565b94613122909492919473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006038541617603855565b6131678573ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006035541617603555565b6132c061318f610bcd610bcd60355473ffffffffffffffffffffffffffffffffffffffff1690565b946132bb60405180977fdc4c90d300000000000000000000000000000000000000000000000000000000825281600460209a8b935afa90811561348c575b60009161346f575b50603480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92831617905560048861323c610bcd60345473ffffffffffffffffffffffffffffffffffffffff1690565b604051928380927ffc0c546a0000000000000000000000000000000000000000000000000000000082525afa908115613462575b600091613445575b501673ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006036541617603655565b612f46565b6132ea6132e5610bcd60345473ffffffffffffffffffffffffffffffffffffffff1690565b612676565b80519060005b82811061342c5750505061330382612788565b80519060005b82811061340e575050506133b1612993939261332a6133b6936132e5613499565b613333846127f6565b61333b613539565b6133436135d9565b60048161336e610bcd610bcd610bcd60365473ffffffffffffffffffffffffffffffffffffffff1690565b604051928380927f313ce5670000000000000000000000000000000000000000000000000000000082525afa918215613401575b6000926133d4575b50506130b9565b603755565b60365473ffffffffffffffffffffffffffffffffffffffff16615044565b6133f39250803d106133fa575b6133eb81836103a8565b8101906130a5565b38806133aa565b503d6133e1565b6134096129eb565b6133a2565b80611d4e613422611efa6134279486612b2b565b612788565b613309565b80611d4e6132e5611efa6134409486612b2b565b6132f0565b61345c9150893d8b11612d5d57612d4f81836103a8565b38613278565b61346a6129eb565b613270565b6134869150883d8a11612d5d57612d4f81836103a8565b386131d5565b6134946129eb565b6131cd565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab600081815260016020527f10c15aae13326e9b33c92ffbb94efb7492c500f0cca324caca9bd1aca194ed19547f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419283927fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9080a4600160406000200155565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041600081815260016020527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5dc547f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c9283927fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9080a4600160406000200155565b7f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c600081815260016020527f21d442261a7cc2346fd3ca5e1f22fe015f6b71188f57ab4761df2e3faed37040547f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419283927fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9080a4600160406000200155565b73ffffffffffffffffffffffffffffffffffffffff60365416604051907f70a0823100000000000000000000000000000000000000000000000000000000825230600483015260208083602481855afa9283156138af575b600093613890575b50821561388b576040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152306004820152737d2768de32b0b80b7a3454c06bdac94a69ddc7a960248201528391908181604481875afa91821561387e575b600092613861575b50501061382a575b5061376c610bcd60365473ffffffffffffffffffffffffffffffffffffffff1690565b90737d2768de32b0b80b7a3454c06bdac94a69ddc7a991823b1561000e576040517fe8eda9df00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff919091166004820152602481019190915230604482015260006064820181905290918290608490829084905af1801561381d575b61380a575b50613807613c8b565b50565b80610cf26138179261034f565b386137fe565b6138256129eb565b6137f9565b6138339061511a565b61385b612c75610bcd610bcd60365473ffffffffffffffffffffffffffffffffffffffff1690565b38613749565b6138779250803d10610d4b57610d3c81836103a8565b3880613741565b6138866129eb565b613739565b505050565b816138a89294503d8511610d4b57610d3c81836103a8565b91386136d9565b6138b76129eb565b6136d1565b919082602091031261000e576040516020810181811067ffffffffffffffff8211176138ec575b60405291518252565b6138f461031f565b6138e3565b51906fffffffffffffffffffffffffffffffff8216820361000e57565b519064ffffffffff8216820361000e57565b6101808183031261000e5761394561393e6103e9565b92826138bc565b8252613953602082016138f9565b6020830152613964604082016138f9565b6040830152613975606082016138f9565b6060830152613986608082016138f9565b608083015261399760a082016138f9565b60a08301526139a860c08201613916565b60c08301526139b960e08201612eca565b60e08301526101006139cc818301612eca565b908301526101206139de818301612eca565b908301526101406139f0818301612eca565b90830152613a02610160809201613097565b9082015290565b91908261014091031261000e5781519160208101519160408201519160608101519160808201519160a08101519160c08201519160e081015191612a816101206101008401519301613916565b7f80000000000000000000000000000000000000000000000000000000000000008114613a84575b60000390565b613a8c612942565b613a7e565b91908261014091031261000e5781519160208101519160408201519160608101519160808201519160a0810151613ac781611224565b9160c0820151613ad681611224565b9160e0810151613ae581611224565b91610120610100830151613af881611224565b920151612a8181611224565b9081606091031261000e578051916040602083015192015190565b8115613b29570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60405190613b6582610370565b6001825260203681840137565b90929160608201606083528451809152608083019060208096019060005b87828210613be057505050506040917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff929685015216910152565b835173ffffffffffffffffffffffffffffffffffffffff1685529384019390920191600101613b90565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152602081602481734da27a545c0c5b758a6ba100e3a049001de870f55afa908115613c7e575b600091613c66575090565b612a81915060203d8111610d4b57610d3c81836103a8565b613c866129eb565b613c5b565b6024602073ffffffffffffffffffffffffffffffffffffffff60675460101c16604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa908115613c7e57600091613c66575090565b73ffffffffffffffffffffffffffffffffffffffff60365416604051907f35ea6a75000000000000000000000000000000000000000000000000000000008252600482015261014090818160248173057835ad21a177dbdd3090bb1cae03eacf78fc6d5afa918215613def575b600091829083928495613db3575b505091613d8f91633b9aca00938201809211613da6575b8101809111613d9e57613dfc565b9104908101809111612a795790565b611991612942565b613dae612942565b613d81565b613d8f9550633b9aca009450613dd9935080919250903d10611ab957611a9881836103a8565b50949950969794965086949350613d6a92505050565b613df76129eb565b613d5c565b6067549060ff8260081c1680613f08575b80613eff575b613e1f575b5050600090565b6040517f1652e7b700000000000000000000000000000000000000000000000000000000815260109290921c73ffffffffffffffffffffffffffffffffffffffff16600483015260608260248173d784927ff2f95ba542bfc824c8a8a98f3495f6b55afa918215613ef2575b600092613ecf575b508115613e1857613ec2613ec791613ebd613eb8613eb3612a8196613fa6565b612972565b612995565b613b1f565b6129b2565b612710900490565b613ee891925060603d81116119ee576119d881836103a8565b5090509038613e93565b613efa6129eb565b613e8b565b50801515613e13565b506040517fcc69afec00000000000000000000000000000000000000000000000000000000815260208160048173d784927ff2f95ba542bfc824c8a8a98f3495f6b55afa908115613f82575b600091613f64575b504210613e0d565b613f7c915060203d8111610d4b57610d3c81836103a8565b38613f5c565b613f8a6129eb565b613f54565b519069ffffffffffffffffffff8216820361000e57565b6040517ffeaf968c00000000000000000000000000000000000000000000000000000000815260a08160048173547a514d5e3769680ce22b2361c10ea13619e8a95afa908115614083575b600091614020575b506140136a52b7d2dcc80cd2e40000009261401c926129c9565b603754906129c9565b0490565b9060a0823d821161407b575b8161403960a093836103a8565b81010312610e9457506140136a52b7d2dcc80cd2e4000000928261405f61401c94613f8f565b50614071608060208301519201613f8f565b5092509250613ff9565b3d915061402c565b61408b6129eb565b613ff1565b614098613c8b565b906140b860365473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f70a0823100000000000000000000000000000000000000000000000000000000808252306004830152602094909373ffffffffffffffffffffffffffffffffffffffff93909186846024818886165afa9384156144a1575b60009461447e575b5083614127916129f8565b808311614476575b508183101561444b57506141b8918591614161610bcd60365473ffffffffffffffffffffffffffffffffffffffff1690565b9183614189610bcd60675473ffffffffffffffffffffffffffffffffffffffff9060101c1690565b60405189815273ffffffffffffffffffffffffffffffffffffffff909116600482015295869081906024820190565b0381865afa94851561443e575b60009561441f575b5060018511614282575b50505090506141fb60365473ffffffffffffffffffffffffffffffffffffffff1690565b60405193845230600485015292918290602490829086165afa928315614275575b600093614250575b505081612a819161424a60355473ffffffffffffffffffffffffffffffffffffffff1690565b90614a9e565b612a81929350908161426d92903d10610d4b57610d3c81836103a8565b919038614224565b61427d6129eb565b61421c565b61428b91612b9b565b92808411614375575050614318916142bb610bcd60365473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f69328dec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481019190915230604482015291829081906064820190565b03816000737d2768de32b0b80b7a3454c06bdac94a69ddc7a95af18015614368575b61434b575b505b38838180806141d7565b61436190843d8611610d4b57610d3c81836103a8565b503861433f565b6143706129eb565b61433a565b6040517f69328dec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201523060448201529150816064816000737d2768de32b0b80b7a3454c06bdac94a69ddc7a95af18015614412575b6143f5575b50614341565b61440b90843d8611610d4b57610d3c81836103a8565b50386143ef565b61441a6129eb565b6143ea565b614437919550843d8611610d4b57610d3c81836103a8565b93386141cd565b6144466129eb565b6141c5565b91509350612a81925083915061424a60355473ffffffffffffffffffffffffffffffffffffffff1690565b91503861412f565b61412791945061449a90883d8a11610d4b57610d3c81836103a8565b939061411c565b6144a96129eb565b614114565b9081606091031261000e5780516144c4816105a7565b91604060208301516144d5816105a7565b920151612a81816105a7565b6145e273ffffffffffffffffffffffffffffffffffffffff61456f6060614520610bcd60365473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fd2493b6c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015291829081906024820190565b038173057835ad21a177dbdd3090bb1cae03eacf78fc6d5afa90811561470e575b6000916146de575b50167fffffffffffffffffffff0000000000000000000000000000000000000000ffff75ffffffffffffffffffffffffffffffffffffffff00006067549260101b16911617606755565b6129936040517f72b49d63000000000000000000000000000000000000000000000000000000008152600460208092614647734da27a545c0c5b758a6ba100e3a049001de870f59183818681865afa9081156146d1575b6000916146b4575b50606555565b604051928380927f359c4a960000000000000000000000000000000000000000000000000000000082525afa9182156146a7575b60009261468a575b5050606655565b6146a09250803d10610d4b57610d3c81836103a8565b3880614683565b6146af6129eb565b61467b565b6146cb9150843d8611610d4b57610d3c81836103a8565b38614641565b6146d96129eb565b614639565b6146ff915060603d8111614707575b6146f781836103a8565b8101906144ae565b505038614598565b503d6146ed565b6147166129eb565b614590565b6040517f091030c300000000000000000000000000000000000000000000000000000000815230600482015260009190602081602481734da27a545c0c5b758a6ba100e3a049001de870f55afa9081156147e7575b6000916147c9575b50614785606554826129f8565b90156147c257804211806147ad575b6147a65742106147a057565b60029150565b5060019150565b506147ba606654826129f8565b421115614794565b5060009150565b6147e1915060203d8111610d4b57610d3c81836103a8565b38614778565b6147ef6129eb565b614770565b6040516060810181811067ffffffffffffffff821117614878575b6040526002815260208101604036823773ffffffffffffffffffffffffffffffffffffffff9081603654169083511561486b575b5260675460101c1681516001101561485e575b604082015290565b614866612ae5565b614856565b614873612ae5565b614843565b61488061031f565b61480f565b604051906148928261038c565b604282526060366020840137565b602190805160011015612b23570190565b9060209180518210156148c357010190565b6148cb612ae5565b010190565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908015612add570190565b1561490357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b604051906060820182811067ffffffffffffffff821117614a16575b604052602a82526040366020840137603061499783612b15565b5360786149a3836148a0565b536029905b600182116149bb57612a819150156148fc565b807f3031323334353637383961626364656600000000000000000000000000000000600f614a0393166010811015614a09575b1a6149f984866148b1565b5360041c916148d0565b906149a8565b614a11612ae5565b6149ee565b614a1e61031f565b61497d565b614a2b614885565b906030614a3783612b15565b536078614a43836148a0565b536041905b60018211614a5b57612a819150156148fc565b807f3031323334353637383961626364656600000000000000000000000000000000600f614a9893166010811015614a09571a6149f984866148b1565b90614a48565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff9092166024830152604482019290925261299391614b2582606481015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018452836103a8565b615436565b15614b3157565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152fd5b61299390614c386040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152306004820152737d2768de32b0b80b7a3454c06bdac94a69ddc7a9602482015260208160448173ffffffffffffffffffffffffffffffffffffffff87165afa908115614ccd575b600091614caf575b5015614b2a565b6040517f095ea7b3000000000000000000000000000000000000000000000000000000006020820152737d2768de32b0b80b7a3454c06bdac94a69ddc7a960248201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604482015290614b258260648101614af9565b614cc7915060203d8111610d4b57610d3c81836103a8565b38614c31565b614cd56129eb565b614c29565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff82166024820152602091614e26916000908190734da27a545c0c5b758a6ba100e3a049001de870f590614d65908781604481865afa908115614eec575b8491614ed5575015614b2a565b6040519373ffffffffffffffffffffffffffffffffffffffff878601917f095ea7b30000000000000000000000000000000000000000000000000000000083521660248601527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604486015260448552614dde8561038c565b8260405195614dec87610370565b8887527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648988015251925af1614e20612b6b565b906154a1565b805180614e3257505050565b8183918101031261000e57810151614e4981611224565b15614e515750565b608490604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b614cc79150883d8a11610d4b57610d3c81836103a8565b614ef46129eb565b614d58565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff82166024820152602091614e26916000908190737fc66500c84a76ad7e9c93437bfc5ac33e2ddae990614f83908781604481865afa908115614eec578491614ed5575015614b2a565b6040519373ffffffffffffffffffffffffffffffffffffffff878601917f095ea7b30000000000000000000000000000000000000000000000000000000083521660248601527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604486015260448552614ffc8561038c565b826040519561500a87610370565b8887527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648988015251925af161503e612b6b565b90615576565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff83811660248301526129939392916150b7906020816044818787165afa908115614ccd57600091614caf575015614b2a565b604051927f095ea7b30000000000000000000000000000000000000000000000000000000060208501521660248301527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604483015260448252614b258261038c565b61299390604051907f095ea7b3000000000000000000000000000000000000000000000000000000006020830152737d2768de32b0b80b7a3454c06bdac94a69ddc7a960248301526000604483015260448252614b258261038c565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff83166024820152612993939092906020848060448101038173ffffffffffffffffffffffffffffffffffffffff87165afa938415615293575b60009461526d575b5090614b25918401809411615260575b6040517f095ea7b300000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff909116602482015260448101939093528260648101614af9565b615268612942565b615208565b614b259291945061528b9060203d8111610d4b57610d3c81836103a8565b9390916151f8565b61529b6129eb565b6151f0565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8316602482015292916020848060448101038173ffffffffffffffffffffffffffffffffffffffff86165afa938415615429575b600094615409575b50828410615385576040517f095ea7b300000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff909116602482015291909203604482015261299391614b258260648101614af9565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5361666545524332303a2064656372656173656420616c6c6f77616e6365206260448201527f656c6f77207a65726f00000000000000000000000000000000000000000000006064820152fd5b61542291945060203d8111610d4b57610d3c81836103a8565b923861531d565b6154316129eb565b615315565b604051614e269173ffffffffffffffffffffffffffffffffffffffff1661545c82610370565b6000806020958685527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656487860152868151910182855af161549b612b6b565b916155a7565b9091901561553057508051156154b45790565b734da27a545c0c5b758a6ba100e3a049001de870f53b156154d25790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8151156155405750805190602001fd5b6122ef906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352600483016114f3565b9091901561553057508051156155895790565b737fc66500c84a76ad7e9c93437bfc5ac33e2ddae93b156154d25790565b919290156155c457508151156155bb575090565b3b156154d25790565b8251909150156155405750805190602001fdfea264697066735822122002d1ebdd00e45664388c59ceab6409273d4eb00e03f8d0ff1609532a42c538de64736f6c63430008110033", + "nonce": "0x3b1", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0x27c46748143651ee0e72af28574594a01879f37185e082c23bc0cf70d51b6ace", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0xe4377620697Be18E6d6aa911CA488571EeB3f081", + "function": null, + "arguments": [ + "0x14bA0B82f1940e35Af39c364e8Fa99408881Ae30", + "0x1D941EF0D3Bba4ad67DBfBCeE5262F4CEE53A32b", + "0x67f52b63000000000000000000000000bfa4459868c60da9edd835f0be684edec054557b00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001600000000000000000000000001111111254eeb25477b68fb85ed929f73a960582000000000000000000000000000000000000000000000000000000000000001341617665204c656e6465722055534443207632000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe" + ], + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x1c2ce1", + "value": "0x0", + "data": "0x60406080815262000f548038038062000018816200030b565b9283398101906060818303126200030657620000348162000347565b916020926200004584840162000347565b8584015190936001600160401b0391908282116200030657019280601f850112156200030657835193620000836200007d866200035c565b6200030b565b948086528786019288828401011162000306578288620000a4930162000378565b823b15620002ac577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b03199081166001600160a01b0386811691821790935590959194600093909290917fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8580a2805115801590620002a4575b620001f5575b50505050507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103937f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f86865493815196818616885216958684820152a18315620001a357501617905551610afd9081620004578239f35b60849086519062461bcd60e51b82526004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152fd5b895194606086019081118682101762000290578a52602785527f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c89860152660819985a5b195960ca1b8a860152516200027a9493929183918291845af4903d1562000286573d6200026a6200007d826200035c565b90815280938a3d92013e6200039d565b5038808080806200012d565b606092506200039d565b634e487b7160e01b85526041600452602485fd5b508362000127565b865162461bcd60e51b815260048101879052602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608490fd5b600080fd5b6040519190601f01601f191682016001600160401b038111838210176200033157604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036200030657565b6001600160401b0381116200033157601f01601f191660200190565b60005b8381106200038c5750506000910152565b81810151838201526020016200037b565b91929015620004025750815115620003b3575090565b3b15620003bd5790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015620004165750805190602001fd5b6044604051809262461bcd60e51b82526020600483015262000448815180928160248601526020868601910162000378565b601f01601f19168101030190fdfe6080604052600436101561002c575b361561001f575b61001d6107b1565b005b6100276107b1565b610015565b6000803560e01c9081633659cfe614610093575080634f1ef2861461008a5780635c60da1b146100815780638f283970146100785763f851a4400361000e57610073610455565b61000e565b506100736102f0565b5061007361023b565b50610073610157565b3461012c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261012c576100ca61012f565b73ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541633146000146101235761012090610117610511565b908382526105cb565b80f35b506101206107b1565b80fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361015257565b600080fd5b5060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525761018a61012f565b60243567ffffffffffffffff9182821161015257366023830112156101525781600401359283116101525736602484840101116101525773ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416331460001461023057600060208480602461021e61021961001d99610582565b61053e565b9682885201838701378401015261070b565b50505061001d6107b1565b50346101525760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610152576020600073ffffffffffffffffffffffffffffffffffffffff90817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541633146000146102e25750807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416905b60405191168152f35b906102eb6107b1565b6102d9565b50346101525760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525761032861012f565b73ffffffffffffffffffffffffffffffffffffffff907fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610391808354163314600014610230577f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f604084549281519481851686521693846020820152a181156103d1577fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b50346101525760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610152576020600073ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038181541633146000146104d85754604051911681529050f35b506102eb6107b1565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051906020820182811067ffffffffffffffff82111761053157604052565b6105396104e1565b604052565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f604051930116820182811067ffffffffffffffff82111761053157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff81116105be575b01160190565b6105c66104e1565b6105b8565b803b156106875773ffffffffffffffffffffffffffffffffffffffff81167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc817fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a281511580159061067f575b61066a575050565b61067c916106766108dd565b9161095b565b50565b506000610662565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152fd5b803b156106875773ffffffffffffffffffffffffffffffffffffffff81167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc817fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a28151158015906107a95761066a575050565b506001610662565b5073ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354163314610833577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc54166000808092368280378136915af43d82803e1561082f573d90f35b3d90fd5b60a46040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f65740000000000000000000000000000000000000000000000000000000000006084820152fd5b604051906060820182811067ffffffffffffffff82111761094e575b604052602782527f206661696c6564000000000000000000000000000000000000000000000000006040837f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c60208201520152565b6109566104e1565b6108f9565b6000806109909493602081519101845af43d15610993573d9161098061021984610582565b9283523d6000602085013e610a00565b90565b606091610a00565b156109a257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b91929015610a205750815115610a14575090565b610990903b151561099b565b825190915015610a335750805190602001fd5b604051907f08c379a000000000000000000000000000000000000000000000000000000000825281602080600483015282519283602484015260005b848110610ab0575050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000604480968601015201168101030190fd5b818101830151868201604401528593508201610a6f56fea26469706673582212201c39b75ea59593d8670f804896fbda9470452421c2de5834b8a62b5fdb34806664736f6c6343000811003300000000000000000000000014ba0b82f1940e35af39c364e8fa99408881ae300000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c467f52b63000000000000000000000000bfa4459868c60da9edd835f0be684edec054557b00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001600000000000000000000000001111111254eeb25477b68fb85ed929f73a960582000000000000000000000000000000000000000000000000000000000000001341617665204c656e6465722055534443207632000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe00000000000000000000000000000000000000000000000000000000", + "nonce": "0x3b2", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0x991eef60590b3e23c89e77e2209afc0d141b0b31dcd9a0053624b2eb00d8ef6c", + "transactionType": "CREATE", + "contractName": "GenericEulerStaker", + "contractAddress": "0x2A729024be86FC692cC02b08f461a56A175b88dC", + "function": null, + "arguments": null, + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x5fed7c", + "value": "0x0", + "data": "0x60808060405234620000d3576000549060ff8260081c169081600014620000c857303b155b156200006f57501590816200005c575b506200004b575b60405161568d9081620000d98239f35b61ff0019600054166000556200003b565b61ffff1916610101176000553862000034565b62461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b60ff83161562000024565b600080fdfe60806040526004361015610013575b600080fd5b60003560e01c806305b41934146102f75780630948c0b6146102ee5780630b6d1d17146102e5578063108cce74146102dc578063116ac4a3146102d35780631f1fcd51146102ca578063248a9ca3146102c157806324ea54f4146102b85780632e1a7d4d146102af5780632e779525146102a65780632f2ff15d1461029d578063364bc15a1461029457806336568abe1461028b578063372500ab146102825780635312ea8e1461027957806357ded9c914610270578063580b7c2e146102675780635be9b2d31461025e57806375653eb414610255578063853828b61461024c5780638b2021761461024357806391d148541461023a578063953d9cf114610231578063a217fddf14610228578063a25b26be1461021f578063a73e0f3b14610216578063a7d385e21461020d578063a8c62e7614610204578063b82c4dc1146101fb578063b8dc491b146101f2578063c1590cd7146101e9578063c6afba3c146101e0578063d0e30db0146101d7578063d547741f146101ce578063dc4c90d3146101c5578063ecf609ae146101bc5763ef06e72c146101b457600080fd5b61000e611de1565b5061000e611d30565b5061000e611cdd565b5061000e611c7a565b5061000e611b04565b5061000e611aca565b5061000e611a90565b5061000e611950565b5061000e611736565b5061000e6116b2565b5061000e6113b7565b5061000e611371565b5061000e6112b6565b5061000e6111c4565b5061000e611171565b5061000e6110ee565b5061000e610fcf565b5061000e610eb9565b5061000e610e66565b5061000e610e04565b5061000e610daa565b5061000e610d70565b5061000e610b8f565b5061000e610adf565b5061000e610a1c565b5061000e6109c2565b5061000e610883565b5061000e610849565b5061000e610803565b5061000e6107a9565b5061000e61075b565b5061000e610708565b5061000e6106b5565b5061000e610672565b5061000e610635565b5061000e6105a1565b5061000e61044a565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161034457604052565b61034c610300565b604052565b6040810190811067ffffffffffffffff82111761034457604052565b6080810190811067ffffffffffffffff82111761034457604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761034457604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610406575b01160190565b61040e610300565b610400565b92919261041f826103ca565b9161042d6040519384610389565b82948184528183011161000e578281602093846000960137010152565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760243567ffffffffffffffff811161000e573660238201121561000e5760006104ae81923690602481600401359101610413565b6104b733611e4b565b73ffffffffffffffffffffffffffffffffffffffff6038541682602083519301915af16104e261289d565b9015610530576104ff8151916020806004359483010191016126ff565b1061050657005b60046040517f22313ae9000000000000000000000000000000000000000000000000000000008152fd5b805190816105625760046040517fc76d51a1000000000000000000000000000000000000000000000000000000008152fd5b602001fd5b73ffffffffffffffffffffffffffffffffffffffff81160361000e57565b6064359061059282610567565b565b60a4359061059282610567565b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5773ffffffffffffffffffffffffffffffffffffffff6004356105f281610567565b6105fb33612059565b167fffffffffffffffffffffffff00000000000000000000000000000000000000006038541617603855600080f35b600091031261000e57565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576020603754604051908152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602060ff60695460a01c16604051908152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760206107006106f2613580565b6106fa612750565b906126ec565b604051908152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602073ffffffffffffffffffffffffffffffffffffffff60365416604051908152f35b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760043560005260016020526020600160406000200154604051908152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760206040517f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50418152f35b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5761083c33612178565b602061070060043561394e565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57610881613d6a565b005b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576004356024356108c281610567565b60009180835260016020526108df60016040852001543390612297565b808352600160205260ff61091683604086209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b541615610921578280f35b808352600160205261095682604085209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8480a438808280f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760206040517ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab8152f35b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602435610a5881610567565b3373ffffffffffffffffffffffffffffffffffffffff821603610a81576108819060043561256d565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f37310000000000000000000000000000000000000000000000000000000000006044820152fd5b503461000e576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610b8c578073ffffffffffffffffffffffffffffffffffffffff60685416803b15610b895781906004604051809481937f3d18b9120000000000000000000000000000000000000000000000000000000083525af18015610b7c575b610b70575080f35b610b7990610330565b80f35b610b8461270e565b610b68565b50fd5b80fd5b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57600435610bcb33612059565b610bd481614377565b50610c10610bf760675473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b803b1561000e576040517f441a3e700000000000000000000000000000000000000000000000000000000081526000600482018190526024820184905290918290604490829084905af18015610d63575b610d4a575b50610881610c8960365473ffffffffffffffffffffffffffffffffffffffff1690565b610cab610bf760345473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529160208360248173ffffffffffffffffffffffffffffffffffffffff85165afa928315610d3d575b600093610d0d575b50614e19565b610d2f91935060203d8111610d36575b610d278183610389565b8101906126ff565b9184610d07565b503d610d1d565b610d4561270e565b610cff565b80610d57610d5d92610330565b8061062a565b80610c66565b610d6b61270e565b610c61565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576020610700613580565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760206040517f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c8152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576020610e3e612750565b60375480600a0290600a820403610e59575b60405191118152f35b610e6161264b565b610e50565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602073ffffffffffffffffffffffffffffffffffffffff60685416604051908152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57610ef233612178565b6020610efc612750565b610f058161394e565b1015604051908152f35b90600182811c92168015610f58575b6020831014610f2957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691610f1e565b60005b838110610f755750506000910152565b8181015183820152602001610f65565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60409360208452610fc88151809281602088015260208888019101610f62565b0116010190565b503461000e576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610b8c57604051908060335461101181610f0f565b808552916001918083169081156110a6575060011461104b575b6110478561103b81870382610389565b60405191829182610f85565b0390f35b9250603383527f82a75bdeeae8604d839476ae9efd8b0e15aa447e21bfd7f41283bb54e22c9a825b82841061108e57505050810160200161103b8261104761102b565b80546020858701810191909152909301928101611073565b8695506110479693506020925061103b9491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001682840152151560051b820101929361102b565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602060ff61116560243561113181610567565b6004356000526001845260406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54166040519015158152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602073ffffffffffffffffffffffffffffffffffffffff60675416604051908152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602060405160008152f35b9080601f8301121561000e5781602061121a93359101610413565b90565b9080601f8301121561000e5781359067ffffffffffffffff821161128f575b8160051b6040519360209361125385840187610389565b8552838086019282010192831161000e578301905b828210611276575050505090565b838091833561128481610567565b815201910190611268565b611297610300565b61123c565b60c4359061059282610567565b60e4359061059282610567565b503461000e576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576004356112f381610567565b67ffffffffffffffff9060243582811161000e576113159036906004016111ff565b60443583811161000e5761132d90369060040161121d565b611335610585565b60843594851161000e5761135061088195369060040161121d565b90611359610594565b9261136261129c565b9461136b6112a9565b966140c9565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602063ffffffff60675460a01c16604051908152f35b503461000e576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576107006004803583611412610bf760665473ffffffffffffffffffffffffffffffffffffffff1690565b604051938480927f18160ddd0000000000000000000000000000000000000000000000000000000082525afa9182156116a5575b600092611686575b50606754916040517ffea61faa000000000000000000000000000000000000000000000000000000008152858160048173ffffffffffffffffffffffffffffffffffffffff88165afa908115611679575b60009161165c575b50828160008212611642576114bc9250612743565b905b600093826114d9575b5050506114d390614810565b90612743565b91816115e9936115b98961151761150e611500876114fb6114d39c9d9a6126cb565b61352e565b670de0b6b3a7640000900490565b63ffffffff1690565b611539610bf760655473ffffffffffffffffffffffffffffffffffffffff1690565b61155b610bf760365473ffffffffffffffffffffffffffffffffffffffff1690565b6040518095819482937fd50c08f80000000000000000000000000000000000000000000000000000000084526004840190929163ffffffff60209173ffffffffffffffffffffffffffffffffffffffff604085019616845216910152565b03915afa948515611635575b946115f2575b5060a01c63ffffffff16926bffffffffffffffffffffffff166137e5565b919038806114c7565b6bffffffffffffffffffffffff91945061162663ffffffff918b3d8d1161162e575b61161e8183610389565b810190613567565b9491506115cb565b503d611614565b61163d61270e565b6115c5565b5090611650611656926134f3565b906128cd565b906114be565b6116739150863d8811610d3657610d278183610389565b386114a7565b61168161270e565b61149f565b61169e919250843d8611610d3657610d278183610389565b903861144e565b6116ad61270e565b611446565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602073ffffffffffffffffffffffffffffffffffffffff60355416604051908152f35b9181601f8401121561000e5782359167ffffffffffffffff831161000e576020808501948460051b01011161000e57565b503461000e5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57600467ffffffffffffffff813581811161000e576117879036908401611705565b92909160243581811161000e576117a19036908401611705565b93909160443590811161000e576117bb9036908501611705565b916117c533612059565b858714801590611946575b61191d5760005b8781106117e057005b806117ef6118c1928a8561287f565b356117f981610567565b611804828a8961287f565b359061180f82610567565b61181a83888861287f565b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152308c820190815273ffffffffffffffffffffffffffffffffffffffff8616602082810191909152933595939283918391829101038173ffffffffffffffffffffffffffffffffffffffff88165afa918215611910575b6000926118f3575b5050838110156118c6576118b6906118bc946128cd565b916150fe565b6127f7565b6117d7565b8381116118d7575b505050506127f7565b6118ea936118e4916128cd565b91615228565b388080806118ce565b6119099250803d10610d3657610d278183610389565b388061189f565b61191861270e565b611897565b846040517f46282e8d000000000000000000000000000000000000000000000000000000008152fd5b50828714156117d0565b503461000e576040807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57600480359061198f82610567565b6024359261199c84610567565b6119a533612059565b6119ad61403b565b80519073ffffffffffffffffffffffffffffffffffffffff60009516945b828110611a295783517f70a08231000000000000000000000000000000000000000000000000000000008152308187019081526108819190899089906020908490819083010381845afa928315610d3d57600093610d0d5750614e19565b611a53610bf7611a39838561285d565b5173ffffffffffffffffffffffffffffffffffffffff1690565b8614611a6757611a62906127f7565b6119cb565b505050517f093e1cdb000000000000000000000000000000000000000000000000000000008152fd5b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576020610700612750565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576020610700613452565b503461000e576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610b8c57611b3e33612178565b80611b61610bf760365473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290602090829060249082905afa908115611c6d575b8291611c4f575b50611bcc610bf760675473ffffffffffffffffffffffffffffffffffffffff1690565b90813b15611c4b576040517fe2bbb15800000000000000000000000000000000000000000000000000000000815260006004820152602481019190915291908290604490829084905af18015611c3e575b611c2b575b50610b7961424d565b80610d57611c3892610330565b38611c22565b611c4661270e565b611c1d565b5050fd5b611c67915060203d8111610d3657610d278183610389565b38611ba9565b611c7561270e565b611ba2565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57610881602435600435611cbc82610567565b806000526001602052611cd86001604060002001543390612297565b61256d565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602073ffffffffffffffffffffffffffffffffffffffff60345416604051908152f35b503461000e5760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57600435611d6c81610567565b67ffffffffffffffff9060243582811161000e57611d8e9036906004016111ff565b60443583811161000e57611da690369060040161121d565b60643590611db382610567565b60843594851161000e57611dce61088195369060040161121d565b9260a43594611ddc86610567565b6128ef565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602073ffffffffffffffffffffffffffffffffffffffff60695416604051908152f35b90611e4760209282815194859201610f62565b0190565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f10c15aae13326e9b33c92ffbb94efb7492c500f0cca324caca9bd1aca194ed1860205260409020547ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab9160019160ff1615611ec257505050565b73ffffffffffffffffffffffffffffffffffffffff611ee19116614cdc565b91611eea614bea565b916030611ef684614c05565b536078611f0284614c1b565b536041905b808211611ffc57611ff86037611fc687611f9a88611f258915614c77565b611f946040519586947f416363657373436f6e74726f6c3a206163636f756e74200000000000000000006020870152611f67815180926020858a019101610f62565b8501016011907f206973206d697373696e6720726f6c652000000000000000000000000000000081520190565b90611e34565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610389565b6040519182917f08c379a000000000000000000000000000000000000000000000000000000000835260048301610f85565b0390fd5b9091807f3031323334353637383961626364656600000000000000000000000000000000600f6120469316601081101561204c575b1a61203c8587614c2c565b5360041c92614c4b565b90611f07565b61205461282d565b612031565b73ffffffffffffffffffffffffffffffffffffffff811660009081527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db60205260409020547f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419160019160ff16156120d057505050565b73ffffffffffffffffffffffffffffffffffffffff6120ef9116614cdc565b916120f8614bea565b91603061210484614c05565b53607861211084614c1b565b536041905b80821161213357611ff86037611fc687611f9a88611f258915614c77565b9091807f3031323334353637383961626364656600000000000000000000000000000000600f6121729316601081101561204c571a61203c8587614c2c565b90612115565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f21d442261a7cc2346fd3ca5e1f22fe015f6b71188f57ab4761df2e3faed3703f60205260409020547f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c9160019160ff16156121ef57505050565b73ffffffffffffffffffffffffffffffffffffffff61220e9116614cdc565b91612217614bea565b91603061222384614c05565b53607861222f84614c1b565b536041905b80821161225257611ff86037611fc687611f9a88611f258915614c77565b9091807f3031323334353637383961626364656600000000000000000000000000000000600f6122919316601081101561204c571a61203c8587614c2c565b90612234565b9081600052600160205260ff6122d18260406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b5416156122dc575050565b611fc6611ff892611f9a61231061230a73ffffffffffffffffffffffffffffffffffffffff60489616614cdc565b92614d9e565b6040519485937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000006020860152612350815180926020603789019101610f62565b84017f206973206d697373696e6720726f6c652000000000000000000000000000000060378201520190611e34565b73ffffffffffffffffffffffffffffffffffffffff811660009081527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db602052604081207f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419060ff905b5416156123f557505050565b808252600160205261242a83604084209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d73ffffffffffffffffffffffffffffffffffffffff3394169280a4565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f10c15aae13326e9b33c92ffbb94efb7492c500f0cca324caca9bd1aca194ed18602052604081207ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab9060ff906123e9565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f21d442261a7cc2346fd3ca5e1f22fe015f6b71188f57ab4761df2e3faed3703f602052604081207f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c9060ff906123e9565b600090808252600160205260ff6125a784604085209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54166125b257505050565b80825260016020526125e783604084209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b73ffffffffffffffffffffffffffffffffffffffff3394169280a4565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b906301e133809182810292818404149015171561269457565b61059261264b565b9061251c9182810292818404149015171561269457565b90620f42409182810292818404149015171561269457565b906b0de0b6b39983494c589c00009182810292818404149015171561269457565b8181029291811591840414171561269457565b9081602091031261000e575190565b506040513d6000823e3d90fd5b906001820180921161269457565b906b033b2e3c9fd0803ce800000091820180921161269457565b9190820180921161269457565b6024602073ffffffffffffffffffffffffffffffffffffffff60365416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9081156127ea575b6000916127cc575b506127b8613452565b81018091116127c45790565b61121a61264b565b6127e4915060203d8111610d3657610d278183610389565b386127af565b6127f261270e565b6127a7565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612825570190565b611e4761264b565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015612872575b60051b010190565b61287a61282d565b61286a565b9190811015612890575b60051b0190565b61289861282d565b612889565b3d156128c8573d906128ae826103ca565b916128bc6040519384610389565b82523d6000602084013e565b606090565b9190820391821161269457565b9081602091031261000e575161121a81610567565b906128fd9594939291612b5e565b612ac3612922610bf760365473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f8948874900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9190911660048201526020733520d5a913427e6f0d6a83e07ccd4a4da316e4d38183602481845afa928315612b51575b600093612b2c575b5081612a6b916129f773ffffffffffffffffffffffffffffffffffffffff80961673ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006067541617606755565b612a19610bf760365473ffffffffffffffffffffffffffffffffffffffff1690565b9060405180809581947f1b3005820000000000000000000000000000000000000000000000000000000083526004830191909173ffffffffffffffffffffffffffffffffffffffff6020820193169052565b03915afa918215612b1f575b600092612af2575b50501673ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006066541617606655565b612acb613d6a565b610592612aed60365473ffffffffffffffffffffffffffffffffffffffff1690565b614f30565b612b119250803d10612b18575b612b098183610389565b8101906128da565b3880612a7f565b503d612aff565b612b2761270e565b612a77565b612a6b919350612b498391823d8411612b1857612b098183610389565b939150612995565b612b5961270e565b61298d565b94929093916000549460ff8660081c169586600014612cae5750303b155b15612c2a57612b9195159687612bc457612eb1565b612b9757565b6105927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff60005416600055565b612bf56101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff6000541617600055565b612c2560017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000541617600055565b612eb1565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152fd5b60ff1615612b7c565b601f8111612cc3575050565b600090603382527f82a75bdeeae8604d839476ae9efd8b0e15aa447e21bfd7f41283bb54e22c9a82906020601f850160051c83019410612d1e575b601f0160051c01915b828110612d1357505050565b818155600101612d07565b9092508290612cfe565b90815167ffffffffffffffff8111612e6c575b612d4f81612d4a603354610f0f565b612cb7565b602080601f8311600114612da85750819293600092612d9d575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c191617603355565b015190503880612d69565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0831694612df960336000527f82a75bdeeae8604d839476ae9efd8b0e15aa447e21bfd7f41283bb54e22c9a8290565b926000905b878210612e54575050836001959610612e1d575b505050811b01603355565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055388080612e12565b80600185968294968601518155019501930190612dfe565b612e74610300565b612d3b565b9081602091031261000e575160ff8116810361000e5790565b60ff16604d8111612ea4575b600a0a90565b612eac61264b565b612e9e565b94612efb909492919473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006038541617603855565b612f408573ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006035541617603555565b613099612f68610bf7610bf760355473ffffffffffffffffffffffffffffffffffffffff1690565b9461309460405180977fdc4c90d300000000000000000000000000000000000000000000000000000000825281600460209a8b935afa908115613265575b600091613248575b50603480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff928316179055600488613015610bf760345473ffffffffffffffffffffffffffffffffffffffff1690565b604051928380927ffc0c546a0000000000000000000000000000000000000000000000000000000082525afa90811561323b575b60009161321e575b501673ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006036541617603655565b612d28565b6130c36130be610bf760345473ffffffffffffffffffffffffffffffffffffffff1690565b61237f565b80519060005b828110613205575050506130dc82612491565b80519060005b8281106131e75750505061318a610592939261310361318f936130be613272565b61310c846124ff565b613114613312565b61311c6133b2565b600481613147610bf7610bf7610bf760365473ffffffffffffffffffffffffffffffffffffffff1690565b604051928380927f313ce5670000000000000000000000000000000000000000000000000000000082525afa9182156131da575b6000926131ad575b5050612e92565b603755565b60365473ffffffffffffffffffffffffffffffffffffffff16615028565b6131cc9250803d106131d3575b6131c48183610389565b810190612e79565b3880613183565b503d6131ba565b6131e261270e565b61317b565b806118bc6131fb611a39613200948661285d565b612491565b6130e2565b806118bc6130be611a39613219948661285d565b6130c9565b6132359150893d8b11612b1857612b098183610389565b38613051565b61324361270e565b613049565b61325f9150883d8a11612b1857612b098183610389565b38612fae565b61326d61270e565b612fa6565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab600081815260016020527f10c15aae13326e9b33c92ffbb94efb7492c500f0cca324caca9bd1aca194ed19547f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419283927fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9080a4600160406000200155565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041600081815260016020527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5dc547f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c9283927fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9080a4600160406000200155565b7f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c600081815260016020527f21d442261a7cc2346fd3ca5e1f22fe015f6b71188f57ab4761df2e3faed37040547f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419283927fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9080a4600160406000200155565b602461345c614489565b602073ffffffffffffffffffffffffffffffffffffffff60675416604051938480927f3af9e6690000000000000000000000000000000000000000000000000000000082523060048301525afa9182156134e6575b6000926134c6575b5081018091116127c45790565b6134df91925060203d8111610d3657610d278183610389565b90386134b9565b6134ee61270e565b6134b1565b7f80000000000000000000000000000000000000000000000000000000000000008114613521575b60000390565b61352961264b565b61351b565b8115613538570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b9081602091031261000e575180600b0b810361000e5790565b61121a6135a5610bf760665473ffffffffffffffffffffffffffffffffffffffff1690565b60405180917f18160ddd00000000000000000000000000000000000000000000000000000000825281600460209485935afa9081156137d8575b6000916137bb575b5060675490604051907ffea61faa000000000000000000000000000000000000000000000000000000008252838260048173ffffffffffffffffffffffffffffffffffffffff87165afa9182156137ae575b60009261378f575b5060009282613658575b50505090506114d36145bc565b613715856137469661367361150e611500886114fb896126cb565b613695610bf760655473ffffffffffffffffffffffffffffffffffffffff1690565b6136b7610bf760365473ffffffffffffffffffffffffffffffffffffffff1690565b6040518096819482937fd50c08f80000000000000000000000000000000000000000000000000000000084526004840190929163ffffffff60209173ffffffffffffffffffffffffffffffffffffffff604085019616845216910152565b03915afa958615613782575b9561374f575b505060a01c63ffffffff16926bffffffffffffffffffffffff166137e5565b8038808061364b565b6bffffffffffffffffffffffff92955063ffffffff918161377b92903d1061162e5761161e8183610389565b9491613727565b61378a61270e565b613721565b6137a7919250843d8611610d3657610d278183610389565b9038613641565b6137b661270e565b613639565b6137d29150823d8411610d3657610d278183610389565b386135e7565b6137e061270e565b6135df565b6137ff613820936114fb633b9aca00969461381a946126ec565b63ffffffff63ee6b2800931683039083821161385a576126ec565b04613867565b7ffffffffffffffffffffffffffffffffffffffffffcc4d1c3602f7fc318000000810190811161384e570490565b61385661264b565b0490565b61386261264b565b6126ec565b801561393d578061390461387e8261121a946126ec565b916139046138ff60066b019d971e4fe8401e7400000095868101809111613930575b6b033b2e3c9fd0803ce8000000809104966138bb86896126ec565b908101809111613923575b04660388828f7b0c809680880297880403613916575b6906a4333ec90a9e8da7009080820291820403613909575b049460011c9261267b565b612729565b612743565b61391161264b565b6138f4565b61391e61264b565b6138dc565b61392b61264b565b6138c6565b61393861264b565b6138a0565b506b033b2e3c9fd0803ce800000090565b613956614489565b613978610bf760675473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f3af9e6690000000000000000000000000000000000000000000000000000000081523060048201526020939092918490849060249082905afa928315613d41575b600093613d22575b506036546040517f70a08231000000000000000000000000000000000000000000000000000000008082523060048301529473ffffffffffffffffffffffffffffffffffffffff9491929091908516908784602481855afa938415613d15575b600094613cec575b508361390484613a3c93612743565b808511613ce4575b5083831015613cb85750613a70610bf760365473ffffffffffffffffffffffffffffffffffffffff1690565b928660405180958882528180613aa160048201907327182842e098f60e3d576794a5bffb0777e025d3602083019252565b03915afa938415613cab575b600094613c8c575b5060018411613b6a575b5050505082613ae360365473ffffffffffffffffffffffffffffffffffffffff1690565b60405193845230600485015292918290602490829086165afa928315613b5d575b600093613b38575b50508161121a91613b3260355473ffffffffffffffffffffffffffffffffffffffff1690565b90614e19565b61121a9293509081613b5592903d10610d3657610d278183610389565b919038613b0c565b613b6561270e565b613b04565b82613b74916128cd565b926000818511613c68575050613b8a8282612743565b600090841115613c605750613ba891613ba291612743565b826128cd565b80613c50575b50613bd1610bf760675473ffffffffffffffffffffffffffffffffffffffff1690565b803b1561000e576040517f441a3e70000000000000000000000000000000000000000000000000000000008152600060048201819052602482019390935291908290604490829084905af18015613c43575b613c30575b808080613abf565b80610d57613c3d92610330565b38613c28565b613c4b61270e565b613c23565b613c5990614377565b5038613bae565b915050613ba8565b92509250808311600014613c8657613c819150826128cd565b613ba8565b50613ba8565b613ca4919450873d8911610d3657610d278183610389565b9238613ab5565b613cb361270e565b613aad565b929550505061121a9250839150613b3260355473ffffffffffffffffffffffffffffffffffffffff1690565b935038613a44565b83945090613904613d0c613a3c938b3d8d11610d3657610d278183610389565b95505090613a2d565b613d1d61270e565b613a25565b613d3a919350843d8611610d3657610d278183610389565b91386139c5565b613d4961270e565b6139bd565b9081602091031261000e575163ffffffff8116810361000e5790565b610592613e6d613f4d613e06613d98610bf760365473ffffffffffffffffffffffffffffffffffffffff1690565b613ed973ffffffffffffffffffffffffffffffffffffffff6040519586937fb409dd9b000000000000000000000000000000000000000000000000000000008552602097889687926004830191909173ffffffffffffffffffffffffffffffffffffffff6020820193169052565b03948181733520d5a913427e6f0d6a83e07ccd4a4da316e4d39781895afa90811561402e575b600091614011575b50604051809381927fcab65f01000000000000000000000000000000000000000000000000000000008352600483019190602083019252565b03817327182842e098f60e3d576794a5bffb0777e025d35afa908115614004575b600091613fe7575b501673ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006065541617606555565b613efb610bf760365473ffffffffffffffffffffffffffffffffffffffff1690565b9060405180809581947fb74b1ed50000000000000000000000000000000000000000000000000000000083526004830191909173ffffffffffffffffffffffffffffffffffffffff6020820193169052565b03915afa918215613fda575b600092613fad575b50507fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff77ffffffff00000000000000000000000000000000000000006067549260a01b16911617606755565b613fcc9250803d10613fd3575b613fc48183610389565b810190613d4e565b3880613f61565b503d613fba565b613fe261270e565b613f59565b613ffe9150853d8711612b1857612b098183610389565b38613e96565b61400c61270e565b613e8e565b6140289150823d8411610d3657610d278183610389565b38613e34565b61403661270e565b613e2c565b6040516060810181811067ffffffffffffffff8211176140bc575b6040526002815260208101604036823773ffffffffffffffffffffffffffffffffffffffff908160365416908351156140af575b52606754168151600110156140a2575b604082015290565b6140aa61282d565b61409a565b6140b761282d565b61408a565b6140c4610300565b614056565b9361059297936140e0938798979361413a976128ef565b73ffffffffffffffffffffffffffffffffffffffff80931690837fffffffffffffffffffffffff00000000000000000000000000000000000000009183836068541617606855169060695416176069558260675416615028565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff831660248201526141ba9060208160448173d9fcd98c322942075a5c3860693e9f4f03aae07b5afa908115614240575b600091614222575b5015614ea5565b604051917f095ea7b30000000000000000000000000000000000000000000000000000000060208401521660248201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60448201526044815261421d8161036d565b6153be565b61423a915060203d8111610d3657610d278183610389565b386141b3565b61424861270e565b6141ab565b61426f610bf760685473ffffffffffffffffffffffffffffffffffffffff1690565b614291610bf760675473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529190602090839060249082905afa91821561436a575b60009261434a575b50803b1561000e576040517fa694fc3a00000000000000000000000000000000000000000000000000000000815260048101929092526000908290818381602481015b03925af1801561433d575b6143305750565b80610d5761059292610330565b61434561270e565b614329565b61436391925060203d8111610d3657610d278183610389565b90386142db565b61437261270e565b6142d3565b6143db60206143f5926143a2610bf760675473ffffffffffffffffffffffffffffffffffffffff1690565b60405180809581947f52eac8af000000000000000000000000000000000000000000000000000000008352600483019190602083019252565b03915afa90811561447c575b60009161445e575b5061271b565b90614418610bf760685473ffffffffffffffffffffffffffffffffffffffff1690565b803b1561000e57600060405180927f2e1a7d4d00000000000000000000000000000000000000000000000000000000825281838161431e89600483019190602083019252565b614476915060203d8111610d3657610d278183610389565b386143ef565b61448461270e565b6143e7565b6144ab610bf760685473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526020916145579183918290829060249082905afa9081156145af575b600091614592575b5061451e610bf760675473ffffffffffffffffffffffffffffffffffffffff1690565b60405180809581947f010ad6d1000000000000000000000000000000000000000000000000000000008352600483019190602083019252565b03915afa918215614585575b60009261456f57505090565b61121a9250803d10610d3657610d278183610389565b61458d61270e565b614563565b6145a99150823d8411610d3657610d278183610389565b386144fb565b6145b761270e565b6144f3565b6145de610bf760685473ffffffffffffffffffffffffffffffffffffffff1690565b6146c0604051917febe2b12b0000000000000000000000000000000000000000000000000000000083526020928381600481855afa908115614803575b6000916147e6575b5083614647610bf760675473ffffffffffffffffffffffffffffffffffffffff1690565b604051907f18160ddd0000000000000000000000000000000000000000000000000000000082528282600481885afa9182156147d9575b6000926147ba575b5060405180809781947f010ad6d1000000000000000000000000000000000000000000000000000000008352600483019190602083019252565b03915afa9283156147ad575b60009361478e575b504210801590614786575b61477e5761474c61474761474261473d86600461121a986114fb97604051928380927f7b0a47ee0000000000000000000000000000000000000000000000000000000082525afa918215614771575b600092614754575b505061267b565b614a40565b61269c565b6126b3565b612710900490565b61476a9250803d10610d3657610d278183610389565b3880614736565b61477961270e565b61472e565b505050600090565b5081156146df565b6147a6919350843d8611610d3657610d278183610389565b91386146d4565b6147b561270e565b6146cc565b6147d2919250833d8511610d3657610d278183610389565b9038614686565b6147e161270e565b61467e565b6147fd9150843d8611610d3657610d278183610389565b38614623565b61480b61270e565b61461b565b614832610bf760685473ffffffffffffffffffffffffffffffffffffffff1690565b604051907febe2b12b0000000000000000000000000000000000000000000000000000000082526020928383600481855afa928315614a33575b600093614a10575b50614915908461489c610bf760675473ffffffffffffffffffffffffffffffffffffffff1690565b604051907f18160ddd0000000000000000000000000000000000000000000000000000000082528282600481895afa918215614a03575b6000926149e4575b5060405180809681947f010ad6d1000000000000000000000000000000000000000000000000000000008352600483019190602083019252565b03915afa9182156149d7575b6000926149b8575b5081600082126149a45761493d9250612743565b915b42108015906147865761477e5761474c61474761474261473d86600461121a986114fb97604051928380927f7b0a47ee0000000000000000000000000000000000000000000000000000000082525afa9182156147715760009261475457505061267b565b50906116506149b2926134f3565b9161493f565b6149d0919250853d8711610d3657610d278183610389565b9038614929565b6149df61270e565b614921565b6149fc919250833d8511610d3657610d278183610389565b90386148db565b614a0b61270e565b6148d3565b614915919350614a2c90853d8711610d3657610d278183610389565b9290614874565b614a3b61270e565b61486c565b60409081517f41976e0900000000000000000000000000000000000000000000000000000000815273d9fcd98c322942075a5c3860693e9f4f03aae07b600482015282816024817359828fdf7ee634aaad3f58b19fdba3b03e2d9d805afa908115614bc6575b600091614b91575b50670de0b6b3a7640000614ac660a0926004946126ec565b049273ffffffffffffffffffffffffffffffffffffffff606954169051928380927ffeaf968c0000000000000000000000000000000000000000000000000000000082525afa908115614b84575b600091614b2c575b506305f5e10091613856916126ec565b9060a0823d8211614b7c575b81614b4560a09383610389565b81010312610b8c57506305f5e1009181614b6161385693614bd3565b50614b73608060208301519201614bd3565b50915091614b1c565b3d9150614b38565b614b8c61270e565b614b14565b908382813d8311614bbf575b614ba78183610389565b81010312610b8c575051670de0b6b3a7640000614aae565b503d614b9d565b614bce61270e565b614aa6565b519069ffffffffffffffffffff8216820361000e57565b60405190614bf78261036d565b604282526060366020840137565b602090805115614c13570190565b611e4761282d565b602190805160011015614c13570190565b906020918051821015614c3e57010190565b614c4661282d565b010190565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908015612825570190565b15614c7e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b604051906060820182811067ffffffffffffffff821117614d91575b604052602a825260403660208401376030614d1283614c05565b536078614d1e83614c1b565b536029905b60018211614d365761121a915015614c77565b807f3031323334353637383961626364656600000000000000000000000000000000600f614d7e93166010811015614d84575b1a614d748486614c2c565b5360041c91614c4b565b90614d23565b614d8c61282d565b614d69565b614d99610300565b614cf8565b614da6614bea565b906030614db283614c05565b536078614dbe83614c1b565b536041905b60018211614dd65761121a915015614c77565b807f3031323334353637383961626364656600000000000000000000000000000000600f614e1393166010811015614d84571a614d748486614c2c565b90614dc3565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff9092166024830152604482019290925261059291614ea082606481015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101845283610389565b6154e5565b15614eac57565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152fd5b61059290614fb16040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201527327182842e098f60e3d576794a5bffb0777e025d3602482015260208160448173ffffffffffffffffffffffffffffffffffffffff87165afa90811561424057600091614222575015614ea5565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000060208201527327182842e098f60e3d576794a5bffb0777e025d360248201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604482015290614ea08260648101614e74565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015261059293929161509b906020816044818787165afa90811561424057600091614222575015614ea5565b604051927f095ea7b30000000000000000000000000000000000000000000000000000000060208501521660248301527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604483015260448252614ea08261036d565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff83166024820152610592939092906020848060448101038173ffffffffffffffffffffffffffffffffffffffff87165afa93841561521b575b6000946151f5575b5090614ea09184018094116151e8575b6040517f095ea7b300000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff909116602482015260448101939093528260648101614e74565b6151f061264b565b615190565b614ea0929194506152139060203d8111610d3657610d278183610389565b939091615180565b61522361270e565b615178565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8316602482015292916020848060448101038173ffffffffffffffffffffffffffffffffffffffff86165afa9384156153b1575b600094615391575b5082841061530d576040517f095ea7b300000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff909116602482015291909203604482015261059291614ea08260648101614e74565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5361666545524332303a2064656372656173656420616c6c6f77616e6365206260448201527f656c6f77207a65726f00000000000000000000000000000000000000000000006064820152fd5b6153aa91945060203d8111610d3657610d278183610389565b92386152a5565b6153b961270e565b61529d565b604051906153cb82610351565b6154296020928381527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656484820152600080848682965191018273d9fcd98c322942075a5c3860693e9f4f03aae07b5af161542361289d565b90615552565b805180615437575b50505050565b818491810103126154e15782015190811591821503610b8c575061545d57808080615431565b608490604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b5080fd5b73ffffffffffffffffffffffffffffffffffffffff169061542960405161550b81610351565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af161554c61289d565b91615627565b909190156155e157508051156155655790565b73d9fcd98c322942075a5c3860693e9f4f03aae07b3b156155835790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8151156155f15750805190602001fd5b611ff8906040519182917f08c379a000000000000000000000000000000000000000000000000000000000835260048301610f85565b91929015615644575081511561563b575090565b3b156155835790565b8251909150156155f15750805190602001fdfea2646970667358221220972b631001f0cb88c0501937d265f2d30e17018fdc744ff7130be8a85723c2ca64736f6c63430008110033", + "nonce": "0x3b3", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0x9e6c568c190380937ad2ccc86b6c5fa03204cc1c291cd86e02e80b72c155931a", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0xf5aD02F3DbBF4b42DEE1f1255607f929CA2a7c5a", + "function": null, + "arguments": [ + "0x2A729024be86FC692cC02b08f461a56A175b88dC", + "0x1D941EF0D3Bba4ad67DBfBCeE5262F4CEE53A32b", + "0xa25b26be000000000000000000000000bfa4459868c60da9edd835f0be684edec054557b000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001800000000000000000000000001111111254eeb25477b68fb85ed929f73a960582000000000000000000000000e5afe81e63f0a52a3a03b922b30f73b8ce74d5700000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419000000000000000000000000000000000000000000000000000000000000001845756c6572205374616b6572204c656e646572205553444300000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe" + ], + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x1cccba", + "value": "0x0", + "data": "0x60406080815262000f548038038062000018816200030b565b9283398101906060818303126200030657620000348162000347565b916020926200004584840162000347565b8584015190936001600160401b0391908282116200030657019280601f850112156200030657835193620000836200007d866200035c565b6200030b565b948086528786019288828401011162000306578288620000a4930162000378565b823b15620002ac577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b03199081166001600160a01b0386811691821790935590959194600093909290917fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8580a2805115801590620002a4575b620001f5575b50505050507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103937f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f86865493815196818616885216958684820152a18315620001a357501617905551610afd9081620004578239f35b60849086519062461bcd60e51b82526004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152fd5b895194606086019081118682101762000290578a52602785527f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c89860152660819985a5b195960ca1b8a860152516200027a9493929183918291845af4903d1562000286573d6200026a6200007d826200035c565b90815280938a3d92013e6200039d565b5038808080806200012d565b606092506200039d565b634e487b7160e01b85526041600452602485fd5b508362000127565b865162461bcd60e51b815260048101879052602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608490fd5b600080fd5b6040519190601f01601f191682016001600160401b038111838210176200033157604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036200030657565b6001600160401b0381116200033157601f01601f191660200190565b60005b8381106200038c5750506000910152565b81810151838201526020016200037b565b91929015620004025750815115620003b3575090565b3b15620003bd5790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015620004165750805190602001fd5b6044604051809262461bcd60e51b82526020600483015262000448815180928160248601526020868601910162000378565b601f01601f19168101030190fdfe6080604052600436101561002c575b361561001f575b61001d6107b1565b005b6100276107b1565b610015565b6000803560e01c9081633659cfe614610093575080634f1ef2861461008a5780635c60da1b146100815780638f283970146100785763f851a4400361000e57610073610455565b61000e565b506100736102f0565b5061007361023b565b50610073610157565b3461012c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261012c576100ca61012f565b73ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541633146000146101235761012090610117610511565b908382526105cb565b80f35b506101206107b1565b80fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361015257565b600080fd5b5060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525761018a61012f565b60243567ffffffffffffffff9182821161015257366023830112156101525781600401359283116101525736602484840101116101525773ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416331460001461023057600060208480602461021e61021961001d99610582565b61053e565b9682885201838701378401015261070b565b50505061001d6107b1565b50346101525760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610152576020600073ffffffffffffffffffffffffffffffffffffffff90817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541633146000146102e25750807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416905b60405191168152f35b906102eb6107b1565b6102d9565b50346101525760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525761032861012f565b73ffffffffffffffffffffffffffffffffffffffff907fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610391808354163314600014610230577f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f604084549281519481851686521693846020820152a181156103d1577fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b50346101525760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610152576020600073ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038181541633146000146104d85754604051911681529050f35b506102eb6107b1565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051906020820182811067ffffffffffffffff82111761053157604052565b6105396104e1565b604052565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f604051930116820182811067ffffffffffffffff82111761053157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff81116105be575b01160190565b6105c66104e1565b6105b8565b803b156106875773ffffffffffffffffffffffffffffffffffffffff81167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc817fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a281511580159061067f575b61066a575050565b61067c916106766108dd565b9161095b565b50565b506000610662565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152fd5b803b156106875773ffffffffffffffffffffffffffffffffffffffff81167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc817fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a28151158015906107a95761066a575050565b506001610662565b5073ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354163314610833577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc54166000808092368280378136915af43d82803e1561082f573d90f35b3d90fd5b60a46040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f65740000000000000000000000000000000000000000000000000000000000006084820152fd5b604051906060820182811067ffffffffffffffff82111761094e575b604052602782527f206661696c6564000000000000000000000000000000000000000000000000006040837f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c60208201520152565b6109566104e1565b6108f9565b6000806109909493602081519101845af43d15610993573d9161098061021984610582565b9283523d6000602085013e610a00565b90565b606091610a00565b156109a257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b91929015610a205750815115610a14575090565b610990903b151561099b565b825190915015610a335750805190602001fd5b604051907f08c379a000000000000000000000000000000000000000000000000000000000825281602080600483015282519283602484015260005b848110610ab0575050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000604480968601015201168101030190fd5b818101830151868201604401528593508201610a6f56fea26469706673582212201c39b75ea59593d8670f804896fbda9470452421c2de5834b8a62b5fdb34806664736f6c634300081100330000000000000000000000002a729024be86fc692cc02b08f461a56a175b88dc0000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001e4a25b26be000000000000000000000000bfa4459868c60da9edd835f0be684edec054557b000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001800000000000000000000000001111111254eeb25477b68fb85ed929f73a960582000000000000000000000000e5afe81e63f0a52a3a03b922b30f73b8ce74d5700000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419000000000000000000000000000000000000000000000000000000000000001845756c6572205374616b6572204c656e646572205553444300000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe00000000000000000000000000000000000000000000000000000000", + "nonce": "0x3b4", + "accessList": [] + }, + "additionalContracts": [] + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x5382fd037f49f38aead835fdd346291ef48fc0807d3b24492cac6929d1e5f2d9", + "0xb15f678d8fe2bd3a0bd0f347863d1458112e94b2553214497ecceed33f6734e0", + "0xf943e18b4748f5a473cf0c8f62fbcf23b832e025207bbaafa5120fb571732208", + "0x64173877fc5a6e2f36eb7b7d68cd8ed8f91ab9ae4b88f77c34fe17dfbcac74bc", + "0x9c0c3c8ce0dcd25ce0ed004e36dba167d476fdcbb041f3dd21fc5843d9100e87", + "0x27c46748143651ee0e72af28574594a01879f37185e082c23bc0cf70d51b6ace", + "0x991eef60590b3e23c89e77e2209afc0d141b0b31dcd9a0053624b2eb00d8ef6c", + "0x9e6c568c190380937ad2ccc86b6c5fa03204cc1c291cd86e02e80b72c155931a" + ], + "path": "/Users/gnervo/Documents/Angle/strategies-dev/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-latest.json", + "returns": {}, + "timestamp": 1675863870, + "chain": 1, + "multi": false, + "commit": "6e49356" +} \ No newline at end of file diff --git a/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-1675863884.json b/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-1675863884.json new file mode 100644 index 0000000..1fc0a1a --- /dev/null +++ b/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-1675863884.json @@ -0,0 +1,1210 @@ +{ + "transactions": [ + { + "hash": "0x5382fd037f49f38aead835fdd346291ef48fc0807d3b24492cac6929d1e5f2d9", + "transactionType": "CREATE", + "contractName": "OptimizerAPRStrategy", + "contractAddress": "0xa693aBabF230397B3e6385ff7eE09607f562af8c", + "function": null, + "arguments": null, + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x5965d1", + "value": "0x0", + "data": "0x60808060405234620000d3576000549060ff8260081c169081600014620000c857303b155b156200006f57501590816200005c575b506200004b575b60405161508c9081620000d98239f35b61ff0019600054166000556200003b565b61ffff1916610101176000553862000034565b62461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b60ff83161562000024565b600080fdfe6101006040908082526004918236101561001857600080fd5b600092833560e01c9283630b6d1d1714612087575082630c016dc01461202e5782630e6e15f014611ff35782630f969b8714611f855782631d12f28b14611f485782631f1fcd5114611ef557826322f3e2d414611eb1578263248a9ca314611e6857826324ea54f414611e0f5782632e1a7d4d14611d9c5782632f2ff15d14611ca5578263364bc15a14611c4c57826336568abe14611b8e5782634641257d14611b575782634786b0cb14611b165782635641ec0314611ad45782635a5cd45e14611a99578263708ba9bd1461199a57826376ee75d8146119515782637985fd51146119145782638baf2957146118cb57826391d1485414611859578263929eea21146117d557826393084b34146115db578263a217fddf146115a2578263a526d83b1461148b578263af648c3d146112eb578263b8dc491b14611120578263bb927c46146110e3578263ce5c7f611461104c578263d547741f14610ff2578263dc4c90d314610f9c578263ddc6326214610f50578263e6a69ab814610f13578263e6bfbfd8146106a3578263ec342ad014610662578263efbb5cb014610620578263fcc5f59a1461026157505063fcf2d0ad146101d557600080fd5b3461025e57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e5761020c336125d8565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0060335416176033557f17fa25a1c2ac074f71f0cf4f6af525c06fab7d83eff5ffcf6df5277f2919ae248180a180f35b80fd5b83903461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760655461029d816121c8565b916102aa85519384612187565b8183527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06102d7836121c8565b01845b818110610605575050835b8281106103a557505050825191602080840190808552835180925285850181878460051b880101950193965b83881061031e5786860387f35b90919293948380827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a60019503018652885190610364825160808084528301906122a3565b918381015184830152868101518783015273ffffffffffffffffffffffffffffffffffffffff60608092015116910152970193019701969093929193610311565b6103ad6142f0565b6103b6826121e0565b905488517f8b2021760000000000000000000000000000000000000000000000000000000081528881878173ffffffffffffffffffffffffffffffffffffffff8096600398891b1c165afa9081156105fb578991610576575b5083528061041c856121e0565b905490841b1c16606084015280610432856121e0565b905490841b1c1691895180937fc1590cd7000000000000000000000000000000000000000000000000000000008252818860209687935afa90811561056c579187939185938c91610534575b508387015261048c876121e0565b9054911b1c168a51928380927f57ded9c90000000000000000000000000000000000000000000000000000000082525afa91821561052a5788926104f6575b5050878201526104f191906104e08287612e1e565b526104eb8186612e1e565b50612df1565b6102e5565b90809250813d8311610523575b61050d8183612187565b8101031261051f57516104f1896104cb565b8680fd5b503d610503565b89513d8a823e3d90fd5b929450509181813d8311610565575b61054d8183612187565b81010312610561579183918793518d61047e565b8980fd5b503d610543565b8b513d8c823e3d90fd5b90503d808a833e6105878183612187565b81019060209081818403126105f75780519067ffffffffffffffff82116105f357019082601f830112156105f757908b92918151926105d16105c885612246565b95519586612187565b8385528184840101116105f3576105ed92918482019101612280565b8a61040f565b8b80fd5b8a80fd5b8a513d8b823e3d90fd5b6020906106106142f0565b828288010152016102da565b5080fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b6143f2565b9051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209051670de0b6b3a76400008152f35b915034610f0f5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576106dc6120e9565b6106e46120c1565b916044359173ffffffffffffffffffffffffffffffffffffffff9182841691828503610f0b576064359267ffffffffffffffff8411610bcc5736602385011215610bcc578388013596610736886121c8565b9061074385519283612187565b8882526020958683016024809b60051b83010191368311610dea578b01905b828210610eef575050508a549760ff93848a60081c1680600014610ee657303b155b15610e655789898f928f90159d8e610e37575b506033547fffffffffffffffffffffff0000000000000000000000000000000000000000ff74ffffffffffffffffffffffffffffffffffffffff008c60081b1691161790816033558b51809481937ffc0c546a00000000000000000000000000000000000000000000000000000000835260081c165afa908115610e2d578b8f928c928591610e00575b5016807fffffffffffffffffffffffff000000000000000000000000000000000000000060345416176034558a51928380927f313ce5670000000000000000000000000000000000000000000000000000000082525afa918215610df557908792610db7575b5016604d8111610d8c57600a0a6035558015908115610d81575b8115610d75575b50610d4d578b949392916108be6108c392612a4e565b612a4e565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5629182855260019384885288878720911690818752885281878720541615610ce7575b50908291859387965284885284868520015492807fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9481868880a480868887200155857f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419786898098528383838320015489898480a42001558151908d5b828110610be157505050507ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab808c5283875283868d200154918c80a4828920015568056bc75e2d63100000603655603354927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00841660335580603454169360081c168151917fdd62ed3e000000000000000000000000000000000000000000000000000000008352308884015281878401528383604481885afa928315610bd7578993610ba4575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301809311610b7957517f095ea7b3000000000000000000000000000000000000000000000000000000009381019390935273ffffffffffffffffffffffffffffffffffffffff168583019081526020810191909152610b049290610aff9083906040015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101845283612187565b614e53565b610b4e575b603554916103e89280840293840403610b2457505060665580f35b601184917f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff8354168355610b09565b868960118a7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b9092508381813d8311610bd0575b610bbc8183612187565b81010312610bcc57519138610a4c565b8880fd5b503d610bb2565b81513d8b823e3d90fd5b90919293945089610bf28286612e1e565b511615610cbf57808e8b610c09610c4e9488612e1e565b51167ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab808352898d528b83208284528d52858c8420541615610c59575b505050612df1565b908694939291610984565b808352898d528b83208284528d528b83208a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d339380a48e3880610c46565b8c88517fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b8386528488528686208187528852868620857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790553390847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8880a438610906565b8a86517fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b905088831614386108a8565b838a161591506108a1565b8b8e60118f7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8092508a8092503d8311610dee575b610dd08183612187565b81010312610dea57518581168103610dea57859038610887565b8d80fd5b503d610dc6565b8951903d90823e3d90fd5b610e209150833d8511610e26575b610e188183612187565b810190612e45565b38610821565b503d610e0e565b89513d84823e3d90fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661010117845538610797565b60848d602e8e8c8c51937f08c379a00000000000000000000000000000000000000000000000000000000085528401528201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152fd5b858b1615610784565b81358a81168103610f07578152908801908801610762565b8e80fd5b8780fd5b8280fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090516301e185588152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f8933612769565b610f91612c08565b610f99613e5c565b80f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209073ffffffffffffffffffffffffffffffffffffffff60335460081c169051908152f35b915034610f0f57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57610f99913561104760016110346120c1565b93838752816020528620015433906128fa565b612b2a565b915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f578282359267ffffffffffffffff841161061c573660238501121561061c57830135926110b46110ab85612246565b93519384612187565b838352366024858301011161061c5783610f999460246020930183860137830101526110de612c08565b6132ff565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906065549051908152f35b915034610f0f57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576111586120e9565b6111606120c1565b9061116a336122e6565b73ffffffffffffffffffffffffffffffffffffffff908180603454169116918183146112c35784519061119c8261214f565b60018252602092838301843682378351156112975752815191885b83811061124e57505050508351947f70a0823100000000000000000000000000000000000000000000000000000000865230908601528085602481855afa9384156112455750859361120f575b50610f999350614df4565b90925083813d831161123e575b6112268183612187565b8101031261123a57610f9992519138611204565b8380fd5b503d61121c565b513d87823e3d90fd5b826112598284612e1e565b5116861461126f5761126a90612df1565b6111b7565b8888517fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b60248a60328b7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8585517fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576113256120e9565b9161132f336125d8565b837f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504180825260016020528282209373ffffffffffffffffffffffffffffffffffffffff8096169485845260205260ff8484205416611425575b60655495835b878110611399578480f35b816113a3826121e0565b90549060031b1c16803b156114215785809160448951809481937fd547741f0000000000000000000000000000000000000000000000000000000083528a8a8401528d60248401525af18015611417579061140392916114085750612df1565b61138e565b6114119061210c565b386104eb565b87513d88823e3d90fd5b8580fd5b81835260016020528383208584526020528383207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690553385837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b8680a4611388565b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57906114c66120e9565b906114d0336125d8565b6114d982612a4e565b8360655493819373ffffffffffffffffffffffffffffffffffffffff809116945b868110611505578380f35b8161150f826121e0565b90549060031b1c16803b1561159e5784809160448851809481937f2f2ff15d0000000000000000000000000000000000000000000000000000000083527f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50418a8401528c60248401525af18015611594579061158f92916114085750612df1565b6114fa565b86513d87823e3d90fd5b8480fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5751908152602090f35b83823461061c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57823573ffffffffffffffffffffffffffffffffffffffff918282169283830361159e57611638336122e6565b81517fa8c62e760000000000000000000000000000000000000000000000000000000081526020818881885afa9081156117cb5786916117ad575b5081309116036117855760655491855b838110611737575050506801000000000000000081101561170b57906116b28260016116e494016065556121e0565b90919082549060031b9173ffffffffffffffffffffffffffffffffffffffff9283811b93849216901b16911916179055565b7f1e7b117a6591133f0b36fc2c24d59f8465d806fdcad63aa33246b45fd62c89ff8280a280f35b6024846041877f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b82611741826121e0565b90549060031b1c16861461175d5761175890612df1565b611683565b8782517f7cc7731c000000000000000000000000000000000000000000000000000000008152fd5b8582517feeacc72d000000000000000000000000000000000000000000000000000000008152fd5b6117c5915060203d8111610e2657610e188183612187565b87611673565b83513d88823e3d90fd5b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f5735606554811015610f0f5773ffffffffffffffffffffffffffffffffffffffff906065602094527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70154169051908152f35b90915034610f0f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f578160209360ff926118996120c1565b903582526001865273ffffffffffffffffffffffffffffffffffffffff83832091168252855220541690519015158152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f996119066120e9565b61190f33612769565b614ae4565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906066549051908152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f9961198c6120e9565b611995336122e6565b614841565b833461025e57602091827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57803567ffffffffffffffff9182821161123a573660238301121561123a578101356119f6816121c8565b92611a0387519485612187565b81845260248685019260051b8401019236841161142157959695602401915b838310611a7b5750505050611a3690614585565b9190835194848695860192865281860152835180925280606086019401925b828110611a6457505050500390f35b835185528695509381019392810192600101611a55565b8297969735828116810361051f578152959695918701918701611a22565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b61449b565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209060ff6033541690519015158152f35b83903461061c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57611b50336122e6565b3560665580f35b833461025e57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f91612c08565b83903461061c57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57611bc66120c1565b903373ffffffffffffffffffffffffffffffffffffffff831603611bef5790610f999135612b2a565b60649060208551917f08c379a0000000000000000000000000000000000000000000000000000000008352820152600260248201527f37310000000000000000000000000000000000000000000000000000000000006044820152fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab8152f35b90915034610f0f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f573590611ce06120c1565b908284526001602052611cfa6001828620015433906128fa565b828452600160205273ffffffffffffffffffffffffffffffffffffffff81852092169182855260205260ff818520541615611d33578380f35b8284526001602052808420828552602052832060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905533917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8480a43880808380f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e5750611de090611dda336125d8565b3561422c565b611e03823373ffffffffffffffffffffffffffffffffffffffff60345416614df4565b82519182526020820152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50418152f35b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57816020936001923581528285522001549051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090611eec6143f2565b15159051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209073ffffffffffffffffffffffffffffffffffffffff603454169051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906036549051908152f35b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f577fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a8600916020913590611fe7336122e6565b8160365551908152a180f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b614326565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5628152f35b84903461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906035548152f35b6024359073ffffffffffffffffffffffffffffffffffffffff821682036120e457565b600080fd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036120e457565b67ffffffffffffffff811161212057604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761212057604052565b6080810190811067ffffffffffffffff82111761212057604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761212057604052565b67ffffffffffffffff81116121205760051b60200190565b6065548110156122175760656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b67ffffffffffffffff811161212057601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381106122935750506000910152565b8181015183820152602001612283565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936122df81518092818752878088019101612280565b0116010190565b73ffffffffffffffffffffffffffffffffffffffff1660008181527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db6020908152604080832054909391927f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419290916001919060ff161561236957505050505050565b61237290614c6e565b9285519161237f8361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116124e05750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b8401917f206973206d697373696e6720726f6c6520000000000000000000000000000000603784015251809386840190612280565b01036028810187520185612187565b519283927f08c379a0000000000000000000000000000000000000000000000000000000008452600484015260248301906122a3565b0390fd5b6064848651907f08c379a000000000000000000000000000000000000000000000000000000000825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a61251d8587614c5d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191906123ac565b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526032600452fd5b73ffffffffffffffffffffffffffffffffffffffff1660008181527f015260285f12fe1d77221203cd7e5aa67b79d47399b4bedd98b8730e56d911bf6020908152604080832054909391927f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5629290916001919060ff161561265b57505050505050565b61266490614c6e565b928551916126718361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116126f85750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a6127358587614c5d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01919061269e565b73ffffffffffffffffffffffffffffffffffffffff1660008181527f10c15aae13326e9b33c92ffbb94efb7492c500f0cca324caca9bd1aca194ed186020908152604080832054909391927ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab9290916001919060ff16156127ec57505050505050565b6127f590614c6e565b928551916128028361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116128895750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a6128c68587614c5d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01919061282f565b60009080825260019160209280845260409473ffffffffffffffffffffffffffffffffffffffff868420911690818452855260ff86842054161561294057505050505050565b61294990614c6e565b928551916129568361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116129dd5750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a612a1a8587614c5d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019190612983565b73ffffffffffffffffffffffffffffffffffffffff1660008181527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db60205260408120549091907f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419060ff1615612ac457505050565b8083526001602052604083208284526020526040832060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d339380a4565b90600091808352600160205273ffffffffffffffffffffffffffffffffffffffff6040842092169182845260205260ff604084205416612b6957505050565b808352600160205260408320828452602052604083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b339380a4565b91908203918211612bd957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080603354916040918251937fbf3759b500000000000000000000000000000000000000000000000000000000855273ffffffffffffffffffffffffffffffffffffffff90602086600481858560081c165afa958615612de7578496612db3575b5060ff1615612d7757612c83612c7e6143f2565b61422c565b508580821015612d5457612c98929350612bcc565b905b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d5096080612cc78488612bcc565b965b86519086825285602083015288888301526060820152a160335460081c16803b156120e45760009283606492865197889586947fa1d9bafc0000000000000000000000000000000000000000000000000000000086526004860152602485015260448401525af1908115612d4a5750612d3f5750565b612d489061210c565b565b513d6000823e3d90fd5b90818111612d64575b5050612c9a565b612d6f929450612bcc565b918438612d5d565b84925060809150612da87f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d50995612e7e565b969193909394612cc9565b9095506020813d8211612ddf575b81612dce60209383612187565b8101031261123a57519460ff612c6a565b3d9150612dc1565b85513d86823e3d90fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612bd95760010190565b80518210156122175760209160051b010190565b81810292918115918404141715612bd957565b908160209103126120e4575173ffffffffffffffffffffffffffffffffffffffff811681036120e45790565b91908201809211612bd957565b9060008091828492612e8e614326565b9573ffffffffffffffffffffffffffffffffffffffff908160345416906040938451998a927f70a08231000000000000000000000000000000000000000000000000000000009485855230600486015284602460209687935afa9b8c156131c257889c6131ef575b50612f01828d612e71565b91156131cc5750602460608660335460081c168851928380927f39ebf8230000000000000000000000000000000000000000000000000000000082523060048301525afa9081156131c2579084918991613133575b500151918282111561305f575090612f6d91612bcc565b98612f78888b612e71565b9384151580613056575b612f90575b50505050505050565b612fa3612f9e849387612bcc565b613efb565b506034541692602486518095819382523060048301525afa93841561304d5750849361301d575b50508110612fdd575b8080808080612f87565b91928286929611600014612ff757505092905b3880612fd3565b9094918561300491612bcc565b91508082101561301657505b90612ff0565b9050613010565b9080929350813d8311613046575b6130358183612187565b81010312610f0f5751903880612fca565b503d61302b565b513d86823e3d90fd5b50848210612f82565b9a995061306b91612bcc565b97613076888a612e71565b938415158061312a575b61308d5750505050505050565b61309b612f9e849387612bcc565b506034541692602486518095819382523060048301525afa93841561304d575084936130fa575b505081106130d4578080808080612f87565b919282859295116000146130ed57505091903880612fd3565b9093918461300491612bcc565b9080929350813d8311613123575b6131128183612187565b81010312610f0f57519038806130c2565b503d613108565b50848210613080565b9150506060813d82116131ba575b8161314e60609383612187565b81010312610f0b578651906060820182811067ffffffffffffffff82111761318d57885280518252808501518286015287015187820152839038612f56565b60248a7f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b3d9150613141565b87513d8a823e3d90fd5b955050505050508592939450949094116131e7575b50829190565b9150386131e1565b909b508381813d8311613217575b6132078183612187565b81010312610f0b57519a38612ef6565b503d6131fd565b60405190606554808352826020918282019060656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c7936000905b82821061327157505050612d4892500383612187565b855473ffffffffffffffffffffffffffffffffffffffff168452600195860195889550938101939091019061325b565b908160209103126120e4575180151581036120e45790565b7f80000000000000000000000000000000000000000000000000000000000000008114612bd95760000390565b81810392916000138015828513169184121617612bd957565b60ff6033541661387a5761331161321e565b8060c05251806080521561387a5780518101906020818184019303126120e457602081015167ffffffffffffffff918282116120e457019180603f840112156120e457602083015191613363836121c8565b936133716040519586612187565b8385526040602086019460051b8201019283116120e457604001925b828410613e0a5750505050600090606060a0528051613df7575b50600090600060e052600090816024602073ffffffffffffffffffffffffffffffffffffffff60345416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa908115613dea5760e05191613db2575b5060e051908182908260c05151917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061346461344e856121c8565b9461345c6040519687612187565b8086526121c8565b0136602085013760c05151937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60e05190603554915b878110613b22575050508561393e575b5050505050505010600014613775575050600090815b6080518110156135de5760006134d88260a051612e1e565b51126134ed575b6134e890612df1565b6134c0565b9160006135056134ff8560a051612e1e565b516132b9565b602073ffffffffffffffffffffffffffffffffffffffff6135288760c051612e1e565b5116602461353b6134ff8960a051612e1e565b60405195869384927f2e1a7d4d00000000000000000000000000000000000000000000000000000000845260048401525af19182156135d25760009261359c575b509161358e613594926134e894612bcc565b90612e71565b9290506134df565b90916020823d6020116135ca575b816135b760209383612187565b8101031261025e5750519061358e61357c565b3d91506135aa565b6040513d6000823e3d90fd5b5090606654811161374b576000905b60805182101561374757806136048360a051612e1e565b511315613705576136219061361b8360a051612e1e565b516132e6565b61362d8260a051612e1e565b5260009061368373ffffffffffffffffffffffffffffffffffffffff6034541673ffffffffffffffffffffffffffffffffffffffff61366e8460c051612e1e565b511661367c8460a051612e1e565b5191614df4565b73ffffffffffffffffffffffffffffffffffffffff6136a48260c051612e1e565b5116803b15610f0f578280916004604051809481937fd0e30db00000000000000000000000000000000000000000000000000000000083525af180156136fa57906136f492916114085750612df1565b906135ed565b6040513d85823e3d90fd5b9060006137148260a051612e1e565b5113613724575b6136f490612df1565b9061373f6136f4916137388460a051612e1e565b5190612bcc565b91905061371b565b5050565b60046040517f5c3810af000000000000000000000000000000000000000000000000000000008152fd5b6138af575b5073ffffffffffffffffffffffffffffffffffffffff603454166040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152602081602481855afa9081156135d25760009161387d575b50806137e2575050565b6138119173ffffffffffffffffffffffffffffffffffffffff61380960e05160c051612e1e565b511690614df4565b73ffffffffffffffffffffffffffffffffffffffff61383460e05160c051612e1e565b5116803b156120e457600080916004604051809481937fd0e30db00000000000000000000000000000000000000000000000000000000083525af180156135d257612d3f575b50565b906020823d6020116138a7575b8161389760209383612187565b8101031261025e575051386137d8565b3d915061388a565b602073ffffffffffffffffffffffffffffffffffffffff6138d460009360c051612e1e565b51166004604051809481937f853828b60000000000000000000000000000000000000000000000000000000083525af180156135d2571561377a576139309060203d602011613937575b6139288183612187565b8101906132a1565b503861377a565b503d61391e565b94965088958695869590915b81871061399e575050505050505080851180613991575b1561398057505061397490600193613e23565b388080808080806134aa565b61398c92919450613e23565b613974565b50600160c0515111613961565b9091929394959660e0518814600014613ad7576139c89061358e836139c38988612e71565b612e32565b9684151580613acd575b6139eb575b6139e090612df1565b95949392919061394a565b9a6139ff856139fa8887612e71565b612e71565b73ffffffffffffffffffffffffffffffffffffffff613a2260e05160c051612e1e565b5116906020613a318989612e71565b6024604051809581937fa7d385e200000000000000000000000000000000000000000000000000000000835260048301525afa918215613ac2578b92613a8c575b509161358e613a84926139e094612e32565b9b90506139d7565b9091506020813d602011613aba575b81613aa860209383612187565b810103126105f757519061358e613a72565b3d9150613a9b565b6040513d8d823e3d90fd5b50600183116139d2565b878d03613afc57613af66139e091613aef8a8a612e1e565b5190612e71565b97612df1565b613b1c889c613aef613b156139e094613aef8d8d612e1e565b9a8a612e1e565b9b612df1565b602498602073ffffffffffffffffffffffffffffffffffffffff613b488460c051612e1e565b51166040519b8c80927fa7d385e20000000000000000000000000000000000000000000000000000000082528b60048301525afa998a15613da5578e9a613d70575b50600490602073ffffffffffffffffffffffffffffffffffffffff613bb18560c051612e1e565b5116604051938480927fc1590cd70000000000000000000000000000000000000000000000000000000082525afa918215613cf0578f92613d3a575b5081613bf891612e71565b998b8111613d2a575b50600a848102048403613cfd5783600a028111613c28575b50613c2390612df1565b61349a565b6004602073ffffffffffffffffffffffffffffffffffffffff613c4d8560c051612e1e565b5116604051928380927f57ded9c90000000000000000000000000000000000000000000000000000000082525afa908115613cf0578f91613cbe575b50613c948282612e32565b613c9e848b612e1e565b52838110613cad575b50613c19565b925094509c50613c238d9038613ca7565b90506020813d602011613ce8575b81613cd960209383612187565b81010312610f07575138613c89565b3d9150613ccc565b8f604051903d90823e3d90fd5b60248e7f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b60e08390529a5093508338613c01565b9091506020813d602011613d68575b81613d5660209383612187565b81010312610f07575190613bf8613bed565b3d9150613d49565b9099506020813d602011613d9d575b81613d8c60209383612187565b81010312610dea5751986004613b8a565b3d9150613d7f565b8e604051903d90823e3d90fd5b90506020813d602011613de2575b81613dcd60209383612187565b81010312613ddc575138613413565b60e05180fd5b3d9150613dc0565b6040513d60e051823e3d90fd5b613e019150614585565b60a052386133a7565b835182811681036120e45781526020938401930161338d565b8115613e2d570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6040516020908181019067ffffffffffffffff928183108484111761212057929082604052600081526040519360408501918180870152518092526060850193926000905b838210613ee2575050505050906110de81612d4893037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612187565b8451811686529482019493820193600190910190613ea1565b600080613f0661321e565b928351928315614224576066549485831061421b5781959395935b613f2b8185612bcc565b871015614212577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff968397845b8881106140cb57505073ffffffffffffffffffffffffffffffffffffffff9788613f828286612e1e565b51166040998a51928380937f5be9b2d3000000000000000000000000000000000000000000000000000000008252602094859160049788915afa9081156140c15789916140a4575b50156140955760248392613fdf8e938a612e1e565b51169489613fed888d612bcc565b935196879485937f2e1a7d4d0000000000000000000000000000000000000000000000000000000085528401525af1998a1561124557508599614061575b505061403a8861404092612e71565b95612df1565b961561405757600687101561405757959395613f21565b5050505091505090565b9080929950813d831161408e575b6140798183612187565b8101031261123a57519661403a61404061402b565b503d61406f565b50505050965050505050505090565b6140bb9150843d8611613937576139288183612187565b38613fca565b8d513d8b823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff806140eb8388612e1e565b5116906040918251918280927f5be9b2d3000000000000000000000000000000000000000000000000000000008252602093849160049687915afa908115614208578b916141eb575b5061414c575b5050505061414790612df1565b613f58565b8190614158868b612e1e565b51168451938480927f57ded9c90000000000000000000000000000000000000000000000000000000082525afa9283156141e2575088926141b4575b50508281106141a6575b80808061413a565b91509850614147899061419e565b90809250813d83116141db575b6141cb8183612187565b8101031261051f57513880614194565b503d6141c1565b513d8a823e3d90fd5b6142029150833d8511613937576139288183612187565b38614134565b85513d8d823e3d90fd5b50505050505090565b50935050505090565b935050505090565b6024602073ffffffffffffffffffffffffffffffffffffffff60345416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9081156135d2576000916142bf575b50818110614299575090600090565b806139fa612f9e6142aa9385612bcc565b8181106142b8575090600090565b9160009150565b906020823d82116142e8575b816142d860209383612187565b8101031261025e5750513861428a565b3d91506142cb565b604051906080820182811067ffffffffffffffff8211176121205760405260006060838181528260208201528260408201520152565b600060655481905b80821061433a57505090565b9091614345836121e0565b9054906040918251917fc1590cd70000000000000000000000000000000000000000000000000000000083528260048173ffffffffffffffffffffffffffffffffffffffff602095869560031b1c165afa928315612d4a57506000926143c1575b50506143b5906143bb92612e71565b92612df1565b9061432e565b81819392933d83116143eb575b6143d88183612187565b8101031261025e575051816143b56143a6565b503d6143ce565b6024906143fd614326565b602073ffffffffffffffffffffffffffffffffffffffff60345416604051948580927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9283156135d257600093614468575b50916144659192612e71565b90565b6020813d8211614493575b8161448060209383612187565b8101031261123a57519250614465614459565b3d9150614473565b6144a36143f2565b90811561457f576000916065549280935b8085106144c75750614465929350613e23565b906144d1856121e0565b9054906040918251917f116ac4a30000000000000000000000000000000000000000000000000000000083528260048173ffffffffffffffffffffffffffffffffffffffff602095869560031b1c165afa928315612d4a575060009261454e575b50506145419061454792612e71565b94612df1565b93906144b4565b81819392933d8311614578575b6145658183612187565b8101031261025e57505181614541614532565b503d61455b565b60009150565b600090600091606554614597816121c8565b926040916145a783519586612187565b8085527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06145d4826121c8565b016020903682880137859683518303614818576145ef6143f2565b96871561480a57509291908380935b8385106146495750505050506127100361462057509061461d91613e23565b91565b600490517f6edcc523000000000000000000000000000000000000000000000000000000008152fd5b909192939661271061468761467467ffffffffffffffff988961466c8d88612e1e565b511690612e71565b9761467f8b86612e1e565b51168b612e32565b04614691896121e0565b9190548951927fc1590cd70000000000000000000000000000000000000000000000000000000084526004938881868173ffffffffffffffffffffffffffffffffffffffff8097600397881b1c165afa90811561480057918f8a94928f948b916147b5575b5084602494939261471561470d61471b948b6132e6565b978892612e1e565b526121e0565b9054911b1c16948c5195869384927fa7d385e20000000000000000000000000000000000000000000000000000000084528301525afa9182156147ab57859261477a575b509161358e613af69261477194612e32565b939291906145fe565b9091508581813d83116147a4575b6147928183612187565b8101031261159e57519061358e61475f565b503d614788565b89513d87823e3d90fd5b9395929450505081813d83116147f9575b6147d08183612187565b81010312610f0b5788928f9261471b8f809561471561470d6024975194505050929394506146f6565b503d6147c6565b8c513d8a823e3d90fd5b989750955050505050509190565b600485517fcdeedcbd000000000000000000000000000000000000000000000000000000008152fd5b61484961321e565b9081519160005b8381106148815760046040517f30990b67000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff806148a18385612e1e565b5116908085169182146148be5750506148b990612df1565b614850565b909460009450816148d184869596612e1e565b511692604094855180957f853828b600000000000000000000000000000000000000000000000000000000825260209687918160049b8c925af18015614ad957614abc575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92838101908111614a8e5784818303614a6d575b5050505060659081548015614a3f5784939291019061498f61496d836121e0565b73ffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055565b55603454169360248451809681937f70a0823100000000000000000000000000000000000000000000000000000000835230908301525afa918215612d4a5750600091614a13575b509050614a06575b7f95c84dbc5fd872c46b0e4290775a1a4ea1c8d760f9e4d38f48ba71b6f9a667db600080a2565b614a0e613e5c565b6149df565b82813d8311614a38575b614a278183612187565b8101031261025e57505180386149d7565b503d614a1d565b6031877f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b614a7d6116b292614a8595612e1e565b5116916121e0565b3880808461494c565b6011887f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b614ad290863d8811613937576139288183612187565b5038614916565b87513d6000823e3d90fd5b614aec61321e565b9081519160005b838110614b245760046040517f30990b67000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff80614b448385612e1e565b511690808516918214614b61575050614b5c90612df1565b614af3565b90946000945081614b7484869596612e1e565b511692604094855180957f853828b600000000000000000000000000000000000000000000000000000000825260209687918160049b8c925af1908115614ad957600091614c40575b5015614c18577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92838101908111614a8e5784818303614a6d575050505060659081548015614a3f5784939291019061498f61496d836121e0565b8686517fa1248235000000000000000000000000000000000000000000000000000000008152fd5b614c579150863d8811613937576139288183612187565b38614bbd565b908151811015612217570160200190565b604051906060820182811067ffffffffffffffff82111761212057604052602a82526020820160403682378251156122175760309053815160019081101561221757607860218401536029905b808211614d29575050614ccb5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015614dc6577f3031323334353637383961626364656600000000000000000000000000000000901a614d658486614c5d565b5360041c918015614d98577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190614cbb565b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff90921660248301526044820192909252612d4891610aff8260648101610ad3565b604051614edd9173ffffffffffffffffffffffffffffffffffffffff16614e798261214f565b6000806020958685527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656487860152868151910182855af13d15614f86573d91614ec183612246565b92614ecf6040519485612187565b83523d60008785013e614f8a565b80519081614eea57505050565b8280614efa9383010191016132a1565b15614f025750565b608490604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b6060915b919290156150055750815115614f9e575090565b3b15614fa75790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156150185750805190602001fd5b612480906040519182917f08c379a00000000000000000000000000000000000000000000000000000000083526020600484015260248301906122a356fea26469706673582212205d4371146c49584a2effa728df6c1c9f6fc2afa78935429a6b14719f26cf70c164736f6c63430008110033", + "nonce": "0x3ad", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0xb15f678d8fe2bd3a0bd0f347863d1458112e94b2553214497ecceed33f6734e0", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0xBfa4459868C60da9edd835F0be684EDeC054557b", + "function": null, + "arguments": [ + "0xa693aBabF230397B3e6385ff7eE09607f562af8c", + "0x1D941EF0D3Bba4ad67DBfBCeE5262F4CEE53A32b", + "0xe6bfbfd8000000000000000000000000e9f183fc656656f1f17af1f2b0df79b8ff9ad8ed000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe" + ], + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x16306b", + "value": "0x0", + "data": "0x60406080815262000f548038038062000018816200030b565b9283398101906060818303126200030657620000348162000347565b916020926200004584840162000347565b8584015190936001600160401b0391908282116200030657019280601f850112156200030657835193620000836200007d866200035c565b6200030b565b948086528786019288828401011162000306578288620000a4930162000378565b823b15620002ac577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b03199081166001600160a01b0386811691821790935590959194600093909290917fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8580a2805115801590620002a4575b620001f5575b50505050507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103937f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f86865493815196818616885216958684820152a18315620001a357501617905551610afd9081620004578239f35b60849086519062461bcd60e51b82526004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152fd5b895194606086019081118682101762000290578a52602785527f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c89860152660819985a5b195960ca1b8a860152516200027a9493929183918291845af4903d1562000286573d6200026a6200007d826200035c565b90815280938a3d92013e6200039d565b5038808080806200012d565b606092506200039d565b634e487b7160e01b85526041600452602485fd5b508362000127565b865162461bcd60e51b815260048101879052602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608490fd5b600080fd5b6040519190601f01601f191682016001600160401b038111838210176200033157604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036200030657565b6001600160401b0381116200033157601f01601f191660200190565b60005b8381106200038c5750506000910152565b81810151838201526020016200037b565b91929015620004025750815115620003b3575090565b3b15620003bd5790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015620004165750805190602001fd5b6044604051809262461bcd60e51b82526020600483015262000448815180928160248601526020868601910162000378565b601f01601f19168101030190fdfe6080604052600436101561002c575b361561001f575b61001d6107b1565b005b6100276107b1565b610015565b6000803560e01c9081633659cfe614610093575080634f1ef2861461008a5780635c60da1b146100815780638f283970146100785763f851a4400361000e57610073610455565b61000e565b506100736102f0565b5061007361023b565b50610073610157565b3461012c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261012c576100ca61012f565b73ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541633146000146101235761012090610117610511565b908382526105cb565b80f35b506101206107b1565b80fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361015257565b600080fd5b5060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525761018a61012f565b60243567ffffffffffffffff9182821161015257366023830112156101525781600401359283116101525736602484840101116101525773ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416331460001461023057600060208480602461021e61021961001d99610582565b61053e565b9682885201838701378401015261070b565b50505061001d6107b1565b50346101525760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610152576020600073ffffffffffffffffffffffffffffffffffffffff90817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541633146000146102e25750807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416905b60405191168152f35b906102eb6107b1565b6102d9565b50346101525760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525761032861012f565b73ffffffffffffffffffffffffffffffffffffffff907fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610391808354163314600014610230577f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f604084549281519481851686521693846020820152a181156103d1577fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b50346101525760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610152576020600073ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038181541633146000146104d85754604051911681529050f35b506102eb6107b1565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051906020820182811067ffffffffffffffff82111761053157604052565b6105396104e1565b604052565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f604051930116820182811067ffffffffffffffff82111761053157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff81116105be575b01160190565b6105c66104e1565b6105b8565b803b156106875773ffffffffffffffffffffffffffffffffffffffff81167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc817fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a281511580159061067f575b61066a575050565b61067c916106766108dd565b9161095b565b50565b506000610662565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152fd5b803b156106875773ffffffffffffffffffffffffffffffffffffffff81167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc817fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a28151158015906107a95761066a575050565b506001610662565b5073ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354163314610833577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc54166000808092368280378136915af43d82803e1561082f573d90f35b3d90fd5b60a46040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f65740000000000000000000000000000000000000000000000000000000000006084820152fd5b604051906060820182811067ffffffffffffffff82111761094e575b604052602782527f206661696c6564000000000000000000000000000000000000000000000000006040837f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c60208201520152565b6109566104e1565b6108f9565b6000806109909493602081519101845af43d15610993573d9161098061021984610582565b9283523d6000602085013e610a00565b90565b606091610a00565b156109a257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b91929015610a205750815115610a14575090565b610990903b151561099b565b825190915015610a335750805190602001fd5b604051907f08c379a000000000000000000000000000000000000000000000000000000000825281602080600483015282519283602484015260005b848110610ab0575050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000604480968601015201168101030190fd5b818101830151868201604401528593508201610a6f56fea26469706673582212201c39b75ea59593d8670f804896fbda9470452421c2de5834b8a62b5fdb34806664736f6c63430008110033000000000000000000000000a693ababf230397b3e6385ff7ee09607f562af8c0000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e4e6bfbfd8000000000000000000000000e9f183fc656656f1f17af1f2b0df79b8ff9ad8ed000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe00000000000000000000000000000000000000000000000000000000", + "nonce": "0x3ae", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0xf943e18b4748f5a473cf0c8f62fbcf23b832e025207bbaafa5120fb571732208", + "transactionType": "CREATE", + "contractName": "GenericCompoundUpgradeable", + "contractAddress": "0xDeEe844C6992F36ADAC59cF38d1F790B2a0313e2", + "function": null, + "arguments": null, + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x53ea5b", + "value": "0x0", + "data": "0x60808060405234620000d3576000549060ff8260081c169081600014620000c857303b155b156200006f57501590816200005c575b506200004b575b604051614b839081620000d98239f35b61ff0019600054166000556200003b565b61ffff1916610101176000553862000034565b62461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b60ff83161562000024565b600080fdfe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806305b41934146102eb5780630948c0b6146102e25780630b6d1d17146102d9578063109d0af8146102d0578063116ac4a3146102c75780631f1fcd51146102be578063248a9ca3146102b557806324ea54f4146102ac5780632e1a7d4d146102a35780632f2ff15d1461029a578063364bc15a1461029157806336568abe146102885780633e0c06291461027f578063437552c0146102765780635312ea8e1461026d57806357ded9c914610264578063580b7c2e1461025b5780635be9b2d3146102525780635fe3b5671461024957806369e527da146102405780637dc0d1d014610237578063804869911461022e578063853828b6146102255780638b2021761461021c57806391d1485414610213578063a217fddf1461020a578063a7d385e214610201578063a8c62e76146101f8578063b82c4dc1146101ef578063b8dc491b146101e6578063c1590cd7146101dd578063c6afba3c146101d4578063d0e30db0146101cb578063d37db1d2146101c2578063d547741f146101b95763dc4c90d30361000e576101b4611f4b565b61000e565b506101b4611ee8565b506101b4611eab565b506101b4611d06565b506101b4611ccc565b506101b4611c92565b506101b4611b23565b506101b4611909565b506101b4611885565b506101b461138d565b506101b4611352565b506101b46112cf565b506101b46111ad565b506101b4611097565b506101b4610fd5565b506101b4610f08565b506101b4610eb5565b506101b4610e67565b506101b4610e05565b506101b4610dab565b506101b4610d71565b506101b4610ba1565b506101b4610b60565b506101b4610ab6565b506101b46109f3565b506101b4610999565b506101b461085a565b506101b4610814565b506101b46107ba565b506101b461076c565b506101b4610719565b506101b46106c6565b506101b4610678565b506101b461063b565b506101b46105a7565b506101b4610443565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161033857604052565b6103406102f4565b604052565b6040810190811067ffffffffffffffff82111761033857604052565b6080810190811067ffffffffffffffff82111761033857604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761033857604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff81116103fa575b01160190565b6104026102f4565b6103f4565b929192610413826103be565b91610421604051938461037d565b82948184528183011161043e578281602093846000960137010152565b600080fd5b503461043e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e5760243567ffffffffffffffff811161043e573660238201121561043e5760006104a781923690602481600401359101610407565b6104b033611fb5565b73ffffffffffffffffffffffffffffffffffffffff6038541682602083519301915af16104db6129be565b9015610529576104f881519160208060043594830101910161282f565b106104ff57005b60046040517f22313ae9000000000000000000000000000000000000000000000000000000008152fd5b8051908161055b5760046040517fc76d51a1000000000000000000000000000000000000000000000000000000008152fd5b602001fd5b73ffffffffffffffffffffffffffffffffffffffff81160361043e57565b6044359061058b82610560565b565b6084359061058b82610560565b60c4359061058b82610560565b503461043e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e5773ffffffffffffffffffffffffffffffffffffffff6004356105f881610560565b610601336121c3565b167fffffffffffffffffffffffff00000000000000000000000000000000000000006038541617603855600080f35b600091031261043e57565b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e576020603754604051908152f35b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e57602060405173c00e94cb662c3520282e6f5717214004a7f268888152f35b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e5760206107116107036135c6565b61070b612858565b9061281c565b604051908152f35b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e57602073ffffffffffffffffffffffffffffffffffffffff60365416604051908152f35b503461043e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e5760043560005260016020526020600160406000200154604051908152f35b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e5760206040517f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50418152f35b503461043e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e5761084d336122e2565b60206107116004356137e2565b503461043e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e5760043560243561089981610560565b60009180835260016020526108b660016040852001543390612401565b808352600160205260ff6108ed83604086209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b5416156108f8578280f35b808352600160205261092d82604085209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8480a438808280f35b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e5760206040517ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab8152f35b503461043e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e57602435610a2f81610560565b3373ffffffffffffffffffffffffffffffffffffffff821603610a5857610019906004356126d7565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f37310000000000000000000000000000000000000000000000000000000000006044820152fd5b503461043e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e576000808080600435610af781610560565b60243590610b04336121c3565b82908215610b56575b73ffffffffffffffffffffffffffffffffffffffff1690f115610b2c57005b60046040517f72de3212000000000000000000000000000000000000000000000000000000008152fd5b6108fc9150610b0d565b503461043e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e57610b99336121c3565b600435606655005b503461043e576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e5761001990610bdf336121c3565b610c1a610c0160655473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b8160405180927f852a12e300000000000000000000000000000000000000000000000000000000825281600081610c5b600435600483019190602083019252565b03925af18015610d64575b610d47575b5060365473ffffffffffffffffffffffffffffffffffffffff16610ca7610c0160345473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152909190838160248173ffffffffffffffffffffffffffffffffffffffff86165afa938415610d3a575b600094610d0b575b50506142aa565b610d2b929450803d10610d33575b610d23818361037d565b81019061282f565b913880610d04565b503d610d19565b610d4261283e565b610cfc565b610d5d90823d8411610d3357610d23818361037d565b5038610c6b565b610d6c61283e565b610c66565b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e5760206107116135c6565b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e5760206040517f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c8152f35b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e576020610e3f612858565b60375480600a0290600a820403610e5a575b60405191118152f35b610e626127b5565b610e51565b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e576020604051733d9819210a31b4961b30ef54be2aed79b9c9cd3b8152f35b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e57602073ffffffffffffffffffffffffffffffffffffffff60655416604051908152f35b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e57602060405173dbd020caef83efd542f4de03e3cf0c28a4428bd58152f35b9080601f8301121561043e5781359067ffffffffffffffff8211610fc8575b8160051b60405193602093610f8c8584018761037d565b8552838086019282010192831161043e578301905b828210610faf575050505090565b8380918335610fbd81610560565b815201910190610fa1565b610fd06102f4565b610f75565b503461043e5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e5760043561101181610560565b67ffffffffffffffff9060243582811161043e573660238201121561043e57611044903690602481600401359101610407565b61104c61057e565b60643584811161043e57611064903690600401610f56565b61106c61058d565b9160a43595861161043e57611088610019963690600401610f56565b9361109161059a565b95612a10565b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e576110d0336122e2565b60206110da612858565b6110e3816137e2565b1015604051908152f35b90600182811c92168015611136575b602083101461110757565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916110fc565b60005b8381106111535750506000910152565b8181015183820152602001611143565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f604093602084526111a68151809281602088015260208888019101611140565b0116010190565b503461043e576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126112cc5760405190806033546111ef816110ed565b808552916001918083169081156112845750600114611229575b611225856112198187038261037d565b60405191829182611163565b0390f35b9250603383527f82a75bdeeae8604d839476ae9efd8b0e15aa447e21bfd7f41283bb54e22c9a825b82841061126c57505050810160200161121982611225611209565b80546020858701810191909152909301928101611251565b869550611225969350602092506112199491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001682840152151560051b8201019293611209565b80fd5b503461043e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e57602060ff61134660243561131281610560565b6004356000526001845260406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54166040519015158152f35b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e57602060405160008152f35b503461043e576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e57611225906116bf6004916116b96116b38435926113f3610c0160365473ffffffffffffffffffffffffffffffffffffffff1690565b9581611417610c0160655473ffffffffffffffffffffffffffffffffffffffff1690565b97604098899783895180947f70a082310000000000000000000000000000000000000000000000000000000082528180611470878b830191909173ffffffffffffffffffffffffffffffffffffffff6020820193169052565b03915afa928315611878575b600093611859575b508851927f47bd371800000000000000000000000000000000000000000000000000000000845284848781865afa93841561184c575b60009461182d575b508951957f8f840ddd00000000000000000000000000000000000000000000000000000000875285878281875afa968715611820575b600097611801575b508a517f173b990400000000000000000000000000000000000000000000000000000000815286818381885afa9081156117f4575b6000916117d7575b508b51947ff3fdb15a0000000000000000000000000000000000000000000000000000000086528c88878581855afa9687156117ca575b600097611791575b5061160684611614928b88958251927f18160ddd00000000000000000000000000000000000000000000000000000000845282848681855afa938415611784575b600094611765575b5051938480927f182df0f50000000000000000000000000000000000000000000000000000000082525afa918215611758575b600092611739575b5061281c565b670de0b6b3a7640000900490565b93600086126116f857509061164c8561164673ffffffffffffffffffffffffffffffffffffffff96976116979561284b565b9661284b565b9c5b51988997889687957fb816881600000000000000000000000000000000000000000000000000000000875286019094939260609260808301968352602083015260408201520152565b0392165afa9182156116eb575b6000926116ce575b50506127e5565b91613d9a565b9061284b565b90519081529081906020820190565b6116e49250803d10610d3357610d23818361037d565b38806116ac565b6116f361283e565b6116a4565b61169792915073ffffffffffffffffffffffffffffffffffffffff9461172761172d611733936117278a61358b565b906129ee565b9761358b565b9c61164e565b6117519192508c8d3d10610d3357610d23818361037d565b9038611600565b61176061283e565b6115f8565b61177d919450833d8511610d3357610d23818361037d565b92386115c5565b61178c61283e565b6115bd565b611614919750846117ba611606928c8d3d106117c3575b6117b2818361037d565b8101906129fb565b9892505061157c565b503d6117a8565b6117d261283e565b611574565b6117ee9150873d8911610d3357610d23818361037d565b3861153d565b6117fc61283e565b611535565b611819919750863d8811610d3357610d23818361037d565b9538611500565b61182861283e565b6114f8565b611845919450853d8711610d3357610d23818361037d565b92386114c2565b61185461283e565b6114ba565b611871919350843d8611610d3357610d23818361037d565b9138611484565b61188061283e565b61147c565b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e57602073ffffffffffffffffffffffffffffffffffffffff60355416604051908152f35b9181601f8401121561043e5782359167ffffffffffffffff831161043e576020808501948460051b01011161043e57565b503461043e5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e57600467ffffffffffffffff813581811161043e5761195a90369084016118d8565b92909160243581811161043e5761197490369084016118d8565b93909160443590811161043e5761198e90369085016118d8565b91611998336121c3565b858714801590611b19575b611af05760005b8781106119b357005b806119c2611a94928a856129a0565b356119cc81610560565b6119d7828a896129a0565b35906119e282610560565b6119ed8388886129a0565b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152308c820190815273ffffffffffffffffffffffffffffffffffffffff8616602082810191909152933595939283918391829101038173ffffffffffffffffffffffffffffffffffffffff88165afa918215611ae3575b600092611ac6575b505083811015611a9957611a8990611a8f946129ee565b916146e3565b612902565b6119aa565b838111611aaa575b50505050612902565b611abd93611ab7916129ee565b9161480d565b38808080611aa1565b611adc9250803d10610d3357610d23818361037d565b3880611a72565b611aeb61283e565b611a6a565b846040517f46282e8d000000000000000000000000000000000000000000000000000000008152fd5b50828714156119a3565b503461043e576040807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e576004803590611b6282610560565b60243592611b6f84610560565b611b78336121c3565b611b80614003565b80519073ffffffffffffffffffffffffffffffffffffffff60009516945b828110611c2b5783517f70a08231000000000000000000000000000000000000000000000000000000008152308187019081526100199190899089906020908490819083010381845afa928315611c1e575b600093611bfe575b506142aa565b611c1791935060203d8111610d3357610d23818361037d565b9184611bf8565b611c2661283e565b611bf0565b611c55610c01611c3b838561297e565b5173ffffffffffffffffffffffffffffffffffffffff1690565b8614611c6957611c6490612902565b611b9e565b505050517f093e1cdb000000000000000000000000000000000000000000000000000000008152fd5b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e576020610711612858565b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e57602061071161346e565b503461043e576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126112cc57611d40336122e2565b611d62610c0160365473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260209183918391611e1291908390829060249082905afa908115611e9e575b8491611e81575b50611dd7610c0160655473ffffffffffffffffffffffffffffffffffffffff1690565b906040519485809481937fa0712d68000000000000000000000000000000000000000000000000000000008352600483019190602083019252565b03925af1918215611e74575b8392611e57575b5050611e2e5780f35b60046040517e48195d000000000000000000000000000000000000000000000000000000008152fd5b611e6d9250803d10610d3357610d23818361037d565b3880611e25565b611e7c61283e565b611e1e565b611e989150833d8511610d3357610d23818361037d565b38611db4565b611ea661283e565b611dad565b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e5760206040516223dbb08152f35b503461043e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e57610019602435600435611f2a82610560565b806000526001602052611f466001604060002001543390612401565b6126d7565b503461043e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261043e57602073ffffffffffffffffffffffffffffffffffffffff60345416604051908152f35b90611fb160209282815194859201611140565b0190565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f10c15aae13326e9b33c92ffbb94efb7492c500f0cca324caca9bd1aca194ed1860205260409020547ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab9160019160ff161561202c57505050565b73ffffffffffffffffffffffffffffffffffffffff61204b911661416d565b91612054614091565b91603061206084612968565b53607861206c846140ac565b536041905b808211612166576121626037612130876121048861208f8915614108565b6120fe6040519586947f416363657373436f6e74726f6c3a206163636f756e742000000000000000000060208701526120d1815180926020858a019101611140565b8501016011907f206973206d697373696e6720726f6c652000000000000000000000000000000081520190565b90611f9e565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261037d565b6040519182917f08c379a000000000000000000000000000000000000000000000000000000000835260048301611163565b0390fd5b9091807f3031323334353637383961626364656600000000000000000000000000000000600f6121b0931660108110156121b6575b1a6121a685876140bd565b5360041c926140dc565b90612071565b6121be612938565b61219b565b73ffffffffffffffffffffffffffffffffffffffff811660009081527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db60205260409020547f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419160019160ff161561223a57505050565b73ffffffffffffffffffffffffffffffffffffffff612259911661416d565b91612262614091565b91603061226e84612968565b53607861227a846140ac565b536041905b80821161229d576121626037612130876121048861208f8915614108565b9091807f3031323334353637383961626364656600000000000000000000000000000000600f6122dc931660108110156121b6571a6121a685876140bd565b9061227f565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f21d442261a7cc2346fd3ca5e1f22fe015f6b71188f57ab4761df2e3faed3703f60205260409020547f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c9160019160ff161561235957505050565b73ffffffffffffffffffffffffffffffffffffffff612378911661416d565b91612381614091565b91603061238d84612968565b536078612399846140ac565b536041905b8082116123bc576121626037612130876121048861208f8915614108565b9091807f3031323334353637383961626364656600000000000000000000000000000000600f6123fb931660108110156121b6571a6121a685876140bd565b9061239e565b9081600052600160205260ff61243b8260406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b541615612446575050565b6121306121629261210461247a61247473ffffffffffffffffffffffffffffffffffffffff6048961661416d565b9261422f565b6040519485937f416363657373436f6e74726f6c3a206163636f756e742000000000000000000060208601526124ba815180926020603789019101611140565b84017f206973206d697373696e6720726f6c652000000000000000000000000000000060378201520190611f9e565b73ffffffffffffffffffffffffffffffffffffffff811660009081527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db602052604081207f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419060ff905b54161561255f57505050565b808252600160205261259483604084209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d73ffffffffffffffffffffffffffffffffffffffff3394169280a4565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f10c15aae13326e9b33c92ffbb94efb7492c500f0cca324caca9bd1aca194ed18602052604081207ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab9060ff90612553565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f21d442261a7cc2346fd3ca5e1f22fe015f6b71188f57ab4761df2e3faed3703f602052604081207f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c9060ff90612553565b600090808252600160205260ff61271184604085209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b541661271c57505050565b808252600160205261275183604084209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b73ffffffffffffffffffffffffffffffffffffffff3394169280a4565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b906223dbb0918281029281840414901517156127fd57565b61058b6127b5565b9061251c918281029281840414901517156127fd57565b818102929181159184041417156127fd57565b9081602091031261043e575190565b506040513d6000823e3d90fd5b919082018092116127fd57565b6024602073ffffffffffffffffffffffffffffffffffffffff60365416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9081156128f5575b6000916128d7575b506128c061346e565b81018091116128cc5790565b6128d46127b5565b90565b6128ef915060203d8111610d3357610d23818361037d565b386128b7565b6128fd61283e565b6128af565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612930570190565b611fb16127b5565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602090805115612976570190565b611fb1612938565b6020918151811015612993575b60051b010190565b61299b612938565b61298b565b91908110156129b1575b60051b0190565b6129b9612938565b6129aa565b3d156129e9573d906129cf826103be565b916129dd604051938461037d565b82523d6000602084013e565b606090565b919082039182116127fd57565b9081602091031261043e57516128d481610560565b939594909291956000549260ff8460081c169384600014612c915750303b155b15612c0d57612a47948794159687612ba757612e94565b612b75575b73ffffffffffffffffffffffffffffffffffffffff60046020828516612aad8173ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006065541617606555565b604051928380927f6f307dc30000000000000000000000000000000000000000000000000000000082525afa908115612b68575b600091612b4a575b5060365473ffffffffffffffffffffffffffffffffffffffff1691808316911603612b205761058b92612b1b916143c1565b6144c4565b60046040517f0766ebc2000000000000000000000000000000000000000000000000000000008152fd5b612b62915060203d81116117c3576117b2818361037d565b38612ae9565b612b7061283e565b612ae1565b612ba27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff60005416600055565b612a4c565b612bd86101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff6000541617600055565b612c0860017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000541617600055565b612e94565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152fd5b60ff1615612a30565b601f8111612ca6575050565b600090603382527f82a75bdeeae8604d839476ae9efd8b0e15aa447e21bfd7f41283bb54e22c9a82906020601f850160051c83019410612d01575b601f0160051c01915b828110612cf657505050565b818155600101612cea565b9092508290612ce1565b90815167ffffffffffffffff8111612e4f575b612d3281612d2d6033546110ed565b612c9a565b602080601f8311600114612d8b5750819293600092612d80575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c191617603355565b015190503880612d4c565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0831694612ddc60336000527f82a75bdeeae8604d839476ae9efd8b0e15aa447e21bfd7f41283bb54e22c9a8290565b926000905b878210612e37575050836001959610612e00575b505050811b01603355565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055388080612df5565b80600185968294968601518155019501930190612de1565b612e576102f4565b612d1e565b9081602091031261043e575160ff8116810361043e5790565b60ff16604d8111612e87575b600a0a90565b612e8f6127b5565b612e81565b94612ede909492919473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006038541617603855565b612f238573ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006035541617603555565b61307c612f4b610c01610c0160355473ffffffffffffffffffffffffffffffffffffffff1690565b9461307760405180977fdc4c90d300000000000000000000000000000000000000000000000000000000825281600460209a8b935afa908115613248575b60009161322b575b50603480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff928316179055600488612ff8610c0160345473ffffffffffffffffffffffffffffffffffffffff1690565b604051928380927ffc0c546a0000000000000000000000000000000000000000000000000000000082525afa90811561321e575b600091613201575b501673ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006036541617603655565b612d0b565b6130a66130a1610c0160345473ffffffffffffffffffffffffffffffffffffffff1690565b6124e9565b80519060005b8281106131e8575050506130bf826125fb565b80519060005b8281106131ca5750505061316d61058b93926130e6613172936130a1613255565b6130ef84612669565b6130f76132f5565b6130ff613395565b60048161312a610c01610c01610c0160365473ffffffffffffffffffffffffffffffffffffffff1690565b604051928380927f313ce5670000000000000000000000000000000000000000000000000000000082525afa9182156131bd575b600092613190575b5050612e75565b603755565b60365473ffffffffffffffffffffffffffffffffffffffff166143c1565b6131af9250803d106131b6575b6131a7818361037d565b810190612e5c565b3880613166565b503d61319d565b6131c561283e565b61315e565b80611a8f6131de611c3b6131e3948661297e565b6125fb565b6130c5565b80611a8f6130a1611c3b6131fc948661297e565b6130ac565b6132189150893d8b116117c3576117b2818361037d565b38613034565b61322661283e565b61302c565b6132429150883d8a116117c3576117b2818361037d565b38612f91565b61325061283e565b612f89565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab600081815260016020527f10c15aae13326e9b33c92ffbb94efb7492c500f0cca324caca9bd1aca194ed19547f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419283927fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9080a4600160406000200155565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041600081815260016020527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5dc547f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c9283927fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9080a4600160406000200155565b7f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c600081815260016020527f21d442261a7cc2346fd3ca5e1f22fe015f6b71188f57ab4761df2e3faed37040547f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419283927fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9080a4600160406000200155565b811561343f570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b613490610c0160655473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529060208083602481855afa92831561357e575b60009361355f575b50826134e557505050600090565b6128d49260048261160694604051928380927f182df0f50000000000000000000000000000000000000000000000000000000082525afa928315613552575b600093613533575b505061281c565b61354a929350803d10610d3357610d23818361037d565b90388061352c565b61355a61283e565b613524565b816135779294503d8511610d3357610d23818361037d565b91386134d7565b61358661283e565b6134cf565b7f800000000000000000000000000000000000000000000000000000000000000081146135b9575b60000390565b6135c16127b5565b6135b3565b6128d46135eb610c0160655473ffffffffffffffffffffffffffffffffffffffff1690565b6116b96116b361160660046040517f18160ddd00000000000000000000000000000000000000000000000000000000815261367f6020938285818682968c5afa908115613703575b6000916136e6575b50604051907f182df0f5000000000000000000000000000000000000000000000000000000008252848287818d5afa9182156136d9575b6000926136c1575061281c565b95604051928380927fae9d70b00000000000000000000000000000000000000000000000000000000082525afa9182156116eb576000926116ce5750506127e5565b611751919250853d8711610d3357610d23818361037d565b6136e161283e565b613672565b6136fd9150843d8611610d3357610d23818361037d565b3861363b565b61370b61283e565b613633565b6040519061371d82610345565b6001825260203681840137565b9291906080840160808552815180915260a085019060208093019060005b8181106137b8575050508481038286015281808451928381520193019160005b82811061378e5750505050606061058b91936137876040820160019052565b0160019052565b835173ffffffffffffffffffffffffffffffffffffffff1685529381019392810192600101613768565b825173ffffffffffffffffffffffffffffffffffffffff1684529284019291840191600101613748565b613804610c0160655473ffffffffffffffffffffffffffffffffffffffff1690565b604080517f3af9e66900000000000000000000000000000000000000000000000000000000815230600480830191909152929391926020929091908382806024810103816000809a5af1918215613d8d575b8692613d6e575b5060365473ffffffffffffffffffffffffffffffffffffffff1685517f70a0823100000000000000000000000000000000000000000000000000000000808252308683019081529093929082906020010394878373ffffffffffffffffffffffffffffffffffffffff97818986165afa928315613d61575b8a93613d3e575b50826138e79161284b565b808411613d36575b5082821015613d0857506139798389938893848b613925610c0160365473ffffffffffffffffffffffffffffffffffffffff1690565b8b613948610c0160655473ffffffffffffffffffffffffffffffffffffffff1690565b96879351988994859384938452830191909173ffffffffffffffffffffffffffffffffffffffff6020820193169052565b03915afa938415613cfb575b8694613cdc575b5060018411613b43575b5050505050506139a4613710565b6139ac613710565b906139d5306139ba83612968565b9073ffffffffffffffffffffffffffffffffffffffff169052565b613a036139fa610c0160655473ffffffffffffffffffffffffffffffffffffffff1690565b6139ba84612968565b733d9819210a31b4961b30ef54be2aed79b9c9cd3b90813b15613b3f57888796949293613aa7989694613a6493838c518096819582947f6810dfa60000000000000000000000000000000000000000000000000000000084528c840161372a565b03925af18015613b32575b613b19575b5060365473ffffffffffffffffffffffffffffffffffffffff169651908152309281019283529485928391829160200190565b039187165afa938415613b0c575b93613ae7575b5050816128d491613ae160355473ffffffffffffffffffffffffffffffffffffffff1690565b906142aa565b6128d49293509081613b0492903d10610d3357610d23818361037d565b919038613abb565b613b1461283e565b613ab5565b80613b26613b2c92610324565b80610630565b38613a74565b613b3a61283e565b613a6f565b8880fd5b613b4c916129ee565b91606654831015613b5e575b80613996565b808311613c3b575050613bc690613b8d610c0160655473ffffffffffffffffffffffffffffffffffffffff1690565b9089519485809481937f852a12e30000000000000000000000000000000000000000000000000000000083528b83019190602083019252565b03925af1908115613c2e575b8791613c11575b50613be9575b8584388080613b58565b8285517f3c9bb3ca000000000000000000000000000000000000000000000000000000008152fd5b613c289150853d8711610d3357610d23818361037d565b38613bd9565b613c3661283e565b613bd2565b89517f852a12e3000000000000000000000000000000000000000000000000000000008152888101918252948593508391829060200103925af1908115613ccf575b8791613cb2575b5015613bdf578285517f3c9bb3ca000000000000000000000000000000000000000000000000000000008152fd5b613cc99150853d8711610d3357610d23818361037d565b38613c84565b613cd761283e565b613c7d565b613cf4919450853d8711610d3357610d23818361037d565b923861398c565b613d0361283e565b613985565b945050955050506128d49250839150613ae160355473ffffffffffffffffffffffffffffffffffffffff1690565b9250386138ef565b6138e7919350613d5a90893d8b11610d3357610d23818361037d565b92906138dc565b613d6961283e565b6138d5565b613d86919250843d8611610d3357610d23818361037d565b903861385d565b613d9561283e565b613856565b613e316128d491613e1c73ffffffffffffffffffffffffffffffffffffffff60655416604051907f6aa875b50000000000000000000000000000000000000000000000000000000082526004820152602081602481733d9819210a31b4961b30ef54be2aed79b9c9cd3b5afa908115613e89575b600091613e6b575b50613edf565b9080613e395750613e2c906127e5565b612805565b612710900490565b613e45613e2c926127e5565b670de0b6b3a764000090818102918183041490151761343557613e666127b5565b613435565b613e83915060203d8111610d3357610d23818361037d565b38613e16565b613e9161283e565b613e0e565b519069ffffffffffffffffffff8216820361043e57565b908160a091031261043e57613ec181613e96565b916020820151916040810151916128d4608060608401519301613e96565b8015613ffd576040517ffeaf968c00000000000000000000000000000000000000000000000000000000815260a08160048173dbd020caef83efd542f4de03e3cf0c28a4428bd55afa8015613ff0575b600080928192613fb9575b508215918215613f9f575b5050613f7557613f5b613f64916128d49361281c565b6037549061281c565b6a52b7d2dcc80cd2e4000000900490565b60046040517f4e596b31000000000000000000000000000000000000000000000000000000008152fd5b69ffffffffffffffffffff90811691161190503880613f45565b915050613fdd915060a03d8111613fe9575b613fd5818361037d565b810190613ead565b92939150389050613f3a565b503d613fcb565b613ff861283e565b613f2f565b50600090565b6040516060810181811067ffffffffffffffff821117614084575b6040526002815260208101604036823773ffffffffffffffffffffffffffffffffffffffff90816036541690835115614077575b526065541681516001101561406a575b604082015290565b614072612938565b614062565b61407f612938565b614052565b61408c6102f4565b61401e565b6040519061409e82610361565b604282526060366020840137565b602190805160011015612976570190565b9060209180518210156140cf57010190565b6140d7612938565b010190565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908015612930570190565b1561410f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b604051906060820182811067ffffffffffffffff821117614222575b604052602a8252604036602084013760306141a383612968565b5360786141af836140ac565b536029905b600182116141c7576128d4915015614108565b807f3031323334353637383961626364656600000000000000000000000000000000600f61420f93166010811015614215575b1a61420584866140bd565b5360041c916140dc565b906141b4565b61421d612938565b6141fa565b61422a6102f4565b614189565b614237614091565b90603061424383612968565b53607861424f836140ac565b536041905b60018211614267576128d4915015614108565b807f3031323334353637383961626364656600000000000000000000000000000000600f6142a493166010811015614215571a61420584866140bd565b90614254565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff9092166024830152604482019290925261058b9161433182606481015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810184528361037d565b6149a3565b1561433d57565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152fd5b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015261058b939291614436906020816044818787165afa9081156144b7575b600091614499575b5015614336565b604051927f095ea7b30000000000000000000000000000000000000000000000000000000060208501521660248301527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60448301526044825261433182610361565b6144b1915060203d8111610d3357610d23818361037d565b3861442f565b6144bf61283e565b614427565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8216602482015260209161461091600090819073c00e94cb662c3520282e6f5717214004a7f268889061454f908781604481865afa9081156146d6575b84916146bf575015614336565b6040519373ffffffffffffffffffffffffffffffffffffffff878601917f095ea7b30000000000000000000000000000000000000000000000000000000083521660248601527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6044860152604485526145c885610361565b82604051956145d687610345565b8887527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648988015251925af161460a6129be565b90614a48565b80518061461c57505050565b8183918101031261043e5781015180159081150361043e5761463b5750565b608490604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b6144b19150883d8a11610d3357610d23818361037d565b6146de61283e565b614542565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8316602482015261058b939092906020848060448101038173ffffffffffffffffffffffffffffffffffffffff87165afa938415614800575b6000946147da575b50906143319184018094116147cd575b6040517f095ea7b300000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff909116602482015260448101939093528260648101614305565b6147d56127b5565b614775565b614331929194506147f89060203d8111610d3357610d23818361037d565b939091614765565b61480861283e565b61475d565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8316602482015292916020848060448101038173ffffffffffffffffffffffffffffffffffffffff86165afa938415614996575b600094614976575b508284106148f2576040517f095ea7b300000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff909116602482015291909203604482015261058b916143318260648101614305565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5361666545524332303a2064656372656173656420616c6c6f77616e6365206260448201527f656c6f77207a65726f00000000000000000000000000000000000000000000006064820152fd5b61498f91945060203d8111610d3357610d23818361037d565b923861488a565b61499e61283e565b614882565b73ffffffffffffffffffffffffffffffffffffffff1690614a106040516149c981610345565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af1614a0a6129be565b91614b1d565b805180614a1e575b50505050565b81849181010312614a4457820151908115918215036112cc575061463b57808080614a18565b5080fd5b90919015614ad75750805115614a5b5790565b73c00e94cb662c3520282e6f5717214004a7f268883b15614a795790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b815115614ae75750805190602001fd5b612162906040519182917f08c379a000000000000000000000000000000000000000000000000000000000835260048301611163565b91929015614b3a5750815115614b31575090565b3b15614a795790565b825190915015614ae75750805190602001fdfea2646970667358221220c4ba1bb9a8e87eeb1f7c937c6947a0e147265a99c391aa68a10fc9973167538f64736f6c63430008110033", + "nonce": "0x3af", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0x64173877fc5a6e2f36eb7b7d68cd8ed8f91ab9ae4b88f77c34fe17dfbcac74bc", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0xE2773fB045e53De5344f245E03eA614AF1064Ce3", + "function": null, + "arguments": [ + "0xDeEe844C6992F36ADAC59cF38d1F790B2a0313e2", + "0x1D941EF0D3Bba4ad67DBfBCeE5262F4CEE53A32b", + "0x80486991000000000000000000000000bfa4459868c60da9edd835f0be684edec054557b00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000039aa39c021dfbae8fac545936693ac917d5e756300000000000000000000000000000000000000000000000000000000000001200000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001600000000000000000000000001111111254eeb25477b68fb85ed929f73a9605820000000000000000000000000000000000000000000000000000000000000017436f6d706f756e64204c656e64657220555344432076320000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe" + ], + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x19b062", + "value": "0x0", + "data": "0x60406080815262000f548038038062000018816200030b565b9283398101906060818303126200030657620000348162000347565b916020926200004584840162000347565b8584015190936001600160401b0391908282116200030657019280601f850112156200030657835193620000836200007d866200035c565b6200030b565b948086528786019288828401011162000306578288620000a4930162000378565b823b15620002ac577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b03199081166001600160a01b0386811691821790935590959194600093909290917fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8580a2805115801590620002a4575b620001f5575b50505050507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103937f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f86865493815196818616885216958684820152a18315620001a357501617905551610afd9081620004578239f35b60849086519062461bcd60e51b82526004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152fd5b895194606086019081118682101762000290578a52602785527f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c89860152660819985a5b195960ca1b8a860152516200027a9493929183918291845af4903d1562000286573d6200026a6200007d826200035c565b90815280938a3d92013e6200039d565b5038808080806200012d565b606092506200039d565b634e487b7160e01b85526041600452602485fd5b508362000127565b865162461bcd60e51b815260048101879052602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608490fd5b600080fd5b6040519190601f01601f191682016001600160401b038111838210176200033157604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036200030657565b6001600160401b0381116200033157601f01601f191660200190565b60005b8381106200038c5750506000910152565b81810151838201526020016200037b565b91929015620004025750815115620003b3575090565b3b15620003bd5790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015620004165750805190602001fd5b6044604051809262461bcd60e51b82526020600483015262000448815180928160248601526020868601910162000378565b601f01601f19168101030190fdfe6080604052600436101561002c575b361561001f575b61001d6107b1565b005b6100276107b1565b610015565b6000803560e01c9081633659cfe614610093575080634f1ef2861461008a5780635c60da1b146100815780638f283970146100785763f851a4400361000e57610073610455565b61000e565b506100736102f0565b5061007361023b565b50610073610157565b3461012c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261012c576100ca61012f565b73ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541633146000146101235761012090610117610511565b908382526105cb565b80f35b506101206107b1565b80fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361015257565b600080fd5b5060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525761018a61012f565b60243567ffffffffffffffff9182821161015257366023830112156101525781600401359283116101525736602484840101116101525773ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416331460001461023057600060208480602461021e61021961001d99610582565b61053e565b9682885201838701378401015261070b565b50505061001d6107b1565b50346101525760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610152576020600073ffffffffffffffffffffffffffffffffffffffff90817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541633146000146102e25750807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416905b60405191168152f35b906102eb6107b1565b6102d9565b50346101525760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525761032861012f565b73ffffffffffffffffffffffffffffffffffffffff907fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610391808354163314600014610230577f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f604084549281519481851686521693846020820152a181156103d1577fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b50346101525760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610152576020600073ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038181541633146000146104d85754604051911681529050f35b506102eb6107b1565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051906020820182811067ffffffffffffffff82111761053157604052565b6105396104e1565b604052565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f604051930116820182811067ffffffffffffffff82111761053157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff81116105be575b01160190565b6105c66104e1565b6105b8565b803b156106875773ffffffffffffffffffffffffffffffffffffffff81167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc817fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a281511580159061067f575b61066a575050565b61067c916106766108dd565b9161095b565b50565b506000610662565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152fd5b803b156106875773ffffffffffffffffffffffffffffffffffffffff81167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc817fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a28151158015906107a95761066a575050565b506001610662565b5073ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354163314610833577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc54166000808092368280378136915af43d82803e1561082f573d90f35b3d90fd5b60a46040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f65740000000000000000000000000000000000000000000000000000000000006084820152fd5b604051906060820182811067ffffffffffffffff82111761094e575b604052602782527f206661696c6564000000000000000000000000000000000000000000000000006040837f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c60208201520152565b6109566104e1565b6108f9565b6000806109909493602081519101845af43d15610993573d9161098061021984610582565b9283523d6000602085013e610a00565b90565b606091610a00565b156109a257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b91929015610a205750815115610a14575090565b610990903b151561099b565b825190915015610a335750805190602001fd5b604051907f08c379a000000000000000000000000000000000000000000000000000000000825281602080600483015282519283602484015260005b848110610ab0575050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000604480968601015201168101030190fd5b818101830151868201604401528593508201610a6f56fea26469706673582212201c39b75ea59593d8670f804896fbda9470452421c2de5834b8a62b5fdb34806664736f6c63430008110033000000000000000000000000deee844c6992f36adac59cf38d1f790b2a0313e20000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c480486991000000000000000000000000bfa4459868c60da9edd835f0be684edec054557b00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000039aa39c021dfbae8fac545936693ac917d5e756300000000000000000000000000000000000000000000000000000000000001200000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001600000000000000000000000001111111254eeb25477b68fb85ed929f73a9605820000000000000000000000000000000000000000000000000000000000000017436f6d706f756e64204c656e64657220555344432076320000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe00000000000000000000000000000000000000000000000000000000", + "nonce": "0x3b0", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0x9c0c3c8ce0dcd25ce0ed004e36dba167d476fdcbb041f3dd21fc5843d9100e87", + "transactionType": "CREATE", + "contractName": "GenericAaveNoStaker", + "contractAddress": "0x14bA0B82f1940e35Af39c364e8Fa99408881Ae30", + "function": null, + "arguments": null, + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x5f6eec", + "value": "0x0", + "data": "0x60808060405234620000d3576000549060ff8260081c169081600014620000c857303b155b156200006f57501590816200005c575b506200004b575b60405161560d9081620000d98239f35b61ff0019600054166000556200003b565b61ffff1916610101176000553862000034565b62461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b60ff83161562000024565b600080fdfe60806040526004361015610013575b600080fd5b60003560e01c806305b41934146103165780630948c0b61461030d5780630b6d1d1714610304578063116ac4a3146102fb5780631f1fcd51146102f257806320f98f3f146102e9578063248a9ca3146102e057806324ea54f4146102d75780632e1a7d4d146102ce5780632f2ff15d146102c557806332b79021146102bc578063364bc15a146102b357806336568abe146102aa578063372500ab146102a157806344040261146102985780634c3f425f1461028f5780635312ea8e1461028657806357ded9c91461027d578063580b7c2e146102745780635be9b2d31461026b5780636314e8841461026257806367f52b6314610235578063787a08a614610259578063853828b6146102505780638b2021761461024757806391d148541461023e578063962e371514610235578063a217fddf1461022c578063a7d385e214610223578063a8c62e761461021a578063b8221bc414610211578063b82c4dc114610208578063b8dc491b146101ff578063c1590cd7146101f6578063c6afba3c146101ed578063d0e30db0146101e4578063d547741f146101db578063dc4c90d3146101d25763fd464918146101ca57600080fd5b61000e6120bc565b5061000e612069565b5061000e612006565b5061000e611fc5565b5061000e611f8b565b5061000e611f51565b5061000e611de2565b5061000e611bc8565b5061000e611b5a565b5061000e611b07565b5061000e61171a565b5061000e6116df565b5061000e6112ad565b5061000e61165c565b5061000e61153d565b5061000e611427565b5061000e61137b565b5061000e6111e7565b5061000e611185565b5061000e61112b565b5061000e6110f1565b5061000e610f11565b5061000e610ed9565b5061000e610e97565b5061000e610b44565b5061000e610a7f565b5061000e610a25565b5061000e6109e0565b5061000e6108a1565b5061000e61085b565b5061000e610801565b5061000e6107b3565b5061000e61073c565b5061000e6106e9565b5061000e610696565b5061000e610659565b5061000e6105c5565b5061000e61048a565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161036357604052565b61036b61031f565b604052565b6040810190811067ffffffffffffffff82111761036357604052565b6080810190811067ffffffffffffffff82111761036357604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761036357604052565b60405190610180820182811067ffffffffffffffff82111761036357604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610446575b01160190565b61044e61031f565b610440565b92919261045f8261040a565b9161046d60405193846103a8565b82948184528183011161000e578281602093846000960137010152565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760243567ffffffffffffffff811161000e573660238201121561000e5760006104ee81923690602481600401359101610453565b6104f733612142565b73ffffffffffffffffffffffffffffffffffffffff6038541682602083519301915af1610522612b6b565b90156105705761053f8151916020806004359483010191016129dc565b1061054657005b60046040517f22313ae9000000000000000000000000000000000000000000000000000000008152fd5b805190816105a25760046040517fc76d51a1000000000000000000000000000000000000000000000000000000008152fd5b602001fd5b73ffffffffffffffffffffffffffffffffffffffff81160361000e57565b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5773ffffffffffffffffffffffffffffffffffffffff600435610616816105a7565b61061f33612350565b167fffffffffffffffffffffffff00000000000000000000000000000000000000006038541617603855600080f35b600091031261000e57565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576020603754604051908152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760206106e16106d3613cef565b6106db612a05565b906129c9565b604051908152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602073ffffffffffffffffffffffffffffffffffffffff60365416604051908152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5761077533612350565b6067547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff61ff0060ff8360081c161560081b16911617606755600080f35b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760043560005260016020526020600160406000200154604051908152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760206040517f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50418152f35b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576108943361246f565b60206106e1600435614090565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576004356024356108e0816105a7565b60009180835260016020526108fd6001604085200154339061258e565b808352600160205260ff61093483604086209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54161561093f578280f35b808352600160205261097482604085209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8480a438808280f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602060ff60675460081c166040519015158152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760206040517ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab8152f35b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602435610abb816105a7565b3373ffffffffffffffffffffffffffffffffffffffff821603610ae657610ae490600435612864565b005b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f37310000000000000000000000000000000000000000000000000000000000006044820152fd5b503461000e576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e9457610b7e33612142565b80610b87613c0a565b80151580610e83575b610d5f575b5050610c3f6020610ba4613b58565b610c0a610be6610bcd60675473ffffffffffffffffffffffffffffffffffffffff9060101c1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b610bef83612b15565b9073ffffffffffffffffffffffffffffffffffffffff169052565b604051809381927f3111e7b3000000000000000000000000000000000000000000000000000000008352309060048401613b72565b03818573d784927ff2f95ba542bfc824c8a8a98f3495f6b55af18015610d52575b610d24575b50610c6e613c0a565b60675460ff169081610d1a575b5080610d0b575b610c895780f35b80734da27a545c0c5b758a6ba100e3a049001de870f5803b15610d085781906004604051809481937f787a08a60000000000000000000000000000000000000000000000000000000083525af18015610cfb575b610ce5575080f35b80610cf2610cf89261034f565b8061064e565b80f35b610d036129eb565b610cdd565b50fd5b50610d1461471b565b15610c82565b9050151538610c7b565b610d449060203d8111610d4b575b610d3c81836103a8565b8101906129dc565b5038610c65565b503d610d32565b610d5a6129eb565b610c60565b734da27a545c0c5b758a6ba100e3a049001de870f590813b15610e5f576040517f9a99b4f00000000000000000000000000000000000000000000000000000000081523060048201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6024820152838160448183875af18015610e76575b610e63575b50813b15610e5f576040517f1e9a6950000000000000000000000000000000000000000000000000000000008152306004820152602481019190915291908290604490829084905af18015610e52575b610e3f575b8190610b95565b80610cf2610e4c9261034f565b38610e38565b610e5a6129eb565b610e33565b5050fd5b80610cf2610e709261034f565b38610de3565b610e7e6129eb565b610dde565b506001610e8e61471b565b14610b90565b80fd5b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602060ff606754166040519015158152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57610ae46144e1565b503461000e576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57610ae490610f4f33612350565b610fd481610f75610bcd60365473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f69328dec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048083019190915235602482015230604482015291829081906064820190565b03816000737d2768de32b0b80b7a3454c06bdac94a69ddc7a95af180156110e4575b6110c7575b5060365473ffffffffffffffffffffffffffffffffffffffff16611037610bcd60345473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152909190838160248173ffffffffffffffffffffffffffffffffffffffff86165afa9384156110ba575b60009461109b575b5050614a9e565b6110b2929450803d10610d4b57610d3c81836103a8565b913880611094565b6110c26129eb565b61108c565b6110dd90823d8411610d4b57610d3c81836103a8565b5038610ffb565b6110ec6129eb565b610ff6565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760206106e1613cef565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760206040517f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c8152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760206111bf612a05565b60375480600a0290600a8204036111da575b60405191118152f35b6111e2612942565b6111d1565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576020606654604051908152f35b8015150361000e57565b9080601f8301121561000e5781359067ffffffffffffffff82116112a0575b8160051b60405193602093611264858401876103a8565b8552838086019282010192831161000e578301905b828210611287575050505090565b8380918335611295816105a7565b815201910190611279565b6112a861031f565b61124d565b503461000e5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576004356112e9816105a7565b67ffffffffffffffff9060243582811161000e573660238201121561000e5761131c903690602481600401359101610453565b60443561132881611224565b60643584811161000e5761134090369060040161122e565b6084359161134d836105a7565b60a43595861161000e57611368610ae496369060040161122e565b9360c43595611376876105a7565b612bbd565b503461000e576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e94576113b533612142565b80734da27a545c0c5b758a6ba100e3a049001de870f5803b15610d085781906004604051809481937f787a08a60000000000000000000000000000000000000000000000000000000083525af1801561141a575b611411575080f35b610cf89061034f565b6114226129eb565b611409565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576114603361246f565b602061146a612a05565b61147381614090565b1015604051908152f35b90600182811c921680156114c6575b602083101461149757565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161148c565b60005b8381106114e35750506000910152565b81810151838201526020016114d3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6040936020845261153681518092816020880152602088880191016114d0565b0116010190565b503461000e576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e9457604051908060335461157f8161147d565b8085529160019180831690811561161457506001146115b9575b6115b5856115a9818703826103a8565b604051918291826114f3565b0390f35b9250603383527f82a75bdeeae8604d839476ae9efd8b0e15aa447e21bfd7f41283bb54e22c9a825b8284106115fc5750505081016020016115a9826115b5611599565b805460208587018101919091529093019281016115e1565b8695506115b5969350602092506115a99491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001682840152151560051b8201019293611599565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602060ff6116d360243561169f816105a7565b6004356000526001845260406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54166040519015158152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602060405160008152f35b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576115b561199d600435611775610bcd60365473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f35ea6a750000000000000000000000000000000000000000000000000000000080825273ffffffffffffffffffffffffffffffffffffffff83166004830152919290610180908181602481737d2768de32b0b80b7a3454c06bdac94a69ddc7a95afa918215611afa575b600092611acd575b505060405192835273ffffffffffffffffffffffffffffffffffffffff841660048401526101409073057835ad21a177dbdd3090bb1cae03eacf78fc6d908285602481855afa918215611ac0575b6000809581978295611a72575b509761196160609593838a9b8a97956000821215600014611a565761186b92506129f8565b9788945b6040517f3e15014100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152928290849060249082905afa928315611a49575b600093611a02575b5001516118f190610bcd9073ffffffffffffffffffffffffffffffffffffffff1681565b946040519b8c97889687967f9584df28000000000000000000000000000000000000000000000000000000008852600488019260a094919796959273ffffffffffffffffffffffffffffffffffffffff60c086019916855260208501526040840152606083015260808201520152565b03915afa9384156119f5575b6000946119ad575b50633b9aca009261198c61199693611991936129f8565b6129f8565b613dfc565b91046129f8565b6040519081529081906020820190565b6119919194509261198c611996936119e0633b9aca009660603d81116119ee575b6119d881836103a8565b810190613b04565b505096935093505092611975565b503d6119ce565b6119fd6129eb565b61196d565b610bcd91935082611a2e610bcd926118f1953d8411611a42575b611a2681836103a8565b810190613a91565b5050505050935050505094925092506118cd565b503d611a1c565b611a516129eb565b6118c5565b5090611a64611a6a92613a56565b90612b9b565b97889461186f565b9092965061196193975060609450611aa09150853d8711611ab9575b611a9881836103a8565b810190613a09565b50959d969c919a50959890979550935061184692505050565b503d611a8e565b611ac86129eb565b611839565b611aec9250803d10611af3575b611ae481836103a8565b810190613928565b38806117eb565b503d611ada565b611b026129eb565b6117e3565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602073ffffffffffffffffffffffffffffffffffffffff60355416604051908152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576020606554604051908152f35b9181601f8401121561000e5782359167ffffffffffffffff831161000e576020808501948460051b01011161000e57565b503461000e5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57600467ffffffffffffffff813581811161000e57611c199036908401611b97565b92909160243581811161000e57611c339036908401611b97565b93909160443590811161000e57611c4d9036908501611b97565b91611c5733612350565b858714801590611dd8575b611daf5760005b878110611c7257005b80611c81611d53928a85612b4d565b35611c8b816105a7565b611c96828a89612b4d565b3590611ca1826105a7565b611cac838888612b4d565b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152308c820190815273ffffffffffffffffffffffffffffffffffffffff8616602082810191909152933595939283918391829101038173ffffffffffffffffffffffffffffffffffffffff88165afa918215611da2575b600092611d85575b505083811015611d5857611d4890611d4e94612b9b565b91615176565b612aaf565b611c69565b838111611d69575b50505050612aaf565b611d7c93611d7691612b9b565b916152a0565b38808080611d60565b611d9b9250803d10610d4b57610d3c81836103a8565b3880611d31565b611daa6129eb565b611d29565b846040517f46282e8d000000000000000000000000000000000000000000000000000000008152fd5b5082871415611c62565b503461000e576040807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576004803590611e21826105a7565b60243592611e2e846105a7565b611e3733612350565b611e3f6147f4565b80519073ffffffffffffffffffffffffffffffffffffffff60009516945b828110611eea5783517f70a0823100000000000000000000000000000000000000000000000000000000815230818701908152610ae49190899089906020908490819083010381845afa928315611edd575b600093611ebd575b50614a9e565b611ed691935060203d8111610d4b57610d3c81836103a8565b9184611eb7565b611ee56129eb565b611eaf565b611f14610bcd611efa8385612b2b565b5173ffffffffffffffffffffffffffffffffffffffff1690565b8614611f2857611f2390612aaf565b611e5d565b505050517f093e1cdb000000000000000000000000000000000000000000000000000000008152fd5b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760206106e1612a05565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760206106e1613c8b565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57611ffe3361246f565b610ae4613679565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57610ae4602435600435612048826105a7565b806000526001602052612064600160406000200154339061258e565b612864565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602073ffffffffffffffffffffffffffffffffffffffff60345416604051908152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576120f533612350565b6067547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0060ff8083161516911617606755600080f35b9061213e602092828151948592016114d0565b0190565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f10c15aae13326e9b33c92ffbb94efb7492c500f0cca324caca9bd1aca194ed1860205260409020547ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab9160019160ff16156121b957505050565b73ffffffffffffffffffffffffffffffffffffffff6121d89116614961565b916121e1614885565b9160306121ed84612b15565b5360786121f9846148a0565b536041905b8082116122f3576122ef60376122bd876122918861221c89156148fc565b61228b6040519586947f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000602087015261225e815180926020858a0191016114d0565b8501016011907f206973206d697373696e6720726f6c652000000000000000000000000000000081520190565b9061212b565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018352826103a8565b6040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352600483016114f3565b0390fd5b9091807f3031323334353637383961626364656600000000000000000000000000000000600f61233d93166010811015612343575b1a61233385876148b1565b5360041c926148d0565b906121fe565b61234b612ae5565b612328565b73ffffffffffffffffffffffffffffffffffffffff811660009081527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db60205260409020547f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419160019160ff16156123c757505050565b73ffffffffffffffffffffffffffffffffffffffff6123e69116614961565b916123ef614885565b9160306123fb84612b15565b536078612407846148a0565b536041905b80821161242a576122ef60376122bd876122918861221c89156148fc565b9091807f3031323334353637383961626364656600000000000000000000000000000000600f61246993166010811015612343571a61233385876148b1565b9061240c565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f21d442261a7cc2346fd3ca5e1f22fe015f6b71188f57ab4761df2e3faed3703f60205260409020547f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c9160019160ff16156124e657505050565b73ffffffffffffffffffffffffffffffffffffffff6125059116614961565b9161250e614885565b91603061251a84612b15565b536078612526846148a0565b536041905b808211612549576122ef60376122bd876122918861221c89156148fc565b9091807f3031323334353637383961626364656600000000000000000000000000000000600f61258893166010811015612343571a61233385876148b1565b9061252b565b9081600052600160205260ff6125c88260406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b5416156125d3575050565b6122bd6122ef9261229161260761260173ffffffffffffffffffffffffffffffffffffffff60489616614961565b92614a23565b6040519485937f416363657373436f6e74726f6c3a206163636f756e742000000000000000000060208601526126478151809260206037890191016114d0565b84017f206973206d697373696e6720726f6c65200000000000000000000000000000006037820152019061212b565b73ffffffffffffffffffffffffffffffffffffffff811660009081527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db602052604081207f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419060ff905b5416156126ec57505050565b808252600160205261272183604084209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d73ffffffffffffffffffffffffffffffffffffffff3394169280a4565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f10c15aae13326e9b33c92ffbb94efb7492c500f0cca324caca9bd1aca194ed18602052604081207ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab9060ff906126e0565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f21d442261a7cc2346fd3ca5e1f22fe015f6b71188f57ab4761df2e3faed3703f602052604081207f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c9060ff906126e0565b600090808252600160205260ff61289e84604085209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54166128a957505050565b80825260016020526128de83604084209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b73ffffffffffffffffffffffffffffffffffffffff3394169280a4565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b906301e133809182810292818404149015171561298b57565b612993612942565b565b90670de0b6b3a76400009182810292818404149015171561298b57565b9061251c9182810292818404149015171561298b57565b8181029291811591840414171561298b57565b9081602091031261000e575190565b506040513d6000823e3d90fd5b9190820180921161298b57565b6024602073ffffffffffffffffffffffffffffffffffffffff60365416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa908115612aa2575b600091612a84575b50612a6d613c8b565b8101809111612a795790565b612a81612942565b90565b612a9c915060203d8111610d4b57610d3c81836103a8565b38612a64565b612aaa6129eb565b612a5c565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612add570190565b61213e612942565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602090805115612b23570190565b61213e612ae5565b6020918151811015612b40575b60051b010190565b612b48612ae5565b612b38565b9190811015612b5e575b60051b0190565b612b66612ae5565b612b57565b3d15612b96573d90612b7c8261040a565b91612b8a60405193846103a8565b82523d6000602084013e565b606090565b9190820391821161298b57565b9081602091031261000e5751612a81816105a7565b92612bcd94918796939794612d71565b612bd56144e1565b8180612cb2575b612c8857612c1d612993927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff61ff0060675492151560081b16911617606755565b612c4d60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006067541617606755565b612c7a612c75610bcd610bcd60365473ffffffffffffffffffffffffffffffffffffffff1690565b614bb5565b612c8381614cda565b614ef9565b60046040517f5e7bb0f9000000000000000000000000000000000000000000000000000000008152fd5b5073ffffffffffffffffffffffffffffffffffffffff60046020612cf2610bcd60675473ffffffffffffffffffffffffffffffffffffffff9060101c1690565b604051928380927f75d264130000000000000000000000000000000000000000000000000000000082525afa908115612d64575b600091612d36575b501615612bdc565b612d57915060203d8111612d5d575b612d4f81836103a8565b810190612ba8565b38612d2e565b503d612d45565b612d6c6129eb565b612d26565b94929093916000549460ff8660081c169586600014612ec15750303b155b15612e3d57612da495159687612dd7576130d8565b612daa57565b6129937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff60005416600055565b612e086101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff6000541617600055565b612e3860017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000541617600055565b6130d8565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152fd5b60ff1615612d8f565b5190612993826105a7565b601f8111612ee1575050565b600090603382527f82a75bdeeae8604d839476ae9efd8b0e15aa447e21bfd7f41283bb54e22c9a82906020601f850160051c83019410612f3c575b601f0160051c01915b828110612f3157505050565b818155600101612f25565b9092508290612f1c565b90815167ffffffffffffffff811161308a575b612f6d81612f6860335461147d565b612ed5565b602080601f8311600114612fc65750819293600092612fbb575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c191617603355565b015190503880612f87565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083169461301760336000527f82a75bdeeae8604d839476ae9efd8b0e15aa447e21bfd7f41283bb54e22c9a8290565b926000905b87821061307257505083600195961061303b575b505050811b01603355565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055388080613030565b8060018596829496860151815501950193019061301c565b61309261031f565b612f59565b519060ff8216820361000e57565b9081602091031261000e57612a8190613097565b60ff16604d81116130cb575b600a0a90565b6130d3612942565b6130c5565b94613122909492919473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006038541617603855565b6131678573ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006035541617603555565b6132c061318f610bcd610bcd60355473ffffffffffffffffffffffffffffffffffffffff1690565b946132bb60405180977fdc4c90d300000000000000000000000000000000000000000000000000000000825281600460209a8b935afa90811561348c575b60009161346f575b50603480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92831617905560048861323c610bcd60345473ffffffffffffffffffffffffffffffffffffffff1690565b604051928380927ffc0c546a0000000000000000000000000000000000000000000000000000000082525afa908115613462575b600091613445575b501673ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006036541617603655565b612f46565b6132ea6132e5610bcd60345473ffffffffffffffffffffffffffffffffffffffff1690565b612676565b80519060005b82811061342c5750505061330382612788565b80519060005b82811061340e575050506133b1612993939261332a6133b6936132e5613499565b613333846127f6565b61333b613539565b6133436135d9565b60048161336e610bcd610bcd610bcd60365473ffffffffffffffffffffffffffffffffffffffff1690565b604051928380927f313ce5670000000000000000000000000000000000000000000000000000000082525afa918215613401575b6000926133d4575b50506130b9565b603755565b60365473ffffffffffffffffffffffffffffffffffffffff16615044565b6133f39250803d106133fa575b6133eb81836103a8565b8101906130a5565b38806133aa565b503d6133e1565b6134096129eb565b6133a2565b80611d4e613422611efa6134279486612b2b565b612788565b613309565b80611d4e6132e5611efa6134409486612b2b565b6132f0565b61345c9150893d8b11612d5d57612d4f81836103a8565b38613278565b61346a6129eb565b613270565b6134869150883d8a11612d5d57612d4f81836103a8565b386131d5565b6134946129eb565b6131cd565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab600081815260016020527f10c15aae13326e9b33c92ffbb94efb7492c500f0cca324caca9bd1aca194ed19547f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419283927fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9080a4600160406000200155565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041600081815260016020527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5dc547f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c9283927fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9080a4600160406000200155565b7f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c600081815260016020527f21d442261a7cc2346fd3ca5e1f22fe015f6b71188f57ab4761df2e3faed37040547f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419283927fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9080a4600160406000200155565b73ffffffffffffffffffffffffffffffffffffffff60365416604051907f70a0823100000000000000000000000000000000000000000000000000000000825230600483015260208083602481855afa9283156138af575b600093613890575b50821561388b576040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152306004820152737d2768de32b0b80b7a3454c06bdac94a69ddc7a960248201528391908181604481875afa91821561387e575b600092613861575b50501061382a575b5061376c610bcd60365473ffffffffffffffffffffffffffffffffffffffff1690565b90737d2768de32b0b80b7a3454c06bdac94a69ddc7a991823b1561000e576040517fe8eda9df00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff919091166004820152602481019190915230604482015260006064820181905290918290608490829084905af1801561381d575b61380a575b50613807613c8b565b50565b80610cf26138179261034f565b386137fe565b6138256129eb565b6137f9565b6138339061511a565b61385b612c75610bcd610bcd60365473ffffffffffffffffffffffffffffffffffffffff1690565b38613749565b6138779250803d10610d4b57610d3c81836103a8565b3880613741565b6138866129eb565b613739565b505050565b816138a89294503d8511610d4b57610d3c81836103a8565b91386136d9565b6138b76129eb565b6136d1565b919082602091031261000e576040516020810181811067ffffffffffffffff8211176138ec575b60405291518252565b6138f461031f565b6138e3565b51906fffffffffffffffffffffffffffffffff8216820361000e57565b519064ffffffffff8216820361000e57565b6101808183031261000e5761394561393e6103e9565b92826138bc565b8252613953602082016138f9565b6020830152613964604082016138f9565b6040830152613975606082016138f9565b6060830152613986608082016138f9565b608083015261399760a082016138f9565b60a08301526139a860c08201613916565b60c08301526139b960e08201612eca565b60e08301526101006139cc818301612eca565b908301526101206139de818301612eca565b908301526101406139f0818301612eca565b90830152613a02610160809201613097565b9082015290565b91908261014091031261000e5781519160208101519160408201519160608101519160808201519160a08101519160c08201519160e081015191612a816101206101008401519301613916565b7f80000000000000000000000000000000000000000000000000000000000000008114613a84575b60000390565b613a8c612942565b613a7e565b91908261014091031261000e5781519160208101519160408201519160608101519160808201519160a0810151613ac781611224565b9160c0820151613ad681611224565b9160e0810151613ae581611224565b91610120610100830151613af881611224565b920151612a8181611224565b9081606091031261000e578051916040602083015192015190565b8115613b29570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60405190613b6582610370565b6001825260203681840137565b90929160608201606083528451809152608083019060208096019060005b87828210613be057505050506040917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff929685015216910152565b835173ffffffffffffffffffffffffffffffffffffffff1685529384019390920191600101613b90565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152602081602481734da27a545c0c5b758a6ba100e3a049001de870f55afa908115613c7e575b600091613c66575090565b612a81915060203d8111610d4b57610d3c81836103a8565b613c866129eb565b613c5b565b6024602073ffffffffffffffffffffffffffffffffffffffff60675460101c16604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa908115613c7e57600091613c66575090565b73ffffffffffffffffffffffffffffffffffffffff60365416604051907f35ea6a75000000000000000000000000000000000000000000000000000000008252600482015261014090818160248173057835ad21a177dbdd3090bb1cae03eacf78fc6d5afa918215613def575b600091829083928495613db3575b505091613d8f91633b9aca00938201809211613da6575b8101809111613d9e57613dfc565b9104908101809111612a795790565b611991612942565b613dae612942565b613d81565b613d8f9550633b9aca009450613dd9935080919250903d10611ab957611a9881836103a8565b50949950969794965086949350613d6a92505050565b613df76129eb565b613d5c565b6067549060ff8260081c1680613f08575b80613eff575b613e1f575b5050600090565b6040517f1652e7b700000000000000000000000000000000000000000000000000000000815260109290921c73ffffffffffffffffffffffffffffffffffffffff16600483015260608260248173d784927ff2f95ba542bfc824c8a8a98f3495f6b55afa918215613ef2575b600092613ecf575b508115613e1857613ec2613ec791613ebd613eb8613eb3612a8196613fa6565b612972565b612995565b613b1f565b6129b2565b612710900490565b613ee891925060603d81116119ee576119d881836103a8565b5090509038613e93565b613efa6129eb565b613e8b565b50801515613e13565b506040517fcc69afec00000000000000000000000000000000000000000000000000000000815260208160048173d784927ff2f95ba542bfc824c8a8a98f3495f6b55afa908115613f82575b600091613f64575b504210613e0d565b613f7c915060203d8111610d4b57610d3c81836103a8565b38613f5c565b613f8a6129eb565b613f54565b519069ffffffffffffffffffff8216820361000e57565b6040517ffeaf968c00000000000000000000000000000000000000000000000000000000815260a08160048173547a514d5e3769680ce22b2361c10ea13619e8a95afa908115614083575b600091614020575b506140136a52b7d2dcc80cd2e40000009261401c926129c9565b603754906129c9565b0490565b9060a0823d821161407b575b8161403960a093836103a8565b81010312610e9457506140136a52b7d2dcc80cd2e4000000928261405f61401c94613f8f565b50614071608060208301519201613f8f565b5092509250613ff9565b3d915061402c565b61408b6129eb565b613ff1565b614098613c8b565b906140b860365473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f70a0823100000000000000000000000000000000000000000000000000000000808252306004830152602094909373ffffffffffffffffffffffffffffffffffffffff93909186846024818886165afa9384156144a1575b60009461447e575b5083614127916129f8565b808311614476575b508183101561444b57506141b8918591614161610bcd60365473ffffffffffffffffffffffffffffffffffffffff1690565b9183614189610bcd60675473ffffffffffffffffffffffffffffffffffffffff9060101c1690565b60405189815273ffffffffffffffffffffffffffffffffffffffff909116600482015295869081906024820190565b0381865afa94851561443e575b60009561441f575b5060018511614282575b50505090506141fb60365473ffffffffffffffffffffffffffffffffffffffff1690565b60405193845230600485015292918290602490829086165afa928315614275575b600093614250575b505081612a819161424a60355473ffffffffffffffffffffffffffffffffffffffff1690565b90614a9e565b612a81929350908161426d92903d10610d4b57610d3c81836103a8565b919038614224565b61427d6129eb565b61421c565b61428b91612b9b565b92808411614375575050614318916142bb610bcd60365473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f69328dec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481019190915230604482015291829081906064820190565b03816000737d2768de32b0b80b7a3454c06bdac94a69ddc7a95af18015614368575b61434b575b505b38838180806141d7565b61436190843d8611610d4b57610d3c81836103a8565b503861433f565b6143706129eb565b61433a565b6040517f69328dec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201523060448201529150816064816000737d2768de32b0b80b7a3454c06bdac94a69ddc7a95af18015614412575b6143f5575b50614341565b61440b90843d8611610d4b57610d3c81836103a8565b50386143ef565b61441a6129eb565b6143ea565b614437919550843d8611610d4b57610d3c81836103a8565b93386141cd565b6144466129eb565b6141c5565b91509350612a81925083915061424a60355473ffffffffffffffffffffffffffffffffffffffff1690565b91503861412f565b61412791945061449a90883d8a11610d4b57610d3c81836103a8565b939061411c565b6144a96129eb565b614114565b9081606091031261000e5780516144c4816105a7565b91604060208301516144d5816105a7565b920151612a81816105a7565b6145e273ffffffffffffffffffffffffffffffffffffffff61456f6060614520610bcd60365473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fd2493b6c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015291829081906024820190565b038173057835ad21a177dbdd3090bb1cae03eacf78fc6d5afa90811561470e575b6000916146de575b50167fffffffffffffffffffff0000000000000000000000000000000000000000ffff75ffffffffffffffffffffffffffffffffffffffff00006067549260101b16911617606755565b6129936040517f72b49d63000000000000000000000000000000000000000000000000000000008152600460208092614647734da27a545c0c5b758a6ba100e3a049001de870f59183818681865afa9081156146d1575b6000916146b4575b50606555565b604051928380927f359c4a960000000000000000000000000000000000000000000000000000000082525afa9182156146a7575b60009261468a575b5050606655565b6146a09250803d10610d4b57610d3c81836103a8565b3880614683565b6146af6129eb565b61467b565b6146cb9150843d8611610d4b57610d3c81836103a8565b38614641565b6146d96129eb565b614639565b6146ff915060603d8111614707575b6146f781836103a8565b8101906144ae565b505038614598565b503d6146ed565b6147166129eb565b614590565b6040517f091030c300000000000000000000000000000000000000000000000000000000815230600482015260009190602081602481734da27a545c0c5b758a6ba100e3a049001de870f55afa9081156147e7575b6000916147c9575b50614785606554826129f8565b90156147c257804211806147ad575b6147a65742106147a057565b60029150565b5060019150565b506147ba606654826129f8565b421115614794565b5060009150565b6147e1915060203d8111610d4b57610d3c81836103a8565b38614778565b6147ef6129eb565b614770565b6040516060810181811067ffffffffffffffff821117614878575b6040526002815260208101604036823773ffffffffffffffffffffffffffffffffffffffff9081603654169083511561486b575b5260675460101c1681516001101561485e575b604082015290565b614866612ae5565b614856565b614873612ae5565b614843565b61488061031f565b61480f565b604051906148928261038c565b604282526060366020840137565b602190805160011015612b23570190565b9060209180518210156148c357010190565b6148cb612ae5565b010190565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908015612add570190565b1561490357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b604051906060820182811067ffffffffffffffff821117614a16575b604052602a82526040366020840137603061499783612b15565b5360786149a3836148a0565b536029905b600182116149bb57612a819150156148fc565b807f3031323334353637383961626364656600000000000000000000000000000000600f614a0393166010811015614a09575b1a6149f984866148b1565b5360041c916148d0565b906149a8565b614a11612ae5565b6149ee565b614a1e61031f565b61497d565b614a2b614885565b906030614a3783612b15565b536078614a43836148a0565b536041905b60018211614a5b57612a819150156148fc565b807f3031323334353637383961626364656600000000000000000000000000000000600f614a9893166010811015614a09571a6149f984866148b1565b90614a48565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff9092166024830152604482019290925261299391614b2582606481015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018452836103a8565b615436565b15614b3157565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152fd5b61299390614c386040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152306004820152737d2768de32b0b80b7a3454c06bdac94a69ddc7a9602482015260208160448173ffffffffffffffffffffffffffffffffffffffff87165afa908115614ccd575b600091614caf575b5015614b2a565b6040517f095ea7b3000000000000000000000000000000000000000000000000000000006020820152737d2768de32b0b80b7a3454c06bdac94a69ddc7a960248201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604482015290614b258260648101614af9565b614cc7915060203d8111610d4b57610d3c81836103a8565b38614c31565b614cd56129eb565b614c29565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff82166024820152602091614e26916000908190734da27a545c0c5b758a6ba100e3a049001de870f590614d65908781604481865afa908115614eec575b8491614ed5575015614b2a565b6040519373ffffffffffffffffffffffffffffffffffffffff878601917f095ea7b30000000000000000000000000000000000000000000000000000000083521660248601527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604486015260448552614dde8561038c565b8260405195614dec87610370565b8887527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648988015251925af1614e20612b6b565b906154a1565b805180614e3257505050565b8183918101031261000e57810151614e4981611224565b15614e515750565b608490604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b614cc79150883d8a11610d4b57610d3c81836103a8565b614ef46129eb565b614d58565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff82166024820152602091614e26916000908190737fc66500c84a76ad7e9c93437bfc5ac33e2ddae990614f83908781604481865afa908115614eec578491614ed5575015614b2a565b6040519373ffffffffffffffffffffffffffffffffffffffff878601917f095ea7b30000000000000000000000000000000000000000000000000000000083521660248601527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604486015260448552614ffc8561038c565b826040519561500a87610370565b8887527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648988015251925af161503e612b6b565b90615576565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff83811660248301526129939392916150b7906020816044818787165afa908115614ccd57600091614caf575015614b2a565b604051927f095ea7b30000000000000000000000000000000000000000000000000000000060208501521660248301527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604483015260448252614b258261038c565b61299390604051907f095ea7b3000000000000000000000000000000000000000000000000000000006020830152737d2768de32b0b80b7a3454c06bdac94a69ddc7a960248301526000604483015260448252614b258261038c565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff83166024820152612993939092906020848060448101038173ffffffffffffffffffffffffffffffffffffffff87165afa938415615293575b60009461526d575b5090614b25918401809411615260575b6040517f095ea7b300000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff909116602482015260448101939093528260648101614af9565b615268612942565b615208565b614b259291945061528b9060203d8111610d4b57610d3c81836103a8565b9390916151f8565b61529b6129eb565b6151f0565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8316602482015292916020848060448101038173ffffffffffffffffffffffffffffffffffffffff86165afa938415615429575b600094615409575b50828410615385576040517f095ea7b300000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff909116602482015291909203604482015261299391614b258260648101614af9565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5361666545524332303a2064656372656173656420616c6c6f77616e6365206260448201527f656c6f77207a65726f00000000000000000000000000000000000000000000006064820152fd5b61542291945060203d8111610d4b57610d3c81836103a8565b923861531d565b6154316129eb565b615315565b604051614e269173ffffffffffffffffffffffffffffffffffffffff1661545c82610370565b6000806020958685527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656487860152868151910182855af161549b612b6b565b916155a7565b9091901561553057508051156154b45790565b734da27a545c0c5b758a6ba100e3a049001de870f53b156154d25790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8151156155405750805190602001fd5b6122ef906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352600483016114f3565b9091901561553057508051156155895790565b737fc66500c84a76ad7e9c93437bfc5ac33e2ddae93b156154d25790565b919290156155c457508151156155bb575090565b3b156154d25790565b8251909150156155405750805190602001fdfea264697066735822122002d1ebdd00e45664388c59ceab6409273d4eb00e03f8d0ff1609532a42c538de64736f6c63430008110033", + "nonce": "0x3b1", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0x27c46748143651ee0e72af28574594a01879f37185e082c23bc0cf70d51b6ace", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0xe4377620697Be18E6d6aa911CA488571EeB3f081", + "function": null, + "arguments": [ + "0x14bA0B82f1940e35Af39c364e8Fa99408881Ae30", + "0x1D941EF0D3Bba4ad67DBfBCeE5262F4CEE53A32b", + "0x67f52b63000000000000000000000000bfa4459868c60da9edd835f0be684edec054557b00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001600000000000000000000000001111111254eeb25477b68fb85ed929f73a960582000000000000000000000000000000000000000000000000000000000000001341617665204c656e6465722055534443207632000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe" + ], + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x1c2ce1", + "value": "0x0", + "data": "0x60406080815262000f548038038062000018816200030b565b9283398101906060818303126200030657620000348162000347565b916020926200004584840162000347565b8584015190936001600160401b0391908282116200030657019280601f850112156200030657835193620000836200007d866200035c565b6200030b565b948086528786019288828401011162000306578288620000a4930162000378565b823b15620002ac577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b03199081166001600160a01b0386811691821790935590959194600093909290917fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8580a2805115801590620002a4575b620001f5575b50505050507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103937f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f86865493815196818616885216958684820152a18315620001a357501617905551610afd9081620004578239f35b60849086519062461bcd60e51b82526004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152fd5b895194606086019081118682101762000290578a52602785527f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c89860152660819985a5b195960ca1b8a860152516200027a9493929183918291845af4903d1562000286573d6200026a6200007d826200035c565b90815280938a3d92013e6200039d565b5038808080806200012d565b606092506200039d565b634e487b7160e01b85526041600452602485fd5b508362000127565b865162461bcd60e51b815260048101879052602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608490fd5b600080fd5b6040519190601f01601f191682016001600160401b038111838210176200033157604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036200030657565b6001600160401b0381116200033157601f01601f191660200190565b60005b8381106200038c5750506000910152565b81810151838201526020016200037b565b91929015620004025750815115620003b3575090565b3b15620003bd5790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015620004165750805190602001fd5b6044604051809262461bcd60e51b82526020600483015262000448815180928160248601526020868601910162000378565b601f01601f19168101030190fdfe6080604052600436101561002c575b361561001f575b61001d6107b1565b005b6100276107b1565b610015565b6000803560e01c9081633659cfe614610093575080634f1ef2861461008a5780635c60da1b146100815780638f283970146100785763f851a4400361000e57610073610455565b61000e565b506100736102f0565b5061007361023b565b50610073610157565b3461012c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261012c576100ca61012f565b73ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541633146000146101235761012090610117610511565b908382526105cb565b80f35b506101206107b1565b80fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361015257565b600080fd5b5060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525761018a61012f565b60243567ffffffffffffffff9182821161015257366023830112156101525781600401359283116101525736602484840101116101525773ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416331460001461023057600060208480602461021e61021961001d99610582565b61053e565b9682885201838701378401015261070b565b50505061001d6107b1565b50346101525760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610152576020600073ffffffffffffffffffffffffffffffffffffffff90817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541633146000146102e25750807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416905b60405191168152f35b906102eb6107b1565b6102d9565b50346101525760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525761032861012f565b73ffffffffffffffffffffffffffffffffffffffff907fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610391808354163314600014610230577f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f604084549281519481851686521693846020820152a181156103d1577fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b50346101525760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610152576020600073ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038181541633146000146104d85754604051911681529050f35b506102eb6107b1565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051906020820182811067ffffffffffffffff82111761053157604052565b6105396104e1565b604052565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f604051930116820182811067ffffffffffffffff82111761053157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff81116105be575b01160190565b6105c66104e1565b6105b8565b803b156106875773ffffffffffffffffffffffffffffffffffffffff81167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc817fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a281511580159061067f575b61066a575050565b61067c916106766108dd565b9161095b565b50565b506000610662565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152fd5b803b156106875773ffffffffffffffffffffffffffffffffffffffff81167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc817fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a28151158015906107a95761066a575050565b506001610662565b5073ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354163314610833577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc54166000808092368280378136915af43d82803e1561082f573d90f35b3d90fd5b60a46040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f65740000000000000000000000000000000000000000000000000000000000006084820152fd5b604051906060820182811067ffffffffffffffff82111761094e575b604052602782527f206661696c6564000000000000000000000000000000000000000000000000006040837f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c60208201520152565b6109566104e1565b6108f9565b6000806109909493602081519101845af43d15610993573d9161098061021984610582565b9283523d6000602085013e610a00565b90565b606091610a00565b156109a257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b91929015610a205750815115610a14575090565b610990903b151561099b565b825190915015610a335750805190602001fd5b604051907f08c379a000000000000000000000000000000000000000000000000000000000825281602080600483015282519283602484015260005b848110610ab0575050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000604480968601015201168101030190fd5b818101830151868201604401528593508201610a6f56fea26469706673582212201c39b75ea59593d8670f804896fbda9470452421c2de5834b8a62b5fdb34806664736f6c6343000811003300000000000000000000000014ba0b82f1940e35af39c364e8fa99408881ae300000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c467f52b63000000000000000000000000bfa4459868c60da9edd835f0be684edec054557b00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001600000000000000000000000001111111254eeb25477b68fb85ed929f73a960582000000000000000000000000000000000000000000000000000000000000001341617665204c656e6465722055534443207632000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe00000000000000000000000000000000000000000000000000000000", + "nonce": "0x3b2", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0x991eef60590b3e23c89e77e2209afc0d141b0b31dcd9a0053624b2eb00d8ef6c", + "transactionType": "CREATE", + "contractName": "GenericEulerStaker", + "contractAddress": "0x2A729024be86FC692cC02b08f461a56A175b88dC", + "function": null, + "arguments": null, + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x5fed7c", + "value": "0x0", + "data": "0x60808060405234620000d3576000549060ff8260081c169081600014620000c857303b155b156200006f57501590816200005c575b506200004b575b60405161568d9081620000d98239f35b61ff0019600054166000556200003b565b61ffff1916610101176000553862000034565b62461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b60ff83161562000024565b600080fdfe60806040526004361015610013575b600080fd5b60003560e01c806305b41934146102f75780630948c0b6146102ee5780630b6d1d17146102e5578063108cce74146102dc578063116ac4a3146102d35780631f1fcd51146102ca578063248a9ca3146102c157806324ea54f4146102b85780632e1a7d4d146102af5780632e779525146102a65780632f2ff15d1461029d578063364bc15a1461029457806336568abe1461028b578063372500ab146102825780635312ea8e1461027957806357ded9c914610270578063580b7c2e146102675780635be9b2d31461025e57806375653eb414610255578063853828b61461024c5780638b2021761461024357806391d148541461023a578063953d9cf114610231578063a217fddf14610228578063a25b26be1461021f578063a73e0f3b14610216578063a7d385e21461020d578063a8c62e7614610204578063b82c4dc1146101fb578063b8dc491b146101f2578063c1590cd7146101e9578063c6afba3c146101e0578063d0e30db0146101d7578063d547741f146101ce578063dc4c90d3146101c5578063ecf609ae146101bc5763ef06e72c146101b457600080fd5b61000e611de1565b5061000e611d30565b5061000e611cdd565b5061000e611c7a565b5061000e611b04565b5061000e611aca565b5061000e611a90565b5061000e611950565b5061000e611736565b5061000e6116b2565b5061000e6113b7565b5061000e611371565b5061000e6112b6565b5061000e6111c4565b5061000e611171565b5061000e6110ee565b5061000e610fcf565b5061000e610eb9565b5061000e610e66565b5061000e610e04565b5061000e610daa565b5061000e610d70565b5061000e610b8f565b5061000e610adf565b5061000e610a1c565b5061000e6109c2565b5061000e610883565b5061000e610849565b5061000e610803565b5061000e6107a9565b5061000e61075b565b5061000e610708565b5061000e6106b5565b5061000e610672565b5061000e610635565b5061000e6105a1565b5061000e61044a565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161034457604052565b61034c610300565b604052565b6040810190811067ffffffffffffffff82111761034457604052565b6080810190811067ffffffffffffffff82111761034457604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761034457604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610406575b01160190565b61040e610300565b610400565b92919261041f826103ca565b9161042d6040519384610389565b82948184528183011161000e578281602093846000960137010152565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760243567ffffffffffffffff811161000e573660238201121561000e5760006104ae81923690602481600401359101610413565b6104b733611e4b565b73ffffffffffffffffffffffffffffffffffffffff6038541682602083519301915af16104e261289d565b9015610530576104ff8151916020806004359483010191016126ff565b1061050657005b60046040517f22313ae9000000000000000000000000000000000000000000000000000000008152fd5b805190816105625760046040517fc76d51a1000000000000000000000000000000000000000000000000000000008152fd5b602001fd5b73ffffffffffffffffffffffffffffffffffffffff81160361000e57565b6064359061059282610567565b565b60a4359061059282610567565b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5773ffffffffffffffffffffffffffffffffffffffff6004356105f281610567565b6105fb33612059565b167fffffffffffffffffffffffff00000000000000000000000000000000000000006038541617603855600080f35b600091031261000e57565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576020603754604051908152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602060ff60695460a01c16604051908152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760206107006106f2613580565b6106fa612750565b906126ec565b604051908152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602073ffffffffffffffffffffffffffffffffffffffff60365416604051908152f35b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760043560005260016020526020600160406000200154604051908152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760206040517f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50418152f35b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5761083c33612178565b602061070060043561394e565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57610881613d6a565b005b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576004356024356108c281610567565b60009180835260016020526108df60016040852001543390612297565b808352600160205260ff61091683604086209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b541615610921578280f35b808352600160205261095682604085209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8480a438808280f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760206040517ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab8152f35b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602435610a5881610567565b3373ffffffffffffffffffffffffffffffffffffffff821603610a81576108819060043561256d565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f37310000000000000000000000000000000000000000000000000000000000006044820152fd5b503461000e576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610b8c578073ffffffffffffffffffffffffffffffffffffffff60685416803b15610b895781906004604051809481937f3d18b9120000000000000000000000000000000000000000000000000000000083525af18015610b7c575b610b70575080f35b610b7990610330565b80f35b610b8461270e565b610b68565b50fd5b80fd5b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57600435610bcb33612059565b610bd481614377565b50610c10610bf760675473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b803b1561000e576040517f441a3e700000000000000000000000000000000000000000000000000000000081526000600482018190526024820184905290918290604490829084905af18015610d63575b610d4a575b50610881610c8960365473ffffffffffffffffffffffffffffffffffffffff1690565b610cab610bf760345473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529160208360248173ffffffffffffffffffffffffffffffffffffffff85165afa928315610d3d575b600093610d0d575b50614e19565b610d2f91935060203d8111610d36575b610d278183610389565b8101906126ff565b9184610d07565b503d610d1d565b610d4561270e565b610cff565b80610d57610d5d92610330565b8061062a565b80610c66565b610d6b61270e565b610c61565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576020610700613580565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760206040517f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c8152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576020610e3e612750565b60375480600a0290600a820403610e59575b60405191118152f35b610e6161264b565b610e50565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602073ffffffffffffffffffffffffffffffffffffffff60685416604051908152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57610ef233612178565b6020610efc612750565b610f058161394e565b1015604051908152f35b90600182811c92168015610f58575b6020831014610f2957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691610f1e565b60005b838110610f755750506000910152565b8181015183820152602001610f65565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60409360208452610fc88151809281602088015260208888019101610f62565b0116010190565b503461000e576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610b8c57604051908060335461101181610f0f565b808552916001918083169081156110a6575060011461104b575b6110478561103b81870382610389565b60405191829182610f85565b0390f35b9250603383527f82a75bdeeae8604d839476ae9efd8b0e15aa447e21bfd7f41283bb54e22c9a825b82841061108e57505050810160200161103b8261104761102b565b80546020858701810191909152909301928101611073565b8695506110479693506020925061103b9491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001682840152151560051b820101929361102b565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602060ff61116560243561113181610567565b6004356000526001845260406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54166040519015158152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602073ffffffffffffffffffffffffffffffffffffffff60675416604051908152f35b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602060405160008152f35b9080601f8301121561000e5781602061121a93359101610413565b90565b9080601f8301121561000e5781359067ffffffffffffffff821161128f575b8160051b6040519360209361125385840187610389565b8552838086019282010192831161000e578301905b828210611276575050505090565b838091833561128481610567565b815201910190611268565b611297610300565b61123c565b60c4359061059282610567565b60e4359061059282610567565b503461000e576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576004356112f381610567565b67ffffffffffffffff9060243582811161000e576113159036906004016111ff565b60443583811161000e5761132d90369060040161121d565b611335610585565b60843594851161000e5761135061088195369060040161121d565b90611359610594565b9261136261129c565b9461136b6112a9565b966140c9565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602063ffffffff60675460a01c16604051908152f35b503461000e576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576107006004803583611412610bf760665473ffffffffffffffffffffffffffffffffffffffff1690565b604051938480927f18160ddd0000000000000000000000000000000000000000000000000000000082525afa9182156116a5575b600092611686575b50606754916040517ffea61faa000000000000000000000000000000000000000000000000000000008152858160048173ffffffffffffffffffffffffffffffffffffffff88165afa908115611679575b60009161165c575b50828160008212611642576114bc9250612743565b905b600093826114d9575b5050506114d390614810565b90612743565b91816115e9936115b98961151761150e611500876114fb6114d39c9d9a6126cb565b61352e565b670de0b6b3a7640000900490565b63ffffffff1690565b611539610bf760655473ffffffffffffffffffffffffffffffffffffffff1690565b61155b610bf760365473ffffffffffffffffffffffffffffffffffffffff1690565b6040518095819482937fd50c08f80000000000000000000000000000000000000000000000000000000084526004840190929163ffffffff60209173ffffffffffffffffffffffffffffffffffffffff604085019616845216910152565b03915afa948515611635575b946115f2575b5060a01c63ffffffff16926bffffffffffffffffffffffff166137e5565b919038806114c7565b6bffffffffffffffffffffffff91945061162663ffffffff918b3d8d1161162e575b61161e8183610389565b810190613567565b9491506115cb565b503d611614565b61163d61270e565b6115c5565b5090611650611656926134f3565b906128cd565b906114be565b6116739150863d8811610d3657610d278183610389565b386114a7565b61168161270e565b61149f565b61169e919250843d8611610d3657610d278183610389565b903861144e565b6116ad61270e565b611446565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602073ffffffffffffffffffffffffffffffffffffffff60355416604051908152f35b9181601f8401121561000e5782359167ffffffffffffffff831161000e576020808501948460051b01011161000e57565b503461000e5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57600467ffffffffffffffff813581811161000e576117879036908401611705565b92909160243581811161000e576117a19036908401611705565b93909160443590811161000e576117bb9036908501611705565b916117c533612059565b858714801590611946575b61191d5760005b8781106117e057005b806117ef6118c1928a8561287f565b356117f981610567565b611804828a8961287f565b359061180f82610567565b61181a83888861287f565b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152308c820190815273ffffffffffffffffffffffffffffffffffffffff8616602082810191909152933595939283918391829101038173ffffffffffffffffffffffffffffffffffffffff88165afa918215611910575b6000926118f3575b5050838110156118c6576118b6906118bc946128cd565b916150fe565b6127f7565b6117d7565b8381116118d7575b505050506127f7565b6118ea936118e4916128cd565b91615228565b388080806118ce565b6119099250803d10610d3657610d278183610389565b388061189f565b61191861270e565b611897565b846040517f46282e8d000000000000000000000000000000000000000000000000000000008152fd5b50828714156117d0565b503461000e576040807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57600480359061198f82610567565b6024359261199c84610567565b6119a533612059565b6119ad61403b565b80519073ffffffffffffffffffffffffffffffffffffffff60009516945b828110611a295783517f70a08231000000000000000000000000000000000000000000000000000000008152308187019081526108819190899089906020908490819083010381845afa928315610d3d57600093610d0d5750614e19565b611a53610bf7611a39838561285d565b5173ffffffffffffffffffffffffffffffffffffffff1690565b8614611a6757611a62906127f7565b6119cb565b505050517f093e1cdb000000000000000000000000000000000000000000000000000000008152fd5b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576020610700612750565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576020610700613452565b503461000e576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610b8c57611b3e33612178565b80611b61610bf760365473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290602090829060249082905afa908115611c6d575b8291611c4f575b50611bcc610bf760675473ffffffffffffffffffffffffffffffffffffffff1690565b90813b15611c4b576040517fe2bbb15800000000000000000000000000000000000000000000000000000000815260006004820152602481019190915291908290604490829084905af18015611c3e575b611c2b575b50610b7961424d565b80610d57611c3892610330565b38611c22565b611c4661270e565b611c1d565b5050fd5b611c67915060203d8111610d3657610d278183610389565b38611ba9565b611c7561270e565b611ba2565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57610881602435600435611cbc82610567565b806000526001602052611cd86001604060002001543390612297565b61256d565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602073ffffffffffffffffffffffffffffffffffffffff60345416604051908152f35b503461000e5760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57600435611d6c81610567565b67ffffffffffffffff9060243582811161000e57611d8e9036906004016111ff565b60443583811161000e57611da690369060040161121d565b60643590611db382610567565b60843594851161000e57611dce61088195369060040161121d565b9260a43594611ddc86610567565b6128ef565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57602073ffffffffffffffffffffffffffffffffffffffff60695416604051908152f35b90611e4760209282815194859201610f62565b0190565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f10c15aae13326e9b33c92ffbb94efb7492c500f0cca324caca9bd1aca194ed1860205260409020547ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab9160019160ff1615611ec257505050565b73ffffffffffffffffffffffffffffffffffffffff611ee19116614cdc565b91611eea614bea565b916030611ef684614c05565b536078611f0284614c1b565b536041905b808211611ffc57611ff86037611fc687611f9a88611f258915614c77565b611f946040519586947f416363657373436f6e74726f6c3a206163636f756e74200000000000000000006020870152611f67815180926020858a019101610f62565b8501016011907f206973206d697373696e6720726f6c652000000000000000000000000000000081520190565b90611e34565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610389565b6040519182917f08c379a000000000000000000000000000000000000000000000000000000000835260048301610f85565b0390fd5b9091807f3031323334353637383961626364656600000000000000000000000000000000600f6120469316601081101561204c575b1a61203c8587614c2c565b5360041c92614c4b565b90611f07565b61205461282d565b612031565b73ffffffffffffffffffffffffffffffffffffffff811660009081527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db60205260409020547f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419160019160ff16156120d057505050565b73ffffffffffffffffffffffffffffffffffffffff6120ef9116614cdc565b916120f8614bea565b91603061210484614c05565b53607861211084614c1b565b536041905b80821161213357611ff86037611fc687611f9a88611f258915614c77565b9091807f3031323334353637383961626364656600000000000000000000000000000000600f6121729316601081101561204c571a61203c8587614c2c565b90612115565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f21d442261a7cc2346fd3ca5e1f22fe015f6b71188f57ab4761df2e3faed3703f60205260409020547f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c9160019160ff16156121ef57505050565b73ffffffffffffffffffffffffffffffffffffffff61220e9116614cdc565b91612217614bea565b91603061222384614c05565b53607861222f84614c1b565b536041905b80821161225257611ff86037611fc687611f9a88611f258915614c77565b9091807f3031323334353637383961626364656600000000000000000000000000000000600f6122919316601081101561204c571a61203c8587614c2c565b90612234565b9081600052600160205260ff6122d18260406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b5416156122dc575050565b611fc6611ff892611f9a61231061230a73ffffffffffffffffffffffffffffffffffffffff60489616614cdc565b92614d9e565b6040519485937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000006020860152612350815180926020603789019101610f62565b84017f206973206d697373696e6720726f6c652000000000000000000000000000000060378201520190611e34565b73ffffffffffffffffffffffffffffffffffffffff811660009081527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db602052604081207f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419060ff905b5416156123f557505050565b808252600160205261242a83604084209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d73ffffffffffffffffffffffffffffffffffffffff3394169280a4565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f10c15aae13326e9b33c92ffbb94efb7492c500f0cca324caca9bd1aca194ed18602052604081207ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab9060ff906123e9565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f21d442261a7cc2346fd3ca5e1f22fe015f6b71188f57ab4761df2e3faed3703f602052604081207f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c9060ff906123e9565b600090808252600160205260ff6125a784604085209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54166125b257505050565b80825260016020526125e783604084209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b73ffffffffffffffffffffffffffffffffffffffff3394169280a4565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b906301e133809182810292818404149015171561269457565b61059261264b565b9061251c9182810292818404149015171561269457565b90620f42409182810292818404149015171561269457565b906b0de0b6b39983494c589c00009182810292818404149015171561269457565b8181029291811591840414171561269457565b9081602091031261000e575190565b506040513d6000823e3d90fd5b906001820180921161269457565b906b033b2e3c9fd0803ce800000091820180921161269457565b9190820180921161269457565b6024602073ffffffffffffffffffffffffffffffffffffffff60365416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9081156127ea575b6000916127cc575b506127b8613452565b81018091116127c45790565b61121a61264b565b6127e4915060203d8111610d3657610d278183610389565b386127af565b6127f261270e565b6127a7565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612825570190565b611e4761264b565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015612872575b60051b010190565b61287a61282d565b61286a565b9190811015612890575b60051b0190565b61289861282d565b612889565b3d156128c8573d906128ae826103ca565b916128bc6040519384610389565b82523d6000602084013e565b606090565b9190820391821161269457565b9081602091031261000e575161121a81610567565b906128fd9594939291612b5e565b612ac3612922610bf760365473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f8948874900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9190911660048201526020733520d5a913427e6f0d6a83e07ccd4a4da316e4d38183602481845afa928315612b51575b600093612b2c575b5081612a6b916129f773ffffffffffffffffffffffffffffffffffffffff80961673ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006067541617606755565b612a19610bf760365473ffffffffffffffffffffffffffffffffffffffff1690565b9060405180809581947f1b3005820000000000000000000000000000000000000000000000000000000083526004830191909173ffffffffffffffffffffffffffffffffffffffff6020820193169052565b03915afa918215612b1f575b600092612af2575b50501673ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006066541617606655565b612acb613d6a565b610592612aed60365473ffffffffffffffffffffffffffffffffffffffff1690565b614f30565b612b119250803d10612b18575b612b098183610389565b8101906128da565b3880612a7f565b503d612aff565b612b2761270e565b612a77565b612a6b919350612b498391823d8411612b1857612b098183610389565b939150612995565b612b5961270e565b61298d565b94929093916000549460ff8660081c169586600014612cae5750303b155b15612c2a57612b9195159687612bc457612eb1565b612b9757565b6105927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff60005416600055565b612bf56101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff6000541617600055565b612c2560017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006000541617600055565b612eb1565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152fd5b60ff1615612b7c565b601f8111612cc3575050565b600090603382527f82a75bdeeae8604d839476ae9efd8b0e15aa447e21bfd7f41283bb54e22c9a82906020601f850160051c83019410612d1e575b601f0160051c01915b828110612d1357505050565b818155600101612d07565b9092508290612cfe565b90815167ffffffffffffffff8111612e6c575b612d4f81612d4a603354610f0f565b612cb7565b602080601f8311600114612da85750819293600092612d9d575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c191617603355565b015190503880612d69565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0831694612df960336000527f82a75bdeeae8604d839476ae9efd8b0e15aa447e21bfd7f41283bb54e22c9a8290565b926000905b878210612e54575050836001959610612e1d575b505050811b01603355565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055388080612e12565b80600185968294968601518155019501930190612dfe565b612e74610300565b612d3b565b9081602091031261000e575160ff8116810361000e5790565b60ff16604d8111612ea4575b600a0a90565b612eac61264b565b612e9e565b94612efb909492919473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006038541617603855565b612f408573ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006035541617603555565b613099612f68610bf7610bf760355473ffffffffffffffffffffffffffffffffffffffff1690565b9461309460405180977fdc4c90d300000000000000000000000000000000000000000000000000000000825281600460209a8b935afa908115613265575b600091613248575b50603480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff928316179055600488613015610bf760345473ffffffffffffffffffffffffffffffffffffffff1690565b604051928380927ffc0c546a0000000000000000000000000000000000000000000000000000000082525afa90811561323b575b60009161321e575b501673ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006036541617603655565b612d28565b6130c36130be610bf760345473ffffffffffffffffffffffffffffffffffffffff1690565b61237f565b80519060005b828110613205575050506130dc82612491565b80519060005b8281106131e75750505061318a610592939261310361318f936130be613272565b61310c846124ff565b613114613312565b61311c6133b2565b600481613147610bf7610bf7610bf760365473ffffffffffffffffffffffffffffffffffffffff1690565b604051928380927f313ce5670000000000000000000000000000000000000000000000000000000082525afa9182156131da575b6000926131ad575b5050612e92565b603755565b60365473ffffffffffffffffffffffffffffffffffffffff16615028565b6131cc9250803d106131d3575b6131c48183610389565b810190612e79565b3880613183565b503d6131ba565b6131e261270e565b61317b565b806118bc6131fb611a39613200948661285d565b612491565b6130e2565b806118bc6130be611a39613219948661285d565b6130c9565b6132359150893d8b11612b1857612b098183610389565b38613051565b61324361270e565b613049565b61325f9150883d8a11612b1857612b098183610389565b38612fae565b61326d61270e565b612fa6565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab600081815260016020527f10c15aae13326e9b33c92ffbb94efb7492c500f0cca324caca9bd1aca194ed19547f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419283927fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9080a4600160406000200155565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041600081815260016020527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5dc547f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c9283927fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9080a4600160406000200155565b7f928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c600081815260016020527f21d442261a7cc2346fd3ca5e1f22fe015f6b71188f57ab4761df2e3faed37040547f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419283927fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9080a4600160406000200155565b602461345c614489565b602073ffffffffffffffffffffffffffffffffffffffff60675416604051938480927f3af9e6690000000000000000000000000000000000000000000000000000000082523060048301525afa9182156134e6575b6000926134c6575b5081018091116127c45790565b6134df91925060203d8111610d3657610d278183610389565b90386134b9565b6134ee61270e565b6134b1565b7f80000000000000000000000000000000000000000000000000000000000000008114613521575b60000390565b61352961264b565b61351b565b8115613538570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b9081602091031261000e575180600b0b810361000e5790565b61121a6135a5610bf760665473ffffffffffffffffffffffffffffffffffffffff1690565b60405180917f18160ddd00000000000000000000000000000000000000000000000000000000825281600460209485935afa9081156137d8575b6000916137bb575b5060675490604051907ffea61faa000000000000000000000000000000000000000000000000000000008252838260048173ffffffffffffffffffffffffffffffffffffffff87165afa9182156137ae575b60009261378f575b5060009282613658575b50505090506114d36145bc565b613715856137469661367361150e611500886114fb896126cb565b613695610bf760655473ffffffffffffffffffffffffffffffffffffffff1690565b6136b7610bf760365473ffffffffffffffffffffffffffffffffffffffff1690565b6040518096819482937fd50c08f80000000000000000000000000000000000000000000000000000000084526004840190929163ffffffff60209173ffffffffffffffffffffffffffffffffffffffff604085019616845216910152565b03915afa958615613782575b9561374f575b505060a01c63ffffffff16926bffffffffffffffffffffffff166137e5565b8038808061364b565b6bffffffffffffffffffffffff92955063ffffffff918161377b92903d1061162e5761161e8183610389565b9491613727565b61378a61270e565b613721565b6137a7919250843d8611610d3657610d278183610389565b9038613641565b6137b661270e565b613639565b6137d29150823d8411610d3657610d278183610389565b386135e7565b6137e061270e565b6135df565b6137ff613820936114fb633b9aca00969461381a946126ec565b63ffffffff63ee6b2800931683039083821161385a576126ec565b04613867565b7ffffffffffffffffffffffffffffffffffffffffffcc4d1c3602f7fc318000000810190811161384e570490565b61385661264b565b0490565b61386261264b565b6126ec565b801561393d578061390461387e8261121a946126ec565b916139046138ff60066b019d971e4fe8401e7400000095868101809111613930575b6b033b2e3c9fd0803ce8000000809104966138bb86896126ec565b908101809111613923575b04660388828f7b0c809680880297880403613916575b6906a4333ec90a9e8da7009080820291820403613909575b049460011c9261267b565b612729565b612743565b61391161264b565b6138f4565b61391e61264b565b6138dc565b61392b61264b565b6138c6565b61393861264b565b6138a0565b506b033b2e3c9fd0803ce800000090565b613956614489565b613978610bf760675473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f3af9e6690000000000000000000000000000000000000000000000000000000081523060048201526020939092918490849060249082905afa928315613d41575b600093613d22575b506036546040517f70a08231000000000000000000000000000000000000000000000000000000008082523060048301529473ffffffffffffffffffffffffffffffffffffffff9491929091908516908784602481855afa938415613d15575b600094613cec575b508361390484613a3c93612743565b808511613ce4575b5083831015613cb85750613a70610bf760365473ffffffffffffffffffffffffffffffffffffffff1690565b928660405180958882528180613aa160048201907327182842e098f60e3d576794a5bffb0777e025d3602083019252565b03915afa938415613cab575b600094613c8c575b5060018411613b6a575b5050505082613ae360365473ffffffffffffffffffffffffffffffffffffffff1690565b60405193845230600485015292918290602490829086165afa928315613b5d575b600093613b38575b50508161121a91613b3260355473ffffffffffffffffffffffffffffffffffffffff1690565b90614e19565b61121a9293509081613b5592903d10610d3657610d278183610389565b919038613b0c565b613b6561270e565b613b04565b82613b74916128cd565b926000818511613c68575050613b8a8282612743565b600090841115613c605750613ba891613ba291612743565b826128cd565b80613c50575b50613bd1610bf760675473ffffffffffffffffffffffffffffffffffffffff1690565b803b1561000e576040517f441a3e70000000000000000000000000000000000000000000000000000000008152600060048201819052602482019390935291908290604490829084905af18015613c43575b613c30575b808080613abf565b80610d57613c3d92610330565b38613c28565b613c4b61270e565b613c23565b613c5990614377565b5038613bae565b915050613ba8565b92509250808311600014613c8657613c819150826128cd565b613ba8565b50613ba8565b613ca4919450873d8911610d3657610d278183610389565b9238613ab5565b613cb361270e565b613aad565b929550505061121a9250839150613b3260355473ffffffffffffffffffffffffffffffffffffffff1690565b935038613a44565b83945090613904613d0c613a3c938b3d8d11610d3657610d278183610389565b95505090613a2d565b613d1d61270e565b613a25565b613d3a919350843d8611610d3657610d278183610389565b91386139c5565b613d4961270e565b6139bd565b9081602091031261000e575163ffffffff8116810361000e5790565b610592613e6d613f4d613e06613d98610bf760365473ffffffffffffffffffffffffffffffffffffffff1690565b613ed973ffffffffffffffffffffffffffffffffffffffff6040519586937fb409dd9b000000000000000000000000000000000000000000000000000000008552602097889687926004830191909173ffffffffffffffffffffffffffffffffffffffff6020820193169052565b03948181733520d5a913427e6f0d6a83e07ccd4a4da316e4d39781895afa90811561402e575b600091614011575b50604051809381927fcab65f01000000000000000000000000000000000000000000000000000000008352600483019190602083019252565b03817327182842e098f60e3d576794a5bffb0777e025d35afa908115614004575b600091613fe7575b501673ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006065541617606555565b613efb610bf760365473ffffffffffffffffffffffffffffffffffffffff1690565b9060405180809581947fb74b1ed50000000000000000000000000000000000000000000000000000000083526004830191909173ffffffffffffffffffffffffffffffffffffffff6020820193169052565b03915afa918215613fda575b600092613fad575b50507fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff77ffffffff00000000000000000000000000000000000000006067549260a01b16911617606755565b613fcc9250803d10613fd3575b613fc48183610389565b810190613d4e565b3880613f61565b503d613fba565b613fe261270e565b613f59565b613ffe9150853d8711612b1857612b098183610389565b38613e96565b61400c61270e565b613e8e565b6140289150823d8411610d3657610d278183610389565b38613e34565b61403661270e565b613e2c565b6040516060810181811067ffffffffffffffff8211176140bc575b6040526002815260208101604036823773ffffffffffffffffffffffffffffffffffffffff908160365416908351156140af575b52606754168151600110156140a2575b604082015290565b6140aa61282d565b61409a565b6140b761282d565b61408a565b6140c4610300565b614056565b9361059297936140e0938798979361413a976128ef565b73ffffffffffffffffffffffffffffffffffffffff80931690837fffffffffffffffffffffffff00000000000000000000000000000000000000009183836068541617606855169060695416176069558260675416615028565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff831660248201526141ba9060208160448173d9fcd98c322942075a5c3860693e9f4f03aae07b5afa908115614240575b600091614222575b5015614ea5565b604051917f095ea7b30000000000000000000000000000000000000000000000000000000060208401521660248201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60448201526044815261421d8161036d565b6153be565b61423a915060203d8111610d3657610d278183610389565b386141b3565b61424861270e565b6141ab565b61426f610bf760685473ffffffffffffffffffffffffffffffffffffffff1690565b614291610bf760675473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529190602090839060249082905afa91821561436a575b60009261434a575b50803b1561000e576040517fa694fc3a00000000000000000000000000000000000000000000000000000000815260048101929092526000908290818381602481015b03925af1801561433d575b6143305750565b80610d5761059292610330565b61434561270e565b614329565b61436391925060203d8111610d3657610d278183610389565b90386142db565b61437261270e565b6142d3565b6143db60206143f5926143a2610bf760675473ffffffffffffffffffffffffffffffffffffffff1690565b60405180809581947f52eac8af000000000000000000000000000000000000000000000000000000008352600483019190602083019252565b03915afa90811561447c575b60009161445e575b5061271b565b90614418610bf760685473ffffffffffffffffffffffffffffffffffffffff1690565b803b1561000e57600060405180927f2e1a7d4d00000000000000000000000000000000000000000000000000000000825281838161431e89600483019190602083019252565b614476915060203d8111610d3657610d278183610389565b386143ef565b61448461270e565b6143e7565b6144ab610bf760685473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526020916145579183918290829060249082905afa9081156145af575b600091614592575b5061451e610bf760675473ffffffffffffffffffffffffffffffffffffffff1690565b60405180809581947f010ad6d1000000000000000000000000000000000000000000000000000000008352600483019190602083019252565b03915afa918215614585575b60009261456f57505090565b61121a9250803d10610d3657610d278183610389565b61458d61270e565b614563565b6145a99150823d8411610d3657610d278183610389565b386144fb565b6145b761270e565b6144f3565b6145de610bf760685473ffffffffffffffffffffffffffffffffffffffff1690565b6146c0604051917febe2b12b0000000000000000000000000000000000000000000000000000000083526020928381600481855afa908115614803575b6000916147e6575b5083614647610bf760675473ffffffffffffffffffffffffffffffffffffffff1690565b604051907f18160ddd0000000000000000000000000000000000000000000000000000000082528282600481885afa9182156147d9575b6000926147ba575b5060405180809781947f010ad6d1000000000000000000000000000000000000000000000000000000008352600483019190602083019252565b03915afa9283156147ad575b60009361478e575b504210801590614786575b61477e5761474c61474761474261473d86600461121a986114fb97604051928380927f7b0a47ee0000000000000000000000000000000000000000000000000000000082525afa918215614771575b600092614754575b505061267b565b614a40565b61269c565b6126b3565b612710900490565b61476a9250803d10610d3657610d278183610389565b3880614736565b61477961270e565b61472e565b505050600090565b5081156146df565b6147a6919350843d8611610d3657610d278183610389565b91386146d4565b6147b561270e565b6146cc565b6147d2919250833d8511610d3657610d278183610389565b9038614686565b6147e161270e565b61467e565b6147fd9150843d8611610d3657610d278183610389565b38614623565b61480b61270e565b61461b565b614832610bf760685473ffffffffffffffffffffffffffffffffffffffff1690565b604051907febe2b12b0000000000000000000000000000000000000000000000000000000082526020928383600481855afa928315614a33575b600093614a10575b50614915908461489c610bf760675473ffffffffffffffffffffffffffffffffffffffff1690565b604051907f18160ddd0000000000000000000000000000000000000000000000000000000082528282600481895afa918215614a03575b6000926149e4575b5060405180809681947f010ad6d1000000000000000000000000000000000000000000000000000000008352600483019190602083019252565b03915afa9182156149d7575b6000926149b8575b5081600082126149a45761493d9250612743565b915b42108015906147865761477e5761474c61474761474261473d86600461121a986114fb97604051928380927f7b0a47ee0000000000000000000000000000000000000000000000000000000082525afa9182156147715760009261475457505061267b565b50906116506149b2926134f3565b9161493f565b6149d0919250853d8711610d3657610d278183610389565b9038614929565b6149df61270e565b614921565b6149fc919250833d8511610d3657610d278183610389565b90386148db565b614a0b61270e565b6148d3565b614915919350614a2c90853d8711610d3657610d278183610389565b9290614874565b614a3b61270e565b61486c565b60409081517f41976e0900000000000000000000000000000000000000000000000000000000815273d9fcd98c322942075a5c3860693e9f4f03aae07b600482015282816024817359828fdf7ee634aaad3f58b19fdba3b03e2d9d805afa908115614bc6575b600091614b91575b50670de0b6b3a7640000614ac660a0926004946126ec565b049273ffffffffffffffffffffffffffffffffffffffff606954169051928380927ffeaf968c0000000000000000000000000000000000000000000000000000000082525afa908115614b84575b600091614b2c575b506305f5e10091613856916126ec565b9060a0823d8211614b7c575b81614b4560a09383610389565b81010312610b8c57506305f5e1009181614b6161385693614bd3565b50614b73608060208301519201614bd3565b50915091614b1c565b3d9150614b38565b614b8c61270e565b614b14565b908382813d8311614bbf575b614ba78183610389565b81010312610b8c575051670de0b6b3a7640000614aae565b503d614b9d565b614bce61270e565b614aa6565b519069ffffffffffffffffffff8216820361000e57565b60405190614bf78261036d565b604282526060366020840137565b602090805115614c13570190565b611e4761282d565b602190805160011015614c13570190565b906020918051821015614c3e57010190565b614c4661282d565b010190565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908015612825570190565b15614c7e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b604051906060820182811067ffffffffffffffff821117614d91575b604052602a825260403660208401376030614d1283614c05565b536078614d1e83614c1b565b536029905b60018211614d365761121a915015614c77565b807f3031323334353637383961626364656600000000000000000000000000000000600f614d7e93166010811015614d84575b1a614d748486614c2c565b5360041c91614c4b565b90614d23565b614d8c61282d565b614d69565b614d99610300565b614cf8565b614da6614bea565b906030614db283614c05565b536078614dbe83614c1b565b536041905b60018211614dd65761121a915015614c77565b807f3031323334353637383961626364656600000000000000000000000000000000600f614e1393166010811015614d84571a614d748486614c2c565b90614dc3565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff9092166024830152604482019290925261059291614ea082606481015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101845283610389565b6154e5565b15614eac57565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152fd5b61059290614fb16040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201527327182842e098f60e3d576794a5bffb0777e025d3602482015260208160448173ffffffffffffffffffffffffffffffffffffffff87165afa90811561424057600091614222575015614ea5565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000060208201527327182842e098f60e3d576794a5bffb0777e025d360248201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604482015290614ea08260648101614e74565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015261059293929161509b906020816044818787165afa90811561424057600091614222575015614ea5565b604051927f095ea7b30000000000000000000000000000000000000000000000000000000060208501521660248301527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604483015260448252614ea08261036d565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff83166024820152610592939092906020848060448101038173ffffffffffffffffffffffffffffffffffffffff87165afa93841561521b575b6000946151f5575b5090614ea09184018094116151e8575b6040517f095ea7b300000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff909116602482015260448101939093528260648101614e74565b6151f061264b565b615190565b614ea0929194506152139060203d8111610d3657610d278183610389565b939091615180565b61522361270e565b615178565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8316602482015292916020848060448101038173ffffffffffffffffffffffffffffffffffffffff86165afa9384156153b1575b600094615391575b5082841061530d576040517f095ea7b300000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff909116602482015291909203604482015261059291614ea08260648101614e74565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5361666545524332303a2064656372656173656420616c6c6f77616e6365206260448201527f656c6f77207a65726f00000000000000000000000000000000000000000000006064820152fd5b6153aa91945060203d8111610d3657610d278183610389565b92386152a5565b6153b961270e565b61529d565b604051906153cb82610351565b6154296020928381527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656484820152600080848682965191018273d9fcd98c322942075a5c3860693e9f4f03aae07b5af161542361289d565b90615552565b805180615437575b50505050565b818491810103126154e15782015190811591821503610b8c575061545d57808080615431565b608490604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b5080fd5b73ffffffffffffffffffffffffffffffffffffffff169061542960405161550b81610351565b6020938482527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858301526000808587829751910182855af161554c61289d565b91615627565b909190156155e157508051156155655790565b73d9fcd98c322942075a5c3860693e9f4f03aae07b3b156155835790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8151156155f15750805190602001fd5b611ff8906040519182917f08c379a000000000000000000000000000000000000000000000000000000000835260048301610f85565b91929015615644575081511561563b575090565b3b156155835790565b8251909150156155f15750805190602001fdfea2646970667358221220972b631001f0cb88c0501937d265f2d30e17018fdc744ff7130be8a85723c2ca64736f6c63430008110033", + "nonce": "0x3b3", + "accessList": [] + }, + "additionalContracts": [] + }, + { + "hash": "0x9e6c568c190380937ad2ccc86b6c5fa03204cc1c291cd86e02e80b72c155931a", + "transactionType": "CREATE", + "contractName": "TransparentUpgradeableProxy", + "contractAddress": "0xf5aD02F3DbBF4b42DEE1f1255607f929CA2a7c5a", + "function": null, + "arguments": [ + "0x2A729024be86FC692cC02b08f461a56A175b88dC", + "0x1D941EF0D3Bba4ad67DBfBCeE5262F4CEE53A32b", + "0xa25b26be000000000000000000000000bfa4459868c60da9edd835f0be684edec054557b000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001800000000000000000000000001111111254eeb25477b68fb85ed929f73a960582000000000000000000000000e5afe81e63f0a52a3a03b922b30f73b8ce74d5700000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419000000000000000000000000000000000000000000000000000000000000001845756c6572205374616b6572204c656e646572205553444300000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe" + ], + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x1cccba", + "value": "0x0", + "data": "0x60406080815262000f548038038062000018816200030b565b9283398101906060818303126200030657620000348162000347565b916020926200004584840162000347565b8584015190936001600160401b0391908282116200030657019280601f850112156200030657835193620000836200007d866200035c565b6200030b565b948086528786019288828401011162000306578288620000a4930162000378565b823b15620002ac577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b03199081166001600160a01b0386811691821790935590959194600093909290917fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8580a2805115801590620002a4575b620001f5575b50505050507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103937f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f86865493815196818616885216958684820152a18315620001a357501617905551610afd9081620004578239f35b60849086519062461bcd60e51b82526004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152fd5b895194606086019081118682101762000290578a52602785527f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c89860152660819985a5b195960ca1b8a860152516200027a9493929183918291845af4903d1562000286573d6200026a6200007d826200035c565b90815280938a3d92013e6200039d565b5038808080806200012d565b606092506200039d565b634e487b7160e01b85526041600452602485fd5b508362000127565b865162461bcd60e51b815260048101879052602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608490fd5b600080fd5b6040519190601f01601f191682016001600160401b038111838210176200033157604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036200030657565b6001600160401b0381116200033157601f01601f191660200190565b60005b8381106200038c5750506000910152565b81810151838201526020016200037b565b91929015620004025750815115620003b3575090565b3b15620003bd5790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015620004165750805190602001fd5b6044604051809262461bcd60e51b82526020600483015262000448815180928160248601526020868601910162000378565b601f01601f19168101030190fdfe6080604052600436101561002c575b361561001f575b61001d6107b1565b005b6100276107b1565b610015565b6000803560e01c9081633659cfe614610093575080634f1ef2861461008a5780635c60da1b146100815780638f283970146100785763f851a4400361000e57610073610455565b61000e565b506100736102f0565b5061007361023b565b50610073610157565b3461012c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261012c576100ca61012f565b73ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541633146000146101235761012090610117610511565b908382526105cb565b80f35b506101206107b1565b80fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361015257565b600080fd5b5060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525761018a61012f565b60243567ffffffffffffffff9182821161015257366023830112156101525781600401359283116101525736602484840101116101525773ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416331460001461023057600060208480602461021e61021961001d99610582565b61053e565b9682885201838701378401015261070b565b50505061001d6107b1565b50346101525760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610152576020600073ffffffffffffffffffffffffffffffffffffffff90817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541633146000146102e25750807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416905b60405191168152f35b906102eb6107b1565b6102d9565b50346101525760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525761032861012f565b73ffffffffffffffffffffffffffffffffffffffff907fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610391808354163314600014610230577f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f604084549281519481851686521693846020820152a181156103d1577fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b50346101525760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610152576020600073ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038181541633146000146104d85754604051911681529050f35b506102eb6107b1565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051906020820182811067ffffffffffffffff82111761053157604052565b6105396104e1565b604052565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f604051930116820182811067ffffffffffffffff82111761053157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff81116105be575b01160190565b6105c66104e1565b6105b8565b803b156106875773ffffffffffffffffffffffffffffffffffffffff81167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc817fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a281511580159061067f575b61066a575050565b61067c916106766108dd565b9161095b565b50565b506000610662565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152fd5b803b156106875773ffffffffffffffffffffffffffffffffffffffff81167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc817fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a28151158015906107a95761066a575050565b506001610662565b5073ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354163314610833577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc54166000808092368280378136915af43d82803e1561082f573d90f35b3d90fd5b60a46040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f65740000000000000000000000000000000000000000000000000000000000006084820152fd5b604051906060820182811067ffffffffffffffff82111761094e575b604052602782527f206661696c6564000000000000000000000000000000000000000000000000006040837f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c60208201520152565b6109566104e1565b6108f9565b6000806109909493602081519101845af43d15610993573d9161098061021984610582565b9283523d6000602085013e610a00565b90565b606091610a00565b156109a257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b91929015610a205750815115610a14575090565b610990903b151561099b565b825190915015610a335750805190602001fd5b604051907f08c379a000000000000000000000000000000000000000000000000000000000825281602080600483015282519283602484015260005b848110610ab0575050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000604480968601015201168101030190fd5b818101830151868201604401528593508201610a6f56fea26469706673582212201c39b75ea59593d8670f804896fbda9470452421c2de5834b8a62b5fdb34806664736f6c634300081100330000000000000000000000002a729024be86fc692cc02b08f461a56a175b88dc0000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001e4a25b26be000000000000000000000000bfa4459868c60da9edd835f0be684edec054557b000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d43000000000000000000000000000000000000000000000000000000000000001800000000000000000000000001111111254eeb25477b68fb85ed929f73a960582000000000000000000000000e5afe81e63f0a52a3a03b922b30f73b8ce74d5700000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419000000000000000000000000000000000000000000000000000000000000001845756c6572205374616b6572204c656e646572205553444300000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe00000000000000000000000000000000000000000000000000000000", + "nonce": "0x3b4", + "accessList": [] + }, + "additionalContracts": [] + } + ], + "receipts": [ + { + "transactionHash": "0x5382fd037f49f38aead835fdd346291ef48fc0807d3b24492cac6929d1e5f2d9", + "transactionIndex": "0xa", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0x653503", + "gasUsed": "0x44c47a", + "contractAddress": "0xa693aBabF230397B3e6385ff7eE09607f562af8c", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x7a69e74a7" + }, + { + "transactionHash": "0xb15f678d8fe2bd3a0bd0f347863d1458112e94b2553214497ecceed33f6734e0", + "transactionIndex": "0x2c", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0xa3d136", + "gasUsed": "0x11118e", + "contractAddress": "0xBfa4459868C60da9edd835F0be684EDeC054557b", + "logs": [ + { + "address": "0xBfa4459868C60da9edd835F0be684EDeC054557b", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000a693ababf230397b3e6385ff7ee09607f562af8c" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0xb15f678d8fe2bd3a0bd0f347863d1458112e94b2553214497ecceed33f6734e0", + "transactionIndex": "0x2c", + "logIndex": "0x6f", + "removed": false + }, + { + "address": "0xBfa4459868C60da9edd835F0be684EDeC054557b", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d430", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0xb15f678d8fe2bd3a0bd0f347863d1458112e94b2553214497ecceed33f6734e0", + "transactionIndex": "0x2c", + "logIndex": "0x70", + "removed": false + }, + { + "address": "0xBfa4459868C60da9edd835F0be684EDeC054557b", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c8", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0xb15f678d8fe2bd3a0bd0f347863d1458112e94b2553214497ecceed33f6734e0", + "transactionIndex": "0x2c", + "logIndex": "0x71", + "removed": false + }, + { + "address": "0xBfa4459868C60da9edd835F0be684EDeC054557b", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe562", + "0x000000000000000000000000e9f183fc656656f1f17af1f2b0df79b8ff9ad8ed", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0xb15f678d8fe2bd3a0bd0f347863d1458112e94b2553214497ecceed33f6734e0", + "transactionIndex": "0x2c", + "logIndex": "0x72", + "removed": false + }, + { + "address": "0xBfa4459868C60da9edd835F0be684EDeC054557b", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe562", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe562" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0xb15f678d8fe2bd3a0bd0f347863d1458112e94b2553214497ecceed33f6734e0", + "transactionIndex": "0x2c", + "logIndex": "0x73", + "removed": false + }, + { + "address": "0xBfa4459868C60da9edd835F0be684EDeC054557b", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe562" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0xb15f678d8fe2bd3a0bd0f347863d1458112e94b2553214497ecceed33f6734e0", + "transactionIndex": "0x2c", + "logIndex": "0x74", + "removed": false + }, + { + "address": "0xBfa4459868C60da9edd835F0be684EDeC054557b", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0xb15f678d8fe2bd3a0bd0f347863d1458112e94b2553214497ecceed33f6734e0", + "transactionIndex": "0x2c", + "logIndex": "0x75", + "removed": false + }, + { + "address": "0xBfa4459868C60da9edd835F0be684EDeC054557b", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0xb15f678d8fe2bd3a0bd0f347863d1458112e94b2553214497ecceed33f6734e0", + "transactionIndex": "0x2c", + "logIndex": "0x76", + "removed": false + }, + { + "address": "0xBfa4459868C60da9edd835F0be684EDeC054557b", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0xb15f678d8fe2bd3a0bd0f347863d1458112e94b2553214497ecceed33f6734e0", + "transactionIndex": "0x2c", + "logIndex": "0x77", + "removed": false + }, + { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000bfa4459868c60da9edd835f0be684edec054557b", + "0x000000000000000000000000e9f183fc656656f1f17af1f2b0df79b8ff9ad8ed" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0xb15f678d8fe2bd3a0bd0f347863d1458112e94b2553214497ecceed33f6734e0", + "transactionIndex": "0x2c", + "logIndex": "0x78", + "removed": false + }, + { + "address": "0xBfa4459868C60da9edd835F0be684EDeC054557b", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0xb15f678d8fe2bd3a0bd0f347863d1458112e94b2553214497ecceed33f6734e0", + "transactionIndex": "0x2c", + "logIndex": "0x79", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000004800004000800000000000000582000080000000002000002000000000000000000000000008000001000000000000000000000000000000000200000000020100000000008000000002003000000000000000000000000000000000000000000020000400000000000000800000000800000400000000000000000000200000000000000000000400010010100100002010000000000000200a04000020000000000200000000000000000000000020000000000001000000000081000000020020000000000000000000000000900000400000100000000000020000010040000002000000200000000002000000000000000000000000000040000", + "type": "0x2", + "effectiveGasPrice": "0x7a69e74a7" + }, + { + "transactionHash": "0xf943e18b4748f5a473cf0c8f62fbcf23b832e025207bbaafa5120fb571732208", + "transactionIndex": "0x2d", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0xe45e1a", + "gasUsed": "0x408ce4", + "contractAddress": "0xDeEe844C6992F36ADAC59cF38d1F790B2a0313e2", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x7a69e74a7" + }, + { + "transactionHash": "0x64173877fc5a6e2f36eb7b7d68cd8ed8f91ab9ae4b88f77c34fe17dfbcac74bc", + "transactionIndex": "0x2e", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0xf820dc", + "gasUsed": "0x13c2c2", + "contractAddress": "0xE2773fB045e53De5344f245E03eA614AF1064Ce3", + "logs": [ + { + "address": "0xE2773fB045e53De5344f245E03eA614AF1064Ce3", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000deee844c6992f36adac59cf38d1f790b2a0313e2" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x64173877fc5a6e2f36eb7b7d68cd8ed8f91ab9ae4b88f77c34fe17dfbcac74bc", + "transactionIndex": "0x2e", + "logIndex": "0x7a", + "removed": false + }, + { + "address": "0xE2773fB045e53De5344f245E03eA614AF1064Ce3", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x000000000000000000000000e9f183fc656656f1f17af1f2b0df79b8ff9ad8ed", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x64173877fc5a6e2f36eb7b7d68cd8ed8f91ab9ae4b88f77c34fe17dfbcac74bc", + "transactionIndex": "0x2e", + "logIndex": "0x7b", + "removed": false + }, + { + "address": "0xE2773fB045e53De5344f245E03eA614AF1064Ce3", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c8", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x64173877fc5a6e2f36eb7b7d68cd8ed8f91ab9ae4b88f77c34fe17dfbcac74bc", + "transactionIndex": "0x2e", + "logIndex": "0x7c", + "removed": false + }, + { + "address": "0xE2773fB045e53De5344f245E03eA614AF1064Ce3", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x0000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d430", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x64173877fc5a6e2f36eb7b7d68cd8ed8f91ab9ae4b88f77c34fe17dfbcac74bc", + "transactionIndex": "0x2e", + "logIndex": "0x7d", + "removed": false + }, + { + "address": "0xE2773fB045e53De5344f245E03eA614AF1064Ce3", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x64173877fc5a6e2f36eb7b7d68cd8ed8f91ab9ae4b88f77c34fe17dfbcac74bc", + "transactionIndex": "0x2e", + "logIndex": "0x7e", + "removed": false + }, + { + "address": "0xE2773fB045e53De5344f245E03eA614AF1064Ce3", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x64173877fc5a6e2f36eb7b7d68cd8ed8f91ab9ae4b88f77c34fe17dfbcac74bc", + "transactionIndex": "0x2e", + "logIndex": "0x7f", + "removed": false + }, + { + "address": "0xE2773fB045e53De5344f245E03eA614AF1064Ce3", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x64173877fc5a6e2f36eb7b7d68cd8ed8f91ab9ae4b88f77c34fe17dfbcac74bc", + "transactionIndex": "0x2e", + "logIndex": "0x80", + "removed": false + }, + { + "address": "0xE2773fB045e53De5344f245E03eA614AF1064Ce3", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d430", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x64173877fc5a6e2f36eb7b7d68cd8ed8f91ab9ae4b88f77c34fe17dfbcac74bc", + "transactionIndex": "0x2e", + "logIndex": "0x81", + "removed": false + }, + { + "address": "0xE2773fB045e53De5344f245E03eA614AF1064Ce3", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c", + "0x000000000000000000000000bfa4459868c60da9edd835f0be684edec054557b", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x64173877fc5a6e2f36eb7b7d68cd8ed8f91ab9ae4b88f77c34fe17dfbcac74bc", + "transactionIndex": "0x2e", + "logIndex": "0x82", + "removed": false + }, + { + "address": "0xE2773fB045e53De5344f245E03eA614AF1064Ce3", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x64173877fc5a6e2f36eb7b7d68cd8ed8f91ab9ae4b88f77c34fe17dfbcac74bc", + "transactionIndex": "0x2e", + "logIndex": "0x83", + "removed": false + }, + { + "address": "0xE2773fB045e53De5344f245E03eA614AF1064Ce3", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x64173877fc5a6e2f36eb7b7d68cd8ed8f91ab9ae4b88f77c34fe17dfbcac74bc", + "transactionIndex": "0x2e", + "logIndex": "0x84", + "removed": false + }, + { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000e2773fb045e53de5344f245e03ea614af1064ce3", + "0x000000000000000000000000bfa4459868c60da9edd835f0be684edec054557b" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x64173877fc5a6e2f36eb7b7d68cd8ed8f91ab9ae4b88f77c34fe17dfbcac74bc", + "transactionIndex": "0x2e", + "logIndex": "0x85", + "removed": false + }, + { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000e2773fb045e53de5344f245e03ea614af1064ce3", + "0x00000000000000000000000039aa39c021dfbae8fac545936693ac917d5e7563" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x64173877fc5a6e2f36eb7b7d68cd8ed8f91ab9ae4b88f77c34fe17dfbcac74bc", + "transactionIndex": "0x2e", + "logIndex": "0x86", + "removed": false + }, + { + "address": "0xc00e94Cb662C3520282E6f5717214004A7f26888", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000e2773fb045e53de5344f245e03ea614af1064ce3", + "0x0000000000000000000000001111111254eeb25477b68fb85ed929f73a960582" + ], + "data": "0x0000000000000000000000000000000000000000ffffffffffffffffffffffff", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x64173877fc5a6e2f36eb7b7d68cd8ed8f91ab9ae4b88f77c34fe17dfbcac74bc", + "transactionIndex": "0x2e", + "logIndex": "0x87", + "removed": false + }, + { + "address": "0xE2773fB045e53De5344f245E03eA614AF1064Ce3", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x64173877fc5a6e2f36eb7b7d68cd8ed8f91ab9ae4b88f77c34fe17dfbcac74bc", + "transactionIndex": "0x2e", + "logIndex": "0x88", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000006800004000800002000000000482000000000000042000002000000000000080000000100000000001000080000000000000000000000000000200000080020100000080209000000000003000000000000000000000000020000000000000000028000400000000000000800000000800000400000000000000000000200000000000000000000400000000100140002010002000000000200a04000020000000000200000000000000004000000000000000000001000000100081000000030020000000000000000000000000900000400010100020000000020000010000000002000000400000080002000000000000000000000000000040000", + "type": "0x2", + "effectiveGasPrice": "0x7a69e74a7" + }, + { + "transactionHash": "0x9c0c3c8ce0dcd25ce0ed004e36dba167d476fdcbb041f3dd21fc5843d9100e87", + "transactionIndex": "0x2f", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0x14189e1", + "gasUsed": "0x496905", + "contractAddress": "0x14bA0B82f1940e35Af39c364e8Fa99408881Ae30", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x7a69e74a7" + }, + { + "transactionHash": "0x27c46748143651ee0e72af28574594a01879f37185e082c23bc0cf70d51b6ace", + "transactionIndex": "0x30", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0x1573640", + "gasUsed": "0x15ac5f", + "contractAddress": "0xe4377620697Be18E6d6aa911CA488571EeB3f081", + "logs": [ + { + "address": "0xe4377620697Be18E6d6aa911CA488571EeB3f081", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x00000000000000000000000014ba0b82f1940e35af39c364e8fa99408881ae30" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x27c46748143651ee0e72af28574594a01879f37185e082c23bc0cf70d51b6ace", + "transactionIndex": "0x30", + "logIndex": "0x89", + "removed": false + }, + { + "address": "0xe4377620697Be18E6d6aa911CA488571EeB3f081", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x000000000000000000000000e9f183fc656656f1f17af1f2b0df79b8ff9ad8ed", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x27c46748143651ee0e72af28574594a01879f37185e082c23bc0cf70d51b6ace", + "transactionIndex": "0x30", + "logIndex": "0x8a", + "removed": false + }, + { + "address": "0xe4377620697Be18E6d6aa911CA488571EeB3f081", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c8", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x27c46748143651ee0e72af28574594a01879f37185e082c23bc0cf70d51b6ace", + "transactionIndex": "0x30", + "logIndex": "0x8b", + "removed": false + }, + { + "address": "0xe4377620697Be18E6d6aa911CA488571EeB3f081", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x0000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d430", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x27c46748143651ee0e72af28574594a01879f37185e082c23bc0cf70d51b6ace", + "transactionIndex": "0x30", + "logIndex": "0x8c", + "removed": false + }, + { + "address": "0xe4377620697Be18E6d6aa911CA488571EeB3f081", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x27c46748143651ee0e72af28574594a01879f37185e082c23bc0cf70d51b6ace", + "transactionIndex": "0x30", + "logIndex": "0x8d", + "removed": false + }, + { + "address": "0xe4377620697Be18E6d6aa911CA488571EeB3f081", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x27c46748143651ee0e72af28574594a01879f37185e082c23bc0cf70d51b6ace", + "transactionIndex": "0x30", + "logIndex": "0x8e", + "removed": false + }, + { + "address": "0xe4377620697Be18E6d6aa911CA488571EeB3f081", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x27c46748143651ee0e72af28574594a01879f37185e082c23bc0cf70d51b6ace", + "transactionIndex": "0x30", + "logIndex": "0x8f", + "removed": false + }, + { + "address": "0xe4377620697Be18E6d6aa911CA488571EeB3f081", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d430", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x27c46748143651ee0e72af28574594a01879f37185e082c23bc0cf70d51b6ace", + "transactionIndex": "0x30", + "logIndex": "0x90", + "removed": false + }, + { + "address": "0xe4377620697Be18E6d6aa911CA488571EeB3f081", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c", + "0x000000000000000000000000bfa4459868c60da9edd835f0be684edec054557b", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x27c46748143651ee0e72af28574594a01879f37185e082c23bc0cf70d51b6ace", + "transactionIndex": "0x30", + "logIndex": "0x91", + "removed": false + }, + { + "address": "0xe4377620697Be18E6d6aa911CA488571EeB3f081", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x27c46748143651ee0e72af28574594a01879f37185e082c23bc0cf70d51b6ace", + "transactionIndex": "0x30", + "logIndex": "0x92", + "removed": false + }, + { + "address": "0xe4377620697Be18E6d6aa911CA488571EeB3f081", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x27c46748143651ee0e72af28574594a01879f37185e082c23bc0cf70d51b6ace", + "transactionIndex": "0x30", + "logIndex": "0x93", + "removed": false + }, + { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000e4377620697be18e6d6aa911ca488571eeb3f081", + "0x000000000000000000000000bfa4459868c60da9edd835f0be684edec054557b" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x27c46748143651ee0e72af28574594a01879f37185e082c23bc0cf70d51b6ace", + "transactionIndex": "0x30", + "logIndex": "0x94", + "removed": false + }, + { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000e4377620697be18e6d6aa911ca488571eeb3f081", + "0x0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a9" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x27c46748143651ee0e72af28574594a01879f37185e082c23bc0cf70d51b6ace", + "transactionIndex": "0x30", + "logIndex": "0x95", + "removed": false + }, + { + "address": "0x4da27a545c0c5B758a6BA100e3a049001de870f5", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000e4377620697be18e6d6aa911ca488571eeb3f081", + "0x0000000000000000000000001111111254eeb25477b68fb85ed929f73a960582" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x27c46748143651ee0e72af28574594a01879f37185e082c23bc0cf70d51b6ace", + "transactionIndex": "0x30", + "logIndex": "0x96", + "removed": false + }, + { + "address": "0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000e4377620697be18e6d6aa911ca488571eeb3f081", + "0x0000000000000000000000001111111254eeb25477b68fb85ed929f73a960582" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x27c46748143651ee0e72af28574594a01879f37185e082c23bc0cf70d51b6ace", + "transactionIndex": "0x30", + "logIndex": "0x97", + "removed": false + }, + { + "address": "0xe4377620697Be18E6d6aa911CA488571EeB3f081", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x27c46748143651ee0e72af28574594a01879f37185e082c23bc0cf70d51b6ace", + "transactionIndex": "0x30", + "logIndex": "0x98", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x000000048000040008000030000000004820000000000000022000020000000000000002000000001000000010200000000004000000000000000000002000020800201000000800080000000000030000000000000000000000000000000000000000000280004000000000000008800000008000004000000000000000000002000a0001000210000001400000000100100002010000000000000200a04200020000000000200000000000000004000000000000000000001000000000081000000020020000000000000000000000004900000400000100000000000020000010000000002000000400000000002000000000000000000000000000040000", + "type": "0x2", + "effectiveGasPrice": "0x7a69e74a7" + }, + { + "transactionHash": "0x991eef60590b3e23c89e77e2209afc0d141b0b31dcd9a0053624b2eb00d8ef6c", + "transactionIndex": "0x31", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0x1a100a0", + "gasUsed": "0x49ca60", + "contractAddress": "0x2A729024be86FC692cC02b08f461a56A175b88dC", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x7a69e74a7" + }, + { + "transactionHash": "0x9e6c568c190380937ad2ccc86b6c5fa03204cc1c291cd86e02e80b72c155931a", + "transactionIndex": "0x32", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0x1b727f4", + "gasUsed": "0x162754", + "contractAddress": "0xf5aD02F3DbBF4b42DEE1f1255607f929CA2a7c5a", + "logs": [ + { + "address": "0xf5aD02F3DbBF4b42DEE1f1255607f929CA2a7c5a", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x0000000000000000000000002a729024be86fc692cc02b08f461a56a175b88dc" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x9e6c568c190380937ad2ccc86b6c5fa03204cc1c291cd86e02e80b72c155931a", + "transactionIndex": "0x32", + "logIndex": "0x99", + "removed": false + }, + { + "address": "0xf5aD02F3DbBF4b42DEE1f1255607f929CA2a7c5a", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x000000000000000000000000e9f183fc656656f1f17af1f2b0df79b8ff9ad8ed", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x9e6c568c190380937ad2ccc86b6c5fa03204cc1c291cd86e02e80b72c155931a", + "transactionIndex": "0x32", + "logIndex": "0x9a", + "removed": false + }, + { + "address": "0xf5aD02F3DbBF4b42DEE1f1255607f929CA2a7c5a", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x000000000000000000000000dc4e6dfe07efca50a197df15d9200883ef4eb1c8", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x9e6c568c190380937ad2ccc86b6c5fa03204cc1c291cd86e02e80b72c155931a", + "transactionIndex": "0x32", + "logIndex": "0x9b", + "removed": false + }, + { + "address": "0xf5aD02F3DbBF4b42DEE1f1255607f929CA2a7c5a", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x0000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d430", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x9e6c568c190380937ad2ccc86b6c5fa03204cc1c291cd86e02e80b72c155931a", + "transactionIndex": "0x32", + "logIndex": "0x9c", + "removed": false + }, + { + "address": "0xf5aD02F3DbBF4b42DEE1f1255607f929CA2a7c5a", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000cc617c6f9725eacc993ac626c7efc6b96476916e", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x9e6c568c190380937ad2ccc86b6c5fa03204cc1c291cd86e02e80b72c155931a", + "transactionIndex": "0x32", + "logIndex": "0x9d", + "removed": false + }, + { + "address": "0xf5aD02F3DbBF4b42DEE1f1255607f929CA2a7c5a", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x000000000000000000000000a0062b7a5e494d569059e2f1a98b5f6c99bfaafe", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x9e6c568c190380937ad2ccc86b6c5fa03204cc1c291cd86e02e80b72c155931a", + "transactionIndex": "0x32", + "logIndex": "0x9e", + "removed": false + }, + { + "address": "0xf5aD02F3DbBF4b42DEE1f1255607f929CA2a7c5a", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x9e6c568c190380937ad2ccc86b6c5fa03204cc1c291cd86e02e80b72c155931a", + "transactionIndex": "0x32", + "logIndex": "0x9f", + "removed": false + }, + { + "address": "0xf5aD02F3DbBF4b42DEE1f1255607f929CA2a7c5a", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000c2553e4b9dfa9f83b1a6d3eab96c4baab42d430", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x9e6c568c190380937ad2ccc86b6c5fa03204cc1c291cd86e02e80b72c155931a", + "transactionIndex": "0x32", + "logIndex": "0xa0", + "removed": false + }, + { + "address": "0xf5aD02F3DbBF4b42DEE1f1255607f929CA2a7c5a", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c", + "0x000000000000000000000000bfa4459868c60da9edd835f0be684edec054557b", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x9e6c568c190380937ad2ccc86b6c5fa03204cc1c291cd86e02e80b72c155931a", + "transactionIndex": "0x32", + "logIndex": "0xa1", + "removed": false + }, + { + "address": "0xf5aD02F3DbBF4b42DEE1f1255607f929CA2a7c5a", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x9e6c568c190380937ad2ccc86b6c5fa03204cc1c291cd86e02e80b72c155931a", + "transactionIndex": "0x32", + "logIndex": "0xa2", + "removed": false + }, + { + "address": "0xf5aD02F3DbBF4b42DEE1f1255607f929CA2a7c5a", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041" + ], + "data": "0x", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x9e6c568c190380937ad2ccc86b6c5fa03204cc1c291cd86e02e80b72c155931a", + "transactionIndex": "0x32", + "logIndex": "0xa3", + "removed": false + }, + { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000f5ad02f3dbbf4b42dee1f1255607f929ca2a7c5a", + "0x000000000000000000000000bfa4459868c60da9edd835f0be684edec054557b" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x9e6c568c190380937ad2ccc86b6c5fa03204cc1c291cd86e02e80b72c155931a", + "transactionIndex": "0x32", + "logIndex": "0xa4", + "removed": false + }, + { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000f5ad02f3dbbf4b42dee1f1255607f929ca2a7c5a", + "0x00000000000000000000000027182842e098f60e3d576794a5bffb0777e025d3" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x9e6c568c190380937ad2ccc86b6c5fa03204cc1c291cd86e02e80b72c155931a", + "transactionIndex": "0x32", + "logIndex": "0xa5", + "removed": false + }, + { + "address": "0xEb91861f8A4e1C12333F42DCE8fB0Ecdc28dA716", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000f5ad02f3dbbf4b42dee1f1255607f929ca2a7c5a", + "0x000000000000000000000000e5afe81e63f0a52a3a03b922b30f73b8ce74d570" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x9e6c568c190380937ad2ccc86b6c5fa03204cc1c291cd86e02e80b72c155931a", + "transactionIndex": "0x32", + "logIndex": "0xa6", + "removed": false + }, + { + "address": "0xd9Fcd98c322942075A5C3860693e9f4f03AAE07b", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000f5ad02f3dbbf4b42dee1f1255607f929ca2a7c5a", + "0x0000000000000000000000001111111254eeb25477b68fb85ed929f73a960582" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x9e6c568c190380937ad2ccc86b6c5fa03204cc1c291cd86e02e80b72c155931a", + "transactionIndex": "0x32", + "logIndex": "0xa7", + "removed": false + }, + { + "address": "0xf5aD02F3DbBF4b42DEE1f1255607f929CA2a7c5a", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d941ef0d3bba4ad67dbfbcee5262f4cee53a32b", + "blockHash": "0x020980e229af4c6b6d5ccd650121c710969abbbca47b2a4ab77a8881b25e7ba2", + "blockNumber": "0xfd0ef5", + "transactionHash": "0x9e6c568c190380937ad2ccc86b6c5fa03204cc1c291cd86e02e80b72c155931a", + "transactionIndex": "0x32", + "logIndex": "0xa8", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00100004800004000800202000000000482000000000000002000002000004000000000000000000000000001000000000000000000008000000000000200000080020100000080008000000000003000000000000000000284200000000000000080000028000400000000000000800000000800000400000000000000000000200000020000001000000c00000000100104002010000100000000200a04000020000000000200000000040000004000000000000000000001000000000281000000020020000000000000000000000000900000400000500000000000020000010000000002000400400000000002000000000000000000000000800040000", + "type": "0x2", + "effectiveGasPrice": "0x7a69e74a7" + } + ], + "libraries": [], + "pending": [], + "path": "/Users/gnervo/Documents/Angle/strategies-dev/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-latest.json", + "returns": {}, + "timestamp": 1675863884, + "chain": 1, + "multi": false, + "commit": "6e49356" +} \ No newline at end of file diff --git a/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-1675931510.json b/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-1675931510.json new file mode 100644 index 0000000..10fd7da --- /dev/null +++ b/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-1675931510.json @@ -0,0 +1,34 @@ +{ + "transactions": [ + { + "hash": "0x38241397fd9e22fd932358aa6ce9e86d9dc97417c2f77e076b0383739cb58640", + "transactionType": "CREATE", + "contractName": "OptimizerAPRStrategy", + "contractAddress": "0xB63BD15E60afE7682447AB45b7D7d7f18d489510", + "function": null, + "arguments": null, + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x5965d1", + "value": "0x0", + "data": "0x60808060405234620000d3576000549060ff8260081c169081600014620000c857303b155b156200006f57501590816200005c575b506200004b575b60405161508c9081620000d98239f35b61ff0019600054166000556200003b565b61ffff1916610101176000553862000034565b62461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b60ff83161562000024565b600080fdfe6101006040908082526004918236101561001857600080fd5b600092833560e01c9283630b6d1d1714612087575082630c016dc01461202e5782630e6e15f014611ff35782630f969b8714611f855782631d12f28b14611f485782631f1fcd5114611ef557826322f3e2d414611eb1578263248a9ca314611e6857826324ea54f414611e0f5782632e1a7d4d14611d9c5782632f2ff15d14611ca5578263364bc15a14611c4c57826336568abe14611b8e5782634641257d14611b575782634786b0cb14611b165782635641ec0314611ad45782635a5cd45e14611a99578263708ba9bd1461199a57826376ee75d8146119515782637985fd51146119145782638baf2957146118cb57826391d1485414611859578263929eea21146117d557826393084b34146115db578263a217fddf146115a2578263a526d83b1461148b578263af648c3d146112eb578263b8dc491b14611120578263bb927c46146110e3578263ce5c7f611461104c578263d547741f14610ff2578263dc4c90d314610f9c578263ddc6326214610f50578263e6a69ab814610f13578263e6bfbfd8146106a3578263ec342ad014610662578263efbb5cb014610620578263fcc5f59a1461026157505063fcf2d0ad146101d557600080fd5b3461025e57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e5761020c336125d8565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0060335416176033557f17fa25a1c2ac074f71f0cf4f6af525c06fab7d83eff5ffcf6df5277f2919ae248180a180f35b80fd5b83903461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760655461029d816121c8565b916102aa85519384612187565b8183527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06102d7836121c8565b01845b818110610605575050835b8281106103a557505050825191602080840190808552835180925285850181878460051b880101950193965b83881061031e5786860387f35b90919293948380827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a60019503018652885190610364825160808084528301906122a3565b918381015184830152868101518783015273ffffffffffffffffffffffffffffffffffffffff60608092015116910152970193019701969093929193610311565b6103ad6142f0565b6103b6826121e0565b905488517f8b2021760000000000000000000000000000000000000000000000000000000081528881878173ffffffffffffffffffffffffffffffffffffffff8096600398891b1c165afa9081156105fb578991610576575b5083528061041c856121e0565b905490841b1c16606084015280610432856121e0565b905490841b1c1691895180937fc1590cd7000000000000000000000000000000000000000000000000000000008252818860209687935afa90811561056c579187939185938c91610534575b508387015261048c876121e0565b9054911b1c168a51928380927f57ded9c90000000000000000000000000000000000000000000000000000000082525afa91821561052a5788926104f6575b5050878201526104f191906104e08287612e1e565b526104eb8186612e1e565b50612df1565b6102e5565b90809250813d8311610523575b61050d8183612187565b8101031261051f57516104f1896104cb565b8680fd5b503d610503565b89513d8a823e3d90fd5b929450509181813d8311610565575b61054d8183612187565b81010312610561579183918793518d61047e565b8980fd5b503d610543565b8b513d8c823e3d90fd5b90503d808a833e6105878183612187565b81019060209081818403126105f75780519067ffffffffffffffff82116105f357019082601f830112156105f757908b92918151926105d16105c885612246565b95519586612187565b8385528184840101116105f3576105ed92918482019101612280565b8a61040f565b8b80fd5b8a80fd5b8a513d8b823e3d90fd5b6020906106106142f0565b828288010152016102da565b5080fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b6143f2565b9051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209051670de0b6b3a76400008152f35b915034610f0f5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576106dc6120e9565b6106e46120c1565b916044359173ffffffffffffffffffffffffffffffffffffffff9182841691828503610f0b576064359267ffffffffffffffff8411610bcc5736602385011215610bcc578388013596610736886121c8565b9061074385519283612187565b8882526020958683016024809b60051b83010191368311610dea578b01905b828210610eef575050508a549760ff93848a60081c1680600014610ee657303b155b15610e655789898f928f90159d8e610e37575b506033547fffffffffffffffffffffff0000000000000000000000000000000000000000ff74ffffffffffffffffffffffffffffffffffffffff008c60081b1691161790816033558b51809481937ffc0c546a00000000000000000000000000000000000000000000000000000000835260081c165afa908115610e2d578b8f928c928591610e00575b5016807fffffffffffffffffffffffff000000000000000000000000000000000000000060345416176034558a51928380927f313ce5670000000000000000000000000000000000000000000000000000000082525afa918215610df557908792610db7575b5016604d8111610d8c57600a0a6035558015908115610d81575b8115610d75575b50610d4d578b949392916108be6108c392612a4e565b612a4e565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5629182855260019384885288878720911690818752885281878720541615610ce7575b50908291859387965284885284868520015492807fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9481868880a480868887200155857f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419786898098528383838320015489898480a42001558151908d5b828110610be157505050507ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab808c5283875283868d200154918c80a4828920015568056bc75e2d63100000603655603354927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00841660335580603454169360081c168151917fdd62ed3e000000000000000000000000000000000000000000000000000000008352308884015281878401528383604481885afa928315610bd7578993610ba4575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301809311610b7957517f095ea7b3000000000000000000000000000000000000000000000000000000009381019390935273ffffffffffffffffffffffffffffffffffffffff168583019081526020810191909152610b049290610aff9083906040015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101845283612187565b614e53565b610b4e575b603554916103e89280840293840403610b2457505060665580f35b601184917f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff8354168355610b09565b868960118a7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b9092508381813d8311610bd0575b610bbc8183612187565b81010312610bcc57519138610a4c565b8880fd5b503d610bb2565b81513d8b823e3d90fd5b90919293945089610bf28286612e1e565b511615610cbf57808e8b610c09610c4e9488612e1e565b51167ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab808352898d528b83208284528d52858c8420541615610c59575b505050612df1565b908694939291610984565b808352898d528b83208284528d528b83208a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d339380a48e3880610c46565b8c88517fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b8386528488528686208187528852868620857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790553390847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8880a438610906565b8a86517fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b905088831614386108a8565b838a161591506108a1565b8b8e60118f7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8092508a8092503d8311610dee575b610dd08183612187565b81010312610dea57518581168103610dea57859038610887565b8d80fd5b503d610dc6565b8951903d90823e3d90fd5b610e209150833d8511610e26575b610e188183612187565b810190612e45565b38610821565b503d610e0e565b89513d84823e3d90fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661010117845538610797565b60848d602e8e8c8c51937f08c379a00000000000000000000000000000000000000000000000000000000085528401528201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152fd5b858b1615610784565b81358a81168103610f07578152908801908801610762565b8e80fd5b8780fd5b8280fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090516301e185588152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f8933612769565b610f91612c08565b610f99613e5c565b80f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209073ffffffffffffffffffffffffffffffffffffffff60335460081c169051908152f35b915034610f0f57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57610f99913561104760016110346120c1565b93838752816020528620015433906128fa565b612b2a565b915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f578282359267ffffffffffffffff841161061c573660238501121561061c57830135926110b46110ab85612246565b93519384612187565b838352366024858301011161061c5783610f999460246020930183860137830101526110de612c08565b6132ff565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906065549051908152f35b915034610f0f57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576111586120e9565b6111606120c1565b9061116a336122e6565b73ffffffffffffffffffffffffffffffffffffffff908180603454169116918183146112c35784519061119c8261214f565b60018252602092838301843682378351156112975752815191885b83811061124e57505050508351947f70a0823100000000000000000000000000000000000000000000000000000000865230908601528085602481855afa9384156112455750859361120f575b50610f999350614df4565b90925083813d831161123e575b6112268183612187565b8101031261123a57610f9992519138611204565b8380fd5b503d61121c565b513d87823e3d90fd5b826112598284612e1e565b5116861461126f5761126a90612df1565b6111b7565b8888517fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b60248a60328b7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8585517fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576113256120e9565b9161132f336125d8565b837f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504180825260016020528282209373ffffffffffffffffffffffffffffffffffffffff8096169485845260205260ff8484205416611425575b60655495835b878110611399578480f35b816113a3826121e0565b90549060031b1c16803b156114215785809160448951809481937fd547741f0000000000000000000000000000000000000000000000000000000083528a8a8401528d60248401525af18015611417579061140392916114085750612df1565b61138e565b6114119061210c565b386104eb565b87513d88823e3d90fd5b8580fd5b81835260016020528383208584526020528383207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690553385837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b8680a4611388565b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57906114c66120e9565b906114d0336125d8565b6114d982612a4e565b8360655493819373ffffffffffffffffffffffffffffffffffffffff809116945b868110611505578380f35b8161150f826121e0565b90549060031b1c16803b1561159e5784809160448851809481937f2f2ff15d0000000000000000000000000000000000000000000000000000000083527f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50418a8401528c60248401525af18015611594579061158f92916114085750612df1565b6114fa565b86513d87823e3d90fd5b8480fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5751908152602090f35b83823461061c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57823573ffffffffffffffffffffffffffffffffffffffff918282169283830361159e57611638336122e6565b81517fa8c62e760000000000000000000000000000000000000000000000000000000081526020818881885afa9081156117cb5786916117ad575b5081309116036117855760655491855b838110611737575050506801000000000000000081101561170b57906116b28260016116e494016065556121e0565b90919082549060031b9173ffffffffffffffffffffffffffffffffffffffff9283811b93849216901b16911916179055565b7f1e7b117a6591133f0b36fc2c24d59f8465d806fdcad63aa33246b45fd62c89ff8280a280f35b6024846041877f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b82611741826121e0565b90549060031b1c16861461175d5761175890612df1565b611683565b8782517f7cc7731c000000000000000000000000000000000000000000000000000000008152fd5b8582517feeacc72d000000000000000000000000000000000000000000000000000000008152fd5b6117c5915060203d8111610e2657610e188183612187565b87611673565b83513d88823e3d90fd5b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f5735606554811015610f0f5773ffffffffffffffffffffffffffffffffffffffff906065602094527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70154169051908152f35b90915034610f0f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f578160209360ff926118996120c1565b903582526001865273ffffffffffffffffffffffffffffffffffffffff83832091168252855220541690519015158152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f996119066120e9565b61190f33612769565b614ae4565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906066549051908152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f9961198c6120e9565b611995336122e6565b614841565b833461025e57602091827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57803567ffffffffffffffff9182821161123a573660238301121561123a578101356119f6816121c8565b92611a0387519485612187565b81845260248685019260051b8401019236841161142157959695602401915b838310611a7b5750505050611a3690614585565b9190835194848695860192865281860152835180925280606086019401925b828110611a6457505050500390f35b835185528695509381019392810192600101611a55565b8297969735828116810361051f578152959695918701918701611a22565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b61449b565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209060ff6033541690519015158152f35b83903461061c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57611b50336122e6565b3560665580f35b833461025e57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f91612c08565b83903461061c57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57611bc66120c1565b903373ffffffffffffffffffffffffffffffffffffffff831603611bef5790610f999135612b2a565b60649060208551917f08c379a0000000000000000000000000000000000000000000000000000000008352820152600260248201527f37310000000000000000000000000000000000000000000000000000000000006044820152fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab8152f35b90915034610f0f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f573590611ce06120c1565b908284526001602052611cfa6001828620015433906128fa565b828452600160205273ffffffffffffffffffffffffffffffffffffffff81852092169182855260205260ff818520541615611d33578380f35b8284526001602052808420828552602052832060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905533917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8480a43880808380f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e5750611de090611dda336125d8565b3561422c565b611e03823373ffffffffffffffffffffffffffffffffffffffff60345416614df4565b82519182526020820152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50418152f35b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57816020936001923581528285522001549051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090611eec6143f2565b15159051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209073ffffffffffffffffffffffffffffffffffffffff603454169051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906036549051908152f35b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f577fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a8600916020913590611fe7336122e6565b8160365551908152a180f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b614326565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5628152f35b84903461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906035548152f35b6024359073ffffffffffffffffffffffffffffffffffffffff821682036120e457565b600080fd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036120e457565b67ffffffffffffffff811161212057604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761212057604052565b6080810190811067ffffffffffffffff82111761212057604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761212057604052565b67ffffffffffffffff81116121205760051b60200190565b6065548110156122175760656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b67ffffffffffffffff811161212057601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381106122935750506000910152565b8181015183820152602001612283565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936122df81518092818752878088019101612280565b0116010190565b73ffffffffffffffffffffffffffffffffffffffff1660008181527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db6020908152604080832054909391927f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419290916001919060ff161561236957505050505050565b61237290614c6e565b9285519161237f8361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116124e05750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b8401917f206973206d697373696e6720726f6c6520000000000000000000000000000000603784015251809386840190612280565b01036028810187520185612187565b519283927f08c379a0000000000000000000000000000000000000000000000000000000008452600484015260248301906122a3565b0390fd5b6064848651907f08c379a000000000000000000000000000000000000000000000000000000000825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a61251d8587614c5d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191906123ac565b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526032600452fd5b73ffffffffffffffffffffffffffffffffffffffff1660008181527f015260285f12fe1d77221203cd7e5aa67b79d47399b4bedd98b8730e56d911bf6020908152604080832054909391927f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5629290916001919060ff161561265b57505050505050565b61266490614c6e565b928551916126718361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116126f85750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a6127358587614c5d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01919061269e565b73ffffffffffffffffffffffffffffffffffffffff1660008181527f10c15aae13326e9b33c92ffbb94efb7492c500f0cca324caca9bd1aca194ed186020908152604080832054909391927ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab9290916001919060ff16156127ec57505050505050565b6127f590614c6e565b928551916128028361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116128895750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a6128c68587614c5d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01919061282f565b60009080825260019160209280845260409473ffffffffffffffffffffffffffffffffffffffff868420911690818452855260ff86842054161561294057505050505050565b61294990614c6e565b928551916129568361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116129dd5750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a612a1a8587614c5d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019190612983565b73ffffffffffffffffffffffffffffffffffffffff1660008181527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db60205260408120549091907f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419060ff1615612ac457505050565b8083526001602052604083208284526020526040832060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d339380a4565b90600091808352600160205273ffffffffffffffffffffffffffffffffffffffff6040842092169182845260205260ff604084205416612b6957505050565b808352600160205260408320828452602052604083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b339380a4565b91908203918211612bd957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080603354916040918251937fbf3759b500000000000000000000000000000000000000000000000000000000855273ffffffffffffffffffffffffffffffffffffffff90602086600481858560081c165afa958615612de7578496612db3575b5060ff1615612d7757612c83612c7e6143f2565b61422c565b508580821015612d5457612c98929350612bcc565b905b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d5096080612cc78488612bcc565b965b86519086825285602083015288888301526060820152a160335460081c16803b156120e45760009283606492865197889586947fa1d9bafc0000000000000000000000000000000000000000000000000000000086526004860152602485015260448401525af1908115612d4a5750612d3f5750565b612d489061210c565b565b513d6000823e3d90fd5b90818111612d64575b5050612c9a565b612d6f929450612bcc565b918438612d5d565b84925060809150612da87f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d50995612e7e565b969193909394612cc9565b9095506020813d8211612ddf575b81612dce60209383612187565b8101031261123a57519460ff612c6a565b3d9150612dc1565b85513d86823e3d90fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612bd95760010190565b80518210156122175760209160051b010190565b81810292918115918404141715612bd957565b908160209103126120e4575173ffffffffffffffffffffffffffffffffffffffff811681036120e45790565b91908201809211612bd957565b9060008091828492612e8e614326565b9573ffffffffffffffffffffffffffffffffffffffff908160345416906040938451998a927f70a08231000000000000000000000000000000000000000000000000000000009485855230600486015284602460209687935afa9b8c156131c257889c6131ef575b50612f01828d612e71565b91156131cc5750602460608660335460081c168851928380927f39ebf8230000000000000000000000000000000000000000000000000000000082523060048301525afa9081156131c2579084918991613133575b500151918282111561305f575090612f6d91612bcc565b98612f78888b612e71565b9384151580613056575b612f90575b50505050505050565b612fa3612f9e849387612bcc565b613efb565b506034541692602486518095819382523060048301525afa93841561304d5750849361301d575b50508110612fdd575b8080808080612f87565b91928286929611600014612ff757505092905b3880612fd3565b9094918561300491612bcc565b91508082101561301657505b90612ff0565b9050613010565b9080929350813d8311613046575b6130358183612187565b81010312610f0f5751903880612fca565b503d61302b565b513d86823e3d90fd5b50848210612f82565b9a995061306b91612bcc565b97613076888a612e71565b938415158061312a575b61308d5750505050505050565b61309b612f9e849387612bcc565b506034541692602486518095819382523060048301525afa93841561304d575084936130fa575b505081106130d4578080808080612f87565b919282859295116000146130ed57505091903880612fd3565b9093918461300491612bcc565b9080929350813d8311613123575b6131128183612187565b81010312610f0f57519038806130c2565b503d613108565b50848210613080565b9150506060813d82116131ba575b8161314e60609383612187565b81010312610f0b578651906060820182811067ffffffffffffffff82111761318d57885280518252808501518286015287015187820152839038612f56565b60248a7f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b3d9150613141565b87513d8a823e3d90fd5b955050505050508592939450949094116131e7575b50829190565b9150386131e1565b909b508381813d8311613217575b6132078183612187565b81010312610f0b57519a38612ef6565b503d6131fd565b60405190606554808352826020918282019060656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c7936000905b82821061327157505050612d4892500383612187565b855473ffffffffffffffffffffffffffffffffffffffff168452600195860195889550938101939091019061325b565b908160209103126120e4575180151581036120e45790565b7f80000000000000000000000000000000000000000000000000000000000000008114612bd95760000390565b81810392916000138015828513169184121617612bd957565b60ff6033541661387a5761331161321e565b8060c05251806080521561387a5780518101906020818184019303126120e457602081015167ffffffffffffffff918282116120e457019180603f840112156120e457602083015191613363836121c8565b936133716040519586612187565b8385526040602086019460051b8201019283116120e457604001925b828410613e0a5750505050600090606060a0528051613df7575b50600090600060e052600090816024602073ffffffffffffffffffffffffffffffffffffffff60345416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa908115613dea5760e05191613db2575b5060e051908182908260c05151917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061346461344e856121c8565b9461345c6040519687612187565b8086526121c8565b0136602085013760c05151937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60e05190603554915b878110613b22575050508561393e575b5050505050505010600014613775575050600090815b6080518110156135de5760006134d88260a051612e1e565b51126134ed575b6134e890612df1565b6134c0565b9160006135056134ff8560a051612e1e565b516132b9565b602073ffffffffffffffffffffffffffffffffffffffff6135288760c051612e1e565b5116602461353b6134ff8960a051612e1e565b60405195869384927f2e1a7d4d00000000000000000000000000000000000000000000000000000000845260048401525af19182156135d25760009261359c575b509161358e613594926134e894612bcc565b90612e71565b9290506134df565b90916020823d6020116135ca575b816135b760209383612187565b8101031261025e5750519061358e61357c565b3d91506135aa565b6040513d6000823e3d90fd5b5090606654811161374b576000905b60805182101561374757806136048360a051612e1e565b511315613705576136219061361b8360a051612e1e565b516132e6565b61362d8260a051612e1e565b5260009061368373ffffffffffffffffffffffffffffffffffffffff6034541673ffffffffffffffffffffffffffffffffffffffff61366e8460c051612e1e565b511661367c8460a051612e1e565b5191614df4565b73ffffffffffffffffffffffffffffffffffffffff6136a48260c051612e1e565b5116803b15610f0f578280916004604051809481937fd0e30db00000000000000000000000000000000000000000000000000000000083525af180156136fa57906136f492916114085750612df1565b906135ed565b6040513d85823e3d90fd5b9060006137148260a051612e1e565b5113613724575b6136f490612df1565b9061373f6136f4916137388460a051612e1e565b5190612bcc565b91905061371b565b5050565b60046040517f5c3810af000000000000000000000000000000000000000000000000000000008152fd5b6138af575b5073ffffffffffffffffffffffffffffffffffffffff603454166040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152602081602481855afa9081156135d25760009161387d575b50806137e2575050565b6138119173ffffffffffffffffffffffffffffffffffffffff61380960e05160c051612e1e565b511690614df4565b73ffffffffffffffffffffffffffffffffffffffff61383460e05160c051612e1e565b5116803b156120e457600080916004604051809481937fd0e30db00000000000000000000000000000000000000000000000000000000083525af180156135d257612d3f575b50565b906020823d6020116138a7575b8161389760209383612187565b8101031261025e575051386137d8565b3d915061388a565b602073ffffffffffffffffffffffffffffffffffffffff6138d460009360c051612e1e565b51166004604051809481937f853828b60000000000000000000000000000000000000000000000000000000083525af180156135d2571561377a576139309060203d602011613937575b6139288183612187565b8101906132a1565b503861377a565b503d61391e565b94965088958695869590915b81871061399e575050505050505080851180613991575b1561398057505061397490600193613e23565b388080808080806134aa565b61398c92919450613e23565b613974565b50600160c0515111613961565b9091929394959660e0518814600014613ad7576139c89061358e836139c38988612e71565b612e32565b9684151580613acd575b6139eb575b6139e090612df1565b95949392919061394a565b9a6139ff856139fa8887612e71565b612e71565b73ffffffffffffffffffffffffffffffffffffffff613a2260e05160c051612e1e565b5116906020613a318989612e71565b6024604051809581937fa7d385e200000000000000000000000000000000000000000000000000000000835260048301525afa918215613ac2578b92613a8c575b509161358e613a84926139e094612e32565b9b90506139d7565b9091506020813d602011613aba575b81613aa860209383612187565b810103126105f757519061358e613a72565b3d9150613a9b565b6040513d8d823e3d90fd5b50600183116139d2565b878d03613afc57613af66139e091613aef8a8a612e1e565b5190612e71565b97612df1565b613b1c889c613aef613b156139e094613aef8d8d612e1e565b9a8a612e1e565b9b612df1565b602498602073ffffffffffffffffffffffffffffffffffffffff613b488460c051612e1e565b51166040519b8c80927fa7d385e20000000000000000000000000000000000000000000000000000000082528b60048301525afa998a15613da5578e9a613d70575b50600490602073ffffffffffffffffffffffffffffffffffffffff613bb18560c051612e1e565b5116604051938480927fc1590cd70000000000000000000000000000000000000000000000000000000082525afa918215613cf0578f92613d3a575b5081613bf891612e71565b998b8111613d2a575b50600a848102048403613cfd5783600a028111613c28575b50613c2390612df1565b61349a565b6004602073ffffffffffffffffffffffffffffffffffffffff613c4d8560c051612e1e565b5116604051928380927f57ded9c90000000000000000000000000000000000000000000000000000000082525afa908115613cf0578f91613cbe575b50613c948282612e32565b613c9e848b612e1e565b52838110613cad575b50613c19565b925094509c50613c238d9038613ca7565b90506020813d602011613ce8575b81613cd960209383612187565b81010312610f07575138613c89565b3d9150613ccc565b8f604051903d90823e3d90fd5b60248e7f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b60e08390529a5093508338613c01565b9091506020813d602011613d68575b81613d5660209383612187565b81010312610f07575190613bf8613bed565b3d9150613d49565b9099506020813d602011613d9d575b81613d8c60209383612187565b81010312610dea5751986004613b8a565b3d9150613d7f565b8e604051903d90823e3d90fd5b90506020813d602011613de2575b81613dcd60209383612187565b81010312613ddc575138613413565b60e05180fd5b3d9150613dc0565b6040513d60e051823e3d90fd5b613e019150614585565b60a052386133a7565b835182811681036120e45781526020938401930161338d565b8115613e2d570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6040516020908181019067ffffffffffffffff928183108484111761212057929082604052600081526040519360408501918180870152518092526060850193926000905b838210613ee2575050505050906110de81612d4893037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612187565b8451811686529482019493820193600190910190613ea1565b600080613f0661321e565b928351928315614224576066549485831061421b5781959395935b613f2b8185612bcc565b871015614212577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff968397845b8881106140cb57505073ffffffffffffffffffffffffffffffffffffffff9788613f828286612e1e565b51166040998a51928380937f5be9b2d3000000000000000000000000000000000000000000000000000000008252602094859160049788915afa9081156140c15789916140a4575b50156140955760248392613fdf8e938a612e1e565b51169489613fed888d612bcc565b935196879485937f2e1a7d4d0000000000000000000000000000000000000000000000000000000085528401525af1998a1561124557508599614061575b505061403a8861404092612e71565b95612df1565b961561405757600687101561405757959395613f21565b5050505091505090565b9080929950813d831161408e575b6140798183612187565b8101031261123a57519661403a61404061402b565b503d61406f565b50505050965050505050505090565b6140bb9150843d8611613937576139288183612187565b38613fca565b8d513d8b823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff806140eb8388612e1e565b5116906040918251918280927f5be9b2d3000000000000000000000000000000000000000000000000000000008252602093849160049687915afa908115614208578b916141eb575b5061414c575b5050505061414790612df1565b613f58565b8190614158868b612e1e565b51168451938480927f57ded9c90000000000000000000000000000000000000000000000000000000082525afa9283156141e2575088926141b4575b50508281106141a6575b80808061413a565b91509850614147899061419e565b90809250813d83116141db575b6141cb8183612187565b8101031261051f57513880614194565b503d6141c1565b513d8a823e3d90fd5b6142029150833d8511613937576139288183612187565b38614134565b85513d8d823e3d90fd5b50505050505090565b50935050505090565b935050505090565b6024602073ffffffffffffffffffffffffffffffffffffffff60345416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9081156135d2576000916142bf575b50818110614299575090600090565b806139fa612f9e6142aa9385612bcc565b8181106142b8575090600090565b9160009150565b906020823d82116142e8575b816142d860209383612187565b8101031261025e5750513861428a565b3d91506142cb565b604051906080820182811067ffffffffffffffff8211176121205760405260006060838181528260208201528260408201520152565b600060655481905b80821061433a57505090565b9091614345836121e0565b9054906040918251917fc1590cd70000000000000000000000000000000000000000000000000000000083528260048173ffffffffffffffffffffffffffffffffffffffff602095869560031b1c165afa928315612d4a57506000926143c1575b50506143b5906143bb92612e71565b92612df1565b9061432e565b81819392933d83116143eb575b6143d88183612187565b8101031261025e575051816143b56143a6565b503d6143ce565b6024906143fd614326565b602073ffffffffffffffffffffffffffffffffffffffff60345416604051948580927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9283156135d257600093614468575b50916144659192612e71565b90565b6020813d8211614493575b8161448060209383612187565b8101031261123a57519250614465614459565b3d9150614473565b6144a36143f2565b90811561457f576000916065549280935b8085106144c75750614465929350613e23565b906144d1856121e0565b9054906040918251917f116ac4a30000000000000000000000000000000000000000000000000000000083528260048173ffffffffffffffffffffffffffffffffffffffff602095869560031b1c165afa928315612d4a575060009261454e575b50506145419061454792612e71565b94612df1565b93906144b4565b81819392933d8311614578575b6145658183612187565b8101031261025e57505181614541614532565b503d61455b565b60009150565b600090600091606554614597816121c8565b926040916145a783519586612187565b8085527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06145d4826121c8565b016020903682880137859683518303614818576145ef6143f2565b96871561480a57509291908380935b8385106146495750505050506127100361462057509061461d91613e23565b91565b600490517f6edcc523000000000000000000000000000000000000000000000000000000008152fd5b909192939661271061468761467467ffffffffffffffff988961466c8d88612e1e565b511690612e71565b9761467f8b86612e1e565b51168b612e32565b04614691896121e0565b9190548951927fc1590cd70000000000000000000000000000000000000000000000000000000084526004938881868173ffffffffffffffffffffffffffffffffffffffff8097600397881b1c165afa90811561480057918f8a94928f948b916147b5575b5084602494939261471561470d61471b948b6132e6565b978892612e1e565b526121e0565b9054911b1c16948c5195869384927fa7d385e20000000000000000000000000000000000000000000000000000000084528301525afa9182156147ab57859261477a575b509161358e613af69261477194612e32565b939291906145fe565b9091508581813d83116147a4575b6147928183612187565b8101031261159e57519061358e61475f565b503d614788565b89513d87823e3d90fd5b9395929450505081813d83116147f9575b6147d08183612187565b81010312610f0b5788928f9261471b8f809561471561470d6024975194505050929394506146f6565b503d6147c6565b8c513d8a823e3d90fd5b989750955050505050509190565b600485517fcdeedcbd000000000000000000000000000000000000000000000000000000008152fd5b61484961321e565b9081519160005b8381106148815760046040517f30990b67000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff806148a18385612e1e565b5116908085169182146148be5750506148b990612df1565b614850565b909460009450816148d184869596612e1e565b511692604094855180957f853828b600000000000000000000000000000000000000000000000000000000825260209687918160049b8c925af18015614ad957614abc575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92838101908111614a8e5784818303614a6d575b5050505060659081548015614a3f5784939291019061498f61496d836121e0565b73ffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055565b55603454169360248451809681937f70a0823100000000000000000000000000000000000000000000000000000000835230908301525afa918215612d4a5750600091614a13575b509050614a06575b7f95c84dbc5fd872c46b0e4290775a1a4ea1c8d760f9e4d38f48ba71b6f9a667db600080a2565b614a0e613e5c565b6149df565b82813d8311614a38575b614a278183612187565b8101031261025e57505180386149d7565b503d614a1d565b6031877f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b614a7d6116b292614a8595612e1e565b5116916121e0565b3880808461494c565b6011887f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b614ad290863d8811613937576139288183612187565b5038614916565b87513d6000823e3d90fd5b614aec61321e565b9081519160005b838110614b245760046040517f30990b67000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff80614b448385612e1e565b511690808516918214614b61575050614b5c90612df1565b614af3565b90946000945081614b7484869596612e1e565b511692604094855180957f853828b600000000000000000000000000000000000000000000000000000000825260209687918160049b8c925af1908115614ad957600091614c40575b5015614c18577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92838101908111614a8e5784818303614a6d575050505060659081548015614a3f5784939291019061498f61496d836121e0565b8686517fa1248235000000000000000000000000000000000000000000000000000000008152fd5b614c579150863d8811613937576139288183612187565b38614bbd565b908151811015612217570160200190565b604051906060820182811067ffffffffffffffff82111761212057604052602a82526020820160403682378251156122175760309053815160019081101561221757607860218401536029905b808211614d29575050614ccb5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015614dc6577f3031323334353637383961626364656600000000000000000000000000000000901a614d658486614c5d565b5360041c918015614d98577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190614cbb565b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff90921660248301526044820192909252612d4891610aff8260648101610ad3565b604051614edd9173ffffffffffffffffffffffffffffffffffffffff16614e798261214f565b6000806020958685527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656487860152868151910182855af13d15614f86573d91614ec183612246565b92614ecf6040519485612187565b83523d60008785013e614f8a565b80519081614eea57505050565b8280614efa9383010191016132a1565b15614f025750565b608490604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b6060915b919290156150055750815115614f9e575090565b3b15614fa75790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156150185750805190602001fd5b612480906040519182917f08c379a00000000000000000000000000000000000000000000000000000000083526020600484015260248301906122a356fea26469706673582212205d4371146c49584a2effa728df6c1c9f6fc2afa78935429a6b14719f26cf70c164736f6c63430008110033", + "nonce": "0x3b9", + "accessList": [] + }, + "additionalContracts": [] + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x38241397fd9e22fd932358aa6ce9e86d9dc97417c2f77e076b0383739cb58640" + ], + "path": "/Users/gnervo/Documents/Angle/strategies-dev/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-latest.json", + "returns": {}, + "timestamp": 1675931510, + "chain": 1, + "multi": false, + "commit": "5360538" +} \ No newline at end of file diff --git a/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-1675931550.json b/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-1675931550.json new file mode 100644 index 0000000..ae841ff --- /dev/null +++ b/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-1675931550.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0x38241397fd9e22fd932358aa6ce9e86d9dc97417c2f77e076b0383739cb58640", + "transactionType": "CREATE", + "contractName": "OptimizerAPRStrategy", + "contractAddress": "0xB63BD15E60afE7682447AB45b7D7d7f18d489510", + "function": null, + "arguments": null, + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x5965d1", + "value": "0x0", + "data": "0x60808060405234620000d3576000549060ff8260081c169081600014620000c857303b155b156200006f57501590816200005c575b506200004b575b60405161508c9081620000d98239f35b61ff0019600054166000556200003b565b61ffff1916610101176000553862000034565b62461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b60ff83161562000024565b600080fdfe6101006040908082526004918236101561001857600080fd5b600092833560e01c9283630b6d1d1714612087575082630c016dc01461202e5782630e6e15f014611ff35782630f969b8714611f855782631d12f28b14611f485782631f1fcd5114611ef557826322f3e2d414611eb1578263248a9ca314611e6857826324ea54f414611e0f5782632e1a7d4d14611d9c5782632f2ff15d14611ca5578263364bc15a14611c4c57826336568abe14611b8e5782634641257d14611b575782634786b0cb14611b165782635641ec0314611ad45782635a5cd45e14611a99578263708ba9bd1461199a57826376ee75d8146119515782637985fd51146119145782638baf2957146118cb57826391d1485414611859578263929eea21146117d557826393084b34146115db578263a217fddf146115a2578263a526d83b1461148b578263af648c3d146112eb578263b8dc491b14611120578263bb927c46146110e3578263ce5c7f611461104c578263d547741f14610ff2578263dc4c90d314610f9c578263ddc6326214610f50578263e6a69ab814610f13578263e6bfbfd8146106a3578263ec342ad014610662578263efbb5cb014610620578263fcc5f59a1461026157505063fcf2d0ad146101d557600080fd5b3461025e57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e5761020c336125d8565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0060335416176033557f17fa25a1c2ac074f71f0cf4f6af525c06fab7d83eff5ffcf6df5277f2919ae248180a180f35b80fd5b83903461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760655461029d816121c8565b916102aa85519384612187565b8183527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06102d7836121c8565b01845b818110610605575050835b8281106103a557505050825191602080840190808552835180925285850181878460051b880101950193965b83881061031e5786860387f35b90919293948380827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a60019503018652885190610364825160808084528301906122a3565b918381015184830152868101518783015273ffffffffffffffffffffffffffffffffffffffff60608092015116910152970193019701969093929193610311565b6103ad6142f0565b6103b6826121e0565b905488517f8b2021760000000000000000000000000000000000000000000000000000000081528881878173ffffffffffffffffffffffffffffffffffffffff8096600398891b1c165afa9081156105fb578991610576575b5083528061041c856121e0565b905490841b1c16606084015280610432856121e0565b905490841b1c1691895180937fc1590cd7000000000000000000000000000000000000000000000000000000008252818860209687935afa90811561056c579187939185938c91610534575b508387015261048c876121e0565b9054911b1c168a51928380927f57ded9c90000000000000000000000000000000000000000000000000000000082525afa91821561052a5788926104f6575b5050878201526104f191906104e08287612e1e565b526104eb8186612e1e565b50612df1565b6102e5565b90809250813d8311610523575b61050d8183612187565b8101031261051f57516104f1896104cb565b8680fd5b503d610503565b89513d8a823e3d90fd5b929450509181813d8311610565575b61054d8183612187565b81010312610561579183918793518d61047e565b8980fd5b503d610543565b8b513d8c823e3d90fd5b90503d808a833e6105878183612187565b81019060209081818403126105f75780519067ffffffffffffffff82116105f357019082601f830112156105f757908b92918151926105d16105c885612246565b95519586612187565b8385528184840101116105f3576105ed92918482019101612280565b8a61040f565b8b80fd5b8a80fd5b8a513d8b823e3d90fd5b6020906106106142f0565b828288010152016102da565b5080fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b6143f2565b9051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209051670de0b6b3a76400008152f35b915034610f0f5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576106dc6120e9565b6106e46120c1565b916044359173ffffffffffffffffffffffffffffffffffffffff9182841691828503610f0b576064359267ffffffffffffffff8411610bcc5736602385011215610bcc578388013596610736886121c8565b9061074385519283612187565b8882526020958683016024809b60051b83010191368311610dea578b01905b828210610eef575050508a549760ff93848a60081c1680600014610ee657303b155b15610e655789898f928f90159d8e610e37575b506033547fffffffffffffffffffffff0000000000000000000000000000000000000000ff74ffffffffffffffffffffffffffffffffffffffff008c60081b1691161790816033558b51809481937ffc0c546a00000000000000000000000000000000000000000000000000000000835260081c165afa908115610e2d578b8f928c928591610e00575b5016807fffffffffffffffffffffffff000000000000000000000000000000000000000060345416176034558a51928380927f313ce5670000000000000000000000000000000000000000000000000000000082525afa918215610df557908792610db7575b5016604d8111610d8c57600a0a6035558015908115610d81575b8115610d75575b50610d4d578b949392916108be6108c392612a4e565b612a4e565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5629182855260019384885288878720911690818752885281878720541615610ce7575b50908291859387965284885284868520015492807fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9481868880a480868887200155857f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419786898098528383838320015489898480a42001558151908d5b828110610be157505050507ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab808c5283875283868d200154918c80a4828920015568056bc75e2d63100000603655603354927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00841660335580603454169360081c168151917fdd62ed3e000000000000000000000000000000000000000000000000000000008352308884015281878401528383604481885afa928315610bd7578993610ba4575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301809311610b7957517f095ea7b3000000000000000000000000000000000000000000000000000000009381019390935273ffffffffffffffffffffffffffffffffffffffff168583019081526020810191909152610b049290610aff9083906040015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101845283612187565b614e53565b610b4e575b603554916103e89280840293840403610b2457505060665580f35b601184917f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff8354168355610b09565b868960118a7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b9092508381813d8311610bd0575b610bbc8183612187565b81010312610bcc57519138610a4c565b8880fd5b503d610bb2565b81513d8b823e3d90fd5b90919293945089610bf28286612e1e565b511615610cbf57808e8b610c09610c4e9488612e1e565b51167ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab808352898d528b83208284528d52858c8420541615610c59575b505050612df1565b908694939291610984565b808352898d528b83208284528d528b83208a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d339380a48e3880610c46565b8c88517fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b8386528488528686208187528852868620857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790553390847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8880a438610906565b8a86517fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b905088831614386108a8565b838a161591506108a1565b8b8e60118f7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8092508a8092503d8311610dee575b610dd08183612187565b81010312610dea57518581168103610dea57859038610887565b8d80fd5b503d610dc6565b8951903d90823e3d90fd5b610e209150833d8511610e26575b610e188183612187565b810190612e45565b38610821565b503d610e0e565b89513d84823e3d90fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661010117845538610797565b60848d602e8e8c8c51937f08c379a00000000000000000000000000000000000000000000000000000000085528401528201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152fd5b858b1615610784565b81358a81168103610f07578152908801908801610762565b8e80fd5b8780fd5b8280fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090516301e185588152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f8933612769565b610f91612c08565b610f99613e5c565b80f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209073ffffffffffffffffffffffffffffffffffffffff60335460081c169051908152f35b915034610f0f57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57610f99913561104760016110346120c1565b93838752816020528620015433906128fa565b612b2a565b915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f578282359267ffffffffffffffff841161061c573660238501121561061c57830135926110b46110ab85612246565b93519384612187565b838352366024858301011161061c5783610f999460246020930183860137830101526110de612c08565b6132ff565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906065549051908152f35b915034610f0f57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576111586120e9565b6111606120c1565b9061116a336122e6565b73ffffffffffffffffffffffffffffffffffffffff908180603454169116918183146112c35784519061119c8261214f565b60018252602092838301843682378351156112975752815191885b83811061124e57505050508351947f70a0823100000000000000000000000000000000000000000000000000000000865230908601528085602481855afa9384156112455750859361120f575b50610f999350614df4565b90925083813d831161123e575b6112268183612187565b8101031261123a57610f9992519138611204565b8380fd5b503d61121c565b513d87823e3d90fd5b826112598284612e1e565b5116861461126f5761126a90612df1565b6111b7565b8888517fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b60248a60328b7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8585517fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576113256120e9565b9161132f336125d8565b837f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504180825260016020528282209373ffffffffffffffffffffffffffffffffffffffff8096169485845260205260ff8484205416611425575b60655495835b878110611399578480f35b816113a3826121e0565b90549060031b1c16803b156114215785809160448951809481937fd547741f0000000000000000000000000000000000000000000000000000000083528a8a8401528d60248401525af18015611417579061140392916114085750612df1565b61138e565b6114119061210c565b386104eb565b87513d88823e3d90fd5b8580fd5b81835260016020528383208584526020528383207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690553385837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b8680a4611388565b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57906114c66120e9565b906114d0336125d8565b6114d982612a4e565b8360655493819373ffffffffffffffffffffffffffffffffffffffff809116945b868110611505578380f35b8161150f826121e0565b90549060031b1c16803b1561159e5784809160448851809481937f2f2ff15d0000000000000000000000000000000000000000000000000000000083527f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50418a8401528c60248401525af18015611594579061158f92916114085750612df1565b6114fa565b86513d87823e3d90fd5b8480fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5751908152602090f35b83823461061c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57823573ffffffffffffffffffffffffffffffffffffffff918282169283830361159e57611638336122e6565b81517fa8c62e760000000000000000000000000000000000000000000000000000000081526020818881885afa9081156117cb5786916117ad575b5081309116036117855760655491855b838110611737575050506801000000000000000081101561170b57906116b28260016116e494016065556121e0565b90919082549060031b9173ffffffffffffffffffffffffffffffffffffffff9283811b93849216901b16911916179055565b7f1e7b117a6591133f0b36fc2c24d59f8465d806fdcad63aa33246b45fd62c89ff8280a280f35b6024846041877f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b82611741826121e0565b90549060031b1c16861461175d5761175890612df1565b611683565b8782517f7cc7731c000000000000000000000000000000000000000000000000000000008152fd5b8582517feeacc72d000000000000000000000000000000000000000000000000000000008152fd5b6117c5915060203d8111610e2657610e188183612187565b87611673565b83513d88823e3d90fd5b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f5735606554811015610f0f5773ffffffffffffffffffffffffffffffffffffffff906065602094527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70154169051908152f35b90915034610f0f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f578160209360ff926118996120c1565b903582526001865273ffffffffffffffffffffffffffffffffffffffff83832091168252855220541690519015158152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f996119066120e9565b61190f33612769565b614ae4565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906066549051908152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f9961198c6120e9565b611995336122e6565b614841565b833461025e57602091827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57803567ffffffffffffffff9182821161123a573660238301121561123a578101356119f6816121c8565b92611a0387519485612187565b81845260248685019260051b8401019236841161142157959695602401915b838310611a7b5750505050611a3690614585565b9190835194848695860192865281860152835180925280606086019401925b828110611a6457505050500390f35b835185528695509381019392810192600101611a55565b8297969735828116810361051f578152959695918701918701611a22565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b61449b565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209060ff6033541690519015158152f35b83903461061c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57611b50336122e6565b3560665580f35b833461025e57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f91612c08565b83903461061c57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57611bc66120c1565b903373ffffffffffffffffffffffffffffffffffffffff831603611bef5790610f999135612b2a565b60649060208551917f08c379a0000000000000000000000000000000000000000000000000000000008352820152600260248201527f37310000000000000000000000000000000000000000000000000000000000006044820152fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab8152f35b90915034610f0f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f573590611ce06120c1565b908284526001602052611cfa6001828620015433906128fa565b828452600160205273ffffffffffffffffffffffffffffffffffffffff81852092169182855260205260ff818520541615611d33578380f35b8284526001602052808420828552602052832060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905533917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8480a43880808380f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e5750611de090611dda336125d8565b3561422c565b611e03823373ffffffffffffffffffffffffffffffffffffffff60345416614df4565b82519182526020820152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50418152f35b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57816020936001923581528285522001549051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090611eec6143f2565b15159051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209073ffffffffffffffffffffffffffffffffffffffff603454169051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906036549051908152f35b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f577fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a8600916020913590611fe7336122e6565b8160365551908152a180f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b614326565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5628152f35b84903461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906035548152f35b6024359073ffffffffffffffffffffffffffffffffffffffff821682036120e457565b600080fd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036120e457565b67ffffffffffffffff811161212057604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761212057604052565b6080810190811067ffffffffffffffff82111761212057604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761212057604052565b67ffffffffffffffff81116121205760051b60200190565b6065548110156122175760656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b67ffffffffffffffff811161212057601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381106122935750506000910152565b8181015183820152602001612283565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936122df81518092818752878088019101612280565b0116010190565b73ffffffffffffffffffffffffffffffffffffffff1660008181527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db6020908152604080832054909391927f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419290916001919060ff161561236957505050505050565b61237290614c6e565b9285519161237f8361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116124e05750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b8401917f206973206d697373696e6720726f6c6520000000000000000000000000000000603784015251809386840190612280565b01036028810187520185612187565b519283927f08c379a0000000000000000000000000000000000000000000000000000000008452600484015260248301906122a3565b0390fd5b6064848651907f08c379a000000000000000000000000000000000000000000000000000000000825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a61251d8587614c5d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191906123ac565b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526032600452fd5b73ffffffffffffffffffffffffffffffffffffffff1660008181527f015260285f12fe1d77221203cd7e5aa67b79d47399b4bedd98b8730e56d911bf6020908152604080832054909391927f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5629290916001919060ff161561265b57505050505050565b61266490614c6e565b928551916126718361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116126f85750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a6127358587614c5d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01919061269e565b73ffffffffffffffffffffffffffffffffffffffff1660008181527f10c15aae13326e9b33c92ffbb94efb7492c500f0cca324caca9bd1aca194ed186020908152604080832054909391927ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab9290916001919060ff16156127ec57505050505050565b6127f590614c6e565b928551916128028361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116128895750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a6128c68587614c5d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01919061282f565b60009080825260019160209280845260409473ffffffffffffffffffffffffffffffffffffffff868420911690818452855260ff86842054161561294057505050505050565b61294990614c6e565b928551916129568361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116129dd5750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a612a1a8587614c5d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019190612983565b73ffffffffffffffffffffffffffffffffffffffff1660008181527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db60205260408120549091907f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419060ff1615612ac457505050565b8083526001602052604083208284526020526040832060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d339380a4565b90600091808352600160205273ffffffffffffffffffffffffffffffffffffffff6040842092169182845260205260ff604084205416612b6957505050565b808352600160205260408320828452602052604083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b339380a4565b91908203918211612bd957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080603354916040918251937fbf3759b500000000000000000000000000000000000000000000000000000000855273ffffffffffffffffffffffffffffffffffffffff90602086600481858560081c165afa958615612de7578496612db3575b5060ff1615612d7757612c83612c7e6143f2565b61422c565b508580821015612d5457612c98929350612bcc565b905b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d5096080612cc78488612bcc565b965b86519086825285602083015288888301526060820152a160335460081c16803b156120e45760009283606492865197889586947fa1d9bafc0000000000000000000000000000000000000000000000000000000086526004860152602485015260448401525af1908115612d4a5750612d3f5750565b612d489061210c565b565b513d6000823e3d90fd5b90818111612d64575b5050612c9a565b612d6f929450612bcc565b918438612d5d565b84925060809150612da87f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d50995612e7e565b969193909394612cc9565b9095506020813d8211612ddf575b81612dce60209383612187565b8101031261123a57519460ff612c6a565b3d9150612dc1565b85513d86823e3d90fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612bd95760010190565b80518210156122175760209160051b010190565b81810292918115918404141715612bd957565b908160209103126120e4575173ffffffffffffffffffffffffffffffffffffffff811681036120e45790565b91908201809211612bd957565b9060008091828492612e8e614326565b9573ffffffffffffffffffffffffffffffffffffffff908160345416906040938451998a927f70a08231000000000000000000000000000000000000000000000000000000009485855230600486015284602460209687935afa9b8c156131c257889c6131ef575b50612f01828d612e71565b91156131cc5750602460608660335460081c168851928380927f39ebf8230000000000000000000000000000000000000000000000000000000082523060048301525afa9081156131c2579084918991613133575b500151918282111561305f575090612f6d91612bcc565b98612f78888b612e71565b9384151580613056575b612f90575b50505050505050565b612fa3612f9e849387612bcc565b613efb565b506034541692602486518095819382523060048301525afa93841561304d5750849361301d575b50508110612fdd575b8080808080612f87565b91928286929611600014612ff757505092905b3880612fd3565b9094918561300491612bcc565b91508082101561301657505b90612ff0565b9050613010565b9080929350813d8311613046575b6130358183612187565b81010312610f0f5751903880612fca565b503d61302b565b513d86823e3d90fd5b50848210612f82565b9a995061306b91612bcc565b97613076888a612e71565b938415158061312a575b61308d5750505050505050565b61309b612f9e849387612bcc565b506034541692602486518095819382523060048301525afa93841561304d575084936130fa575b505081106130d4578080808080612f87565b919282859295116000146130ed57505091903880612fd3565b9093918461300491612bcc565b9080929350813d8311613123575b6131128183612187565b81010312610f0f57519038806130c2565b503d613108565b50848210613080565b9150506060813d82116131ba575b8161314e60609383612187565b81010312610f0b578651906060820182811067ffffffffffffffff82111761318d57885280518252808501518286015287015187820152839038612f56565b60248a7f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b3d9150613141565b87513d8a823e3d90fd5b955050505050508592939450949094116131e7575b50829190565b9150386131e1565b909b508381813d8311613217575b6132078183612187565b81010312610f0b57519a38612ef6565b503d6131fd565b60405190606554808352826020918282019060656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c7936000905b82821061327157505050612d4892500383612187565b855473ffffffffffffffffffffffffffffffffffffffff168452600195860195889550938101939091019061325b565b908160209103126120e4575180151581036120e45790565b7f80000000000000000000000000000000000000000000000000000000000000008114612bd95760000390565b81810392916000138015828513169184121617612bd957565b60ff6033541661387a5761331161321e565b8060c05251806080521561387a5780518101906020818184019303126120e457602081015167ffffffffffffffff918282116120e457019180603f840112156120e457602083015191613363836121c8565b936133716040519586612187565b8385526040602086019460051b8201019283116120e457604001925b828410613e0a5750505050600090606060a0528051613df7575b50600090600060e052600090816024602073ffffffffffffffffffffffffffffffffffffffff60345416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa908115613dea5760e05191613db2575b5060e051908182908260c05151917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061346461344e856121c8565b9461345c6040519687612187565b8086526121c8565b0136602085013760c05151937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60e05190603554915b878110613b22575050508561393e575b5050505050505010600014613775575050600090815b6080518110156135de5760006134d88260a051612e1e565b51126134ed575b6134e890612df1565b6134c0565b9160006135056134ff8560a051612e1e565b516132b9565b602073ffffffffffffffffffffffffffffffffffffffff6135288760c051612e1e565b5116602461353b6134ff8960a051612e1e565b60405195869384927f2e1a7d4d00000000000000000000000000000000000000000000000000000000845260048401525af19182156135d25760009261359c575b509161358e613594926134e894612bcc565b90612e71565b9290506134df565b90916020823d6020116135ca575b816135b760209383612187565b8101031261025e5750519061358e61357c565b3d91506135aa565b6040513d6000823e3d90fd5b5090606654811161374b576000905b60805182101561374757806136048360a051612e1e565b511315613705576136219061361b8360a051612e1e565b516132e6565b61362d8260a051612e1e565b5260009061368373ffffffffffffffffffffffffffffffffffffffff6034541673ffffffffffffffffffffffffffffffffffffffff61366e8460c051612e1e565b511661367c8460a051612e1e565b5191614df4565b73ffffffffffffffffffffffffffffffffffffffff6136a48260c051612e1e565b5116803b15610f0f578280916004604051809481937fd0e30db00000000000000000000000000000000000000000000000000000000083525af180156136fa57906136f492916114085750612df1565b906135ed565b6040513d85823e3d90fd5b9060006137148260a051612e1e565b5113613724575b6136f490612df1565b9061373f6136f4916137388460a051612e1e565b5190612bcc565b91905061371b565b5050565b60046040517f5c3810af000000000000000000000000000000000000000000000000000000008152fd5b6138af575b5073ffffffffffffffffffffffffffffffffffffffff603454166040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152602081602481855afa9081156135d25760009161387d575b50806137e2575050565b6138119173ffffffffffffffffffffffffffffffffffffffff61380960e05160c051612e1e565b511690614df4565b73ffffffffffffffffffffffffffffffffffffffff61383460e05160c051612e1e565b5116803b156120e457600080916004604051809481937fd0e30db00000000000000000000000000000000000000000000000000000000083525af180156135d257612d3f575b50565b906020823d6020116138a7575b8161389760209383612187565b8101031261025e575051386137d8565b3d915061388a565b602073ffffffffffffffffffffffffffffffffffffffff6138d460009360c051612e1e565b51166004604051809481937f853828b60000000000000000000000000000000000000000000000000000000083525af180156135d2571561377a576139309060203d602011613937575b6139288183612187565b8101906132a1565b503861377a565b503d61391e565b94965088958695869590915b81871061399e575050505050505080851180613991575b1561398057505061397490600193613e23565b388080808080806134aa565b61398c92919450613e23565b613974565b50600160c0515111613961565b9091929394959660e0518814600014613ad7576139c89061358e836139c38988612e71565b612e32565b9684151580613acd575b6139eb575b6139e090612df1565b95949392919061394a565b9a6139ff856139fa8887612e71565b612e71565b73ffffffffffffffffffffffffffffffffffffffff613a2260e05160c051612e1e565b5116906020613a318989612e71565b6024604051809581937fa7d385e200000000000000000000000000000000000000000000000000000000835260048301525afa918215613ac2578b92613a8c575b509161358e613a84926139e094612e32565b9b90506139d7565b9091506020813d602011613aba575b81613aa860209383612187565b810103126105f757519061358e613a72565b3d9150613a9b565b6040513d8d823e3d90fd5b50600183116139d2565b878d03613afc57613af66139e091613aef8a8a612e1e565b5190612e71565b97612df1565b613b1c889c613aef613b156139e094613aef8d8d612e1e565b9a8a612e1e565b9b612df1565b602498602073ffffffffffffffffffffffffffffffffffffffff613b488460c051612e1e565b51166040519b8c80927fa7d385e20000000000000000000000000000000000000000000000000000000082528b60048301525afa998a15613da5578e9a613d70575b50600490602073ffffffffffffffffffffffffffffffffffffffff613bb18560c051612e1e565b5116604051938480927fc1590cd70000000000000000000000000000000000000000000000000000000082525afa918215613cf0578f92613d3a575b5081613bf891612e71565b998b8111613d2a575b50600a848102048403613cfd5783600a028111613c28575b50613c2390612df1565b61349a565b6004602073ffffffffffffffffffffffffffffffffffffffff613c4d8560c051612e1e565b5116604051928380927f57ded9c90000000000000000000000000000000000000000000000000000000082525afa908115613cf0578f91613cbe575b50613c948282612e32565b613c9e848b612e1e565b52838110613cad575b50613c19565b925094509c50613c238d9038613ca7565b90506020813d602011613ce8575b81613cd960209383612187565b81010312610f07575138613c89565b3d9150613ccc565b8f604051903d90823e3d90fd5b60248e7f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b60e08390529a5093508338613c01565b9091506020813d602011613d68575b81613d5660209383612187565b81010312610f07575190613bf8613bed565b3d9150613d49565b9099506020813d602011613d9d575b81613d8c60209383612187565b81010312610dea5751986004613b8a565b3d9150613d7f565b8e604051903d90823e3d90fd5b90506020813d602011613de2575b81613dcd60209383612187565b81010312613ddc575138613413565b60e05180fd5b3d9150613dc0565b6040513d60e051823e3d90fd5b613e019150614585565b60a052386133a7565b835182811681036120e45781526020938401930161338d565b8115613e2d570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6040516020908181019067ffffffffffffffff928183108484111761212057929082604052600081526040519360408501918180870152518092526060850193926000905b838210613ee2575050505050906110de81612d4893037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612187565b8451811686529482019493820193600190910190613ea1565b600080613f0661321e565b928351928315614224576066549485831061421b5781959395935b613f2b8185612bcc565b871015614212577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff968397845b8881106140cb57505073ffffffffffffffffffffffffffffffffffffffff9788613f828286612e1e565b51166040998a51928380937f5be9b2d3000000000000000000000000000000000000000000000000000000008252602094859160049788915afa9081156140c15789916140a4575b50156140955760248392613fdf8e938a612e1e565b51169489613fed888d612bcc565b935196879485937f2e1a7d4d0000000000000000000000000000000000000000000000000000000085528401525af1998a1561124557508599614061575b505061403a8861404092612e71565b95612df1565b961561405757600687101561405757959395613f21565b5050505091505090565b9080929950813d831161408e575b6140798183612187565b8101031261123a57519661403a61404061402b565b503d61406f565b50505050965050505050505090565b6140bb9150843d8611613937576139288183612187565b38613fca565b8d513d8b823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff806140eb8388612e1e565b5116906040918251918280927f5be9b2d3000000000000000000000000000000000000000000000000000000008252602093849160049687915afa908115614208578b916141eb575b5061414c575b5050505061414790612df1565b613f58565b8190614158868b612e1e565b51168451938480927f57ded9c90000000000000000000000000000000000000000000000000000000082525afa9283156141e2575088926141b4575b50508281106141a6575b80808061413a565b91509850614147899061419e565b90809250813d83116141db575b6141cb8183612187565b8101031261051f57513880614194565b503d6141c1565b513d8a823e3d90fd5b6142029150833d8511613937576139288183612187565b38614134565b85513d8d823e3d90fd5b50505050505090565b50935050505090565b935050505090565b6024602073ffffffffffffffffffffffffffffffffffffffff60345416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9081156135d2576000916142bf575b50818110614299575090600090565b806139fa612f9e6142aa9385612bcc565b8181106142b8575090600090565b9160009150565b906020823d82116142e8575b816142d860209383612187565b8101031261025e5750513861428a565b3d91506142cb565b604051906080820182811067ffffffffffffffff8211176121205760405260006060838181528260208201528260408201520152565b600060655481905b80821061433a57505090565b9091614345836121e0565b9054906040918251917fc1590cd70000000000000000000000000000000000000000000000000000000083528260048173ffffffffffffffffffffffffffffffffffffffff602095869560031b1c165afa928315612d4a57506000926143c1575b50506143b5906143bb92612e71565b92612df1565b9061432e565b81819392933d83116143eb575b6143d88183612187565b8101031261025e575051816143b56143a6565b503d6143ce565b6024906143fd614326565b602073ffffffffffffffffffffffffffffffffffffffff60345416604051948580927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9283156135d257600093614468575b50916144659192612e71565b90565b6020813d8211614493575b8161448060209383612187565b8101031261123a57519250614465614459565b3d9150614473565b6144a36143f2565b90811561457f576000916065549280935b8085106144c75750614465929350613e23565b906144d1856121e0565b9054906040918251917f116ac4a30000000000000000000000000000000000000000000000000000000083528260048173ffffffffffffffffffffffffffffffffffffffff602095869560031b1c165afa928315612d4a575060009261454e575b50506145419061454792612e71565b94612df1565b93906144b4565b81819392933d8311614578575b6145658183612187565b8101031261025e57505181614541614532565b503d61455b565b60009150565b600090600091606554614597816121c8565b926040916145a783519586612187565b8085527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06145d4826121c8565b016020903682880137859683518303614818576145ef6143f2565b96871561480a57509291908380935b8385106146495750505050506127100361462057509061461d91613e23565b91565b600490517f6edcc523000000000000000000000000000000000000000000000000000000008152fd5b909192939661271061468761467467ffffffffffffffff988961466c8d88612e1e565b511690612e71565b9761467f8b86612e1e565b51168b612e32565b04614691896121e0565b9190548951927fc1590cd70000000000000000000000000000000000000000000000000000000084526004938881868173ffffffffffffffffffffffffffffffffffffffff8097600397881b1c165afa90811561480057918f8a94928f948b916147b5575b5084602494939261471561470d61471b948b6132e6565b978892612e1e565b526121e0565b9054911b1c16948c5195869384927fa7d385e20000000000000000000000000000000000000000000000000000000084528301525afa9182156147ab57859261477a575b509161358e613af69261477194612e32565b939291906145fe565b9091508581813d83116147a4575b6147928183612187565b8101031261159e57519061358e61475f565b503d614788565b89513d87823e3d90fd5b9395929450505081813d83116147f9575b6147d08183612187565b81010312610f0b5788928f9261471b8f809561471561470d6024975194505050929394506146f6565b503d6147c6565b8c513d8a823e3d90fd5b989750955050505050509190565b600485517fcdeedcbd000000000000000000000000000000000000000000000000000000008152fd5b61484961321e565b9081519160005b8381106148815760046040517f30990b67000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff806148a18385612e1e565b5116908085169182146148be5750506148b990612df1565b614850565b909460009450816148d184869596612e1e565b511692604094855180957f853828b600000000000000000000000000000000000000000000000000000000825260209687918160049b8c925af18015614ad957614abc575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92838101908111614a8e5784818303614a6d575b5050505060659081548015614a3f5784939291019061498f61496d836121e0565b73ffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055565b55603454169360248451809681937f70a0823100000000000000000000000000000000000000000000000000000000835230908301525afa918215612d4a5750600091614a13575b509050614a06575b7f95c84dbc5fd872c46b0e4290775a1a4ea1c8d760f9e4d38f48ba71b6f9a667db600080a2565b614a0e613e5c565b6149df565b82813d8311614a38575b614a278183612187565b8101031261025e57505180386149d7565b503d614a1d565b6031877f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b614a7d6116b292614a8595612e1e565b5116916121e0565b3880808461494c565b6011887f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b614ad290863d8811613937576139288183612187565b5038614916565b87513d6000823e3d90fd5b614aec61321e565b9081519160005b838110614b245760046040517f30990b67000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff80614b448385612e1e565b511690808516918214614b61575050614b5c90612df1565b614af3565b90946000945081614b7484869596612e1e565b511692604094855180957f853828b600000000000000000000000000000000000000000000000000000000825260209687918160049b8c925af1908115614ad957600091614c40575b5015614c18577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92838101908111614a8e5784818303614a6d575050505060659081548015614a3f5784939291019061498f61496d836121e0565b8686517fa1248235000000000000000000000000000000000000000000000000000000008152fd5b614c579150863d8811613937576139288183612187565b38614bbd565b908151811015612217570160200190565b604051906060820182811067ffffffffffffffff82111761212057604052602a82526020820160403682378251156122175760309053815160019081101561221757607860218401536029905b808211614d29575050614ccb5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015614dc6577f3031323334353637383961626364656600000000000000000000000000000000901a614d658486614c5d565b5360041c918015614d98577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190614cbb565b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff90921660248301526044820192909252612d4891610aff8260648101610ad3565b604051614edd9173ffffffffffffffffffffffffffffffffffffffff16614e798261214f565b6000806020958685527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656487860152868151910182855af13d15614f86573d91614ec183612246565b92614ecf6040519485612187565b83523d60008785013e614f8a565b80519081614eea57505050565b8280614efa9383010191016132a1565b15614f025750565b608490604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b6060915b919290156150055750815115614f9e575090565b3b15614fa75790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156150185750805190602001fd5b612480906040519182917f08c379a00000000000000000000000000000000000000000000000000000000083526020600484015260248301906122a356fea26469706673582212205d4371146c49584a2effa728df6c1c9f6fc2afa78935429a6b14719f26cf70c164736f6c63430008110033", + "nonce": "0x3b9", + "accessList": [] + }, + "additionalContracts": [] + } + ], + "receipts": [ + { + "transactionHash": "0x38241397fd9e22fd932358aa6ce9e86d9dc97417c2f77e076b0383739cb58640", + "transactionIndex": "0x109", + "blockHash": "0x75641f660d45e3c283cf0839eac93420e82e5499f660da5a0fb0b5cced1715ba", + "blockNumber": "0xfd24cb", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0x127df75", + "gasUsed": "0x44c47a", + "contractAddress": "0xB63BD15E60afE7682447AB45b7D7d7f18d489510", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0xf62f32873" + } + ], + "libraries": [], + "pending": [], + "path": "/Users/gnervo/Documents/Angle/strategies-dev/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-latest.json", + "returns": {}, + "timestamp": 1675931550, + "chain": 1, + "multi": false, + "commit": "5360538" +} \ No newline at end of file diff --git a/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-1675944261.json b/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-1675944261.json new file mode 100644 index 0000000..1ae7bf8 --- /dev/null +++ b/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-1675944261.json @@ -0,0 +1,34 @@ +{ + "transactions": [ + { + "hash": "0x711eb89a44e5dcb9c9001cc6ff0956fba43402940081d91c6471bbe19f913282", + "transactionType": "CREATE", + "contractName": "OptimizerAPRStrategy", + "contractAddress": "0x7411B6648Ae65CB99446c25eCf5363d59941013B", + "function": null, + "arguments": null, + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x59c84e", + "value": "0x0", + "data": "0x60808060405234620000d3576000549060ff8260081c169081600014620000c857303b155b156200006f57501590816200005c575b506200004b575b6040516150e59081620000d98239f35b61ff0019600054166000556200003b565b61ffff1916610101176000553862000034565b62461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b60ff83161562000024565b600080fdfe6102c06040908082526004918236101561001857600080fd5b600092833560e01c9283630b6d1d1714612087575082630c016dc01461202e5782630e6e15f014611ff35782630f969b8714611f855782631d12f28b14611f485782631f1fcd5114611ef557826322f3e2d414611eb1578263248a9ca314611e6857826324ea54f414611e0f5782632e1a7d4d14611d9c5782632f2ff15d14611ca5578263364bc15a14611c4c57826336568abe14611b8e5782634641257d14611b575782634786b0cb14611b165782635641ec0314611ad45782635a5cd45e14611a99578263708ba9bd1461199a57826376ee75d8146119515782637985fd51146119145782638baf2957146118cb57826391d1485414611859578263929eea21146117d557826393084b34146115db578263a217fddf146115a2578263a526d83b1461148b578263af648c3d146112eb578263b8dc491b14611120578263bb927c46146110e3578263ce5c7f611461104c578263d547741f14610ff2578263dc4c90d314610f9c578263ddc6326214610f50578263e6a69ab814610f13578263e6bfbfd8146106a3578263ec342ad014610662578263efbb5cb014610620578263fcc5f59a1461026157505063fcf2d0ad146101d557600080fd5b3461025e57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e5761020c336125d8565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0060335416176033557f17fa25a1c2ac074f71f0cf4f6af525c06fab7d83eff5ffcf6df5277f2919ae248180a180f35b80fd5b83903461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760655461029d816121c8565b916102aa85519384612187565b8183527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06102d7836121c8565b01845b818110610605575050835b8281106103a557505050825191602080840190808552835180925285850181878460051b880101950193965b83881061031e5786860387f35b90919293948380827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a60019503018652885190610364825160808084528301906122a3565b918381015184830152868101518783015273ffffffffffffffffffffffffffffffffffffffff60608092015116910152970193019701969093929193610311565b6103ad614343565b6103b6826121e0565b905488517f8b2021760000000000000000000000000000000000000000000000000000000081528881878173ffffffffffffffffffffffffffffffffffffffff8096600398891b1c165afa9081156105fb578991610576575b5083528061041c856121e0565b905490841b1c16606084015280610432856121e0565b905490841b1c1691895180937fc1590cd7000000000000000000000000000000000000000000000000000000008252818860209687935afa90811561056c579187939185938c91610534575b508387015261048c876121e0565b9054911b1c168a51928380927f57ded9c90000000000000000000000000000000000000000000000000000000082525afa91821561052a5788926104f6575b5050878201526104f191906104e08287612e1e565b526104eb8186612e1e565b50612df1565b6102e5565b90809250813d8311610523575b61050d8183612187565b8101031261051f57516104f1896104cb565b8680fd5b503d610503565b89513d8a823e3d90fd5b929450509181813d8311610565575b61054d8183612187565b81010312610561579183918793518d61047e565b8980fd5b503d610543565b8b513d8c823e3d90fd5b90503d808a833e6105878183612187565b81019060209081818403126105f75780519067ffffffffffffffff82116105f357019082601f830112156105f757908b92918151926105d16105c885612246565b95519586612187565b8385528184840101116105f3576105ed92918482019101612280565b8a61040f565b8b80fd5b8a80fd5b8a513d8b823e3d90fd5b602090610610614343565b828288010152016102da565b5080fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b614445565b9051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209051670de0b6b3a76400008152f35b915034610f0f5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576106dc6120e9565b6106e46120c1565b916044359173ffffffffffffffffffffffffffffffffffffffff9182841691828503610f0b576064359267ffffffffffffffff8411610bcc5736602385011215610bcc578388013596610736886121c8565b9061074385519283612187565b8882526020958683016024809b60051b83010191368311610dea578b01905b828210610eef575050508a549760ff93848a60081c1680600014610ee657303b155b15610e655789898f928f90159d8e610e37575b506033547fffffffffffffffffffffff0000000000000000000000000000000000000000ff74ffffffffffffffffffffffffffffffffffffffff008c60081b1691161790816033558b51809481937ffc0c546a00000000000000000000000000000000000000000000000000000000835260081c165afa908115610e2d578b8f928c928591610e00575b5016807fffffffffffffffffffffffff000000000000000000000000000000000000000060345416176034558a51928380927f313ce5670000000000000000000000000000000000000000000000000000000082525afa918215610df557908792610db7575b5016604d8111610d8c57600a0a6035558015908115610d81575b8115610d75575b50610d4d578b949392916108be6108c392612a4e565b612a4e565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5629182855260019384885288878720911690818752885281878720541615610ce7575b50908291859387965284885284868520015492807fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9481868880a480868887200155857f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419786898098528383838320015489898480a42001558151908d5b828110610be157505050507ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab808c5283875283868d200154918c80a4828920015568056bc75e2d63100000603655603354927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00841660335580603454169360081c168151917fdd62ed3e000000000000000000000000000000000000000000000000000000008352308884015281878401528383604481885afa928315610bd7578993610ba4575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301809311610b7957517f095ea7b3000000000000000000000000000000000000000000000000000000009381019390935273ffffffffffffffffffffffffffffffffffffffff168583019081526020810191909152610b049290610aff9083906040015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101845283612187565b614eac565b610b4e575b603554916103e89280840293840403610b2457505060665580f35b601184917f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff8354168355610b09565b868960118a7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b9092508381813d8311610bd0575b610bbc8183612187565b81010312610bcc57519138610a4c565b8880fd5b503d610bb2565b81513d8b823e3d90fd5b90919293945089610bf28286612e1e565b511615610cbf57808e8b610c09610c4e9488612e1e565b51167ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab808352898d528b83208284528d52858c8420541615610c59575b505050612df1565b908694939291610984565b808352898d528b83208284528d528b83208a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d339380a48e3880610c46565b8c88517fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b8386528488528686208187528852868620857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790553390847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8880a438610906565b8a86517fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b905088831614386108a8565b838a161591506108a1565b8b8e60118f7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8092508a8092503d8311610dee575b610dd08183612187565b81010312610dea57518581168103610dea57859038610887565b8d80fd5b503d610dc6565b8951903d90823e3d90fd5b610e209150833d8511610e26575b610e188183612187565b810190612e45565b38610821565b503d610e0e565b89513d84823e3d90fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661010117845538610797565b60848d602e8e8c8c51937f08c379a00000000000000000000000000000000000000000000000000000000085528401528201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152fd5b858b1615610784565b81358a81168103610f07578152908801908801610762565b8e80fd5b8780fd5b8280fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090516301e185588152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f8933612769565b610f91612c08565b610f99613eaf565b80f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209073ffffffffffffffffffffffffffffffffffffffff60335460081c169051908152f35b915034610f0f57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57610f99913561104760016110346120c1565b93838752816020528620015433906128fa565b612b2a565b915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f578282359267ffffffffffffffff841161061c573660238501121561061c57830135926110b46110ab85612246565b93519384612187565b838352366024858301011161061c5783610f999460246020930183860137830101526110de612c08565b6132ff565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906065549051908152f35b915034610f0f57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576111586120e9565b6111606120c1565b9061116a336122e6565b73ffffffffffffffffffffffffffffffffffffffff908180603454169116918183146112c35784519061119c8261214f565b60018252602092838301843682378351156112975752815191885b83811061124e57505050508351947f70a0823100000000000000000000000000000000000000000000000000000000865230908601528085602481855afa9384156112455750859361120f575b50610f999350614e4d565b90925083813d831161123e575b6112268183612187565b8101031261123a57610f9992519138611204565b8380fd5b503d61121c565b513d87823e3d90fd5b826112598284612e1e565b5116861461126f5761126a90612df1565b6111b7565b8888517fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b60248a60328b7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8585517fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576113256120e9565b9161132f336125d8565b837f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504180825260016020528282209373ffffffffffffffffffffffffffffffffffffffff8096169485845260205260ff8484205416611425575b60655495835b878110611399578480f35b816113a3826121e0565b90549060031b1c16803b156114215785809160448951809481937fd547741f0000000000000000000000000000000000000000000000000000000083528a8a8401528d60248401525af18015611417579061140392916114085750612df1565b61138e565b6114119061210c565b386104eb565b87513d88823e3d90fd5b8580fd5b81835260016020528383208584526020528383207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690553385837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b8680a4611388565b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57906114c66120e9565b906114d0336125d8565b6114d982612a4e565b8360655493819373ffffffffffffffffffffffffffffffffffffffff809116945b868110611505578380f35b8161150f826121e0565b90549060031b1c16803b1561159e5784809160448851809481937f2f2ff15d0000000000000000000000000000000000000000000000000000000083527f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50418a8401528c60248401525af18015611594579061158f92916114085750612df1565b6114fa565b86513d87823e3d90fd5b8480fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5751908152602090f35b83823461061c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57823573ffffffffffffffffffffffffffffffffffffffff918282169283830361159e57611638336122e6565b81517fa8c62e760000000000000000000000000000000000000000000000000000000081526020818881885afa9081156117cb5786916117ad575b5081309116036117855760655491855b838110611737575050506801000000000000000081101561170b57906116b28260016116e494016065556121e0565b90919082549060031b9173ffffffffffffffffffffffffffffffffffffffff9283811b93849216901b16911916179055565b7f1e7b117a6591133f0b36fc2c24d59f8465d806fdcad63aa33246b45fd62c89ff8280a280f35b6024846041877f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b82611741826121e0565b90549060031b1c16861461175d5761175890612df1565b611683565b8782517f7cc7731c000000000000000000000000000000000000000000000000000000008152fd5b8582517feeacc72d000000000000000000000000000000000000000000000000000000008152fd5b6117c5915060203d8111610e2657610e188183612187565b87611673565b83513d88823e3d90fd5b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f5735606554811015610f0f5773ffffffffffffffffffffffffffffffffffffffff906065602094527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70154169051908152f35b90915034610f0f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f578160209360ff926118996120c1565b903582526001865273ffffffffffffffffffffffffffffffffffffffff83832091168252855220541690519015158152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f996119066120e9565b61190f33612769565b614b3d565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906066549051908152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f9961198c6120e9565b611995336122e6565b61489a565b833461025e57602091827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57803567ffffffffffffffff9182821161123a573660238301121561123a578101356119f6816121c8565b92611a0387519485612187565b81845260248685019260051b8401019236841161142157959695602401915b838310611a7b5750505050611a36906145d8565b9190835194848695860192865281860152835180925280606086019401925b828110611a6457505050500390f35b835185528695509381019392810192600101611a55565b8297969735828116810361051f578152959695918701918701611a22565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b6144ee565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209060ff6033541690519015158152f35b83903461061c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57611b50336122e6565b3560665580f35b833461025e57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f91612c08565b83903461061c57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57611bc66120c1565b903373ffffffffffffffffffffffffffffffffffffffff831603611bef5790610f999135612b2a565b60649060208551917f08c379a0000000000000000000000000000000000000000000000000000000008352820152600260248201527f37310000000000000000000000000000000000000000000000000000000000006044820152fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab8152f35b90915034610f0f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f573590611ce06120c1565b908284526001602052611cfa6001828620015433906128fa565b828452600160205273ffffffffffffffffffffffffffffffffffffffff81852092169182855260205260ff818520541615611d33578380f35b8284526001602052808420828552602052832060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905533917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8480a43880808380f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e5750611de090611dda336125d8565b3561427f565b611e03823373ffffffffffffffffffffffffffffffffffffffff60345416614e4d565b82519182526020820152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50418152f35b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57816020936001923581528285522001549051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090611eec614445565b15159051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209073ffffffffffffffffffffffffffffffffffffffff603454169051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906036549051908152f35b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f577fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a8600916020913590611fe7336122e6565b8160365551908152a180f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b614379565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5628152f35b84903461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906035548152f35b6024359073ffffffffffffffffffffffffffffffffffffffff821682036120e457565b600080fd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036120e457565b67ffffffffffffffff811161212057604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761212057604052565b6080810190811067ffffffffffffffff82111761212057604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761212057604052565b67ffffffffffffffff81116121205760051b60200190565b6065548110156122175760656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b67ffffffffffffffff811161212057601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381106122935750506000910152565b8181015183820152602001612283565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936122df81518092818752878088019101612280565b0116010190565b73ffffffffffffffffffffffffffffffffffffffff1660008181527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db6020908152604080832054909391927f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419290916001919060ff161561236957505050505050565b61237290614cc7565b9285519161237f8361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116124e05750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b8401917f206973206d697373696e6720726f6c6520000000000000000000000000000000603784015251809386840190612280565b01036028810187520185612187565b519283927f08c379a0000000000000000000000000000000000000000000000000000000008452600484015260248301906122a3565b0390fd5b6064848651907f08c379a000000000000000000000000000000000000000000000000000000000825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a61251d8587614cb6565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191906123ac565b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526032600452fd5b73ffffffffffffffffffffffffffffffffffffffff1660008181527f015260285f12fe1d77221203cd7e5aa67b79d47399b4bedd98b8730e56d911bf6020908152604080832054909391927f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5629290916001919060ff161561265b57505050505050565b61266490614cc7565b928551916126718361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116126f85750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a6127358587614cb6565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01919061269e565b73ffffffffffffffffffffffffffffffffffffffff1660008181527f10c15aae13326e9b33c92ffbb94efb7492c500f0cca324caca9bd1aca194ed186020908152604080832054909391927ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab9290916001919060ff16156127ec57505050505050565b6127f590614cc7565b928551916128028361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116128895750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a6128c68587614cb6565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01919061282f565b60009080825260019160209280845260409473ffffffffffffffffffffffffffffffffffffffff868420911690818452855260ff86842054161561294057505050505050565b61294990614cc7565b928551916129568361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116129dd5750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a612a1a8587614cb6565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019190612983565b73ffffffffffffffffffffffffffffffffffffffff1660008181527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db60205260408120549091907f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419060ff1615612ac457505050565b8083526001602052604083208284526020526040832060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d339380a4565b90600091808352600160205273ffffffffffffffffffffffffffffffffffffffff6040842092169182845260205260ff604084205416612b6957505050565b808352600160205260408320828452602052604083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b339380a4565b91908203918211612bd957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080603354916040918251937fbf3759b500000000000000000000000000000000000000000000000000000000855273ffffffffffffffffffffffffffffffffffffffff90602086600481858560081c165afa958615612de7578496612db3575b5060ff1615612d7757612c83612c7e614445565b61427f565b508580821015612d5457612c98929350612bcc565b905b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d5096080612cc78488612bcc565b965b86519086825285602083015288888301526060820152a160335460081c16803b156120e45760009283606492865197889586947fa1d9bafc0000000000000000000000000000000000000000000000000000000086526004860152602485015260448401525af1908115612d4a5750612d3f5750565b612d489061210c565b565b513d6000823e3d90fd5b90818111612d64575b5050612c9a565b612d6f929450612bcc565b918438612d5d565b84925060809150612da87f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d50995612e7e565b969193909394612cc9565b9095506020813d8211612ddf575b81612dce60209383612187565b8101031261123a57519460ff612c6a565b3d9150612dc1565b85513d86823e3d90fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612bd95760010190565b80518210156122175760209160051b010190565b81810292918115918404141715612bd957565b908160209103126120e4575173ffffffffffffffffffffffffffffffffffffffff811681036120e45790565b91908201809211612bd957565b9060008091828492612e8e614379565b9573ffffffffffffffffffffffffffffffffffffffff908160345416906040938451998a927f70a08231000000000000000000000000000000000000000000000000000000009485855230600486015284602460209687935afa9b8c156131c257889c6131ef575b50612f01828d612e71565b91156131cc5750602460608660335460081c168851928380927f39ebf8230000000000000000000000000000000000000000000000000000000082523060048301525afa9081156131c2579084918991613133575b500151918282111561305f575090612f6d91612bcc565b98612f78888b612e71565b9384151580613056575b612f90575b50505050505050565b612fa3612f9e849387612bcc565b613f4e565b506034541692602486518095819382523060048301525afa93841561304d5750849361301d575b50508110612fdd575b8080808080612f87565b91928286929611600014612ff757505092905b3880612fd3565b9094918561300491612bcc565b91508082101561301657505b90612ff0565b9050613010565b9080929350813d8311613046575b6130358183612187565b81010312610f0f5751903880612fca565b503d61302b565b513d86823e3d90fd5b50848210612f82565b9a995061306b91612bcc565b97613076888a612e71565b938415158061312a575b61308d5750505050505050565b61309b612f9e849387612bcc565b506034541692602486518095819382523060048301525afa93841561304d575084936130fa575b505081106130d4578080808080612f87565b919282859295116000146130ed57505091903880612fd3565b9093918461300491612bcc565b9080929350813d8311613123575b6131128183612187565b81010312610f0f57519038806130c2565b503d613108565b50848210613080565b9150506060813d82116131ba575b8161314e60609383612187565b81010312610f0b578651906060820182811067ffffffffffffffff82111761318d57885280518252808501518286015287015187820152839038612f56565b60248a7f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b3d9150613141565b87513d8a823e3d90fd5b955050505050508592939450949094116131e7575b50829190565b9150386131e1565b909b508381813d8311613217575b6132078183612187565b81010312610f0b57519a38612ef6565b503d6131fd565b60405190606554808352826020918282019060656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c7936000905b82821061327157505050612d4892500383612187565b855473ffffffffffffffffffffffffffffffffffffffff168452600195860195889550938101939091019061325b565b908160209103126120e4575180151581036120e45790565b7f80000000000000000000000000000000000000000000000000000000000000008114612bd95760000390565b81810392916000138015828513169184121617612bd957565b9060ff60335416613e725761331261321e565b806101e05251908115613e6d5782518301926020818186019503126120e457602081015167ffffffffffffffff918282116120e457019380603f860112156120e457602085015191613363836121c8565b956133716040519788612187565b8387526040602088019460051b8201019283116120e457604001925b828410613e5457505050506000906060938051613e40575b506000936000938480966024602073ffffffffffffffffffffffffffffffffffffffff60345416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa80156138b9578361014052613e0c575b5081610260528196829661014051610160527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061346d6101e05151613462613455826121c8565b6040518061024052612187565b8061024051526121c8565b013660206102405101377fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60e052836035546080525b6101e051805182101561377657602073ffffffffffffffffffffffffffffffffffffffff6134d384602494612e1e565b5116604051928380927fa7d385e20000000000000000000000000000000000000000000000000000000082526101405160048301525afa80156136df5760006101805261373b575b50602073ffffffffffffffffffffffffffffffffffffffff613540836101e051612e1e565b51166102209081527fc1590cd7000000000000000000000000000000000000000000000000000000006040518060c05252600460c0518092515afa8060a052156136df5760006102005260a0516136fd575b6135a26102005161016051612e71565b61016052610180518a81116136eb575b50608051600a80828102048203612bd9570261020051116135dc575b6135d790612df1565b6134a3565b602073ffffffffffffffffffffffffffffffffffffffff613600836101e051612e1e565b51166101a09081527f57ded9c9000000000000000000000000000000000000000000000000000000006040518061028052526004610280518092515afa806101c052156136df576000610120526101c05161369f575b6136666102005161012051612e32565b6136738261024051612e1e565b5260e05161012051908110613689575b506135ce565b60e05261020051610260529250826135d7613683565b60203d6020116136d8575b6136b78161028051612187565b6020610280518092810103126136d1575161012052613656565b6101205180fd5b503d6136aa565b6040513d6000823e3d90fd5b61020051909a509850935083386135b2565b60203d602011613734575b6137148160c051612187565b602060c05180928101031261372d575161020052613592565b6102005180fd5b503d613708565b6020813d60201161376e575b8161375460209383612187565b810103126137675751610180523861351b565b6101805180fd5b3d9150613747565b50509295989194979690939661016051613bec575b50501015613a2f575050506000805b82811061392c57506066548111613902576000905b8282106137bc5750505050565b806137c78386612e1e565b5113156138c4576137e2906137dc8386612e1e565b516132e6565b6137ec8285612e1e565b5260009061384173ffffffffffffffffffffffffffffffffffffffff6034541673ffffffffffffffffffffffffffffffffffffffff61382e846101e051612e1e565b511661383a8488612e1e565b5191614e4d565b73ffffffffffffffffffffffffffffffffffffffff613863826101e051612e1e565b5116803b15610f0f578280916004604051809481937fd0e30db00000000000000000000000000000000000000000000000000000000083525af180156138b957906138b392916114085750612df1565b906137af565b6040513d85823e3d90fd5b9060006138d18286612e1e565b51136138e1575b6138b390612df1565b906138fa6138b3916138f38487612e1e565b5190612bcc565b9190506138d8565b60046040517f5c3810af000000000000000000000000000000000000000000000000000000008152fd5b60006139388286612e1e565b511261394d575b61394890612df1565b61379a565b90600061396361395d8487612e1e565b516132b9565b602073ffffffffffffffffffffffffffffffffffffffff613987866101e051612e1e565b5116602461399861395d888b612e1e565b60405195869384927f2e1a7d4d00000000000000000000000000000000000000000000000000000000845260048401525af19182156136df576000926139f9575b50916139eb6139f19261394894612bcc565b90612e71565b91905061393f565b90916020823d602011613a27575b81613a1460209383612187565b8101031261025e575051906139eb6139d9565b3d9150613a07565b9193509150613b5c575b5073ffffffffffffffffffffffffffffffffffffffff6034541690604051907f70a08231000000000000000000000000000000000000000000000000000000008252306004830152602082602481865afa9182156136df57600092613b28575b5081613aa457505050565b613ad7613ae09273ffffffffffffffffffffffffffffffffffffffff9485613acf856101e051612e1e565b511690614e4d565b6101e051612e1e565b5116803b156120e457600080916004604051809481937fd0e30db00000000000000000000000000000000000000000000000000000000083525af180156136df57612d3f5750565b90916020823d602011613b54575b81613b4360209383612187565b8101031261025e5750519038613a99565b3d9150613b36565b602073ffffffffffffffffffffffffffffffffffffffff613b826000936101e051612e1e565b51166004604051809481937f853828b60000000000000000000000000000000000000000000000000000000083525af180156136df5715613a3957613bde9060203d602011613be5575b613bd68183612187565b8101906132a1565b5038613a39565b503d613bcc565b959892949396909791506000806102a05280610100525b6101e05151906101005191821015613db357818b03613d5357613c3791506139eb88613c32610140518d612e71565b612e32565b966102605180151580613d45575b613c62575b505b613c5861010051612df1565b6101005296613c03565b613c7890613c73610140518c612e71565b612e71565b73ffffffffffffffffffffffffffffffffffffffff613c9a8c6101e051612e1e565b51166020613cae6101405161026051612e71565b6024604051809481937fa7d385e200000000000000000000000000000000000000000000000000000000835260048301525afa9081156136df57600091613d11575b50613cfe90613d0792612e32565b6102a051612e71565b6102a05238613c4a565b906020823d602011613d3d575b81613d2b60209383612187565b8101031261025e575051613d07613cf0565b3d9150613d1e565b5060016101e0515111613c45565b818603613d7c57613d769150613d6f6101005161024051612e1e565b5190612e71565b96613c4c565b613d6f613d8c9261024051612e1e565b96613daa613da06101005161024051612e1e565b516102a051612e71565b6102a052613c4c565b9298505095929391979450806102a0511180613dfe575b15613dec57509050600190613de5610160516102a051613e76565b388061378b565b61016051613df991613e76565b613de5565b5060016101e0515111613dca565b6020813d602011613e38575b81613e2560209383612187565b81010312610f0f5751610140523861340e565b3d9150613e18565b909350613e4d91506145d8565b92386133a5565b835182811681036120e45781526020938401930161338d565b915050565b9050565b8115613e80570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6040516020908181019067ffffffffffffffff928183108484111761212057929082604052600081526040519360408501918180870152518092526060850193926000905b838210613f35575050505050906110de81612d4893037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612187565b8451811686529482019493820193600190910190613ef4565b600080613f5961321e565b928351928315614277576066549485831061426e5781959395935b613f7e8185612bcc565b871015614265577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff968397845b88811061411e57505073ffffffffffffffffffffffffffffffffffffffff9788613fd58286612e1e565b51166040998a51928380937f5be9b2d3000000000000000000000000000000000000000000000000000000008252602094859160049788915afa9081156141145789916140f7575b50156140e857602483926140328e938a612e1e565b51169489614040888d612bcc565b935196879485937f2e1a7d4d0000000000000000000000000000000000000000000000000000000085528401525af1998a15611245575085996140b4575b505061408d8861409392612e71565b95612df1565b96156140aa5760068710156140aa57959395613f74565b5050505091505090565b9080929950813d83116140e1575b6140cc8183612187565b8101031261123a57519661408d61409361407e565b503d6140c2565b50505050965050505050505090565b61410e9150843d8611613be557613bd68183612187565b3861401d565b8d513d8b823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8061413e8388612e1e565b5116906040918251918280927f5be9b2d3000000000000000000000000000000000000000000000000000000008252602093849160049687915afa90811561425b578b9161423e575b5061419f575b5050505061419a90612df1565b613fab565b81906141ab868b612e1e565b51168451938480927f57ded9c90000000000000000000000000000000000000000000000000000000082525afa92831561423557508892614207575b50508281106141f9575b80808061418d565b9150985061419a89906141f1565b90809250813d831161422e575b61421e8183612187565b8101031261051f575138806141e7565b503d614214565b513d8a823e3d90fd5b6142559150833d8511613be557613bd68183612187565b38614187565b85513d8d823e3d90fd5b50505050505090565b50935050505090565b935050505090565b6024602073ffffffffffffffffffffffffffffffffffffffff60345416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9081156136df57600091614312575b508181106142ec575090600090565b80613c73612f9e6142fd9385612bcc565b81811061430b575090600090565b9160009150565b906020823d821161433b575b8161432b60209383612187565b8101031261025e575051386142dd565b3d915061431e565b604051906080820182811067ffffffffffffffff8211176121205760405260006060838181528260208201528260408201520152565b600060655481905b80821061438d57505090565b9091614398836121e0565b9054906040918251917fc1590cd70000000000000000000000000000000000000000000000000000000083528260048173ffffffffffffffffffffffffffffffffffffffff602095869560031b1c165afa928315612d4a5750600092614414575b50506144089061440e92612e71565b92612df1565b90614381565b81819392933d831161443e575b61442b8183612187565b8101031261025e575051816144086143f9565b503d614421565b602490614450614379565b602073ffffffffffffffffffffffffffffffffffffffff60345416604051948580927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9283156136df576000936144bb575b50916144b89192612e71565b90565b6020813d82116144e6575b816144d360209383612187565b8101031261123a575192506144b86144ac565b3d91506144c6565b6144f6614445565b9081156145d2576000916065549280935b80851061451a57506144b8929350613e76565b90614524856121e0565b9054906040918251917f116ac4a30000000000000000000000000000000000000000000000000000000083528260048173ffffffffffffffffffffffffffffffffffffffff602095869560031b1c165afa928315612d4a57506000926145a1575b50506145949061459a92612e71565b94612df1565b9390614507565b81819392933d83116145cb575b6145b88183612187565b8101031261025e57505181614594614585565b503d6145ae565b60009150565b6000906000916065546145ea816121c8565b926040916145fa83519586612187565b8085527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0614627826121c8565b01602090368288013785968351830361487157614642614445565b96871561486357509291908380935b83851061469c5750505050506127100361467357509061467091613e76565b91565b600490517f6edcc523000000000000000000000000000000000000000000000000000000008152fd5b90919293966127106146da6146c767ffffffffffffffff98896146bf8d88612e1e565b511690612e71565b976146d28b86612e1e565b51168b612e32565b046146e4896121e0565b9190548951927fc1590cd70000000000000000000000000000000000000000000000000000000084526004938881868173ffffffffffffffffffffffffffffffffffffffff8097600397881b1c165afa90811561485957918f8a94928f948b9161480e575b5084602494939261476861476061476e948b6132e6565b978892612e1e565b526121e0565b9054911b1c16948c5195869384927fa7d385e20000000000000000000000000000000000000000000000000000000084528301525afa9182156148045785926147d3575b50916139eb6147c4926147ca94612e32565b97612df1565b93929190614651565b9091508581813d83116147fd575b6147eb8183612187565b8101031261159e5751906139eb6147b2565b503d6147e1565b89513d87823e3d90fd5b9395929450505081813d8311614852575b6148298183612187565b81010312610f0b5788928f9261476e8f8095614768614760602497519450505092939450614749565b503d61481f565b8c513d8a823e3d90fd5b989750955050505050509190565b600485517fcdeedcbd000000000000000000000000000000000000000000000000000000008152fd5b6148a261321e565b9081519160005b8381106148da5760046040517f30990b67000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff806148fa8385612e1e565b51169080851691821461491757505061491290612df1565b6148a9565b9094600094508161492a84869596612e1e565b511692604094855180957f853828b600000000000000000000000000000000000000000000000000000000825260209687918160049b8c925af18015614b3257614b15575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92838101908111614ae75784818303614ac6575b5050505060659081548015614a98578493929101906149e86149c6836121e0565b73ffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055565b55603454169360248451809681937f70a0823100000000000000000000000000000000000000000000000000000000835230908301525afa918215612d4a5750600091614a6c575b509050614a5f575b7f95c84dbc5fd872c46b0e4290775a1a4ea1c8d760f9e4d38f48ba71b6f9a667db600080a2565b614a67613eaf565b614a38565b82813d8311614a91575b614a808183612187565b8101031261025e5750518038614a30565b503d614a76565b6031877f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b614ad66116b292614ade95612e1e565b5116916121e0565b388080846149a5565b6011887f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b614b2b90863d8811613be557613bd68183612187565b503861496f565b87513d6000823e3d90fd5b614b4561321e565b9081519160005b838110614b7d5760046040517f30990b67000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff80614b9d8385612e1e565b511690808516918214614bba575050614bb590612df1565b614b4c565b90946000945081614bcd84869596612e1e565b511692604094855180957f853828b600000000000000000000000000000000000000000000000000000000825260209687918160049b8c925af1908115614b3257600091614c99575b5015614c71577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92838101908111614ae75784818303614ac6575050505060659081548015614a98578493929101906149e86149c6836121e0565b8686517fa1248235000000000000000000000000000000000000000000000000000000008152fd5b614cb09150863d8811613be557613bd68183612187565b38614c16565b908151811015612217570160200190565b604051906060820182811067ffffffffffffffff82111761212057604052602a82526020820160403682378251156122175760309053815160019081101561221757607860218401536029905b808211614d82575050614d245790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015614e1f577f3031323334353637383961626364656600000000000000000000000000000000901a614dbe8486614cb6565b5360041c918015614df1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190614d14565b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff90921660248301526044820192909252612d4891610aff8260648101610ad3565b604051614f369173ffffffffffffffffffffffffffffffffffffffff16614ed28261214f565b6000806020958685527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656487860152868151910182855af13d15614fdf573d91614f1a83612246565b92614f286040519485612187565b83523d60008785013e614fe3565b80519081614f4357505050565b8280614f539383010191016132a1565b15614f5b5750565b608490604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b6060915b9192901561505e5750815115614ff7575090565b3b156150005790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156150715750805190602001fd5b612480906040519182917f08c379a00000000000000000000000000000000000000000000000000000000083526020600484015260248301906122a356fea2646970667358221220e6aebacc82a93d7303967dd1fc6fdf63bd78d6ffd7f2b8384bfe5fdcca62c6ed64736f6c63430008110033", + "nonce": "0x3bb", + "accessList": [] + }, + "additionalContracts": [] + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x711eb89a44e5dcb9c9001cc6ff0956fba43402940081d91c6471bbe19f913282" + ], + "path": "/Users/gnervo/Documents/Angle/strategies-dev/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-latest.json", + "returns": {}, + "timestamp": 1675944261, + "chain": 1, + "multi": false, + "commit": "86f454d" +} \ No newline at end of file diff --git a/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-1675944268.json b/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-1675944268.json new file mode 100644 index 0000000..a018740 --- /dev/null +++ b/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-1675944268.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0x711eb89a44e5dcb9c9001cc6ff0956fba43402940081d91c6471bbe19f913282", + "transactionType": "CREATE", + "contractName": "OptimizerAPRStrategy", + "contractAddress": "0x7411B6648Ae65CB99446c25eCf5363d59941013B", + "function": null, + "arguments": null, + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x59c84e", + "value": "0x0", + "data": "0x60808060405234620000d3576000549060ff8260081c169081600014620000c857303b155b156200006f57501590816200005c575b506200004b575b6040516150e59081620000d98239f35b61ff0019600054166000556200003b565b61ffff1916610101176000553862000034565b62461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b60ff83161562000024565b600080fdfe6102c06040908082526004918236101561001857600080fd5b600092833560e01c9283630b6d1d1714612087575082630c016dc01461202e5782630e6e15f014611ff35782630f969b8714611f855782631d12f28b14611f485782631f1fcd5114611ef557826322f3e2d414611eb1578263248a9ca314611e6857826324ea54f414611e0f5782632e1a7d4d14611d9c5782632f2ff15d14611ca5578263364bc15a14611c4c57826336568abe14611b8e5782634641257d14611b575782634786b0cb14611b165782635641ec0314611ad45782635a5cd45e14611a99578263708ba9bd1461199a57826376ee75d8146119515782637985fd51146119145782638baf2957146118cb57826391d1485414611859578263929eea21146117d557826393084b34146115db578263a217fddf146115a2578263a526d83b1461148b578263af648c3d146112eb578263b8dc491b14611120578263bb927c46146110e3578263ce5c7f611461104c578263d547741f14610ff2578263dc4c90d314610f9c578263ddc6326214610f50578263e6a69ab814610f13578263e6bfbfd8146106a3578263ec342ad014610662578263efbb5cb014610620578263fcc5f59a1461026157505063fcf2d0ad146101d557600080fd5b3461025e57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e5761020c336125d8565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0060335416176033557f17fa25a1c2ac074f71f0cf4f6af525c06fab7d83eff5ffcf6df5277f2919ae248180a180f35b80fd5b83903461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760655461029d816121c8565b916102aa85519384612187565b8183527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06102d7836121c8565b01845b818110610605575050835b8281106103a557505050825191602080840190808552835180925285850181878460051b880101950193965b83881061031e5786860387f35b90919293948380827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a60019503018652885190610364825160808084528301906122a3565b918381015184830152868101518783015273ffffffffffffffffffffffffffffffffffffffff60608092015116910152970193019701969093929193610311565b6103ad614343565b6103b6826121e0565b905488517f8b2021760000000000000000000000000000000000000000000000000000000081528881878173ffffffffffffffffffffffffffffffffffffffff8096600398891b1c165afa9081156105fb578991610576575b5083528061041c856121e0565b905490841b1c16606084015280610432856121e0565b905490841b1c1691895180937fc1590cd7000000000000000000000000000000000000000000000000000000008252818860209687935afa90811561056c579187939185938c91610534575b508387015261048c876121e0565b9054911b1c168a51928380927f57ded9c90000000000000000000000000000000000000000000000000000000082525afa91821561052a5788926104f6575b5050878201526104f191906104e08287612e1e565b526104eb8186612e1e565b50612df1565b6102e5565b90809250813d8311610523575b61050d8183612187565b8101031261051f57516104f1896104cb565b8680fd5b503d610503565b89513d8a823e3d90fd5b929450509181813d8311610565575b61054d8183612187565b81010312610561579183918793518d61047e565b8980fd5b503d610543565b8b513d8c823e3d90fd5b90503d808a833e6105878183612187565b81019060209081818403126105f75780519067ffffffffffffffff82116105f357019082601f830112156105f757908b92918151926105d16105c885612246565b95519586612187565b8385528184840101116105f3576105ed92918482019101612280565b8a61040f565b8b80fd5b8a80fd5b8a513d8b823e3d90fd5b602090610610614343565b828288010152016102da565b5080fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b614445565b9051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209051670de0b6b3a76400008152f35b915034610f0f5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576106dc6120e9565b6106e46120c1565b916044359173ffffffffffffffffffffffffffffffffffffffff9182841691828503610f0b576064359267ffffffffffffffff8411610bcc5736602385011215610bcc578388013596610736886121c8565b9061074385519283612187565b8882526020958683016024809b60051b83010191368311610dea578b01905b828210610eef575050508a549760ff93848a60081c1680600014610ee657303b155b15610e655789898f928f90159d8e610e37575b506033547fffffffffffffffffffffff0000000000000000000000000000000000000000ff74ffffffffffffffffffffffffffffffffffffffff008c60081b1691161790816033558b51809481937ffc0c546a00000000000000000000000000000000000000000000000000000000835260081c165afa908115610e2d578b8f928c928591610e00575b5016807fffffffffffffffffffffffff000000000000000000000000000000000000000060345416176034558a51928380927f313ce5670000000000000000000000000000000000000000000000000000000082525afa918215610df557908792610db7575b5016604d8111610d8c57600a0a6035558015908115610d81575b8115610d75575b50610d4d578b949392916108be6108c392612a4e565b612a4e565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5629182855260019384885288878720911690818752885281878720541615610ce7575b50908291859387965284885284868520015492807fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9481868880a480868887200155857f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419786898098528383838320015489898480a42001558151908d5b828110610be157505050507ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab808c5283875283868d200154918c80a4828920015568056bc75e2d63100000603655603354927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00841660335580603454169360081c168151917fdd62ed3e000000000000000000000000000000000000000000000000000000008352308884015281878401528383604481885afa928315610bd7578993610ba4575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301809311610b7957517f095ea7b3000000000000000000000000000000000000000000000000000000009381019390935273ffffffffffffffffffffffffffffffffffffffff168583019081526020810191909152610b049290610aff9083906040015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101845283612187565b614eac565b610b4e575b603554916103e89280840293840403610b2457505060665580f35b601184917f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff8354168355610b09565b868960118a7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b9092508381813d8311610bd0575b610bbc8183612187565b81010312610bcc57519138610a4c565b8880fd5b503d610bb2565b81513d8b823e3d90fd5b90919293945089610bf28286612e1e565b511615610cbf57808e8b610c09610c4e9488612e1e565b51167ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab808352898d528b83208284528d52858c8420541615610c59575b505050612df1565b908694939291610984565b808352898d528b83208284528d528b83208a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d339380a48e3880610c46565b8c88517fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b8386528488528686208187528852868620857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790553390847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8880a438610906565b8a86517fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b905088831614386108a8565b838a161591506108a1565b8b8e60118f7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8092508a8092503d8311610dee575b610dd08183612187565b81010312610dea57518581168103610dea57859038610887565b8d80fd5b503d610dc6565b8951903d90823e3d90fd5b610e209150833d8511610e26575b610e188183612187565b810190612e45565b38610821565b503d610e0e565b89513d84823e3d90fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661010117845538610797565b60848d602e8e8c8c51937f08c379a00000000000000000000000000000000000000000000000000000000085528401528201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152fd5b858b1615610784565b81358a81168103610f07578152908801908801610762565b8e80fd5b8780fd5b8280fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090516301e185588152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f8933612769565b610f91612c08565b610f99613eaf565b80f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209073ffffffffffffffffffffffffffffffffffffffff60335460081c169051908152f35b915034610f0f57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57610f99913561104760016110346120c1565b93838752816020528620015433906128fa565b612b2a565b915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f578282359267ffffffffffffffff841161061c573660238501121561061c57830135926110b46110ab85612246565b93519384612187565b838352366024858301011161061c5783610f999460246020930183860137830101526110de612c08565b6132ff565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906065549051908152f35b915034610f0f57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576111586120e9565b6111606120c1565b9061116a336122e6565b73ffffffffffffffffffffffffffffffffffffffff908180603454169116918183146112c35784519061119c8261214f565b60018252602092838301843682378351156112975752815191885b83811061124e57505050508351947f70a0823100000000000000000000000000000000000000000000000000000000865230908601528085602481855afa9384156112455750859361120f575b50610f999350614e4d565b90925083813d831161123e575b6112268183612187565b8101031261123a57610f9992519138611204565b8380fd5b503d61121c565b513d87823e3d90fd5b826112598284612e1e565b5116861461126f5761126a90612df1565b6111b7565b8888517fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b60248a60328b7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8585517fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576113256120e9565b9161132f336125d8565b837f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504180825260016020528282209373ffffffffffffffffffffffffffffffffffffffff8096169485845260205260ff8484205416611425575b60655495835b878110611399578480f35b816113a3826121e0565b90549060031b1c16803b156114215785809160448951809481937fd547741f0000000000000000000000000000000000000000000000000000000083528a8a8401528d60248401525af18015611417579061140392916114085750612df1565b61138e565b6114119061210c565b386104eb565b87513d88823e3d90fd5b8580fd5b81835260016020528383208584526020528383207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690553385837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b8680a4611388565b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57906114c66120e9565b906114d0336125d8565b6114d982612a4e565b8360655493819373ffffffffffffffffffffffffffffffffffffffff809116945b868110611505578380f35b8161150f826121e0565b90549060031b1c16803b1561159e5784809160448851809481937f2f2ff15d0000000000000000000000000000000000000000000000000000000083527f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50418a8401528c60248401525af18015611594579061158f92916114085750612df1565b6114fa565b86513d87823e3d90fd5b8480fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5751908152602090f35b83823461061c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57823573ffffffffffffffffffffffffffffffffffffffff918282169283830361159e57611638336122e6565b81517fa8c62e760000000000000000000000000000000000000000000000000000000081526020818881885afa9081156117cb5786916117ad575b5081309116036117855760655491855b838110611737575050506801000000000000000081101561170b57906116b28260016116e494016065556121e0565b90919082549060031b9173ffffffffffffffffffffffffffffffffffffffff9283811b93849216901b16911916179055565b7f1e7b117a6591133f0b36fc2c24d59f8465d806fdcad63aa33246b45fd62c89ff8280a280f35b6024846041877f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b82611741826121e0565b90549060031b1c16861461175d5761175890612df1565b611683565b8782517f7cc7731c000000000000000000000000000000000000000000000000000000008152fd5b8582517feeacc72d000000000000000000000000000000000000000000000000000000008152fd5b6117c5915060203d8111610e2657610e188183612187565b87611673565b83513d88823e3d90fd5b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f5735606554811015610f0f5773ffffffffffffffffffffffffffffffffffffffff906065602094527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70154169051908152f35b90915034610f0f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f578160209360ff926118996120c1565b903582526001865273ffffffffffffffffffffffffffffffffffffffff83832091168252855220541690519015158152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f996119066120e9565b61190f33612769565b614b3d565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906066549051908152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f9961198c6120e9565b611995336122e6565b61489a565b833461025e57602091827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57803567ffffffffffffffff9182821161123a573660238301121561123a578101356119f6816121c8565b92611a0387519485612187565b81845260248685019260051b8401019236841161142157959695602401915b838310611a7b5750505050611a36906145d8565b9190835194848695860192865281860152835180925280606086019401925b828110611a6457505050500390f35b835185528695509381019392810192600101611a55565b8297969735828116810361051f578152959695918701918701611a22565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b6144ee565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209060ff6033541690519015158152f35b83903461061c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57611b50336122e6565b3560665580f35b833461025e57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f91612c08565b83903461061c57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57611bc66120c1565b903373ffffffffffffffffffffffffffffffffffffffff831603611bef5790610f999135612b2a565b60649060208551917f08c379a0000000000000000000000000000000000000000000000000000000008352820152600260248201527f37310000000000000000000000000000000000000000000000000000000000006044820152fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab8152f35b90915034610f0f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f573590611ce06120c1565b908284526001602052611cfa6001828620015433906128fa565b828452600160205273ffffffffffffffffffffffffffffffffffffffff81852092169182855260205260ff818520541615611d33578380f35b8284526001602052808420828552602052832060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905533917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8480a43880808380f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e5750611de090611dda336125d8565b3561427f565b611e03823373ffffffffffffffffffffffffffffffffffffffff60345416614e4d565b82519182526020820152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50418152f35b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57816020936001923581528285522001549051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090611eec614445565b15159051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209073ffffffffffffffffffffffffffffffffffffffff603454169051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906036549051908152f35b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f577fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a8600916020913590611fe7336122e6565b8160365551908152a180f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b614379565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5628152f35b84903461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906035548152f35b6024359073ffffffffffffffffffffffffffffffffffffffff821682036120e457565b600080fd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036120e457565b67ffffffffffffffff811161212057604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761212057604052565b6080810190811067ffffffffffffffff82111761212057604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761212057604052565b67ffffffffffffffff81116121205760051b60200190565b6065548110156122175760656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b67ffffffffffffffff811161212057601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381106122935750506000910152565b8181015183820152602001612283565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936122df81518092818752878088019101612280565b0116010190565b73ffffffffffffffffffffffffffffffffffffffff1660008181527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db6020908152604080832054909391927f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419290916001919060ff161561236957505050505050565b61237290614cc7565b9285519161237f8361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116124e05750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b8401917f206973206d697373696e6720726f6c6520000000000000000000000000000000603784015251809386840190612280565b01036028810187520185612187565b519283927f08c379a0000000000000000000000000000000000000000000000000000000008452600484015260248301906122a3565b0390fd5b6064848651907f08c379a000000000000000000000000000000000000000000000000000000000825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a61251d8587614cb6565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191906123ac565b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526032600452fd5b73ffffffffffffffffffffffffffffffffffffffff1660008181527f015260285f12fe1d77221203cd7e5aa67b79d47399b4bedd98b8730e56d911bf6020908152604080832054909391927f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5629290916001919060ff161561265b57505050505050565b61266490614cc7565b928551916126718361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116126f85750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a6127358587614cb6565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01919061269e565b73ffffffffffffffffffffffffffffffffffffffff1660008181527f10c15aae13326e9b33c92ffbb94efb7492c500f0cca324caca9bd1aca194ed186020908152604080832054909391927ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab9290916001919060ff16156127ec57505050505050565b6127f590614cc7565b928551916128028361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116128895750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a6128c68587614cb6565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01919061282f565b60009080825260019160209280845260409473ffffffffffffffffffffffffffffffffffffffff868420911690818452855260ff86842054161561294057505050505050565b61294990614cc7565b928551916129568361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116129dd5750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a612a1a8587614cb6565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019190612983565b73ffffffffffffffffffffffffffffffffffffffff1660008181527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db60205260408120549091907f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419060ff1615612ac457505050565b8083526001602052604083208284526020526040832060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d339380a4565b90600091808352600160205273ffffffffffffffffffffffffffffffffffffffff6040842092169182845260205260ff604084205416612b6957505050565b808352600160205260408320828452602052604083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b339380a4565b91908203918211612bd957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080603354916040918251937fbf3759b500000000000000000000000000000000000000000000000000000000855273ffffffffffffffffffffffffffffffffffffffff90602086600481858560081c165afa958615612de7578496612db3575b5060ff1615612d7757612c83612c7e614445565b61427f565b508580821015612d5457612c98929350612bcc565b905b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d5096080612cc78488612bcc565b965b86519086825285602083015288888301526060820152a160335460081c16803b156120e45760009283606492865197889586947fa1d9bafc0000000000000000000000000000000000000000000000000000000086526004860152602485015260448401525af1908115612d4a5750612d3f5750565b612d489061210c565b565b513d6000823e3d90fd5b90818111612d64575b5050612c9a565b612d6f929450612bcc565b918438612d5d565b84925060809150612da87f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d50995612e7e565b969193909394612cc9565b9095506020813d8211612ddf575b81612dce60209383612187565b8101031261123a57519460ff612c6a565b3d9150612dc1565b85513d86823e3d90fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612bd95760010190565b80518210156122175760209160051b010190565b81810292918115918404141715612bd957565b908160209103126120e4575173ffffffffffffffffffffffffffffffffffffffff811681036120e45790565b91908201809211612bd957565b9060008091828492612e8e614379565b9573ffffffffffffffffffffffffffffffffffffffff908160345416906040938451998a927f70a08231000000000000000000000000000000000000000000000000000000009485855230600486015284602460209687935afa9b8c156131c257889c6131ef575b50612f01828d612e71565b91156131cc5750602460608660335460081c168851928380927f39ebf8230000000000000000000000000000000000000000000000000000000082523060048301525afa9081156131c2579084918991613133575b500151918282111561305f575090612f6d91612bcc565b98612f78888b612e71565b9384151580613056575b612f90575b50505050505050565b612fa3612f9e849387612bcc565b613f4e565b506034541692602486518095819382523060048301525afa93841561304d5750849361301d575b50508110612fdd575b8080808080612f87565b91928286929611600014612ff757505092905b3880612fd3565b9094918561300491612bcc565b91508082101561301657505b90612ff0565b9050613010565b9080929350813d8311613046575b6130358183612187565b81010312610f0f5751903880612fca565b503d61302b565b513d86823e3d90fd5b50848210612f82565b9a995061306b91612bcc565b97613076888a612e71565b938415158061312a575b61308d5750505050505050565b61309b612f9e849387612bcc565b506034541692602486518095819382523060048301525afa93841561304d575084936130fa575b505081106130d4578080808080612f87565b919282859295116000146130ed57505091903880612fd3565b9093918461300491612bcc565b9080929350813d8311613123575b6131128183612187565b81010312610f0f57519038806130c2565b503d613108565b50848210613080565b9150506060813d82116131ba575b8161314e60609383612187565b81010312610f0b578651906060820182811067ffffffffffffffff82111761318d57885280518252808501518286015287015187820152839038612f56565b60248a7f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b3d9150613141565b87513d8a823e3d90fd5b955050505050508592939450949094116131e7575b50829190565b9150386131e1565b909b508381813d8311613217575b6132078183612187565b81010312610f0b57519a38612ef6565b503d6131fd565b60405190606554808352826020918282019060656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c7936000905b82821061327157505050612d4892500383612187565b855473ffffffffffffffffffffffffffffffffffffffff168452600195860195889550938101939091019061325b565b908160209103126120e4575180151581036120e45790565b7f80000000000000000000000000000000000000000000000000000000000000008114612bd95760000390565b81810392916000138015828513169184121617612bd957565b9060ff60335416613e725761331261321e565b806101e05251908115613e6d5782518301926020818186019503126120e457602081015167ffffffffffffffff918282116120e457019380603f860112156120e457602085015191613363836121c8565b956133716040519788612187565b8387526040602088019460051b8201019283116120e457604001925b828410613e5457505050506000906060938051613e40575b506000936000938480966024602073ffffffffffffffffffffffffffffffffffffffff60345416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa80156138b9578361014052613e0c575b5081610260528196829661014051610160527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061346d6101e05151613462613455826121c8565b6040518061024052612187565b8061024051526121c8565b013660206102405101377fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60e052836035546080525b6101e051805182101561377657602073ffffffffffffffffffffffffffffffffffffffff6134d384602494612e1e565b5116604051928380927fa7d385e20000000000000000000000000000000000000000000000000000000082526101405160048301525afa80156136df5760006101805261373b575b50602073ffffffffffffffffffffffffffffffffffffffff613540836101e051612e1e565b51166102209081527fc1590cd7000000000000000000000000000000000000000000000000000000006040518060c05252600460c0518092515afa8060a052156136df5760006102005260a0516136fd575b6135a26102005161016051612e71565b61016052610180518a81116136eb575b50608051600a80828102048203612bd9570261020051116135dc575b6135d790612df1565b6134a3565b602073ffffffffffffffffffffffffffffffffffffffff613600836101e051612e1e565b51166101a09081527f57ded9c9000000000000000000000000000000000000000000000000000000006040518061028052526004610280518092515afa806101c052156136df576000610120526101c05161369f575b6136666102005161012051612e32565b6136738261024051612e1e565b5260e05161012051908110613689575b506135ce565b60e05261020051610260529250826135d7613683565b60203d6020116136d8575b6136b78161028051612187565b6020610280518092810103126136d1575161012052613656565b6101205180fd5b503d6136aa565b6040513d6000823e3d90fd5b61020051909a509850935083386135b2565b60203d602011613734575b6137148160c051612187565b602060c05180928101031261372d575161020052613592565b6102005180fd5b503d613708565b6020813d60201161376e575b8161375460209383612187565b810103126137675751610180523861351b565b6101805180fd5b3d9150613747565b50509295989194979690939661016051613bec575b50501015613a2f575050506000805b82811061392c57506066548111613902576000905b8282106137bc5750505050565b806137c78386612e1e565b5113156138c4576137e2906137dc8386612e1e565b516132e6565b6137ec8285612e1e565b5260009061384173ffffffffffffffffffffffffffffffffffffffff6034541673ffffffffffffffffffffffffffffffffffffffff61382e846101e051612e1e565b511661383a8488612e1e565b5191614e4d565b73ffffffffffffffffffffffffffffffffffffffff613863826101e051612e1e565b5116803b15610f0f578280916004604051809481937fd0e30db00000000000000000000000000000000000000000000000000000000083525af180156138b957906138b392916114085750612df1565b906137af565b6040513d85823e3d90fd5b9060006138d18286612e1e565b51136138e1575b6138b390612df1565b906138fa6138b3916138f38487612e1e565b5190612bcc565b9190506138d8565b60046040517f5c3810af000000000000000000000000000000000000000000000000000000008152fd5b60006139388286612e1e565b511261394d575b61394890612df1565b61379a565b90600061396361395d8487612e1e565b516132b9565b602073ffffffffffffffffffffffffffffffffffffffff613987866101e051612e1e565b5116602461399861395d888b612e1e565b60405195869384927f2e1a7d4d00000000000000000000000000000000000000000000000000000000845260048401525af19182156136df576000926139f9575b50916139eb6139f19261394894612bcc565b90612e71565b91905061393f565b90916020823d602011613a27575b81613a1460209383612187565b8101031261025e575051906139eb6139d9565b3d9150613a07565b9193509150613b5c575b5073ffffffffffffffffffffffffffffffffffffffff6034541690604051907f70a08231000000000000000000000000000000000000000000000000000000008252306004830152602082602481865afa9182156136df57600092613b28575b5081613aa457505050565b613ad7613ae09273ffffffffffffffffffffffffffffffffffffffff9485613acf856101e051612e1e565b511690614e4d565b6101e051612e1e565b5116803b156120e457600080916004604051809481937fd0e30db00000000000000000000000000000000000000000000000000000000083525af180156136df57612d3f5750565b90916020823d602011613b54575b81613b4360209383612187565b8101031261025e5750519038613a99565b3d9150613b36565b602073ffffffffffffffffffffffffffffffffffffffff613b826000936101e051612e1e565b51166004604051809481937f853828b60000000000000000000000000000000000000000000000000000000083525af180156136df5715613a3957613bde9060203d602011613be5575b613bd68183612187565b8101906132a1565b5038613a39565b503d613bcc565b959892949396909791506000806102a05280610100525b6101e05151906101005191821015613db357818b03613d5357613c3791506139eb88613c32610140518d612e71565b612e32565b966102605180151580613d45575b613c62575b505b613c5861010051612df1565b6101005296613c03565b613c7890613c73610140518c612e71565b612e71565b73ffffffffffffffffffffffffffffffffffffffff613c9a8c6101e051612e1e565b51166020613cae6101405161026051612e71565b6024604051809481937fa7d385e200000000000000000000000000000000000000000000000000000000835260048301525afa9081156136df57600091613d11575b50613cfe90613d0792612e32565b6102a051612e71565b6102a05238613c4a565b906020823d602011613d3d575b81613d2b60209383612187565b8101031261025e575051613d07613cf0565b3d9150613d1e565b5060016101e0515111613c45565b818603613d7c57613d769150613d6f6101005161024051612e1e565b5190612e71565b96613c4c565b613d6f613d8c9261024051612e1e565b96613daa613da06101005161024051612e1e565b516102a051612e71565b6102a052613c4c565b9298505095929391979450806102a0511180613dfe575b15613dec57509050600190613de5610160516102a051613e76565b388061378b565b61016051613df991613e76565b613de5565b5060016101e0515111613dca565b6020813d602011613e38575b81613e2560209383612187565b81010312610f0f5751610140523861340e565b3d9150613e18565b909350613e4d91506145d8565b92386133a5565b835182811681036120e45781526020938401930161338d565b915050565b9050565b8115613e80570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6040516020908181019067ffffffffffffffff928183108484111761212057929082604052600081526040519360408501918180870152518092526060850193926000905b838210613f35575050505050906110de81612d4893037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612187565b8451811686529482019493820193600190910190613ef4565b600080613f5961321e565b928351928315614277576066549485831061426e5781959395935b613f7e8185612bcc565b871015614265577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff968397845b88811061411e57505073ffffffffffffffffffffffffffffffffffffffff9788613fd58286612e1e565b51166040998a51928380937f5be9b2d3000000000000000000000000000000000000000000000000000000008252602094859160049788915afa9081156141145789916140f7575b50156140e857602483926140328e938a612e1e565b51169489614040888d612bcc565b935196879485937f2e1a7d4d0000000000000000000000000000000000000000000000000000000085528401525af1998a15611245575085996140b4575b505061408d8861409392612e71565b95612df1565b96156140aa5760068710156140aa57959395613f74565b5050505091505090565b9080929950813d83116140e1575b6140cc8183612187565b8101031261123a57519661408d61409361407e565b503d6140c2565b50505050965050505050505090565b61410e9150843d8611613be557613bd68183612187565b3861401d565b8d513d8b823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8061413e8388612e1e565b5116906040918251918280927f5be9b2d3000000000000000000000000000000000000000000000000000000008252602093849160049687915afa90811561425b578b9161423e575b5061419f575b5050505061419a90612df1565b613fab565b81906141ab868b612e1e565b51168451938480927f57ded9c90000000000000000000000000000000000000000000000000000000082525afa92831561423557508892614207575b50508281106141f9575b80808061418d565b9150985061419a89906141f1565b90809250813d831161422e575b61421e8183612187565b8101031261051f575138806141e7565b503d614214565b513d8a823e3d90fd5b6142559150833d8511613be557613bd68183612187565b38614187565b85513d8d823e3d90fd5b50505050505090565b50935050505090565b935050505090565b6024602073ffffffffffffffffffffffffffffffffffffffff60345416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9081156136df57600091614312575b508181106142ec575090600090565b80613c73612f9e6142fd9385612bcc565b81811061430b575090600090565b9160009150565b906020823d821161433b575b8161432b60209383612187565b8101031261025e575051386142dd565b3d915061431e565b604051906080820182811067ffffffffffffffff8211176121205760405260006060838181528260208201528260408201520152565b600060655481905b80821061438d57505090565b9091614398836121e0565b9054906040918251917fc1590cd70000000000000000000000000000000000000000000000000000000083528260048173ffffffffffffffffffffffffffffffffffffffff602095869560031b1c165afa928315612d4a5750600092614414575b50506144089061440e92612e71565b92612df1565b90614381565b81819392933d831161443e575b61442b8183612187565b8101031261025e575051816144086143f9565b503d614421565b602490614450614379565b602073ffffffffffffffffffffffffffffffffffffffff60345416604051948580927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9283156136df576000936144bb575b50916144b89192612e71565b90565b6020813d82116144e6575b816144d360209383612187565b8101031261123a575192506144b86144ac565b3d91506144c6565b6144f6614445565b9081156145d2576000916065549280935b80851061451a57506144b8929350613e76565b90614524856121e0565b9054906040918251917f116ac4a30000000000000000000000000000000000000000000000000000000083528260048173ffffffffffffffffffffffffffffffffffffffff602095869560031b1c165afa928315612d4a57506000926145a1575b50506145949061459a92612e71565b94612df1565b9390614507565b81819392933d83116145cb575b6145b88183612187565b8101031261025e57505181614594614585565b503d6145ae565b60009150565b6000906000916065546145ea816121c8565b926040916145fa83519586612187565b8085527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0614627826121c8565b01602090368288013785968351830361487157614642614445565b96871561486357509291908380935b83851061469c5750505050506127100361467357509061467091613e76565b91565b600490517f6edcc523000000000000000000000000000000000000000000000000000000008152fd5b90919293966127106146da6146c767ffffffffffffffff98896146bf8d88612e1e565b511690612e71565b976146d28b86612e1e565b51168b612e32565b046146e4896121e0565b9190548951927fc1590cd70000000000000000000000000000000000000000000000000000000084526004938881868173ffffffffffffffffffffffffffffffffffffffff8097600397881b1c165afa90811561485957918f8a94928f948b9161480e575b5084602494939261476861476061476e948b6132e6565b978892612e1e565b526121e0565b9054911b1c16948c5195869384927fa7d385e20000000000000000000000000000000000000000000000000000000084528301525afa9182156148045785926147d3575b50916139eb6147c4926147ca94612e32565b97612df1565b93929190614651565b9091508581813d83116147fd575b6147eb8183612187565b8101031261159e5751906139eb6147b2565b503d6147e1565b89513d87823e3d90fd5b9395929450505081813d8311614852575b6148298183612187565b81010312610f0b5788928f9261476e8f8095614768614760602497519450505092939450614749565b503d61481f565b8c513d8a823e3d90fd5b989750955050505050509190565b600485517fcdeedcbd000000000000000000000000000000000000000000000000000000008152fd5b6148a261321e565b9081519160005b8381106148da5760046040517f30990b67000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff806148fa8385612e1e565b51169080851691821461491757505061491290612df1565b6148a9565b9094600094508161492a84869596612e1e565b511692604094855180957f853828b600000000000000000000000000000000000000000000000000000000825260209687918160049b8c925af18015614b3257614b15575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92838101908111614ae75784818303614ac6575b5050505060659081548015614a98578493929101906149e86149c6836121e0565b73ffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055565b55603454169360248451809681937f70a0823100000000000000000000000000000000000000000000000000000000835230908301525afa918215612d4a5750600091614a6c575b509050614a5f575b7f95c84dbc5fd872c46b0e4290775a1a4ea1c8d760f9e4d38f48ba71b6f9a667db600080a2565b614a67613eaf565b614a38565b82813d8311614a91575b614a808183612187565b8101031261025e5750518038614a30565b503d614a76565b6031877f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b614ad66116b292614ade95612e1e565b5116916121e0565b388080846149a5565b6011887f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b614b2b90863d8811613be557613bd68183612187565b503861496f565b87513d6000823e3d90fd5b614b4561321e565b9081519160005b838110614b7d5760046040517f30990b67000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff80614b9d8385612e1e565b511690808516918214614bba575050614bb590612df1565b614b4c565b90946000945081614bcd84869596612e1e565b511692604094855180957f853828b600000000000000000000000000000000000000000000000000000000825260209687918160049b8c925af1908115614b3257600091614c99575b5015614c71577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92838101908111614ae75784818303614ac6575050505060659081548015614a98578493929101906149e86149c6836121e0565b8686517fa1248235000000000000000000000000000000000000000000000000000000008152fd5b614cb09150863d8811613be557613bd68183612187565b38614c16565b908151811015612217570160200190565b604051906060820182811067ffffffffffffffff82111761212057604052602a82526020820160403682378251156122175760309053815160019081101561221757607860218401536029905b808211614d82575050614d245790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015614e1f577f3031323334353637383961626364656600000000000000000000000000000000901a614dbe8486614cb6565b5360041c918015614df1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190614d14565b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff90921660248301526044820192909252612d4891610aff8260648101610ad3565b604051614f369173ffffffffffffffffffffffffffffffffffffffff16614ed28261214f565b6000806020958685527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656487860152868151910182855af13d15614fdf573d91614f1a83612246565b92614f286040519485612187565b83523d60008785013e614fe3565b80519081614f4357505050565b8280614f539383010191016132a1565b15614f5b5750565b608490604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b6060915b9192901561505e5750815115614ff7575090565b3b156150005790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156150715750805190602001fd5b612480906040519182917f08c379a00000000000000000000000000000000000000000000000000000000083526020600484015260248301906122a356fea2646970667358221220e6aebacc82a93d7303967dd1fc6fdf63bd78d6ffd7f2b8384bfe5fdcca62c6ed64736f6c63430008110033", + "nonce": "0x3bb", + "accessList": [] + }, + "additionalContracts": [] + } + ], + "receipts": [ + { + "transactionHash": "0x711eb89a44e5dcb9c9001cc6ff0956fba43402940081d91c6471bbe19f913282", + "transactionIndex": "0x15", + "blockHash": "0xbf78f447b75e220e5a5be0fd9f080680eea9185615745c0b71e41a571406cdb2", + "blockNumber": "0xfd28e3", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0x5c77ec", + "gasUsed": "0x45103c", + "contractAddress": "0x7411B6648Ae65CB99446c25eCf5363d59941013B", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x5ef60c62b" + } + ], + "libraries": [], + "pending": [], + "path": "/Users/gnervo/Documents/Angle/strategies-dev/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-latest.json", + "returns": {}, + "timestamp": 1675944268, + "chain": 1, + "multi": false, + "commit": "86f454d" +} \ No newline at end of file diff --git a/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-1675944454.json b/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-1675944454.json new file mode 100644 index 0000000..5e95ec1 --- /dev/null +++ b/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-1675944454.json @@ -0,0 +1,34 @@ +{ + "transactions": [ + { + "hash": "0x261b22721a799eb3f94b1c2e870671562ee0230f5af6e9f9d829c5ebc5a80726", + "transactionType": "CREATE", + "contractName": "OptimizerAPRStrategy", + "contractAddress": "0x05E08E1BF31C1882822Cc48D7d51d6fe49Bca9c2", + "function": null, + "arguments": null, + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x56d432", + "value": "0x0", + "data": "0x60806040523480156200001157600080fd5b50600054610100900460ff166200002f5760005460ff161562000039565b62000039620000de565b620000a15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b600054610100900460ff16158015620000c4576000805461ffff19166101011790555b8015620000d7576000805461ff00191690555b5062000102565b6000620000f630620000fc60201b620019901760201c565b15905090565b3b151590565b614e1480620001126000396000f3fe608060405234801561001057600080fd5b50600436106102ad5760003560e01c80637985fd511161017b578063ce5c7f61116100d8578063e6bfbfd81161008c578063efbb5cb011610071578063efbb5cb0146105c5578063fcc5f59a146105cd578063fcf2d0ad146105e257600080fd5b8063e6bfbfd8146105a3578063ec342ad0146105b657600080fd5b8063dc4c90d3116100bd578063dc4c90d314610560578063ddc6326214610585578063e6a69ab81461059857600080fd5b8063ce5c7f611461053a578063d547741f1461054d57600080fd5b8063a217fddf1161012f578063af648c3d11610114578063af648c3d1461050c578063b8dc491b1461051f578063bb927c461461053257600080fd5b8063a217fddf146104f1578063a526d83b146104f957600080fd5b806391d148541161016057806391d14854146104b8578063929eea21146104cb57806393084b34146104de57600080fd5b80637985fd511461049c5780638baf2957146104a557600080fd5b80632e1a7d4d116102295780634786b0cb116101dd5780635a5cd45e116101c25780635a5cd45e14610460578063708ba9bd1461046857806376ee75d81461048957600080fd5b80634786b0cb146104405780635641ec031461045357600080fd5b8063364bc15a1161020e578063364bc15a146103fe57806336568abe146104255780634641257d1461043857600080fd5b80632e1a7d4d146103c35780632f2ff15d146103eb57600080fd5b80631d12f28b1161028057806322f3e2d41161026557806322f3e2d414610360578063248a9ca31461037857806324ea54f41461039c57600080fd5b80631d12f28b146103125780631f1fcd511461031b57600080fd5b80630b6d1d17146102b25780630c016dc0146102ce5780630e6e15f0146102f55780630f969b87146102fd575b600080fd5b6102bb60355481565b6040519081526020015b60405180910390f35b6102bb7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe56281565b6102bb6105ea565b61031061030b3660046142fa565b6106cb565b005b6102bb60365481565b60345461033b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102c5565b610368610732565b60405190151581526020016102c5565b6102bb6103863660046142fa565b6000908152600160208190526040909120015490565b6102bb7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504181565b6103d66103d13660046142fa565b610743565b604080519283526020830191909152016102c5565b6103106103f9366004614335565b6107a9565b6102bb7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab81565b610310610433366004614335565b6107d5565b610310610867565b61031061044e3660046142fa565b610879565b6033546103689060ff1681565b6102bb6108aa565b61047b61047636600461441d565b6109b1565b6040516102c59291906144b1565b6103106104973660046144ff565b610cdb565b6102bb60665481565b6103106104b33660046144ff565b610d11565b6103686104c6366004614335565b610d47565b61033b6104d93660046142fa565b610d81565b6103106104ec3660046144ff565b610db8565b6102bb600081565b6103106105073660046144ff565b610fe5565b61031061051a3660046144ff565b611126565b61031061052d36600461451c565b611261565b6065546102bb565b610310610548366004614590565b611443565b61031061055b366004614335565b611457565b60335461033b90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6103106105933660046142fa565b61147e565b6102bb6301e1855881565b6103106105b136600461460b565b6114ba565b6102bb670de0b6b3a764000081565b6102bb6114de565b6105d5611588565b6040516102c5919061474b565b61031061190e565b6065546000908190815b818110156106c3576065818154811061060f5761060f61480a565b60009182526020918290200154604080517fc1590cd7000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263c1590cd7926004808401938290030181865afa158015610683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a79190614839565b6106b19084614881565b92506106bc81614894565b90506105f4565b509092915050565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50416106f68133611996565b60368290556040518281527fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a86009060200160405180910390a15050565b600061073c6114de565b1515919050565b6000807f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626107718133611996565b61077a84611a3f565b60345491945092506107a39073ffffffffffffffffffffffffffffffffffffffff163385611b29565b50915091565b600082815260016020819052604090912001546107c68133611996565b6107d08383611bfd565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f373100000000000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6108638282611c93565b5050565b61086f611d25565b610877611f0d565b565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50416108a48133611996565b50606655565b6000806108b56114de565b9050806000036108c757600091505090565b606554600090815b8181101561099e57606581815481106108ea576108ea61480a565b60009182526020918290200154604080517f116ac4a3000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263116ac4a3926004808401938290030181865afa15801561095e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109829190614839565b61098c9084614881565b925061099781614894565b90506108cf565b506109a983836148cc565b935050505090565b6065546000906060908067ffffffffffffffff8111156109d3576109d3614365565b6040519080825280602002602001820160405280156109fc578160200160208202803683370190505b50915083518114610a39576040517fcdeedcbd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610a436114de565b905080600003610a54575050915091565b6000805b83811015610c8b57868181518110610a7257610a7261480a565b602002602001015167ffffffffffffffff1682610a8f9190614881565b9150600061271067ffffffffffffffff16888381518110610ab257610ab261480a565b602002602001015167ffffffffffffffff1685610acf9190614907565b610ad991906148cc565b9050600060658381548110610af057610af061480a565b60009182526020918290200154604080517fc1590cd7000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263c1590cd7926004808401938290030181865afa158015610b64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b889190614839565b610b92908361491e565b905080878481518110610ba757610ba761480a565b60200260200101818152505060658381548110610bc657610bc661480a565b6000918252602090912001546040517fa7d385e20000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff9091169063a7d385e290602401602060405180830381865afa158015610c3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c629190614839565b610c6c9083614907565b610c769089614881565b9750505080610c8490614894565b9050610a58565b508061271014610cc7576040517f6edcc52300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cd182866148cc565b9450505050915091565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610d068133611996565b610863826001611f61565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab610d3c8133611996565b610863826000611f61565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff165b92915050565b60658181548110610d9157600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610de38133611996565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663a8c62e766040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e69919061493e565b73ffffffffffffffffffffffffffffffffffffffff1614610eb6576040517feeacc72d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60655460005b81811015610f455760658181548110610ed757610ed761480a565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff90811690851603610f35576040517f7cc7731c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f3e81614894565b9050610ebc565b506065805460018101825560009182527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915560405190917f1e7b117a6591133f0b36fc2c24d59f8465d806fdcad63aa33246b45fd62c89ff91a2505050565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626110108133611996565b61103a7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504183611bfd565b60655460005b81811015611120576065818154811061105b5761105b61480a565b6000918252602090912001546040517f2f2ff15d0000000000000000000000000000000000000000000000000000000081527f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041600482015273ffffffffffffffffffffffffffffffffffffffff868116602483015290911690632f2ff15d90604401600060405180830381600087803b1580156110f757600080fd5b505af115801561110b573d6000803e3d6000fd5b505050508061111990614894565b9050611040565b50505050565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626111518133611996565b61117b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504183611c93565b60655460005b81811015611120576065818154811061119c5761119c61480a565b6000918252602090912001546040517fd547741f0000000000000000000000000000000000000000000000000000000081527f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041600482015273ffffffffffffffffffffffffffffffffffffffff86811660248301529091169063d547741f90604401600060405180830381600087803b15801561123857600080fd5b505af115801561124c573d6000803e3d6000fd5b505050508061125a90614894565b9050611181565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504161128c8133611996565b60345473ffffffffffffffffffffffffffffffffffffffff908116908416036112e1576040517fc1ab6dc100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112eb61231e565b805190915060005b818110156113895782818151811061130d5761130d61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603611379576040517fc1ab6dc100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138281614894565b90506112f3565b506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015261143c90859073ffffffffffffffffffffffffffffffffffffffff8816906370a0823190602401602060405180830381865afa1580156113fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141e9190614839565b73ffffffffffffffffffffffffffffffffffffffff88169190611b29565b5050505050565b61144b611d25565b6114548161239b565b50565b600082815260016020819052604090912001546114748133611996565b6107d08383611c93565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab6114a98133611996565b6114b1611d25565b61086382612974565b6114c68484848461297e565b6035546114d5906103e8614907565b60665550505050565b6034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561154d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115719190614839565b6115796105ea565b6115839190614881565b905090565b60655460609060008167ffffffffffffffff8111156115a9576115a9614365565b60405190808252806020026020018201604052801561161b57816020015b6116086040518060800160405280606081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b8152602001906001900390816115c75790505b50905060005b828110156119075761166a6040518060800160405280606081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b6065828154811061167d5761167d61480a565b6000918252602082200154604080517f8b202176000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921692638b202176926004808401938290030181865afa1580156116ef573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611735919081019061495b565b8152606580548390811061174b5761174b61480a565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16606082015260658054839081106117865761178661480a565b60009182526020918290200154604080517fc1590cd7000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263c1590cd7926004808401938290030181865afa1580156117fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181e9190614839565b602082015260658054839081106118375761183761480a565b60009182526020918290200154604080517f57ded9c9000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff909216926357ded9c9926004808401938290030181865afa1580156118ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cf9190614839565b6040820152825181908490849081106118ea576118ea61480a565b6020026020010181905250508061190090614894565b9050611621565b5092915050565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626119398133611996565b603380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f17fa25a1c2ac074f71f0cf4f6af525c06fab7d83eff5ffcf6df5277f2919ae2490600090a150565b3b151590565b6119a08282610d47565b610863576119c58173ffffffffffffffffffffffffffffffffffffffff166014612f8a565b6119d0836020612f8a565b6040516020016119e19291906149d2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261085091600401614a53565b6034546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000918291829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611ab2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad69190614839565b9050838110611aea57509192600092509050565b600081611aff611afa8288614a66565b6131d4565b611b099190614881565b9050848110611b1e5750929360009350915050565b946000945092505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526107d09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613578565b611c078282610d47565b61086357600082815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616808652925280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b611c9d8282610d47565b1561086357600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000806000603360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf3759b56040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dbb9190614839565b60335490915060009060ff1615611e18576000611dd6613684565b905082811015611df157611dea8184614a66565b9350611e06565b82811115611e0657611e038382614a66565b94505b611e108484614a66565b915050611e29565b611e218261369c565b919550935090505b6040805185815260208101859052908101829052606081018390527f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d5099060800160405180910390a16033546040517fa1d9bafc00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044810183905261010090910473ffffffffffffffffffffffffffffffffffffffff169063a1d9bafc90606401600060405180830381600087803b158015611eef57600080fd5b505af1158015611f03573d6000803e3d6000fd5b5050505050505050565b61087760005b604051908082528060200260200182016040528015611f3c578160200160208202803683370190505b50604051602001611f4d9190614a79565b60405160208183030381529060405261239b565b60006065805480602002602001604051908101604052809291908181526020018280548015611fc657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611f9b575b505083519394506000925050505b818110156122eb57828181518110611fee57611fee61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036122db57600083828151811061203c5761203c61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663853828b66040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612090573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b49190614ac7565b9050841580156120c2575080155b156120f9576040517fa124823500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612104600184614a66565b821461218a5783612116600185614a66565b815181106121265761212661480a565b6020026020010151606583815481106121415761214161480a565b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b606580548061219b5761219b614ae9565b6000828152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908201810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690550190556034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015612261573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122859190614839565b1561229257612292611f0d565b60405173ffffffffffffffffffffffffffffffffffffffff8716907f95c84dbc5fd872c46b0e4290775a1a4ea1c8d760f9e4d38f48ba71b6f9a667db90600090a2505050505050565b6122e481614894565b9050611fd4565b506040517f30990b6700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051600180825281830190925260609160009190602080830190803683375050603454825192935073ffffffffffffffffffffffffffffffffffffffff16918391506000906123715761237161480a565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152919050565b60335460ff16156123a95750565b6000606580548060200260200160405190810160405280929190818152602001828054801561240e57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116123e3575b505050505090506000815190508060000361242857505050565b60008380602001905181019061243e9190614b18565b905060006060825160001461245c57612456836109b1565b90925090505b60008060008061246b89613a29565b93509350935093508581101561277f576000805b898110156125ac57600087828151811061249b5761249b61480a565b6020026020010151121561259c578a81815181106124bb576124bb61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8883815181106124f0576124f061480a565b602002602001015161250190614ba7565b6040518263ffffffff1660e01b815260040161251f91815260200190565b6020604051808303816000875af115801561253e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125629190614839565b8782815181106125745761257461480a565b602002602001015161258590614ba7565b61258f9190614a66565b6125999083614881565b91505b6125a581614894565b905061247f565b506066548111156125e9576040517f5c3810af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8981101561277857818782815181106126075761260761480a565b6020026020010151131561271e57818782815181106126285761262861480a565b6020026020010181815161263c919061491e565b9052508a51600092506126a0908c908390811061265b5761265b61480a565b60200260200101518883815181106126755761267561480a565b602090810291909101015160345473ffffffffffffffffffffffffffffffffffffffff169190611b29565b8a81815181106126b2576126b261480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561270157600080fd5b505af1158015612715573d6000803e3d6000fd5b50505050612768565b60008782815181106127325761273261480a565b60200260200101511315612768578681815181106127525761275261480a565b6020026020010151826127659190614a66565b91505b61277181614894565b90506125ec565b5050612968565b8115612811578884815181106127975761279761480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663853828b66040518163ffffffff1660e01b81526004016020604051808303816000875af11580156127eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061280f9190614ac7565b505b6034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a49190614839565b90508015612966576128ec8a85815181106128c1576128c161480a565b602090810291909101015160345473ffffffffffffffffffffffffffffffffffffffff169083611b29565b8984815181106128fe576128fe61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561294d57600080fd5b505af1158015612961573d6000803e3d6000fd5b505050505b505b50505050505050505050565b6114546000611f13565b600054610100900460ff166129995760005460ff161561299d565b303b155b612a29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610850565b600054610100900460ff16158015612a6857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b84603360016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550603360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3a919061493e565b603480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169182179055604080517f313ce567000000000000000000000000000000000000000000000000000000008152905163313ce567916004808201926020929091908290030181865afa158015612bd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf69190614bdf565b612c0190600a614d22565b60355573ffffffffffffffffffffffffffffffffffffffff83161580612c3b575073ffffffffffffffffffffffffffffffffffffffff8416155b80612c7157508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b15612ca8576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cd27f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504184613f76565b612cfc7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504185613f76565b612d267f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe56286613f76565b612d507f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe56280613f80565b612d9a7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50417f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe562613f80565b815160005b81811015612e7c57600073ffffffffffffffffffffffffffffffffffffffff16848281518110612dd157612dd161480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603612e26576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e6c7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab60001b858381518110612e5f57612e5f61480a565b6020026020010151613f76565b612e7581614894565b9050612d9f565b50612ec77ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041613f80565b612eda670de0b6b3a76400006064614907565b603655603380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690819055603454612f549173ffffffffffffffffffffffffffffffffffffffff91821691610100909104167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613fd7565b50801561143c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555050505050565b60606000612f99836002614907565b612fa4906002614881565b67ffffffffffffffff811115612fbc57612fbc614365565b6040519080825280601f01601f191660200182016040528015612fe6576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061301d5761301d61480a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106130805761308061480a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006130bc846002614907565b6130c7906001614881565b90505b6001811115613164577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106131085761310861480a565b1a60f81b82828151811061311e5761311e61480a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9361315d81614d31565b90506130ca565b5083156131cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610850565b9392505050565b600080606580548060200260200160405190810160405280929190818152602001828054801561323a57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161320f575b5050505050905060008151905080600003613259575060009392505050565b6066548085101561326f57506000949350505050565b60005b61327c8287614a66565b85101561356f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000805b858110156133ea578681815181106132c2576132c261480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16635be9b2d36040518163ffffffff1660e01b8152600401602060405180830381865afa158015613314573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133389190614ac7565b156133da5760008782815181106133515761335161480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166357ded9c96040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133c79190614839565b9050838110156133d8578093508192505b505b6133e381614894565b90506132a8565b508581815181106133fd576133fd61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16635be9b2d36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561344f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134739190614ac7565b61348257505050505050919050565b60008682815181106134965761349661480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d898b6134c59190614a66565b6040518263ffffffff1660e01b81526004016134e391815260200190565b6020604051808303816000875af1158015613502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135269190614839565b90506135328189614881565b975061353d84614894565b9350806000036135535750505050505050919050565b600684106135675750505050505050919050565b505050613272565b50505050919050565b60006135da826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166140d59092919063ffffffff16565b8051909150156107d057808060200190518101906135f89190614ac7565b6107d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610850565b60006136966136916114de565b611a3f565b50919050565b60008082816136a96105ea565b6034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291925060009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa15801561371d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137419190614839565b9050600061374f8383614881565b90508260000361376d5781841115613765578193505b505050613a22565b6033546040517f39ebf823000000000000000000000000000000000000000000000000000000008152306004820152600091610100900473ffffffffffffffffffffffffffffffffffffffff16906339ebf82390602401606060405180830381865afa1580156137e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138059190614d66565b6020015190508082111561391d5761381d8183614a66565b9650600061382b8689614881565b9050801580159061383b57508084105b156139175761384d611afa8583614a66565b506034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156138bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138e19190614839565b90508181101561391557808911156138ff5780985060009650613915565b61391261390c8a83614a66565b886140ec565b96505b505b50613a1d565b6139278282614a66565b955060006139358688614881565b9050801580159061394557508084105b15613a1b57613957611afa8583614a66565b506034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156139c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139eb9190614839565b905081811015613a195780881115613a095780975060009650613a19565b613a1661390c8983614a66565b96505b505b505b505050505b9193909250565b6034546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600091829182918291829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015613aa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ac49190614839565b905060008060008084905060008a5167ffffffffffffffff811115613aeb57613aeb614365565b604051908082528060200260200182016040528015613b14578160200160208202803683370190505b5090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005b8c51811015613d775760008d8281518110613b5857613b5861480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663a7d385e28a6040518263ffffffff1660e01b8152600401613b9a91815260200190565b602060405180830381865afa158015613bb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bdb9190614839565b905060008e8381518110613bf157613bf161480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663c1590cd76040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c679190614839565b9050613c738187614881565b955087821115613c8757819750809650829c505b603554613c9590600a614907565b811115613d645760008f8481518110613cb057613cb061480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166357ded9c96040518163ffffffff1660e01b8152600401602060405180830381865afa158015613d02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d269190614839565b9050613d328282614907565b868581518110613d4457613d4461480a565b60200260200101818152505084811015613d6257809450819950839e505b505b505080613d7090614894565b9050613b3b565b50508115613f695760008060005b8d51811015613f2e578b8103613e9c5786613da08a88614881565b613daa9190614907565b613db49084614881565b92508715801590613dc6575060018e51115b15613e97578d8c81518110613ddd57613ddd61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663a7d385e28a8a613e0c9190614881565b6040518263ffffffff1660e01b8152600401613e2a91815260200190565b602060405180830381865afa158015613e47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e6b9190614839565b88613e768b89614881565b613e809190614881565b613e8a9190614907565b613e949083614881565b91505b613f1e565b8c8103613ecf57838181518110613eb557613eb561480a565b602002602001015183613ec89190614881565b9250613f1e565b838181518110613ee157613ee161480a565b602002602001015183613ef49190614881565b9250838181518110613f0857613f0861480a565b602002602001015182613f1b9190614881565b91505b613f2781614894565b9050613d85565b508181118015613f3f575060018d51115b15613f595760019950613f5284826148cc565b9850613f66565b613f6384836148cc565b98505b50505b5050505050509193509193565b6108638282611bfd565b60008281526001602081905260409091200154819060405184907fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff90600090a4600091825260016020819052604090922090910155565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801561404e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140729190614839565b61407c9190614881565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506111209085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611b7b565b60606140e48484600085614102565b949350505050565b60008183106140fb57816131cd565b5090919050565b606082471015614194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610850565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516141bd9190614dc2565b60006040518083038185875af1925050503d80600081146141fa576040519150601f19603f3d011682016040523d82523d6000602084013e6141ff565b606091505b50915091506142108783838761421b565b979650505050505050565b606083156142b15782516000036142aa5773ffffffffffffffffffffffffffffffffffffffff85163b6142aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610850565b50816140e4565b6140e483838151156142c65781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108509190614a53565b60006020828403121561430c57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461145457600080fd5b6000806040838503121561434857600080fd5b82359150602083013561435a81614313565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156143db576143db614365565b604052919050565b600067ffffffffffffffff8211156143fd576143fd614365565b5060051b60200190565b67ffffffffffffffff8116811461145457600080fd5b6000602080838503121561443057600080fd5b823567ffffffffffffffff81111561444757600080fd5b8301601f8101851361445857600080fd5b803561446b614466826143e3565b614394565b81815260059190911b8201830190838101908783111561448a57600080fd5b928401925b828410156142105783356144a281614407565b8252928401929084019061448f565b6000604082018483526020604081850152818551808452606086019150828701935060005b818110156144f2578451835293830193918301916001016144d6565b5090979650505050505050565b60006020828403121561451157600080fd5b81356131cd81614313565b6000806040838503121561452f57600080fd5b823561453a81614313565b9150602083013561435a81614313565b600067ffffffffffffffff82111561456457614564614365565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b6000602082840312156145a257600080fd5b813567ffffffffffffffff8111156145b957600080fd5b8201601f810184136145ca57600080fd5b80356145d86144668261454a565b8181528560208385010111156145ed57600080fd5b81602084016020830137600091810160200191909152949350505050565b6000806000806080858703121561462157600080fd5b843561462c81614313565b935060208581013561463d81614313565b9350604086013561464d81614313565b9250606086013567ffffffffffffffff81111561466957600080fd5b8601601f8101881361467a57600080fd5b8035614688614466826143e3565b81815260059190911b8201830190838101908a8311156146a757600080fd5b928401925b828410156146ce5783356146bf81614313565b825292840192908401906146ac565b979a9699509497505050505050565b60005b838110156146f85781810151838201526020016146e0565b50506000910152565b600081518084526147198160208601602086016146dd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156147fc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08984030185528151608081518186526147b682870182614701565b838b0151878c0152898401518a88015260609384015173ffffffffffffffffffffffffffffffffffffffff16939096019290925250509386019390860190600101614772565b509098975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561484b57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610d7b57610d7b614852565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148c5576148c5614852565b5060010190565b600082614902577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082028115828204841417610d7b57610d7b614852565b818103600083128015838313168383128216171561190757611907614852565b60006020828403121561495057600080fd5b81516131cd81614313565b60006020828403121561496d57600080fd5b815167ffffffffffffffff81111561498457600080fd5b8201601f8101841361499557600080fd5b80516149a36144668261454a565b8181528560208385010111156149b857600080fd5b6149c98260208301602086016146dd565b95945050505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351614a0a8160178501602088016146dd565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351614a478160288401602088016146dd565b01602801949350505050565b6020815260006131cd6020830184614701565b81810381811115610d7b57610d7b614852565b6020808252825182820181905260009190848201906040850190845b81811015614abb57835167ffffffffffffffff1683529284019291840191600101614a95565b50909695505050505050565b600060208284031215614ad957600080fd5b815180151581146131cd57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006020808385031215614b2b57600080fd5b825167ffffffffffffffff811115614b4257600080fd5b8301601f81018513614b5357600080fd5b8051614b61614466826143e3565b81815260059190911b82018301908381019087831115614b8057600080fd5b928401925b82841015614210578351614b9881614407565b82529284019290840190614b85565b60007f80000000000000000000000000000000000000000000000000000000000000008203614bd857614bd8614852565b5060000390565b600060208284031215614bf157600080fd5b815160ff811681146131cd57600080fd5b600181815b80851115614c5b57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614c4157614c41614852565b80851615614c4e57918102915b93841c9390800290614c07565b509250929050565b600082614c7257506001610d7b565b81614c7f57506000610d7b565b8160018114614c955760028114614c9f57614cbb565b6001915050610d7b565b60ff841115614cb057614cb0614852565b50506001821b610d7b565b5060208310610133831016604e8410600b8410161715614cde575081810a610d7b565b614ce88383614c02565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614d1a57614d1a614852565b029392505050565b60006131cd60ff841683614c63565b600081614d4057614d40614852565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600060608284031215614d7857600080fd5b6040516060810181811067ffffffffffffffff82111715614d9b57614d9b614365565b80604052508251815260208301516020820152604083015160408201528091505092915050565b60008251614dd48184602087016146dd565b919091019291505056fea2646970667358221220c87a76c31f0456ef0717d5130419ac6f77b92dd570dccd680f54c8fcb72977f364736f6c63430008110033", + "nonce": "0x3bc", + "accessList": [] + }, + "additionalContracts": [] + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x261b22721a799eb3f94b1c2e870671562ee0230f5af6e9f9d829c5ebc5a80726" + ], + "path": "/Users/gnervo/Documents/Angle/strategies-dev/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-latest.json", + "returns": {}, + "timestamp": 1675944454, + "chain": 1, + "multi": false, + "commit": "86f454d" +} \ No newline at end of file diff --git a/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-1675944461.json b/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-1675944461.json new file mode 100644 index 0000000..189a565 --- /dev/null +++ b/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-1675944461.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0x261b22721a799eb3f94b1c2e870671562ee0230f5af6e9f9d829c5ebc5a80726", + "transactionType": "CREATE", + "contractName": "OptimizerAPRStrategy", + "contractAddress": "0x05E08E1BF31C1882822Cc48D7d51d6fe49Bca9c2", + "function": null, + "arguments": null, + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x56d432", + "value": "0x0", + "data": "0x60806040523480156200001157600080fd5b50600054610100900460ff166200002f5760005460ff161562000039565b62000039620000de565b620000a15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b600054610100900460ff16158015620000c4576000805461ffff19166101011790555b8015620000d7576000805461ff00191690555b5062000102565b6000620000f630620000fc60201b620019901760201c565b15905090565b3b151590565b614e1480620001126000396000f3fe608060405234801561001057600080fd5b50600436106102ad5760003560e01c80637985fd511161017b578063ce5c7f61116100d8578063e6bfbfd81161008c578063efbb5cb011610071578063efbb5cb0146105c5578063fcc5f59a146105cd578063fcf2d0ad146105e257600080fd5b8063e6bfbfd8146105a3578063ec342ad0146105b657600080fd5b8063dc4c90d3116100bd578063dc4c90d314610560578063ddc6326214610585578063e6a69ab81461059857600080fd5b8063ce5c7f611461053a578063d547741f1461054d57600080fd5b8063a217fddf1161012f578063af648c3d11610114578063af648c3d1461050c578063b8dc491b1461051f578063bb927c461461053257600080fd5b8063a217fddf146104f1578063a526d83b146104f957600080fd5b806391d148541161016057806391d14854146104b8578063929eea21146104cb57806393084b34146104de57600080fd5b80637985fd511461049c5780638baf2957146104a557600080fd5b80632e1a7d4d116102295780634786b0cb116101dd5780635a5cd45e116101c25780635a5cd45e14610460578063708ba9bd1461046857806376ee75d81461048957600080fd5b80634786b0cb146104405780635641ec031461045357600080fd5b8063364bc15a1161020e578063364bc15a146103fe57806336568abe146104255780634641257d1461043857600080fd5b80632e1a7d4d146103c35780632f2ff15d146103eb57600080fd5b80631d12f28b1161028057806322f3e2d41161026557806322f3e2d414610360578063248a9ca31461037857806324ea54f41461039c57600080fd5b80631d12f28b146103125780631f1fcd511461031b57600080fd5b80630b6d1d17146102b25780630c016dc0146102ce5780630e6e15f0146102f55780630f969b87146102fd575b600080fd5b6102bb60355481565b6040519081526020015b60405180910390f35b6102bb7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe56281565b6102bb6105ea565b61031061030b3660046142fa565b6106cb565b005b6102bb60365481565b60345461033b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102c5565b610368610732565b60405190151581526020016102c5565b6102bb6103863660046142fa565b6000908152600160208190526040909120015490565b6102bb7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504181565b6103d66103d13660046142fa565b610743565b604080519283526020830191909152016102c5565b6103106103f9366004614335565b6107a9565b6102bb7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab81565b610310610433366004614335565b6107d5565b610310610867565b61031061044e3660046142fa565b610879565b6033546103689060ff1681565b6102bb6108aa565b61047b61047636600461441d565b6109b1565b6040516102c59291906144b1565b6103106104973660046144ff565b610cdb565b6102bb60665481565b6103106104b33660046144ff565b610d11565b6103686104c6366004614335565b610d47565b61033b6104d93660046142fa565b610d81565b6103106104ec3660046144ff565b610db8565b6102bb600081565b6103106105073660046144ff565b610fe5565b61031061051a3660046144ff565b611126565b61031061052d36600461451c565b611261565b6065546102bb565b610310610548366004614590565b611443565b61031061055b366004614335565b611457565b60335461033b90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6103106105933660046142fa565b61147e565b6102bb6301e1855881565b6103106105b136600461460b565b6114ba565b6102bb670de0b6b3a764000081565b6102bb6114de565b6105d5611588565b6040516102c5919061474b565b61031061190e565b6065546000908190815b818110156106c3576065818154811061060f5761060f61480a565b60009182526020918290200154604080517fc1590cd7000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263c1590cd7926004808401938290030181865afa158015610683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a79190614839565b6106b19084614881565b92506106bc81614894565b90506105f4565b509092915050565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50416106f68133611996565b60368290556040518281527fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a86009060200160405180910390a15050565b600061073c6114de565b1515919050565b6000807f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626107718133611996565b61077a84611a3f565b60345491945092506107a39073ffffffffffffffffffffffffffffffffffffffff163385611b29565b50915091565b600082815260016020819052604090912001546107c68133611996565b6107d08383611bfd565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f373100000000000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6108638282611c93565b5050565b61086f611d25565b610877611f0d565b565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50416108a48133611996565b50606655565b6000806108b56114de565b9050806000036108c757600091505090565b606554600090815b8181101561099e57606581815481106108ea576108ea61480a565b60009182526020918290200154604080517f116ac4a3000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263116ac4a3926004808401938290030181865afa15801561095e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109829190614839565b61098c9084614881565b925061099781614894565b90506108cf565b506109a983836148cc565b935050505090565b6065546000906060908067ffffffffffffffff8111156109d3576109d3614365565b6040519080825280602002602001820160405280156109fc578160200160208202803683370190505b50915083518114610a39576040517fcdeedcbd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610a436114de565b905080600003610a54575050915091565b6000805b83811015610c8b57868181518110610a7257610a7261480a565b602002602001015167ffffffffffffffff1682610a8f9190614881565b9150600061271067ffffffffffffffff16888381518110610ab257610ab261480a565b602002602001015167ffffffffffffffff1685610acf9190614907565b610ad991906148cc565b9050600060658381548110610af057610af061480a565b60009182526020918290200154604080517fc1590cd7000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263c1590cd7926004808401938290030181865afa158015610b64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b889190614839565b610b92908361491e565b905080878481518110610ba757610ba761480a565b60200260200101818152505060658381548110610bc657610bc661480a565b6000918252602090912001546040517fa7d385e20000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff9091169063a7d385e290602401602060405180830381865afa158015610c3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c629190614839565b610c6c9083614907565b610c769089614881565b9750505080610c8490614894565b9050610a58565b508061271014610cc7576040517f6edcc52300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cd182866148cc565b9450505050915091565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610d068133611996565b610863826001611f61565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab610d3c8133611996565b610863826000611f61565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff165b92915050565b60658181548110610d9157600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610de38133611996565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663a8c62e766040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e69919061493e565b73ffffffffffffffffffffffffffffffffffffffff1614610eb6576040517feeacc72d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60655460005b81811015610f455760658181548110610ed757610ed761480a565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff90811690851603610f35576040517f7cc7731c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f3e81614894565b9050610ebc565b506065805460018101825560009182527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915560405190917f1e7b117a6591133f0b36fc2c24d59f8465d806fdcad63aa33246b45fd62c89ff91a2505050565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626110108133611996565b61103a7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504183611bfd565b60655460005b81811015611120576065818154811061105b5761105b61480a565b6000918252602090912001546040517f2f2ff15d0000000000000000000000000000000000000000000000000000000081527f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041600482015273ffffffffffffffffffffffffffffffffffffffff868116602483015290911690632f2ff15d90604401600060405180830381600087803b1580156110f757600080fd5b505af115801561110b573d6000803e3d6000fd5b505050508061111990614894565b9050611040565b50505050565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626111518133611996565b61117b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504183611c93565b60655460005b81811015611120576065818154811061119c5761119c61480a565b6000918252602090912001546040517fd547741f0000000000000000000000000000000000000000000000000000000081527f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041600482015273ffffffffffffffffffffffffffffffffffffffff86811660248301529091169063d547741f90604401600060405180830381600087803b15801561123857600080fd5b505af115801561124c573d6000803e3d6000fd5b505050508061125a90614894565b9050611181565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504161128c8133611996565b60345473ffffffffffffffffffffffffffffffffffffffff908116908416036112e1576040517fc1ab6dc100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112eb61231e565b805190915060005b818110156113895782818151811061130d5761130d61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603611379576040517fc1ab6dc100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138281614894565b90506112f3565b506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015261143c90859073ffffffffffffffffffffffffffffffffffffffff8816906370a0823190602401602060405180830381865afa1580156113fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141e9190614839565b73ffffffffffffffffffffffffffffffffffffffff88169190611b29565b5050505050565b61144b611d25565b6114548161239b565b50565b600082815260016020819052604090912001546114748133611996565b6107d08383611c93565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab6114a98133611996565b6114b1611d25565b61086382612974565b6114c68484848461297e565b6035546114d5906103e8614907565b60665550505050565b6034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561154d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115719190614839565b6115796105ea565b6115839190614881565b905090565b60655460609060008167ffffffffffffffff8111156115a9576115a9614365565b60405190808252806020026020018201604052801561161b57816020015b6116086040518060800160405280606081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b8152602001906001900390816115c75790505b50905060005b828110156119075761166a6040518060800160405280606081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b6065828154811061167d5761167d61480a565b6000918252602082200154604080517f8b202176000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921692638b202176926004808401938290030181865afa1580156116ef573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611735919081019061495b565b8152606580548390811061174b5761174b61480a565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16606082015260658054839081106117865761178661480a565b60009182526020918290200154604080517fc1590cd7000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263c1590cd7926004808401938290030181865afa1580156117fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181e9190614839565b602082015260658054839081106118375761183761480a565b60009182526020918290200154604080517f57ded9c9000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff909216926357ded9c9926004808401938290030181865afa1580156118ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cf9190614839565b6040820152825181908490849081106118ea576118ea61480a565b6020026020010181905250508061190090614894565b9050611621565b5092915050565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626119398133611996565b603380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f17fa25a1c2ac074f71f0cf4f6af525c06fab7d83eff5ffcf6df5277f2919ae2490600090a150565b3b151590565b6119a08282610d47565b610863576119c58173ffffffffffffffffffffffffffffffffffffffff166014612f8a565b6119d0836020612f8a565b6040516020016119e19291906149d2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261085091600401614a53565b6034546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000918291829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611ab2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad69190614839565b9050838110611aea57509192600092509050565b600081611aff611afa8288614a66565b6131d4565b611b099190614881565b9050848110611b1e5750929360009350915050565b946000945092505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526107d09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613578565b611c078282610d47565b61086357600082815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616808652925280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b611c9d8282610d47565b1561086357600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000806000603360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf3759b56040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dbb9190614839565b60335490915060009060ff1615611e18576000611dd6613684565b905082811015611df157611dea8184614a66565b9350611e06565b82811115611e0657611e038382614a66565b94505b611e108484614a66565b915050611e29565b611e218261369c565b919550935090505b6040805185815260208101859052908101829052606081018390527f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d5099060800160405180910390a16033546040517fa1d9bafc00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044810183905261010090910473ffffffffffffffffffffffffffffffffffffffff169063a1d9bafc90606401600060405180830381600087803b158015611eef57600080fd5b505af1158015611f03573d6000803e3d6000fd5b5050505050505050565b61087760005b604051908082528060200260200182016040528015611f3c578160200160208202803683370190505b50604051602001611f4d9190614a79565b60405160208183030381529060405261239b565b60006065805480602002602001604051908101604052809291908181526020018280548015611fc657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611f9b575b505083519394506000925050505b818110156122eb57828181518110611fee57611fee61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036122db57600083828151811061203c5761203c61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663853828b66040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612090573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b49190614ac7565b9050841580156120c2575080155b156120f9576040517fa124823500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612104600184614a66565b821461218a5783612116600185614a66565b815181106121265761212661480a565b6020026020010151606583815481106121415761214161480a565b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b606580548061219b5761219b614ae9565b6000828152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908201810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690550190556034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015612261573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122859190614839565b1561229257612292611f0d565b60405173ffffffffffffffffffffffffffffffffffffffff8716907f95c84dbc5fd872c46b0e4290775a1a4ea1c8d760f9e4d38f48ba71b6f9a667db90600090a2505050505050565b6122e481614894565b9050611fd4565b506040517f30990b6700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051600180825281830190925260609160009190602080830190803683375050603454825192935073ffffffffffffffffffffffffffffffffffffffff16918391506000906123715761237161480a565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152919050565b60335460ff16156123a95750565b6000606580548060200260200160405190810160405280929190818152602001828054801561240e57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116123e3575b505050505090506000815190508060000361242857505050565b60008380602001905181019061243e9190614b18565b905060006060825160001461245c57612456836109b1565b90925090505b60008060008061246b89613a29565b93509350935093508581101561277f576000805b898110156125ac57600087828151811061249b5761249b61480a565b6020026020010151121561259c578a81815181106124bb576124bb61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8883815181106124f0576124f061480a565b602002602001015161250190614ba7565b6040518263ffffffff1660e01b815260040161251f91815260200190565b6020604051808303816000875af115801561253e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125629190614839565b8782815181106125745761257461480a565b602002602001015161258590614ba7565b61258f9190614a66565b6125999083614881565b91505b6125a581614894565b905061247f565b506066548111156125e9576040517f5c3810af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8981101561277857818782815181106126075761260761480a565b6020026020010151131561271e57818782815181106126285761262861480a565b6020026020010181815161263c919061491e565b9052508a51600092506126a0908c908390811061265b5761265b61480a565b60200260200101518883815181106126755761267561480a565b602090810291909101015160345473ffffffffffffffffffffffffffffffffffffffff169190611b29565b8a81815181106126b2576126b261480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561270157600080fd5b505af1158015612715573d6000803e3d6000fd5b50505050612768565b60008782815181106127325761273261480a565b60200260200101511315612768578681815181106127525761275261480a565b6020026020010151826127659190614a66565b91505b61277181614894565b90506125ec565b5050612968565b8115612811578884815181106127975761279761480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663853828b66040518163ffffffff1660e01b81526004016020604051808303816000875af11580156127eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061280f9190614ac7565b505b6034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a49190614839565b90508015612966576128ec8a85815181106128c1576128c161480a565b602090810291909101015160345473ffffffffffffffffffffffffffffffffffffffff169083611b29565b8984815181106128fe576128fe61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561294d57600080fd5b505af1158015612961573d6000803e3d6000fd5b505050505b505b50505050505050505050565b6114546000611f13565b600054610100900460ff166129995760005460ff161561299d565b303b155b612a29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610850565b600054610100900460ff16158015612a6857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b84603360016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550603360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3a919061493e565b603480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169182179055604080517f313ce567000000000000000000000000000000000000000000000000000000008152905163313ce567916004808201926020929091908290030181865afa158015612bd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf69190614bdf565b612c0190600a614d22565b60355573ffffffffffffffffffffffffffffffffffffffff83161580612c3b575073ffffffffffffffffffffffffffffffffffffffff8416155b80612c7157508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b15612ca8576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cd27f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504184613f76565b612cfc7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504185613f76565b612d267f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe56286613f76565b612d507f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe56280613f80565b612d9a7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50417f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe562613f80565b815160005b81811015612e7c57600073ffffffffffffffffffffffffffffffffffffffff16848281518110612dd157612dd161480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603612e26576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e6c7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab60001b858381518110612e5f57612e5f61480a565b6020026020010151613f76565b612e7581614894565b9050612d9f565b50612ec77ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041613f80565b612eda670de0b6b3a76400006064614907565b603655603380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690819055603454612f549173ffffffffffffffffffffffffffffffffffffffff91821691610100909104167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613fd7565b50801561143c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555050505050565b60606000612f99836002614907565b612fa4906002614881565b67ffffffffffffffff811115612fbc57612fbc614365565b6040519080825280601f01601f191660200182016040528015612fe6576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061301d5761301d61480a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106130805761308061480a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006130bc846002614907565b6130c7906001614881565b90505b6001811115613164577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106131085761310861480a565b1a60f81b82828151811061311e5761311e61480a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9361315d81614d31565b90506130ca565b5083156131cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610850565b9392505050565b600080606580548060200260200160405190810160405280929190818152602001828054801561323a57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161320f575b5050505050905060008151905080600003613259575060009392505050565b6066548085101561326f57506000949350505050565b60005b61327c8287614a66565b85101561356f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000805b858110156133ea578681815181106132c2576132c261480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16635be9b2d36040518163ffffffff1660e01b8152600401602060405180830381865afa158015613314573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133389190614ac7565b156133da5760008782815181106133515761335161480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166357ded9c96040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133c79190614839565b9050838110156133d8578093508192505b505b6133e381614894565b90506132a8565b508581815181106133fd576133fd61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16635be9b2d36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561344f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134739190614ac7565b61348257505050505050919050565b60008682815181106134965761349661480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d898b6134c59190614a66565b6040518263ffffffff1660e01b81526004016134e391815260200190565b6020604051808303816000875af1158015613502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135269190614839565b90506135328189614881565b975061353d84614894565b9350806000036135535750505050505050919050565b600684106135675750505050505050919050565b505050613272565b50505050919050565b60006135da826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166140d59092919063ffffffff16565b8051909150156107d057808060200190518101906135f89190614ac7565b6107d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610850565b60006136966136916114de565b611a3f565b50919050565b60008082816136a96105ea565b6034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291925060009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa15801561371d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137419190614839565b9050600061374f8383614881565b90508260000361376d5781841115613765578193505b505050613a22565b6033546040517f39ebf823000000000000000000000000000000000000000000000000000000008152306004820152600091610100900473ffffffffffffffffffffffffffffffffffffffff16906339ebf82390602401606060405180830381865afa1580156137e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138059190614d66565b6020015190508082111561391d5761381d8183614a66565b9650600061382b8689614881565b9050801580159061383b57508084105b156139175761384d611afa8583614a66565b506034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156138bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138e19190614839565b90508181101561391557808911156138ff5780985060009650613915565b61391261390c8a83614a66565b886140ec565b96505b505b50613a1d565b6139278282614a66565b955060006139358688614881565b9050801580159061394557508084105b15613a1b57613957611afa8583614a66565b506034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156139c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139eb9190614839565b905081811015613a195780881115613a095780975060009650613a19565b613a1661390c8983614a66565b96505b505b505b505050505b9193909250565b6034546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600091829182918291829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015613aa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ac49190614839565b905060008060008084905060008a5167ffffffffffffffff811115613aeb57613aeb614365565b604051908082528060200260200182016040528015613b14578160200160208202803683370190505b5090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005b8c51811015613d775760008d8281518110613b5857613b5861480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663a7d385e28a6040518263ffffffff1660e01b8152600401613b9a91815260200190565b602060405180830381865afa158015613bb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bdb9190614839565b905060008e8381518110613bf157613bf161480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663c1590cd76040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c679190614839565b9050613c738187614881565b955087821115613c8757819750809650829c505b603554613c9590600a614907565b811115613d645760008f8481518110613cb057613cb061480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166357ded9c96040518163ffffffff1660e01b8152600401602060405180830381865afa158015613d02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d269190614839565b9050613d328282614907565b868581518110613d4457613d4461480a565b60200260200101818152505084811015613d6257809450819950839e505b505b505080613d7090614894565b9050613b3b565b50508115613f695760008060005b8d51811015613f2e578b8103613e9c5786613da08a88614881565b613daa9190614907565b613db49084614881565b92508715801590613dc6575060018e51115b15613e97578d8c81518110613ddd57613ddd61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663a7d385e28a8a613e0c9190614881565b6040518263ffffffff1660e01b8152600401613e2a91815260200190565b602060405180830381865afa158015613e47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e6b9190614839565b88613e768b89614881565b613e809190614881565b613e8a9190614907565b613e949083614881565b91505b613f1e565b8c8103613ecf57838181518110613eb557613eb561480a565b602002602001015183613ec89190614881565b9250613f1e565b838181518110613ee157613ee161480a565b602002602001015183613ef49190614881565b9250838181518110613f0857613f0861480a565b602002602001015182613f1b9190614881565b91505b613f2781614894565b9050613d85565b508181118015613f3f575060018d51115b15613f595760019950613f5284826148cc565b9850613f66565b613f6384836148cc565b98505b50505b5050505050509193509193565b6108638282611bfd565b60008281526001602081905260409091200154819060405184907fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff90600090a4600091825260016020819052604090922090910155565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801561404e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140729190614839565b61407c9190614881565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506111209085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611b7b565b60606140e48484600085614102565b949350505050565b60008183106140fb57816131cd565b5090919050565b606082471015614194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610850565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516141bd9190614dc2565b60006040518083038185875af1925050503d80600081146141fa576040519150601f19603f3d011682016040523d82523d6000602084013e6141ff565b606091505b50915091506142108783838761421b565b979650505050505050565b606083156142b15782516000036142aa5773ffffffffffffffffffffffffffffffffffffffff85163b6142aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610850565b50816140e4565b6140e483838151156142c65781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108509190614a53565b60006020828403121561430c57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461145457600080fd5b6000806040838503121561434857600080fd5b82359150602083013561435a81614313565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156143db576143db614365565b604052919050565b600067ffffffffffffffff8211156143fd576143fd614365565b5060051b60200190565b67ffffffffffffffff8116811461145457600080fd5b6000602080838503121561443057600080fd5b823567ffffffffffffffff81111561444757600080fd5b8301601f8101851361445857600080fd5b803561446b614466826143e3565b614394565b81815260059190911b8201830190838101908783111561448a57600080fd5b928401925b828410156142105783356144a281614407565b8252928401929084019061448f565b6000604082018483526020604081850152818551808452606086019150828701935060005b818110156144f2578451835293830193918301916001016144d6565b5090979650505050505050565b60006020828403121561451157600080fd5b81356131cd81614313565b6000806040838503121561452f57600080fd5b823561453a81614313565b9150602083013561435a81614313565b600067ffffffffffffffff82111561456457614564614365565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b6000602082840312156145a257600080fd5b813567ffffffffffffffff8111156145b957600080fd5b8201601f810184136145ca57600080fd5b80356145d86144668261454a565b8181528560208385010111156145ed57600080fd5b81602084016020830137600091810160200191909152949350505050565b6000806000806080858703121561462157600080fd5b843561462c81614313565b935060208581013561463d81614313565b9350604086013561464d81614313565b9250606086013567ffffffffffffffff81111561466957600080fd5b8601601f8101881361467a57600080fd5b8035614688614466826143e3565b81815260059190911b8201830190838101908a8311156146a757600080fd5b928401925b828410156146ce5783356146bf81614313565b825292840192908401906146ac565b979a9699509497505050505050565b60005b838110156146f85781810151838201526020016146e0565b50506000910152565b600081518084526147198160208601602086016146dd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156147fc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08984030185528151608081518186526147b682870182614701565b838b0151878c0152898401518a88015260609384015173ffffffffffffffffffffffffffffffffffffffff16939096019290925250509386019390860190600101614772565b509098975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561484b57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610d7b57610d7b614852565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148c5576148c5614852565b5060010190565b600082614902577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082028115828204841417610d7b57610d7b614852565b818103600083128015838313168383128216171561190757611907614852565b60006020828403121561495057600080fd5b81516131cd81614313565b60006020828403121561496d57600080fd5b815167ffffffffffffffff81111561498457600080fd5b8201601f8101841361499557600080fd5b80516149a36144668261454a565b8181528560208385010111156149b857600080fd5b6149c98260208301602086016146dd565b95945050505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351614a0a8160178501602088016146dd565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351614a478160288401602088016146dd565b01602801949350505050565b6020815260006131cd6020830184614701565b81810381811115610d7b57610d7b614852565b6020808252825182820181905260009190848201906040850190845b81811015614abb57835167ffffffffffffffff1683529284019291840191600101614a95565b50909695505050505050565b600060208284031215614ad957600080fd5b815180151581146131cd57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006020808385031215614b2b57600080fd5b825167ffffffffffffffff811115614b4257600080fd5b8301601f81018513614b5357600080fd5b8051614b61614466826143e3565b81815260059190911b82018301908381019087831115614b8057600080fd5b928401925b82841015614210578351614b9881614407565b82529284019290840190614b85565b60007f80000000000000000000000000000000000000000000000000000000000000008203614bd857614bd8614852565b5060000390565b600060208284031215614bf157600080fd5b815160ff811681146131cd57600080fd5b600181815b80851115614c5b57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614c4157614c41614852565b80851615614c4e57918102915b93841c9390800290614c07565b509250929050565b600082614c7257506001610d7b565b81614c7f57506000610d7b565b8160018114614c955760028114614c9f57614cbb565b6001915050610d7b565b60ff841115614cb057614cb0614852565b50506001821b610d7b565b5060208310610133831016604e8410600b8410161715614cde575081810a610d7b565b614ce88383614c02565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614d1a57614d1a614852565b029392505050565b60006131cd60ff841683614c63565b600081614d4057614d40614852565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600060608284031215614d7857600080fd5b6040516060810181811067ffffffffffffffff82111715614d9b57614d9b614365565b80604052508251815260208301516020820152604083015160408201528091505092915050565b60008251614dd48184602087016146dd565b919091019291505056fea2646970667358221220c87a76c31f0456ef0717d5130419ac6f77b92dd570dccd680f54c8fcb72977f364736f6c63430008110033", + "nonce": "0x3bc", + "accessList": [] + }, + "additionalContracts": [] + } + ], + "receipts": [ + { + "transactionHash": "0x261b22721a799eb3f94b1c2e870671562ee0230f5af6e9f9d829c5ebc5a80726", + "transactionIndex": "0x10", + "blockHash": "0x5efe885243c9832d713c337bab9fb0d42b97c6a7fffb07ad75bb4c2eb8aec381", + "blockNumber": "0xfd28f3", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0x58f6b7", + "gasUsed": "0x42ca9d", + "contractAddress": "0x05E08E1BF31C1882822Cc48D7d51d6fe49Bca9c2", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x5997fd6f2" + } + ], + "libraries": [], + "pending": [], + "path": "/Users/gnervo/Documents/Angle/strategies-dev/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-latest.json", + "returns": {}, + "timestamp": 1675944461, + "chain": 1, + "multi": false, + "commit": "86f454d" +} \ No newline at end of file diff --git a/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-1675944479.json b/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-1675944479.json new file mode 100644 index 0000000..905c5d6 --- /dev/null +++ b/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-1675944479.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0x261b22721a799eb3f94b1c2e870671562ee0230f5af6e9f9d829c5ebc5a80726", + "transactionType": "CREATE", + "contractName": "OptimizerAPRStrategy", + "contractAddress": "0x05E08E1BF31C1882822Cc48D7d51d6fe49Bca9c2", + "function": null, + "arguments": null, + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x56d432", + "value": "0x0", + "data": "0x60806040523480156200001157600080fd5b50600054610100900460ff166200002f5760005460ff161562000039565b62000039620000de565b620000a15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b600054610100900460ff16158015620000c4576000805461ffff19166101011790555b8015620000d7576000805461ff00191690555b5062000102565b6000620000f630620000fc60201b620019901760201c565b15905090565b3b151590565b614e1480620001126000396000f3fe608060405234801561001057600080fd5b50600436106102ad5760003560e01c80637985fd511161017b578063ce5c7f61116100d8578063e6bfbfd81161008c578063efbb5cb011610071578063efbb5cb0146105c5578063fcc5f59a146105cd578063fcf2d0ad146105e257600080fd5b8063e6bfbfd8146105a3578063ec342ad0146105b657600080fd5b8063dc4c90d3116100bd578063dc4c90d314610560578063ddc6326214610585578063e6a69ab81461059857600080fd5b8063ce5c7f611461053a578063d547741f1461054d57600080fd5b8063a217fddf1161012f578063af648c3d11610114578063af648c3d1461050c578063b8dc491b1461051f578063bb927c461461053257600080fd5b8063a217fddf146104f1578063a526d83b146104f957600080fd5b806391d148541161016057806391d14854146104b8578063929eea21146104cb57806393084b34146104de57600080fd5b80637985fd511461049c5780638baf2957146104a557600080fd5b80632e1a7d4d116102295780634786b0cb116101dd5780635a5cd45e116101c25780635a5cd45e14610460578063708ba9bd1461046857806376ee75d81461048957600080fd5b80634786b0cb146104405780635641ec031461045357600080fd5b8063364bc15a1161020e578063364bc15a146103fe57806336568abe146104255780634641257d1461043857600080fd5b80632e1a7d4d146103c35780632f2ff15d146103eb57600080fd5b80631d12f28b1161028057806322f3e2d41161026557806322f3e2d414610360578063248a9ca31461037857806324ea54f41461039c57600080fd5b80631d12f28b146103125780631f1fcd511461031b57600080fd5b80630b6d1d17146102b25780630c016dc0146102ce5780630e6e15f0146102f55780630f969b87146102fd575b600080fd5b6102bb60355481565b6040519081526020015b60405180910390f35b6102bb7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe56281565b6102bb6105ea565b61031061030b3660046142fa565b6106cb565b005b6102bb60365481565b60345461033b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102c5565b610368610732565b60405190151581526020016102c5565b6102bb6103863660046142fa565b6000908152600160208190526040909120015490565b6102bb7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504181565b6103d66103d13660046142fa565b610743565b604080519283526020830191909152016102c5565b6103106103f9366004614335565b6107a9565b6102bb7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab81565b610310610433366004614335565b6107d5565b610310610867565b61031061044e3660046142fa565b610879565b6033546103689060ff1681565b6102bb6108aa565b61047b61047636600461441d565b6109b1565b6040516102c59291906144b1565b6103106104973660046144ff565b610cdb565b6102bb60665481565b6103106104b33660046144ff565b610d11565b6103686104c6366004614335565b610d47565b61033b6104d93660046142fa565b610d81565b6103106104ec3660046144ff565b610db8565b6102bb600081565b6103106105073660046144ff565b610fe5565b61031061051a3660046144ff565b611126565b61031061052d36600461451c565b611261565b6065546102bb565b610310610548366004614590565b611443565b61031061055b366004614335565b611457565b60335461033b90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6103106105933660046142fa565b61147e565b6102bb6301e1855881565b6103106105b136600461460b565b6114ba565b6102bb670de0b6b3a764000081565b6102bb6114de565b6105d5611588565b6040516102c5919061474b565b61031061190e565b6065546000908190815b818110156106c3576065818154811061060f5761060f61480a565b60009182526020918290200154604080517fc1590cd7000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263c1590cd7926004808401938290030181865afa158015610683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a79190614839565b6106b19084614881565b92506106bc81614894565b90506105f4565b509092915050565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50416106f68133611996565b60368290556040518281527fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a86009060200160405180910390a15050565b600061073c6114de565b1515919050565b6000807f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626107718133611996565b61077a84611a3f565b60345491945092506107a39073ffffffffffffffffffffffffffffffffffffffff163385611b29565b50915091565b600082815260016020819052604090912001546107c68133611996565b6107d08383611bfd565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f373100000000000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6108638282611c93565b5050565b61086f611d25565b610877611f0d565b565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50416108a48133611996565b50606655565b6000806108b56114de565b9050806000036108c757600091505090565b606554600090815b8181101561099e57606581815481106108ea576108ea61480a565b60009182526020918290200154604080517f116ac4a3000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263116ac4a3926004808401938290030181865afa15801561095e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109829190614839565b61098c9084614881565b925061099781614894565b90506108cf565b506109a983836148cc565b935050505090565b6065546000906060908067ffffffffffffffff8111156109d3576109d3614365565b6040519080825280602002602001820160405280156109fc578160200160208202803683370190505b50915083518114610a39576040517fcdeedcbd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610a436114de565b905080600003610a54575050915091565b6000805b83811015610c8b57868181518110610a7257610a7261480a565b602002602001015167ffffffffffffffff1682610a8f9190614881565b9150600061271067ffffffffffffffff16888381518110610ab257610ab261480a565b602002602001015167ffffffffffffffff1685610acf9190614907565b610ad991906148cc565b9050600060658381548110610af057610af061480a565b60009182526020918290200154604080517fc1590cd7000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263c1590cd7926004808401938290030181865afa158015610b64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b889190614839565b610b92908361491e565b905080878481518110610ba757610ba761480a565b60200260200101818152505060658381548110610bc657610bc661480a565b6000918252602090912001546040517fa7d385e20000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff9091169063a7d385e290602401602060405180830381865afa158015610c3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c629190614839565b610c6c9083614907565b610c769089614881565b9750505080610c8490614894565b9050610a58565b508061271014610cc7576040517f6edcc52300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cd182866148cc565b9450505050915091565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610d068133611996565b610863826001611f61565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab610d3c8133611996565b610863826000611f61565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff165b92915050565b60658181548110610d9157600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610de38133611996565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663a8c62e766040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e69919061493e565b73ffffffffffffffffffffffffffffffffffffffff1614610eb6576040517feeacc72d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60655460005b81811015610f455760658181548110610ed757610ed761480a565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff90811690851603610f35576040517f7cc7731c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f3e81614894565b9050610ebc565b506065805460018101825560009182527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915560405190917f1e7b117a6591133f0b36fc2c24d59f8465d806fdcad63aa33246b45fd62c89ff91a2505050565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626110108133611996565b61103a7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504183611bfd565b60655460005b81811015611120576065818154811061105b5761105b61480a565b6000918252602090912001546040517f2f2ff15d0000000000000000000000000000000000000000000000000000000081527f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041600482015273ffffffffffffffffffffffffffffffffffffffff868116602483015290911690632f2ff15d90604401600060405180830381600087803b1580156110f757600080fd5b505af115801561110b573d6000803e3d6000fd5b505050508061111990614894565b9050611040565b50505050565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626111518133611996565b61117b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504183611c93565b60655460005b81811015611120576065818154811061119c5761119c61480a565b6000918252602090912001546040517fd547741f0000000000000000000000000000000000000000000000000000000081527f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041600482015273ffffffffffffffffffffffffffffffffffffffff86811660248301529091169063d547741f90604401600060405180830381600087803b15801561123857600080fd5b505af115801561124c573d6000803e3d6000fd5b505050508061125a90614894565b9050611181565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504161128c8133611996565b60345473ffffffffffffffffffffffffffffffffffffffff908116908416036112e1576040517fc1ab6dc100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112eb61231e565b805190915060005b818110156113895782818151811061130d5761130d61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603611379576040517fc1ab6dc100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138281614894565b90506112f3565b506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015261143c90859073ffffffffffffffffffffffffffffffffffffffff8816906370a0823190602401602060405180830381865afa1580156113fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141e9190614839565b73ffffffffffffffffffffffffffffffffffffffff88169190611b29565b5050505050565b61144b611d25565b6114548161239b565b50565b600082815260016020819052604090912001546114748133611996565b6107d08383611c93565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab6114a98133611996565b6114b1611d25565b61086382612974565b6114c68484848461297e565b6035546114d5906103e8614907565b60665550505050565b6034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561154d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115719190614839565b6115796105ea565b6115839190614881565b905090565b60655460609060008167ffffffffffffffff8111156115a9576115a9614365565b60405190808252806020026020018201604052801561161b57816020015b6116086040518060800160405280606081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b8152602001906001900390816115c75790505b50905060005b828110156119075761166a6040518060800160405280606081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b6065828154811061167d5761167d61480a565b6000918252602082200154604080517f8b202176000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921692638b202176926004808401938290030181865afa1580156116ef573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611735919081019061495b565b8152606580548390811061174b5761174b61480a565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16606082015260658054839081106117865761178661480a565b60009182526020918290200154604080517fc1590cd7000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263c1590cd7926004808401938290030181865afa1580156117fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181e9190614839565b602082015260658054839081106118375761183761480a565b60009182526020918290200154604080517f57ded9c9000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff909216926357ded9c9926004808401938290030181865afa1580156118ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cf9190614839565b6040820152825181908490849081106118ea576118ea61480a565b6020026020010181905250508061190090614894565b9050611621565b5092915050565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626119398133611996565b603380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f17fa25a1c2ac074f71f0cf4f6af525c06fab7d83eff5ffcf6df5277f2919ae2490600090a150565b3b151590565b6119a08282610d47565b610863576119c58173ffffffffffffffffffffffffffffffffffffffff166014612f8a565b6119d0836020612f8a565b6040516020016119e19291906149d2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261085091600401614a53565b6034546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000918291829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611ab2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad69190614839565b9050838110611aea57509192600092509050565b600081611aff611afa8288614a66565b6131d4565b611b099190614881565b9050848110611b1e5750929360009350915050565b946000945092505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526107d09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613578565b611c078282610d47565b61086357600082815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616808652925280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b611c9d8282610d47565b1561086357600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000806000603360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf3759b56040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dbb9190614839565b60335490915060009060ff1615611e18576000611dd6613684565b905082811015611df157611dea8184614a66565b9350611e06565b82811115611e0657611e038382614a66565b94505b611e108484614a66565b915050611e29565b611e218261369c565b919550935090505b6040805185815260208101859052908101829052606081018390527f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d5099060800160405180910390a16033546040517fa1d9bafc00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044810183905261010090910473ffffffffffffffffffffffffffffffffffffffff169063a1d9bafc90606401600060405180830381600087803b158015611eef57600080fd5b505af1158015611f03573d6000803e3d6000fd5b5050505050505050565b61087760005b604051908082528060200260200182016040528015611f3c578160200160208202803683370190505b50604051602001611f4d9190614a79565b60405160208183030381529060405261239b565b60006065805480602002602001604051908101604052809291908181526020018280548015611fc657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611f9b575b505083519394506000925050505b818110156122eb57828181518110611fee57611fee61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036122db57600083828151811061203c5761203c61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663853828b66040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612090573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b49190614ac7565b9050841580156120c2575080155b156120f9576040517fa124823500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612104600184614a66565b821461218a5783612116600185614a66565b815181106121265761212661480a565b6020026020010151606583815481106121415761214161480a565b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b606580548061219b5761219b614ae9565b6000828152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908201810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690550190556034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015612261573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122859190614839565b1561229257612292611f0d565b60405173ffffffffffffffffffffffffffffffffffffffff8716907f95c84dbc5fd872c46b0e4290775a1a4ea1c8d760f9e4d38f48ba71b6f9a667db90600090a2505050505050565b6122e481614894565b9050611fd4565b506040517f30990b6700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051600180825281830190925260609160009190602080830190803683375050603454825192935073ffffffffffffffffffffffffffffffffffffffff16918391506000906123715761237161480a565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152919050565b60335460ff16156123a95750565b6000606580548060200260200160405190810160405280929190818152602001828054801561240e57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116123e3575b505050505090506000815190508060000361242857505050565b60008380602001905181019061243e9190614b18565b905060006060825160001461245c57612456836109b1565b90925090505b60008060008061246b89613a29565b93509350935093508581101561277f576000805b898110156125ac57600087828151811061249b5761249b61480a565b6020026020010151121561259c578a81815181106124bb576124bb61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8883815181106124f0576124f061480a565b602002602001015161250190614ba7565b6040518263ffffffff1660e01b815260040161251f91815260200190565b6020604051808303816000875af115801561253e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125629190614839565b8782815181106125745761257461480a565b602002602001015161258590614ba7565b61258f9190614a66565b6125999083614881565b91505b6125a581614894565b905061247f565b506066548111156125e9576040517f5c3810af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8981101561277857818782815181106126075761260761480a565b6020026020010151131561271e57818782815181106126285761262861480a565b6020026020010181815161263c919061491e565b9052508a51600092506126a0908c908390811061265b5761265b61480a565b60200260200101518883815181106126755761267561480a565b602090810291909101015160345473ffffffffffffffffffffffffffffffffffffffff169190611b29565b8a81815181106126b2576126b261480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561270157600080fd5b505af1158015612715573d6000803e3d6000fd5b50505050612768565b60008782815181106127325761273261480a565b60200260200101511315612768578681815181106127525761275261480a565b6020026020010151826127659190614a66565b91505b61277181614894565b90506125ec565b5050612968565b8115612811578884815181106127975761279761480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663853828b66040518163ffffffff1660e01b81526004016020604051808303816000875af11580156127eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061280f9190614ac7565b505b6034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a49190614839565b90508015612966576128ec8a85815181106128c1576128c161480a565b602090810291909101015160345473ffffffffffffffffffffffffffffffffffffffff169083611b29565b8984815181106128fe576128fe61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561294d57600080fd5b505af1158015612961573d6000803e3d6000fd5b505050505b505b50505050505050505050565b6114546000611f13565b600054610100900460ff166129995760005460ff161561299d565b303b155b612a29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610850565b600054610100900460ff16158015612a6857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b84603360016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550603360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3a919061493e565b603480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169182179055604080517f313ce567000000000000000000000000000000000000000000000000000000008152905163313ce567916004808201926020929091908290030181865afa158015612bd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf69190614bdf565b612c0190600a614d22565b60355573ffffffffffffffffffffffffffffffffffffffff83161580612c3b575073ffffffffffffffffffffffffffffffffffffffff8416155b80612c7157508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b15612ca8576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cd27f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504184613f76565b612cfc7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504185613f76565b612d267f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe56286613f76565b612d507f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe56280613f80565b612d9a7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50417f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe562613f80565b815160005b81811015612e7c57600073ffffffffffffffffffffffffffffffffffffffff16848281518110612dd157612dd161480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603612e26576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e6c7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab60001b858381518110612e5f57612e5f61480a565b6020026020010151613f76565b612e7581614894565b9050612d9f565b50612ec77ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041613f80565b612eda670de0b6b3a76400006064614907565b603655603380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690819055603454612f549173ffffffffffffffffffffffffffffffffffffffff91821691610100909104167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613fd7565b50801561143c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555050505050565b60606000612f99836002614907565b612fa4906002614881565b67ffffffffffffffff811115612fbc57612fbc614365565b6040519080825280601f01601f191660200182016040528015612fe6576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061301d5761301d61480a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106130805761308061480a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006130bc846002614907565b6130c7906001614881565b90505b6001811115613164577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106131085761310861480a565b1a60f81b82828151811061311e5761311e61480a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9361315d81614d31565b90506130ca565b5083156131cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610850565b9392505050565b600080606580548060200260200160405190810160405280929190818152602001828054801561323a57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161320f575b5050505050905060008151905080600003613259575060009392505050565b6066548085101561326f57506000949350505050565b60005b61327c8287614a66565b85101561356f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000805b858110156133ea578681815181106132c2576132c261480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16635be9b2d36040518163ffffffff1660e01b8152600401602060405180830381865afa158015613314573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133389190614ac7565b156133da5760008782815181106133515761335161480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166357ded9c96040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133c79190614839565b9050838110156133d8578093508192505b505b6133e381614894565b90506132a8565b508581815181106133fd576133fd61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16635be9b2d36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561344f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134739190614ac7565b61348257505050505050919050565b60008682815181106134965761349661480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d898b6134c59190614a66565b6040518263ffffffff1660e01b81526004016134e391815260200190565b6020604051808303816000875af1158015613502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135269190614839565b90506135328189614881565b975061353d84614894565b9350806000036135535750505050505050919050565b600684106135675750505050505050919050565b505050613272565b50505050919050565b60006135da826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166140d59092919063ffffffff16565b8051909150156107d057808060200190518101906135f89190614ac7565b6107d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610850565b60006136966136916114de565b611a3f565b50919050565b60008082816136a96105ea565b6034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291925060009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa15801561371d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137419190614839565b9050600061374f8383614881565b90508260000361376d5781841115613765578193505b505050613a22565b6033546040517f39ebf823000000000000000000000000000000000000000000000000000000008152306004820152600091610100900473ffffffffffffffffffffffffffffffffffffffff16906339ebf82390602401606060405180830381865afa1580156137e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138059190614d66565b6020015190508082111561391d5761381d8183614a66565b9650600061382b8689614881565b9050801580159061383b57508084105b156139175761384d611afa8583614a66565b506034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156138bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138e19190614839565b90508181101561391557808911156138ff5780985060009650613915565b61391261390c8a83614a66565b886140ec565b96505b505b50613a1d565b6139278282614a66565b955060006139358688614881565b9050801580159061394557508084105b15613a1b57613957611afa8583614a66565b506034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156139c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139eb9190614839565b905081811015613a195780881115613a095780975060009650613a19565b613a1661390c8983614a66565b96505b505b505b505050505b9193909250565b6034546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600091829182918291829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015613aa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ac49190614839565b905060008060008084905060008a5167ffffffffffffffff811115613aeb57613aeb614365565b604051908082528060200260200182016040528015613b14578160200160208202803683370190505b5090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005b8c51811015613d775760008d8281518110613b5857613b5861480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663a7d385e28a6040518263ffffffff1660e01b8152600401613b9a91815260200190565b602060405180830381865afa158015613bb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bdb9190614839565b905060008e8381518110613bf157613bf161480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663c1590cd76040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c679190614839565b9050613c738187614881565b955087821115613c8757819750809650829c505b603554613c9590600a614907565b811115613d645760008f8481518110613cb057613cb061480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166357ded9c96040518163ffffffff1660e01b8152600401602060405180830381865afa158015613d02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d269190614839565b9050613d328282614907565b868581518110613d4457613d4461480a565b60200260200101818152505084811015613d6257809450819950839e505b505b505080613d7090614894565b9050613b3b565b50508115613f695760008060005b8d51811015613f2e578b8103613e9c5786613da08a88614881565b613daa9190614907565b613db49084614881565b92508715801590613dc6575060018e51115b15613e97578d8c81518110613ddd57613ddd61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663a7d385e28a8a613e0c9190614881565b6040518263ffffffff1660e01b8152600401613e2a91815260200190565b602060405180830381865afa158015613e47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e6b9190614839565b88613e768b89614881565b613e809190614881565b613e8a9190614907565b613e949083614881565b91505b613f1e565b8c8103613ecf57838181518110613eb557613eb561480a565b602002602001015183613ec89190614881565b9250613f1e565b838181518110613ee157613ee161480a565b602002602001015183613ef49190614881565b9250838181518110613f0857613f0861480a565b602002602001015182613f1b9190614881565b91505b613f2781614894565b9050613d85565b508181118015613f3f575060018d51115b15613f595760019950613f5284826148cc565b9850613f66565b613f6384836148cc565b98505b50505b5050505050509193509193565b6108638282611bfd565b60008281526001602081905260409091200154819060405184907fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff90600090a4600091825260016020819052604090922090910155565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801561404e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140729190614839565b61407c9190614881565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506111209085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611b7b565b60606140e48484600085614102565b949350505050565b60008183106140fb57816131cd565b5090919050565b606082471015614194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610850565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516141bd9190614dc2565b60006040518083038185875af1925050503d80600081146141fa576040519150601f19603f3d011682016040523d82523d6000602084013e6141ff565b606091505b50915091506142108783838761421b565b979650505050505050565b606083156142b15782516000036142aa5773ffffffffffffffffffffffffffffffffffffffff85163b6142aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610850565b50816140e4565b6140e483838151156142c65781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108509190614a53565b60006020828403121561430c57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461145457600080fd5b6000806040838503121561434857600080fd5b82359150602083013561435a81614313565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156143db576143db614365565b604052919050565b600067ffffffffffffffff8211156143fd576143fd614365565b5060051b60200190565b67ffffffffffffffff8116811461145457600080fd5b6000602080838503121561443057600080fd5b823567ffffffffffffffff81111561444757600080fd5b8301601f8101851361445857600080fd5b803561446b614466826143e3565b614394565b81815260059190911b8201830190838101908783111561448a57600080fd5b928401925b828410156142105783356144a281614407565b8252928401929084019061448f565b6000604082018483526020604081850152818551808452606086019150828701935060005b818110156144f2578451835293830193918301916001016144d6565b5090979650505050505050565b60006020828403121561451157600080fd5b81356131cd81614313565b6000806040838503121561452f57600080fd5b823561453a81614313565b9150602083013561435a81614313565b600067ffffffffffffffff82111561456457614564614365565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b6000602082840312156145a257600080fd5b813567ffffffffffffffff8111156145b957600080fd5b8201601f810184136145ca57600080fd5b80356145d86144668261454a565b8181528560208385010111156145ed57600080fd5b81602084016020830137600091810160200191909152949350505050565b6000806000806080858703121561462157600080fd5b843561462c81614313565b935060208581013561463d81614313565b9350604086013561464d81614313565b9250606086013567ffffffffffffffff81111561466957600080fd5b8601601f8101881361467a57600080fd5b8035614688614466826143e3565b81815260059190911b8201830190838101908a8311156146a757600080fd5b928401925b828410156146ce5783356146bf81614313565b825292840192908401906146ac565b979a9699509497505050505050565b60005b838110156146f85781810151838201526020016146e0565b50506000910152565b600081518084526147198160208601602086016146dd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156147fc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08984030185528151608081518186526147b682870182614701565b838b0151878c0152898401518a88015260609384015173ffffffffffffffffffffffffffffffffffffffff16939096019290925250509386019390860190600101614772565b509098975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561484b57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610d7b57610d7b614852565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148c5576148c5614852565b5060010190565b600082614902577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082028115828204841417610d7b57610d7b614852565b818103600083128015838313168383128216171561190757611907614852565b60006020828403121561495057600080fd5b81516131cd81614313565b60006020828403121561496d57600080fd5b815167ffffffffffffffff81111561498457600080fd5b8201601f8101841361499557600080fd5b80516149a36144668261454a565b8181528560208385010111156149b857600080fd5b6149c98260208301602086016146dd565b95945050505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351614a0a8160178501602088016146dd565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351614a478160288401602088016146dd565b01602801949350505050565b6020815260006131cd6020830184614701565b81810381811115610d7b57610d7b614852565b6020808252825182820181905260009190848201906040850190845b81811015614abb57835167ffffffffffffffff1683529284019291840191600101614a95565b50909695505050505050565b600060208284031215614ad957600080fd5b815180151581146131cd57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006020808385031215614b2b57600080fd5b825167ffffffffffffffff811115614b4257600080fd5b8301601f81018513614b5357600080fd5b8051614b61614466826143e3565b81815260059190911b82018301908381019087831115614b8057600080fd5b928401925b82841015614210578351614b9881614407565b82529284019290840190614b85565b60007f80000000000000000000000000000000000000000000000000000000000000008203614bd857614bd8614852565b5060000390565b600060208284031215614bf157600080fd5b815160ff811681146131cd57600080fd5b600181815b80851115614c5b57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614c4157614c41614852565b80851615614c4e57918102915b93841c9390800290614c07565b509250929050565b600082614c7257506001610d7b565b81614c7f57506000610d7b565b8160018114614c955760028114614c9f57614cbb565b6001915050610d7b565b60ff841115614cb057614cb0614852565b50506001821b610d7b565b5060208310610133831016604e8410600b8410161715614cde575081810a610d7b565b614ce88383614c02565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614d1a57614d1a614852565b029392505050565b60006131cd60ff841683614c63565b600081614d4057614d40614852565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600060608284031215614d7857600080fd5b6040516060810181811067ffffffffffffffff82111715614d9b57614d9b614365565b80604052508251815260208301516020820152604083015160408201528091505092915050565b60008251614dd48184602087016146dd565b919091019291505056fea2646970667358221220c87a76c31f0456ef0717d5130419ac6f77b92dd570dccd680f54c8fcb72977f364736f6c63430008110033", + "nonce": "0x3bc", + "accessList": [] + }, + "additionalContracts": [] + } + ], + "receipts": [ + { + "transactionHash": "0x261b22721a799eb3f94b1c2e870671562ee0230f5af6e9f9d829c5ebc5a80726", + "transactionIndex": "0x10", + "blockHash": "0x5efe885243c9832d713c337bab9fb0d42b97c6a7fffb07ad75bb4c2eb8aec381", + "blockNumber": "0xfd28f3", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0x58f6b7", + "gasUsed": "0x42ca9d", + "contractAddress": "0x05E08E1BF31C1882822Cc48D7d51d6fe49Bca9c2", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x5997fd6f2" + } + ], + "libraries": [], + "pending": [], + "path": "/Users/gnervo/Documents/Angle/strategies-dev/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-latest.json", + "returns": {}, + "timestamp": 1675944479, + "chain": 1, + "multi": false, + "commit": "86f454d" +} \ No newline at end of file diff --git a/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-latest.json b/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-latest.json new file mode 100644 index 0000000..905c5d6 --- /dev/null +++ b/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-latest.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0x261b22721a799eb3f94b1c2e870671562ee0230f5af6e9f9d829c5ebc5a80726", + "transactionType": "CREATE", + "contractName": "OptimizerAPRStrategy", + "contractAddress": "0x05E08E1BF31C1882822Cc48D7d51d6fe49Bca9c2", + "function": null, + "arguments": null, + "rpc": "https://mainnet.infura.io/v3/092a612c762245f0946ecb943377617d", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x56d432", + "value": "0x0", + "data": "0x60806040523480156200001157600080fd5b50600054610100900460ff166200002f5760005460ff161562000039565b62000039620000de565b620000a15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b600054610100900460ff16158015620000c4576000805461ffff19166101011790555b8015620000d7576000805461ff00191690555b5062000102565b6000620000f630620000fc60201b620019901760201c565b15905090565b3b151590565b614e1480620001126000396000f3fe608060405234801561001057600080fd5b50600436106102ad5760003560e01c80637985fd511161017b578063ce5c7f61116100d8578063e6bfbfd81161008c578063efbb5cb011610071578063efbb5cb0146105c5578063fcc5f59a146105cd578063fcf2d0ad146105e257600080fd5b8063e6bfbfd8146105a3578063ec342ad0146105b657600080fd5b8063dc4c90d3116100bd578063dc4c90d314610560578063ddc6326214610585578063e6a69ab81461059857600080fd5b8063ce5c7f611461053a578063d547741f1461054d57600080fd5b8063a217fddf1161012f578063af648c3d11610114578063af648c3d1461050c578063b8dc491b1461051f578063bb927c461461053257600080fd5b8063a217fddf146104f1578063a526d83b146104f957600080fd5b806391d148541161016057806391d14854146104b8578063929eea21146104cb57806393084b34146104de57600080fd5b80637985fd511461049c5780638baf2957146104a557600080fd5b80632e1a7d4d116102295780634786b0cb116101dd5780635a5cd45e116101c25780635a5cd45e14610460578063708ba9bd1461046857806376ee75d81461048957600080fd5b80634786b0cb146104405780635641ec031461045357600080fd5b8063364bc15a1161020e578063364bc15a146103fe57806336568abe146104255780634641257d1461043857600080fd5b80632e1a7d4d146103c35780632f2ff15d146103eb57600080fd5b80631d12f28b1161028057806322f3e2d41161026557806322f3e2d414610360578063248a9ca31461037857806324ea54f41461039c57600080fd5b80631d12f28b146103125780631f1fcd511461031b57600080fd5b80630b6d1d17146102b25780630c016dc0146102ce5780630e6e15f0146102f55780630f969b87146102fd575b600080fd5b6102bb60355481565b6040519081526020015b60405180910390f35b6102bb7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe56281565b6102bb6105ea565b61031061030b3660046142fa565b6106cb565b005b6102bb60365481565b60345461033b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102c5565b610368610732565b60405190151581526020016102c5565b6102bb6103863660046142fa565b6000908152600160208190526040909120015490565b6102bb7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504181565b6103d66103d13660046142fa565b610743565b604080519283526020830191909152016102c5565b6103106103f9366004614335565b6107a9565b6102bb7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab81565b610310610433366004614335565b6107d5565b610310610867565b61031061044e3660046142fa565b610879565b6033546103689060ff1681565b6102bb6108aa565b61047b61047636600461441d565b6109b1565b6040516102c59291906144b1565b6103106104973660046144ff565b610cdb565b6102bb60665481565b6103106104b33660046144ff565b610d11565b6103686104c6366004614335565b610d47565b61033b6104d93660046142fa565b610d81565b6103106104ec3660046144ff565b610db8565b6102bb600081565b6103106105073660046144ff565b610fe5565b61031061051a3660046144ff565b611126565b61031061052d36600461451c565b611261565b6065546102bb565b610310610548366004614590565b611443565b61031061055b366004614335565b611457565b60335461033b90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6103106105933660046142fa565b61147e565b6102bb6301e1855881565b6103106105b136600461460b565b6114ba565b6102bb670de0b6b3a764000081565b6102bb6114de565b6105d5611588565b6040516102c5919061474b565b61031061190e565b6065546000908190815b818110156106c3576065818154811061060f5761060f61480a565b60009182526020918290200154604080517fc1590cd7000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263c1590cd7926004808401938290030181865afa158015610683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a79190614839565b6106b19084614881565b92506106bc81614894565b90506105f4565b509092915050565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50416106f68133611996565b60368290556040518281527fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a86009060200160405180910390a15050565b600061073c6114de565b1515919050565b6000807f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626107718133611996565b61077a84611a3f565b60345491945092506107a39073ffffffffffffffffffffffffffffffffffffffff163385611b29565b50915091565b600082815260016020819052604090912001546107c68133611996565b6107d08383611bfd565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f373100000000000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6108638282611c93565b5050565b61086f611d25565b610877611f0d565b565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50416108a48133611996565b50606655565b6000806108b56114de565b9050806000036108c757600091505090565b606554600090815b8181101561099e57606581815481106108ea576108ea61480a565b60009182526020918290200154604080517f116ac4a3000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263116ac4a3926004808401938290030181865afa15801561095e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109829190614839565b61098c9084614881565b925061099781614894565b90506108cf565b506109a983836148cc565b935050505090565b6065546000906060908067ffffffffffffffff8111156109d3576109d3614365565b6040519080825280602002602001820160405280156109fc578160200160208202803683370190505b50915083518114610a39576040517fcdeedcbd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610a436114de565b905080600003610a54575050915091565b6000805b83811015610c8b57868181518110610a7257610a7261480a565b602002602001015167ffffffffffffffff1682610a8f9190614881565b9150600061271067ffffffffffffffff16888381518110610ab257610ab261480a565b602002602001015167ffffffffffffffff1685610acf9190614907565b610ad991906148cc565b9050600060658381548110610af057610af061480a565b60009182526020918290200154604080517fc1590cd7000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263c1590cd7926004808401938290030181865afa158015610b64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b889190614839565b610b92908361491e565b905080878481518110610ba757610ba761480a565b60200260200101818152505060658381548110610bc657610bc661480a565b6000918252602090912001546040517fa7d385e20000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff9091169063a7d385e290602401602060405180830381865afa158015610c3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c629190614839565b610c6c9083614907565b610c769089614881565b9750505080610c8490614894565b9050610a58565b508061271014610cc7576040517f6edcc52300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cd182866148cc565b9450505050915091565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610d068133611996565b610863826001611f61565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab610d3c8133611996565b610863826000611f61565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff165b92915050565b60658181548110610d9157600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610de38133611996565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663a8c62e766040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e69919061493e565b73ffffffffffffffffffffffffffffffffffffffff1614610eb6576040517feeacc72d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60655460005b81811015610f455760658181548110610ed757610ed761480a565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff90811690851603610f35576040517f7cc7731c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f3e81614894565b9050610ebc565b506065805460018101825560009182527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915560405190917f1e7b117a6591133f0b36fc2c24d59f8465d806fdcad63aa33246b45fd62c89ff91a2505050565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626110108133611996565b61103a7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504183611bfd565b60655460005b81811015611120576065818154811061105b5761105b61480a565b6000918252602090912001546040517f2f2ff15d0000000000000000000000000000000000000000000000000000000081527f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041600482015273ffffffffffffffffffffffffffffffffffffffff868116602483015290911690632f2ff15d90604401600060405180830381600087803b1580156110f757600080fd5b505af115801561110b573d6000803e3d6000fd5b505050508061111990614894565b9050611040565b50505050565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626111518133611996565b61117b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504183611c93565b60655460005b81811015611120576065818154811061119c5761119c61480a565b6000918252602090912001546040517fd547741f0000000000000000000000000000000000000000000000000000000081527f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041600482015273ffffffffffffffffffffffffffffffffffffffff86811660248301529091169063d547741f90604401600060405180830381600087803b15801561123857600080fd5b505af115801561124c573d6000803e3d6000fd5b505050508061125a90614894565b9050611181565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504161128c8133611996565b60345473ffffffffffffffffffffffffffffffffffffffff908116908416036112e1576040517fc1ab6dc100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112eb61231e565b805190915060005b818110156113895782818151811061130d5761130d61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603611379576040517fc1ab6dc100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138281614894565b90506112f3565b506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015261143c90859073ffffffffffffffffffffffffffffffffffffffff8816906370a0823190602401602060405180830381865afa1580156113fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141e9190614839565b73ffffffffffffffffffffffffffffffffffffffff88169190611b29565b5050505050565b61144b611d25565b6114548161239b565b50565b600082815260016020819052604090912001546114748133611996565b6107d08383611c93565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab6114a98133611996565b6114b1611d25565b61086382612974565b6114c68484848461297e565b6035546114d5906103e8614907565b60665550505050565b6034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561154d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115719190614839565b6115796105ea565b6115839190614881565b905090565b60655460609060008167ffffffffffffffff8111156115a9576115a9614365565b60405190808252806020026020018201604052801561161b57816020015b6116086040518060800160405280606081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b8152602001906001900390816115c75790505b50905060005b828110156119075761166a6040518060800160405280606081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b6065828154811061167d5761167d61480a565b6000918252602082200154604080517f8b202176000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921692638b202176926004808401938290030181865afa1580156116ef573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611735919081019061495b565b8152606580548390811061174b5761174b61480a565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16606082015260658054839081106117865761178661480a565b60009182526020918290200154604080517fc1590cd7000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263c1590cd7926004808401938290030181865afa1580156117fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181e9190614839565b602082015260658054839081106118375761183761480a565b60009182526020918290200154604080517f57ded9c9000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff909216926357ded9c9926004808401938290030181865afa1580156118ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cf9190614839565b6040820152825181908490849081106118ea576118ea61480a565b6020026020010181905250508061190090614894565b9050611621565b5092915050565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626119398133611996565b603380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f17fa25a1c2ac074f71f0cf4f6af525c06fab7d83eff5ffcf6df5277f2919ae2490600090a150565b3b151590565b6119a08282610d47565b610863576119c58173ffffffffffffffffffffffffffffffffffffffff166014612f8a565b6119d0836020612f8a565b6040516020016119e19291906149d2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261085091600401614a53565b6034546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000918291829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611ab2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad69190614839565b9050838110611aea57509192600092509050565b600081611aff611afa8288614a66565b6131d4565b611b099190614881565b9050848110611b1e5750929360009350915050565b946000945092505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526107d09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613578565b611c078282610d47565b61086357600082815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616808652925280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b611c9d8282610d47565b1561086357600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000806000603360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf3759b56040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dbb9190614839565b60335490915060009060ff1615611e18576000611dd6613684565b905082811015611df157611dea8184614a66565b9350611e06565b82811115611e0657611e038382614a66565b94505b611e108484614a66565b915050611e29565b611e218261369c565b919550935090505b6040805185815260208101859052908101829052606081018390527f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d5099060800160405180910390a16033546040517fa1d9bafc00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044810183905261010090910473ffffffffffffffffffffffffffffffffffffffff169063a1d9bafc90606401600060405180830381600087803b158015611eef57600080fd5b505af1158015611f03573d6000803e3d6000fd5b5050505050505050565b61087760005b604051908082528060200260200182016040528015611f3c578160200160208202803683370190505b50604051602001611f4d9190614a79565b60405160208183030381529060405261239b565b60006065805480602002602001604051908101604052809291908181526020018280548015611fc657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611f9b575b505083519394506000925050505b818110156122eb57828181518110611fee57611fee61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036122db57600083828151811061203c5761203c61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663853828b66040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612090573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b49190614ac7565b9050841580156120c2575080155b156120f9576040517fa124823500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612104600184614a66565b821461218a5783612116600185614a66565b815181106121265761212661480a565b6020026020010151606583815481106121415761214161480a565b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b606580548061219b5761219b614ae9565b6000828152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908201810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690550190556034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015612261573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122859190614839565b1561229257612292611f0d565b60405173ffffffffffffffffffffffffffffffffffffffff8716907f95c84dbc5fd872c46b0e4290775a1a4ea1c8d760f9e4d38f48ba71b6f9a667db90600090a2505050505050565b6122e481614894565b9050611fd4565b506040517f30990b6700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051600180825281830190925260609160009190602080830190803683375050603454825192935073ffffffffffffffffffffffffffffffffffffffff16918391506000906123715761237161480a565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152919050565b60335460ff16156123a95750565b6000606580548060200260200160405190810160405280929190818152602001828054801561240e57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116123e3575b505050505090506000815190508060000361242857505050565b60008380602001905181019061243e9190614b18565b905060006060825160001461245c57612456836109b1565b90925090505b60008060008061246b89613a29565b93509350935093508581101561277f576000805b898110156125ac57600087828151811061249b5761249b61480a565b6020026020010151121561259c578a81815181106124bb576124bb61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8883815181106124f0576124f061480a565b602002602001015161250190614ba7565b6040518263ffffffff1660e01b815260040161251f91815260200190565b6020604051808303816000875af115801561253e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125629190614839565b8782815181106125745761257461480a565b602002602001015161258590614ba7565b61258f9190614a66565b6125999083614881565b91505b6125a581614894565b905061247f565b506066548111156125e9576040517f5c3810af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8981101561277857818782815181106126075761260761480a565b6020026020010151131561271e57818782815181106126285761262861480a565b6020026020010181815161263c919061491e565b9052508a51600092506126a0908c908390811061265b5761265b61480a565b60200260200101518883815181106126755761267561480a565b602090810291909101015160345473ffffffffffffffffffffffffffffffffffffffff169190611b29565b8a81815181106126b2576126b261480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561270157600080fd5b505af1158015612715573d6000803e3d6000fd5b50505050612768565b60008782815181106127325761273261480a565b60200260200101511315612768578681815181106127525761275261480a565b6020026020010151826127659190614a66565b91505b61277181614894565b90506125ec565b5050612968565b8115612811578884815181106127975761279761480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663853828b66040518163ffffffff1660e01b81526004016020604051808303816000875af11580156127eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061280f9190614ac7565b505b6034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a49190614839565b90508015612966576128ec8a85815181106128c1576128c161480a565b602090810291909101015160345473ffffffffffffffffffffffffffffffffffffffff169083611b29565b8984815181106128fe576128fe61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561294d57600080fd5b505af1158015612961573d6000803e3d6000fd5b505050505b505b50505050505050505050565b6114546000611f13565b600054610100900460ff166129995760005460ff161561299d565b303b155b612a29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610850565b600054610100900460ff16158015612a6857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b84603360016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550603360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3a919061493e565b603480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169182179055604080517f313ce567000000000000000000000000000000000000000000000000000000008152905163313ce567916004808201926020929091908290030181865afa158015612bd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf69190614bdf565b612c0190600a614d22565b60355573ffffffffffffffffffffffffffffffffffffffff83161580612c3b575073ffffffffffffffffffffffffffffffffffffffff8416155b80612c7157508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b15612ca8576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cd27f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504184613f76565b612cfc7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504185613f76565b612d267f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe56286613f76565b612d507f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe56280613f80565b612d9a7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50417f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe562613f80565b815160005b81811015612e7c57600073ffffffffffffffffffffffffffffffffffffffff16848281518110612dd157612dd161480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603612e26576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e6c7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab60001b858381518110612e5f57612e5f61480a565b6020026020010151613f76565b612e7581614894565b9050612d9f565b50612ec77ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041613f80565b612eda670de0b6b3a76400006064614907565b603655603380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690819055603454612f549173ffffffffffffffffffffffffffffffffffffffff91821691610100909104167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613fd7565b50801561143c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555050505050565b60606000612f99836002614907565b612fa4906002614881565b67ffffffffffffffff811115612fbc57612fbc614365565b6040519080825280601f01601f191660200182016040528015612fe6576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061301d5761301d61480a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106130805761308061480a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006130bc846002614907565b6130c7906001614881565b90505b6001811115613164577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106131085761310861480a565b1a60f81b82828151811061311e5761311e61480a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9361315d81614d31565b90506130ca565b5083156131cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610850565b9392505050565b600080606580548060200260200160405190810160405280929190818152602001828054801561323a57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161320f575b5050505050905060008151905080600003613259575060009392505050565b6066548085101561326f57506000949350505050565b60005b61327c8287614a66565b85101561356f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000805b858110156133ea578681815181106132c2576132c261480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16635be9b2d36040518163ffffffff1660e01b8152600401602060405180830381865afa158015613314573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133389190614ac7565b156133da5760008782815181106133515761335161480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166357ded9c96040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133c79190614839565b9050838110156133d8578093508192505b505b6133e381614894565b90506132a8565b508581815181106133fd576133fd61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16635be9b2d36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561344f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134739190614ac7565b61348257505050505050919050565b60008682815181106134965761349661480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d898b6134c59190614a66565b6040518263ffffffff1660e01b81526004016134e391815260200190565b6020604051808303816000875af1158015613502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135269190614839565b90506135328189614881565b975061353d84614894565b9350806000036135535750505050505050919050565b600684106135675750505050505050919050565b505050613272565b50505050919050565b60006135da826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166140d59092919063ffffffff16565b8051909150156107d057808060200190518101906135f89190614ac7565b6107d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610850565b60006136966136916114de565b611a3f565b50919050565b60008082816136a96105ea565b6034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291925060009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa15801561371d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137419190614839565b9050600061374f8383614881565b90508260000361376d5781841115613765578193505b505050613a22565b6033546040517f39ebf823000000000000000000000000000000000000000000000000000000008152306004820152600091610100900473ffffffffffffffffffffffffffffffffffffffff16906339ebf82390602401606060405180830381865afa1580156137e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138059190614d66565b6020015190508082111561391d5761381d8183614a66565b9650600061382b8689614881565b9050801580159061383b57508084105b156139175761384d611afa8583614a66565b506034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156138bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138e19190614839565b90508181101561391557808911156138ff5780985060009650613915565b61391261390c8a83614a66565b886140ec565b96505b505b50613a1d565b6139278282614a66565b955060006139358688614881565b9050801580159061394557508084105b15613a1b57613957611afa8583614a66565b506034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156139c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139eb9190614839565b905081811015613a195780881115613a095780975060009650613a19565b613a1661390c8983614a66565b96505b505b505b505050505b9193909250565b6034546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600091829182918291829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015613aa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ac49190614839565b905060008060008084905060008a5167ffffffffffffffff811115613aeb57613aeb614365565b604051908082528060200260200182016040528015613b14578160200160208202803683370190505b5090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005b8c51811015613d775760008d8281518110613b5857613b5861480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663a7d385e28a6040518263ffffffff1660e01b8152600401613b9a91815260200190565b602060405180830381865afa158015613bb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bdb9190614839565b905060008e8381518110613bf157613bf161480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663c1590cd76040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c679190614839565b9050613c738187614881565b955087821115613c8757819750809650829c505b603554613c9590600a614907565b811115613d645760008f8481518110613cb057613cb061480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166357ded9c96040518163ffffffff1660e01b8152600401602060405180830381865afa158015613d02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d269190614839565b9050613d328282614907565b868581518110613d4457613d4461480a565b60200260200101818152505084811015613d6257809450819950839e505b505b505080613d7090614894565b9050613b3b565b50508115613f695760008060005b8d51811015613f2e578b8103613e9c5786613da08a88614881565b613daa9190614907565b613db49084614881565b92508715801590613dc6575060018e51115b15613e97578d8c81518110613ddd57613ddd61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663a7d385e28a8a613e0c9190614881565b6040518263ffffffff1660e01b8152600401613e2a91815260200190565b602060405180830381865afa158015613e47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e6b9190614839565b88613e768b89614881565b613e809190614881565b613e8a9190614907565b613e949083614881565b91505b613f1e565b8c8103613ecf57838181518110613eb557613eb561480a565b602002602001015183613ec89190614881565b9250613f1e565b838181518110613ee157613ee161480a565b602002602001015183613ef49190614881565b9250838181518110613f0857613f0861480a565b602002602001015182613f1b9190614881565b91505b613f2781614894565b9050613d85565b508181118015613f3f575060018d51115b15613f595760019950613f5284826148cc565b9850613f66565b613f6384836148cc565b98505b50505b5050505050509193509193565b6108638282611bfd565b60008281526001602081905260409091200154819060405184907fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff90600090a4600091825260016020819052604090922090910155565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801561404e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140729190614839565b61407c9190614881565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506111209085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611b7b565b60606140e48484600085614102565b949350505050565b60008183106140fb57816131cd565b5090919050565b606082471015614194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610850565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516141bd9190614dc2565b60006040518083038185875af1925050503d80600081146141fa576040519150601f19603f3d011682016040523d82523d6000602084013e6141ff565b606091505b50915091506142108783838761421b565b979650505050505050565b606083156142b15782516000036142aa5773ffffffffffffffffffffffffffffffffffffffff85163b6142aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610850565b50816140e4565b6140e483838151156142c65781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108509190614a53565b60006020828403121561430c57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461145457600080fd5b6000806040838503121561434857600080fd5b82359150602083013561435a81614313565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156143db576143db614365565b604052919050565b600067ffffffffffffffff8211156143fd576143fd614365565b5060051b60200190565b67ffffffffffffffff8116811461145457600080fd5b6000602080838503121561443057600080fd5b823567ffffffffffffffff81111561444757600080fd5b8301601f8101851361445857600080fd5b803561446b614466826143e3565b614394565b81815260059190911b8201830190838101908783111561448a57600080fd5b928401925b828410156142105783356144a281614407565b8252928401929084019061448f565b6000604082018483526020604081850152818551808452606086019150828701935060005b818110156144f2578451835293830193918301916001016144d6565b5090979650505050505050565b60006020828403121561451157600080fd5b81356131cd81614313565b6000806040838503121561452f57600080fd5b823561453a81614313565b9150602083013561435a81614313565b600067ffffffffffffffff82111561456457614564614365565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b6000602082840312156145a257600080fd5b813567ffffffffffffffff8111156145b957600080fd5b8201601f810184136145ca57600080fd5b80356145d86144668261454a565b8181528560208385010111156145ed57600080fd5b81602084016020830137600091810160200191909152949350505050565b6000806000806080858703121561462157600080fd5b843561462c81614313565b935060208581013561463d81614313565b9350604086013561464d81614313565b9250606086013567ffffffffffffffff81111561466957600080fd5b8601601f8101881361467a57600080fd5b8035614688614466826143e3565b81815260059190911b8201830190838101908a8311156146a757600080fd5b928401925b828410156146ce5783356146bf81614313565b825292840192908401906146ac565b979a9699509497505050505050565b60005b838110156146f85781810151838201526020016146e0565b50506000910152565b600081518084526147198160208601602086016146dd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156147fc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08984030185528151608081518186526147b682870182614701565b838b0151878c0152898401518a88015260609384015173ffffffffffffffffffffffffffffffffffffffff16939096019290925250509386019390860190600101614772565b509098975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561484b57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610d7b57610d7b614852565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148c5576148c5614852565b5060010190565b600082614902577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082028115828204841417610d7b57610d7b614852565b818103600083128015838313168383128216171561190757611907614852565b60006020828403121561495057600080fd5b81516131cd81614313565b60006020828403121561496d57600080fd5b815167ffffffffffffffff81111561498457600080fd5b8201601f8101841361499557600080fd5b80516149a36144668261454a565b8181528560208385010111156149b857600080fd5b6149c98260208301602086016146dd565b95945050505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351614a0a8160178501602088016146dd565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351614a478160288401602088016146dd565b01602801949350505050565b6020815260006131cd6020830184614701565b81810381811115610d7b57610d7b614852565b6020808252825182820181905260009190848201906040850190845b81811015614abb57835167ffffffffffffffff1683529284019291840191600101614a95565b50909695505050505050565b600060208284031215614ad957600080fd5b815180151581146131cd57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006020808385031215614b2b57600080fd5b825167ffffffffffffffff811115614b4257600080fd5b8301601f81018513614b5357600080fd5b8051614b61614466826143e3565b81815260059190911b82018301908381019087831115614b8057600080fd5b928401925b82841015614210578351614b9881614407565b82529284019290840190614b85565b60007f80000000000000000000000000000000000000000000000000000000000000008203614bd857614bd8614852565b5060000390565b600060208284031215614bf157600080fd5b815160ff811681146131cd57600080fd5b600181815b80851115614c5b57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614c4157614c41614852565b80851615614c4e57918102915b93841c9390800290614c07565b509250929050565b600082614c7257506001610d7b565b81614c7f57506000610d7b565b8160018114614c955760028114614c9f57614cbb565b6001915050610d7b565b60ff841115614cb057614cb0614852565b50506001821b610d7b565b5060208310610133831016604e8410600b8410161715614cde575081810a610d7b565b614ce88383614c02565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614d1a57614d1a614852565b029392505050565b60006131cd60ff841683614c63565b600081614d4057614d40614852565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600060608284031215614d7857600080fd5b6040516060810181811067ffffffffffffffff82111715614d9b57614d9b614365565b80604052508251815260208301516020820152604083015160408201528091505092915050565b60008251614dd48184602087016146dd565b919091019291505056fea2646970667358221220c87a76c31f0456ef0717d5130419ac6f77b92dd570dccd680f54c8fcb72977f364736f6c63430008110033", + "nonce": "0x3bc", + "accessList": [] + }, + "additionalContracts": [] + } + ], + "receipts": [ + { + "transactionHash": "0x261b22721a799eb3f94b1c2e870671562ee0230f5af6e9f9d829c5ebc5a80726", + "transactionIndex": "0x10", + "blockHash": "0x5efe885243c9832d713c337bab9fb0d42b97c6a7fffb07ad75bb4c2eb8aec381", + "blockNumber": "0xfd28f3", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0x58f6b7", + "gasUsed": "0x42ca9d", + "contractAddress": "0x05E08E1BF31C1882822Cc48D7d51d6fe49Bca9c2", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x5997fd6f2" + } + ], + "libraries": [], + "pending": [], + "path": "/Users/gnervo/Documents/Angle/strategies-dev/broadcast/MigrationOptimizerAPRUSDC.s.sol/1/run-latest.json", + "returns": {}, + "timestamp": 1675944479, + "chain": 1, + "multi": false, + "commit": "86f454d" +} \ No newline at end of file diff --git a/broadcast/MigrationOptimizerAPRUSDC.s.sol/137/run-1675932828.json b/broadcast/MigrationOptimizerAPRUSDC.s.sol/137/run-1675932828.json new file mode 100644 index 0000000..43c3551 --- /dev/null +++ b/broadcast/MigrationOptimizerAPRUSDC.s.sol/137/run-1675932828.json @@ -0,0 +1,34 @@ +{ + "transactions": [ + { + "hash": "0xa1262d668c197705b2cda322153731ca350c1710945d0f8751c99da6329844e4", + "transactionType": "CREATE", + "contractName": "OptimizerAPRStrategy", + "contractAddress": "0x151B4aa3A1F553F8c4aC1463fEE41FdFa319ed35", + "function": null, + "arguments": null, + "rpc": "https://polygon-mainnet.g.alchemy.com/v2/IJTj5SikhXCIV_a021XV2xpbLL8ibwUP", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x5965d1", + "value": "0x0", + "data": "0x60808060405234620000d3576000549060ff8260081c169081600014620000c857303b155b156200006f57501590816200005c575b506200004b575b60405161508c9081620000d98239f35b61ff0019600054166000556200003b565b61ffff1916610101176000553862000034565b62461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b60ff83161562000024565b600080fdfe6101006040908082526004918236101561001857600080fd5b600092833560e01c9283630b6d1d1714612087575082630c016dc01461202e5782630e6e15f014611ff35782630f969b8714611f855782631d12f28b14611f485782631f1fcd5114611ef557826322f3e2d414611eb1578263248a9ca314611e6857826324ea54f414611e0f5782632e1a7d4d14611d9c5782632f2ff15d14611ca5578263364bc15a14611c4c57826336568abe14611b8e5782634641257d14611b575782634786b0cb14611b165782635641ec0314611ad45782635a5cd45e14611a99578263708ba9bd1461199a57826376ee75d8146119515782637985fd51146119145782638baf2957146118cb57826391d1485414611859578263929eea21146117d557826393084b34146115db578263a217fddf146115a2578263a526d83b1461148b578263af648c3d146112eb578263b8dc491b14611120578263bb927c46146110e3578263ce5c7f611461104c578263d547741f14610ff2578263dc4c90d314610f9c578263ddc6326214610f50578263e6a69ab814610f13578263e6bfbfd8146106a3578263ec342ad014610662578263efbb5cb014610620578263fcc5f59a1461026157505063fcf2d0ad146101d557600080fd5b3461025e57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e5761020c336125d8565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0060335416176033557f17fa25a1c2ac074f71f0cf4f6af525c06fab7d83eff5ffcf6df5277f2919ae248180a180f35b80fd5b83903461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760655461029d816121c8565b916102aa85519384612187565b8183527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06102d7836121c8565b01845b818110610605575050835b8281106103a557505050825191602080840190808552835180925285850181878460051b880101950193965b83881061031e5786860387f35b90919293948380827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a60019503018652885190610364825160808084528301906122a3565b918381015184830152868101518783015273ffffffffffffffffffffffffffffffffffffffff60608092015116910152970193019701969093929193610311565b6103ad6142f0565b6103b6826121e0565b905488517f8b2021760000000000000000000000000000000000000000000000000000000081528881878173ffffffffffffffffffffffffffffffffffffffff8096600398891b1c165afa9081156105fb578991610576575b5083528061041c856121e0565b905490841b1c16606084015280610432856121e0565b905490841b1c1691895180937fc1590cd7000000000000000000000000000000000000000000000000000000008252818860209687935afa90811561056c579187939185938c91610534575b508387015261048c876121e0565b9054911b1c168a51928380927f57ded9c90000000000000000000000000000000000000000000000000000000082525afa91821561052a5788926104f6575b5050878201526104f191906104e08287612e1e565b526104eb8186612e1e565b50612df1565b6102e5565b90809250813d8311610523575b61050d8183612187565b8101031261051f57516104f1896104cb565b8680fd5b503d610503565b89513d8a823e3d90fd5b929450509181813d8311610565575b61054d8183612187565b81010312610561579183918793518d61047e565b8980fd5b503d610543565b8b513d8c823e3d90fd5b90503d808a833e6105878183612187565b81019060209081818403126105f75780519067ffffffffffffffff82116105f357019082601f830112156105f757908b92918151926105d16105c885612246565b95519586612187565b8385528184840101116105f3576105ed92918482019101612280565b8a61040f565b8b80fd5b8a80fd5b8a513d8b823e3d90fd5b6020906106106142f0565b828288010152016102da565b5080fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b6143f2565b9051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209051670de0b6b3a76400008152f35b915034610f0f5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576106dc6120e9565b6106e46120c1565b916044359173ffffffffffffffffffffffffffffffffffffffff9182841691828503610f0b576064359267ffffffffffffffff8411610bcc5736602385011215610bcc578388013596610736886121c8565b9061074385519283612187565b8882526020958683016024809b60051b83010191368311610dea578b01905b828210610eef575050508a549760ff93848a60081c1680600014610ee657303b155b15610e655789898f928f90159d8e610e37575b506033547fffffffffffffffffffffff0000000000000000000000000000000000000000ff74ffffffffffffffffffffffffffffffffffffffff008c60081b1691161790816033558b51809481937ffc0c546a00000000000000000000000000000000000000000000000000000000835260081c165afa908115610e2d578b8f928c928591610e00575b5016807fffffffffffffffffffffffff000000000000000000000000000000000000000060345416176034558a51928380927f313ce5670000000000000000000000000000000000000000000000000000000082525afa918215610df557908792610db7575b5016604d8111610d8c57600a0a6035558015908115610d81575b8115610d75575b50610d4d578b949392916108be6108c392612a4e565b612a4e565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5629182855260019384885288878720911690818752885281878720541615610ce7575b50908291859387965284885284868520015492807fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9481868880a480868887200155857f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419786898098528383838320015489898480a42001558151908d5b828110610be157505050507ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab808c5283875283868d200154918c80a4828920015568056bc75e2d63100000603655603354927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00841660335580603454169360081c168151917fdd62ed3e000000000000000000000000000000000000000000000000000000008352308884015281878401528383604481885afa928315610bd7578993610ba4575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301809311610b7957517f095ea7b3000000000000000000000000000000000000000000000000000000009381019390935273ffffffffffffffffffffffffffffffffffffffff168583019081526020810191909152610b049290610aff9083906040015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101845283612187565b614e53565b610b4e575b603554916103e89280840293840403610b2457505060665580f35b601184917f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff8354168355610b09565b868960118a7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b9092508381813d8311610bd0575b610bbc8183612187565b81010312610bcc57519138610a4c565b8880fd5b503d610bb2565b81513d8b823e3d90fd5b90919293945089610bf28286612e1e565b511615610cbf57808e8b610c09610c4e9488612e1e565b51167ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab808352898d528b83208284528d52858c8420541615610c59575b505050612df1565b908694939291610984565b808352898d528b83208284528d528b83208a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d339380a48e3880610c46565b8c88517fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b8386528488528686208187528852868620857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790553390847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8880a438610906565b8a86517fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b905088831614386108a8565b838a161591506108a1565b8b8e60118f7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8092508a8092503d8311610dee575b610dd08183612187565b81010312610dea57518581168103610dea57859038610887565b8d80fd5b503d610dc6565b8951903d90823e3d90fd5b610e209150833d8511610e26575b610e188183612187565b810190612e45565b38610821565b503d610e0e565b89513d84823e3d90fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661010117845538610797565b60848d602e8e8c8c51937f08c379a00000000000000000000000000000000000000000000000000000000085528401528201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152fd5b858b1615610784565b81358a81168103610f07578152908801908801610762565b8e80fd5b8780fd5b8280fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090516301e185588152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f8933612769565b610f91612c08565b610f99613e5c565b80f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209073ffffffffffffffffffffffffffffffffffffffff60335460081c169051908152f35b915034610f0f57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57610f99913561104760016110346120c1565b93838752816020528620015433906128fa565b612b2a565b915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f578282359267ffffffffffffffff841161061c573660238501121561061c57830135926110b46110ab85612246565b93519384612187565b838352366024858301011161061c5783610f999460246020930183860137830101526110de612c08565b6132ff565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906065549051908152f35b915034610f0f57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576111586120e9565b6111606120c1565b9061116a336122e6565b73ffffffffffffffffffffffffffffffffffffffff908180603454169116918183146112c35784519061119c8261214f565b60018252602092838301843682378351156112975752815191885b83811061124e57505050508351947f70a0823100000000000000000000000000000000000000000000000000000000865230908601528085602481855afa9384156112455750859361120f575b50610f999350614df4565b90925083813d831161123e575b6112268183612187565b8101031261123a57610f9992519138611204565b8380fd5b503d61121c565b513d87823e3d90fd5b826112598284612e1e565b5116861461126f5761126a90612df1565b6111b7565b8888517fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b60248a60328b7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8585517fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576113256120e9565b9161132f336125d8565b837f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504180825260016020528282209373ffffffffffffffffffffffffffffffffffffffff8096169485845260205260ff8484205416611425575b60655495835b878110611399578480f35b816113a3826121e0565b90549060031b1c16803b156114215785809160448951809481937fd547741f0000000000000000000000000000000000000000000000000000000083528a8a8401528d60248401525af18015611417579061140392916114085750612df1565b61138e565b6114119061210c565b386104eb565b87513d88823e3d90fd5b8580fd5b81835260016020528383208584526020528383207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690553385837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b8680a4611388565b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57906114c66120e9565b906114d0336125d8565b6114d982612a4e565b8360655493819373ffffffffffffffffffffffffffffffffffffffff809116945b868110611505578380f35b8161150f826121e0565b90549060031b1c16803b1561159e5784809160448851809481937f2f2ff15d0000000000000000000000000000000000000000000000000000000083527f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50418a8401528c60248401525af18015611594579061158f92916114085750612df1565b6114fa565b86513d87823e3d90fd5b8480fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5751908152602090f35b83823461061c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57823573ffffffffffffffffffffffffffffffffffffffff918282169283830361159e57611638336122e6565b81517fa8c62e760000000000000000000000000000000000000000000000000000000081526020818881885afa9081156117cb5786916117ad575b5081309116036117855760655491855b838110611737575050506801000000000000000081101561170b57906116b28260016116e494016065556121e0565b90919082549060031b9173ffffffffffffffffffffffffffffffffffffffff9283811b93849216901b16911916179055565b7f1e7b117a6591133f0b36fc2c24d59f8465d806fdcad63aa33246b45fd62c89ff8280a280f35b6024846041877f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b82611741826121e0565b90549060031b1c16861461175d5761175890612df1565b611683565b8782517f7cc7731c000000000000000000000000000000000000000000000000000000008152fd5b8582517feeacc72d000000000000000000000000000000000000000000000000000000008152fd5b6117c5915060203d8111610e2657610e188183612187565b87611673565b83513d88823e3d90fd5b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f5735606554811015610f0f5773ffffffffffffffffffffffffffffffffffffffff906065602094527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70154169051908152f35b90915034610f0f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f578160209360ff926118996120c1565b903582526001865273ffffffffffffffffffffffffffffffffffffffff83832091168252855220541690519015158152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f996119066120e9565b61190f33612769565b614ae4565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906066549051908152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f9961198c6120e9565b611995336122e6565b614841565b833461025e57602091827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57803567ffffffffffffffff9182821161123a573660238301121561123a578101356119f6816121c8565b92611a0387519485612187565b81845260248685019260051b8401019236841161142157959695602401915b838310611a7b5750505050611a3690614585565b9190835194848695860192865281860152835180925280606086019401925b828110611a6457505050500390f35b835185528695509381019392810192600101611a55565b8297969735828116810361051f578152959695918701918701611a22565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b61449b565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209060ff6033541690519015158152f35b83903461061c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57611b50336122e6565b3560665580f35b833461025e57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f91612c08565b83903461061c57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57611bc66120c1565b903373ffffffffffffffffffffffffffffffffffffffff831603611bef5790610f999135612b2a565b60649060208551917f08c379a0000000000000000000000000000000000000000000000000000000008352820152600260248201527f37310000000000000000000000000000000000000000000000000000000000006044820152fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab8152f35b90915034610f0f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f573590611ce06120c1565b908284526001602052611cfa6001828620015433906128fa565b828452600160205273ffffffffffffffffffffffffffffffffffffffff81852092169182855260205260ff818520541615611d33578380f35b8284526001602052808420828552602052832060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905533917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8480a43880808380f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e5750611de090611dda336125d8565b3561422c565b611e03823373ffffffffffffffffffffffffffffffffffffffff60345416614df4565b82519182526020820152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50418152f35b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57816020936001923581528285522001549051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090611eec6143f2565b15159051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209073ffffffffffffffffffffffffffffffffffffffff603454169051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906036549051908152f35b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f577fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a8600916020913590611fe7336122e6565b8160365551908152a180f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b614326565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5628152f35b84903461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906035548152f35b6024359073ffffffffffffffffffffffffffffffffffffffff821682036120e457565b600080fd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036120e457565b67ffffffffffffffff811161212057604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761212057604052565b6080810190811067ffffffffffffffff82111761212057604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761212057604052565b67ffffffffffffffff81116121205760051b60200190565b6065548110156122175760656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b67ffffffffffffffff811161212057601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381106122935750506000910152565b8181015183820152602001612283565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936122df81518092818752878088019101612280565b0116010190565b73ffffffffffffffffffffffffffffffffffffffff1660008181527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db6020908152604080832054909391927f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419290916001919060ff161561236957505050505050565b61237290614c6e565b9285519161237f8361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116124e05750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b8401917f206973206d697373696e6720726f6c6520000000000000000000000000000000603784015251809386840190612280565b01036028810187520185612187565b519283927f08c379a0000000000000000000000000000000000000000000000000000000008452600484015260248301906122a3565b0390fd5b6064848651907f08c379a000000000000000000000000000000000000000000000000000000000825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a61251d8587614c5d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191906123ac565b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526032600452fd5b73ffffffffffffffffffffffffffffffffffffffff1660008181527f015260285f12fe1d77221203cd7e5aa67b79d47399b4bedd98b8730e56d911bf6020908152604080832054909391927f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5629290916001919060ff161561265b57505050505050565b61266490614c6e565b928551916126718361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116126f85750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a6127358587614c5d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01919061269e565b73ffffffffffffffffffffffffffffffffffffffff1660008181527f10c15aae13326e9b33c92ffbb94efb7492c500f0cca324caca9bd1aca194ed186020908152604080832054909391927ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab9290916001919060ff16156127ec57505050505050565b6127f590614c6e565b928551916128028361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116128895750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a6128c68587614c5d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01919061282f565b60009080825260019160209280845260409473ffffffffffffffffffffffffffffffffffffffff868420911690818452855260ff86842054161561294057505050505050565b61294990614c6e565b928551916129568361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116129dd5750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a612a1a8587614c5d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019190612983565b73ffffffffffffffffffffffffffffffffffffffff1660008181527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db60205260408120549091907f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419060ff1615612ac457505050565b8083526001602052604083208284526020526040832060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d339380a4565b90600091808352600160205273ffffffffffffffffffffffffffffffffffffffff6040842092169182845260205260ff604084205416612b6957505050565b808352600160205260408320828452602052604083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b339380a4565b91908203918211612bd957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080603354916040918251937fbf3759b500000000000000000000000000000000000000000000000000000000855273ffffffffffffffffffffffffffffffffffffffff90602086600481858560081c165afa958615612de7578496612db3575b5060ff1615612d7757612c83612c7e6143f2565b61422c565b508580821015612d5457612c98929350612bcc565b905b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d5096080612cc78488612bcc565b965b86519086825285602083015288888301526060820152a160335460081c16803b156120e45760009283606492865197889586947fa1d9bafc0000000000000000000000000000000000000000000000000000000086526004860152602485015260448401525af1908115612d4a5750612d3f5750565b612d489061210c565b565b513d6000823e3d90fd5b90818111612d64575b5050612c9a565b612d6f929450612bcc565b918438612d5d565b84925060809150612da87f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d50995612e7e565b969193909394612cc9565b9095506020813d8211612ddf575b81612dce60209383612187565b8101031261123a57519460ff612c6a565b3d9150612dc1565b85513d86823e3d90fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612bd95760010190565b80518210156122175760209160051b010190565b81810292918115918404141715612bd957565b908160209103126120e4575173ffffffffffffffffffffffffffffffffffffffff811681036120e45790565b91908201809211612bd957565b9060008091828492612e8e614326565b9573ffffffffffffffffffffffffffffffffffffffff908160345416906040938451998a927f70a08231000000000000000000000000000000000000000000000000000000009485855230600486015284602460209687935afa9b8c156131c257889c6131ef575b50612f01828d612e71565b91156131cc5750602460608660335460081c168851928380927f39ebf8230000000000000000000000000000000000000000000000000000000082523060048301525afa9081156131c2579084918991613133575b500151918282111561305f575090612f6d91612bcc565b98612f78888b612e71565b9384151580613056575b612f90575b50505050505050565b612fa3612f9e849387612bcc565b613efb565b506034541692602486518095819382523060048301525afa93841561304d5750849361301d575b50508110612fdd575b8080808080612f87565b91928286929611600014612ff757505092905b3880612fd3565b9094918561300491612bcc565b91508082101561301657505b90612ff0565b9050613010565b9080929350813d8311613046575b6130358183612187565b81010312610f0f5751903880612fca565b503d61302b565b513d86823e3d90fd5b50848210612f82565b9a995061306b91612bcc565b97613076888a612e71565b938415158061312a575b61308d5750505050505050565b61309b612f9e849387612bcc565b506034541692602486518095819382523060048301525afa93841561304d575084936130fa575b505081106130d4578080808080612f87565b919282859295116000146130ed57505091903880612fd3565b9093918461300491612bcc565b9080929350813d8311613123575b6131128183612187565b81010312610f0f57519038806130c2565b503d613108565b50848210613080565b9150506060813d82116131ba575b8161314e60609383612187565b81010312610f0b578651906060820182811067ffffffffffffffff82111761318d57885280518252808501518286015287015187820152839038612f56565b60248a7f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b3d9150613141565b87513d8a823e3d90fd5b955050505050508592939450949094116131e7575b50829190565b9150386131e1565b909b508381813d8311613217575b6132078183612187565b81010312610f0b57519a38612ef6565b503d6131fd565b60405190606554808352826020918282019060656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c7936000905b82821061327157505050612d4892500383612187565b855473ffffffffffffffffffffffffffffffffffffffff168452600195860195889550938101939091019061325b565b908160209103126120e4575180151581036120e45790565b7f80000000000000000000000000000000000000000000000000000000000000008114612bd95760000390565b81810392916000138015828513169184121617612bd957565b60ff6033541661387a5761331161321e565b8060a05251806080521561387a5780518101906020818184019303126120e457602081015167ffffffffffffffff918282116120e457019180603f840112156120e457602083015191613363836121c8565b936133716040519586612187565b8385526040602086019460051b8201019283116120e457604001925b828410613e0a5750505050600090606060c0528051613df7575b50600090600060e052600090816024602073ffffffffffffffffffffffffffffffffffffffff60345416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa908115613dea5760e05191613db2575b5060e051908182908260a05151917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061346461344e856121c8565b9461345c6040519687612187565b8086526121c8565b0136602085013760a05151937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60e05190603554915b878110613b22575050508561393e575b5050505050505010600014613775575050600090815b6080518110156135de5760006134d88260c051612e1e565b51126134ed575b6134e890612df1565b6134c0565b9160006135056134ff8560c051612e1e565b516132b9565b602073ffffffffffffffffffffffffffffffffffffffff6135288760a051612e1e565b5116602461353b6134ff8960c051612e1e565b60405195869384927f2e1a7d4d00000000000000000000000000000000000000000000000000000000845260048401525af19182156135d25760009261359c575b509161358e613594926134e894612bcc565b90612e71565b9290506134df565b90916020823d6020116135ca575b816135b760209383612187565b8101031261025e5750519061358e61357c565b3d91506135aa565b6040513d6000823e3d90fd5b5090606654811161374b576000905b60805182101561374757806136048360c051612e1e565b511315613705576136219061361b8360c051612e1e565b516132e6565b61362d8260c051612e1e565b5260009061368373ffffffffffffffffffffffffffffffffffffffff6034541673ffffffffffffffffffffffffffffffffffffffff61366e8460a051612e1e565b511661367c8460c051612e1e565b5191614df4565b73ffffffffffffffffffffffffffffffffffffffff6136a48260a051612e1e565b5116803b15610f0f578280916004604051809481937fd0e30db00000000000000000000000000000000000000000000000000000000083525af180156136fa57906136f492916114085750612df1565b906135ed565b6040513d85823e3d90fd5b9060006137148260c051612e1e565b5113613724575b6136f490612df1565b9061373f6136f4916137388460c051612e1e565b5190612bcc565b91905061371b565b5050565b60046040517f5c3810af000000000000000000000000000000000000000000000000000000008152fd5b6138af575b5073ffffffffffffffffffffffffffffffffffffffff603454166040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152602081602481855afa9081156135d25760009161387d575b50806137e2575050565b6138119173ffffffffffffffffffffffffffffffffffffffff61380960e05160a051612e1e565b511690614df4565b73ffffffffffffffffffffffffffffffffffffffff61383460e05160a051612e1e565b5116803b156120e457600080916004604051809481937fd0e30db00000000000000000000000000000000000000000000000000000000083525af180156135d257612d3f575b50565b906020823d6020116138a7575b8161389760209383612187565b8101031261025e575051386137d8565b3d915061388a565b602073ffffffffffffffffffffffffffffffffffffffff6138d460009360a051612e1e565b51166004604051809481937f853828b60000000000000000000000000000000000000000000000000000000083525af180156135d2571561377a576139309060203d602011613937575b6139288183612187565b8101906132a1565b503861377a565b503d61391e565b94965088958695869590915b81871061399e575050505050505080851180613991575b1561398057505061397490600193613e23565b388080808080806134aa565b61398c92919450613e23565b613974565b50600160a0515111613961565b9091929394959660e0518814600014613ad7576139c89061358e836139c38988612e71565b612e32565b9684151580613acd575b6139eb575b6139e090612df1565b95949392919061394a565b9a6139ff856139fa8887612e71565b612e71565b73ffffffffffffffffffffffffffffffffffffffff613a2260e05160a051612e1e565b5116906020613a318989612e71565b6024604051809581937fa7d385e200000000000000000000000000000000000000000000000000000000835260048301525afa918215613ac2578b92613a8c575b509161358e613a84926139e094612e32565b9b90506139d7565b9091506020813d602011613aba575b81613aa860209383612187565b810103126105f757519061358e613a72565b3d9150613a9b565b6040513d8d823e3d90fd5b50600183116139d2565b878d03613afc57613af66139e091613aef8a8a612e1e565b5190612e71565b97612df1565b613b1c889c613aef613b156139e094613aef8d8d612e1e565b9a8a612e1e565b9b612df1565b602498602073ffffffffffffffffffffffffffffffffffffffff613b488460a051612e1e565b51166040519b8c80927fa7d385e20000000000000000000000000000000000000000000000000000000082528b60048301525afa998a15613da5578e9a613d70575b50600490602073ffffffffffffffffffffffffffffffffffffffff613bb18560a051612e1e565b5116604051938480927fc1590cd70000000000000000000000000000000000000000000000000000000082525afa918215613cf0578f92613d3a575b5081613bf891612e71565b998b8111613d2a575b50600a848102048403613cfd5783600a028111613c28575b50613c2390612df1565b61349a565b6004602073ffffffffffffffffffffffffffffffffffffffff613c4d8560a051612e1e565b5116604051928380927f57ded9c90000000000000000000000000000000000000000000000000000000082525afa908115613cf0578f91613cbe575b50613c948282612e32565b613c9e848b612e1e565b52838110613cad575b50613c19565b925094509c50613c238d9038613ca7565b90506020813d602011613ce8575b81613cd960209383612187565b81010312610f07575138613c89565b3d9150613ccc565b8f604051903d90823e3d90fd5b60248e7f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b60e08390529a5093508338613c01565b9091506020813d602011613d68575b81613d5660209383612187565b81010312610f07575190613bf8613bed565b3d9150613d49565b9099506020813d602011613d9d575b81613d8c60209383612187565b81010312610dea5751986004613b8a565b3d9150613d7f565b8e604051903d90823e3d90fd5b90506020813d602011613de2575b81613dcd60209383612187565b81010312613ddc575138613413565b60e05180fd5b3d9150613dc0565b6040513d60e051823e3d90fd5b613e019150614585565b60c052386133a7565b835182811681036120e45781526020938401930161338d565b8115613e2d570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6040516020908181019067ffffffffffffffff928183108484111761212057929082604052600081526040519360408501918180870152518092526060850193926000905b838210613ee2575050505050906110de81612d4893037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612187565b8451811686529482019493820193600190910190613ea1565b600080613f0661321e565b928351928315614224576066549485831061421b5781959395935b613f2b8185612bcc565b871015614212577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff968397845b8881106140cb57505073ffffffffffffffffffffffffffffffffffffffff9788613f828286612e1e565b51166040998a51928380937f5be9b2d3000000000000000000000000000000000000000000000000000000008252602094859160049788915afa9081156140c15789916140a4575b50156140955760248392613fdf8e938a612e1e565b51169489613fed888d612bcc565b935196879485937f2e1a7d4d0000000000000000000000000000000000000000000000000000000085528401525af1998a1561124557508599614061575b505061403a8861404092612e71565b95612df1565b961561405757600687101561405757959395613f21565b5050505091505090565b9080929950813d831161408e575b6140798183612187565b8101031261123a57519661403a61404061402b565b503d61406f565b50505050965050505050505090565b6140bb9150843d8611613937576139288183612187565b38613fca565b8d513d8b823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff806140eb8388612e1e565b5116906040918251918280927f5be9b2d3000000000000000000000000000000000000000000000000000000008252602093849160049687915afa908115614208578b916141eb575b5061414c575b5050505061414790612df1565b613f58565b8190614158868b612e1e565b51168451938480927f57ded9c90000000000000000000000000000000000000000000000000000000082525afa9283156141e2575088926141b4575b50508281106141a6575b80808061413a565b91509850614147899061419e565b90809250813d83116141db575b6141cb8183612187565b8101031261051f57513880614194565b503d6141c1565b513d8a823e3d90fd5b6142029150833d8511613937576139288183612187565b38614134565b85513d8d823e3d90fd5b50505050505090565b50935050505090565b935050505090565b6024602073ffffffffffffffffffffffffffffffffffffffff60345416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9081156135d2576000916142bf575b50818110614299575090600090565b806139fa612f9e6142aa9385612bcc565b8181106142b8575090600090565b9160009150565b906020823d82116142e8575b816142d860209383612187565b8101031261025e5750513861428a565b3d91506142cb565b604051906080820182811067ffffffffffffffff8211176121205760405260006060838181528260208201528260408201520152565b600060655481905b80821061433a57505090565b9091614345836121e0565b9054906040918251917fc1590cd70000000000000000000000000000000000000000000000000000000083528260048173ffffffffffffffffffffffffffffffffffffffff602095869560031b1c165afa928315612d4a57506000926143c1575b50506143b5906143bb92612e71565b92612df1565b9061432e565b81819392933d83116143eb575b6143d88183612187565b8101031261025e575051816143b56143a6565b503d6143ce565b6024906143fd614326565b602073ffffffffffffffffffffffffffffffffffffffff60345416604051948580927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9283156135d257600093614468575b50916144659192612e71565b90565b6020813d8211614493575b8161448060209383612187565b8101031261123a57519250614465614459565b3d9150614473565b6144a36143f2565b90811561457f576000916065549280935b8085106144c75750614465929350613e23565b906144d1856121e0565b9054906040918251917f116ac4a30000000000000000000000000000000000000000000000000000000083528260048173ffffffffffffffffffffffffffffffffffffffff602095869560031b1c165afa928315612d4a575060009261454e575b50506145419061454792612e71565b94612df1565b93906144b4565b81819392933d8311614578575b6145658183612187565b8101031261025e57505181614541614532565b503d61455b565b60009150565b600090600091606554614597816121c8565b926040916145a783519586612187565b8085527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06145d4826121c8565b016020903682880137859683518303614818576145ef6143f2565b96871561480a57509291908380935b8385106146495750505050506127100361462057509061461d91613e23565b91565b600490517f6edcc523000000000000000000000000000000000000000000000000000000008152fd5b909192939661271061468761467467ffffffffffffffff988961466c8d88612e1e565b511690612e71565b9761467f8b86612e1e565b51168b612e32565b04614691896121e0565b9190548951927fc1590cd70000000000000000000000000000000000000000000000000000000084526004938881868173ffffffffffffffffffffffffffffffffffffffff8097600397881b1c165afa90811561480057918f8a94928f948b916147b5575b5084602494939261471561470d61471b948b6132e6565b978892612e1e565b526121e0565b9054911b1c16948c5195869384927fa7d385e20000000000000000000000000000000000000000000000000000000084528301525afa9182156147ab57859261477a575b509161358e613af69261477194612e32565b939291906145fe565b9091508581813d83116147a4575b6147928183612187565b8101031261159e57519061358e61475f565b503d614788565b89513d87823e3d90fd5b9395929450505081813d83116147f9575b6147d08183612187565b81010312610f0b5788928f9261471b8f809561471561470d6024975194505050929394506146f6565b503d6147c6565b8c513d8a823e3d90fd5b989750955050505050509190565b600485517fcdeedcbd000000000000000000000000000000000000000000000000000000008152fd5b61484961321e565b9081519160005b8381106148815760046040517f30990b67000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff806148a18385612e1e565b5116908085169182146148be5750506148b990612df1565b614850565b909460009450816148d184869596612e1e565b511692604094855180957f853828b600000000000000000000000000000000000000000000000000000000825260209687918160049b8c925af18015614ad957614abc575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92838101908111614a8e5784818303614a6d575b5050505060659081548015614a3f5784939291019061498f61496d836121e0565b73ffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055565b55603454169360248451809681937f70a0823100000000000000000000000000000000000000000000000000000000835230908301525afa918215612d4a5750600091614a13575b509050614a06575b7f95c84dbc5fd872c46b0e4290775a1a4ea1c8d760f9e4d38f48ba71b6f9a667db600080a2565b614a0e613e5c565b6149df565b82813d8311614a38575b614a278183612187565b8101031261025e57505180386149d7565b503d614a1d565b6031877f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b614a7d6116b292614a8595612e1e565b5116916121e0565b3880808461494c565b6011887f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b614ad290863d8811613937576139288183612187565b5038614916565b87513d6000823e3d90fd5b614aec61321e565b9081519160005b838110614b245760046040517f30990b67000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff80614b448385612e1e565b511690808516918214614b61575050614b5c90612df1565b614af3565b90946000945081614b7484869596612e1e565b511692604094855180957f853828b600000000000000000000000000000000000000000000000000000000825260209687918160049b8c925af1908115614ad957600091614c40575b5015614c18577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92838101908111614a8e5784818303614a6d575050505060659081548015614a3f5784939291019061498f61496d836121e0565b8686517fa1248235000000000000000000000000000000000000000000000000000000008152fd5b614c579150863d8811613937576139288183612187565b38614bbd565b908151811015612217570160200190565b604051906060820182811067ffffffffffffffff82111761212057604052602a82526020820160403682378251156122175760309053815160019081101561221757607860218401536029905b808211614d29575050614ccb5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015614dc6577f3031323334353637383961626364656600000000000000000000000000000000901a614d658486614c5d565b5360041c918015614d98577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190614cbb565b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff90921660248301526044820192909252612d4891610aff8260648101610ad3565b604051614edd9173ffffffffffffffffffffffffffffffffffffffff16614e798261214f565b6000806020958685527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656487860152868151910182855af13d15614f86573d91614ec183612246565b92614ecf6040519485612187565b83523d60008785013e614f8a565b80519081614eea57505050565b8280614efa9383010191016132a1565b15614f025750565b608490604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b6060915b919290156150055750815115614f9e575090565b3b15614fa75790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156150185750805190602001fd5b612480906040519182917f08c379a00000000000000000000000000000000000000000000000000000000083526020600484015260248301906122a356fea26469706673582212205d4371146c49584a2effa728df6c1c9f6fc2afa78935429a6b14719f26cf70c164736f6c63430008110033", + "nonce": "0x1ab", + "accessList": [] + }, + "additionalContracts": [] + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xa1262d668c197705b2cda322153731ca350c1710945d0f8751c99da6329844e4" + ], + "path": "/Users/gnervo/Documents/Angle/strategies-dev/broadcast/MigrationOptimizerAPRUSDC.s.sol/137/run-latest.json", + "returns": {}, + "timestamp": 1675932828, + "chain": 137, + "multi": false, + "commit": "5360538" +} \ No newline at end of file diff --git a/broadcast/MigrationOptimizerAPRUSDC.s.sol/137/run-1675932835.json b/broadcast/MigrationOptimizerAPRUSDC.s.sol/137/run-1675932835.json new file mode 100644 index 0000000..8464d17 --- /dev/null +++ b/broadcast/MigrationOptimizerAPRUSDC.s.sol/137/run-1675932835.json @@ -0,0 +1,66 @@ +{ + "transactions": [ + { + "hash": "0xa1262d668c197705b2cda322153731ca350c1710945d0f8751c99da6329844e4", + "transactionType": "CREATE", + "contractName": "OptimizerAPRStrategy", + "contractAddress": "0x151B4aa3A1F553F8c4aC1463fEE41FdFa319ed35", + "function": null, + "arguments": null, + "rpc": "https://polygon-mainnet.g.alchemy.com/v2/IJTj5SikhXCIV_a021XV2xpbLL8ibwUP", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x5965d1", + "value": "0x0", + "data": "0x60808060405234620000d3576000549060ff8260081c169081600014620000c857303b155b156200006f57501590816200005c575b506200004b575b60405161508c9081620000d98239f35b61ff0019600054166000556200003b565b61ffff1916610101176000553862000034565b62461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b60ff83161562000024565b600080fdfe6101006040908082526004918236101561001857600080fd5b600092833560e01c9283630b6d1d1714612087575082630c016dc01461202e5782630e6e15f014611ff35782630f969b8714611f855782631d12f28b14611f485782631f1fcd5114611ef557826322f3e2d414611eb1578263248a9ca314611e6857826324ea54f414611e0f5782632e1a7d4d14611d9c5782632f2ff15d14611ca5578263364bc15a14611c4c57826336568abe14611b8e5782634641257d14611b575782634786b0cb14611b165782635641ec0314611ad45782635a5cd45e14611a99578263708ba9bd1461199a57826376ee75d8146119515782637985fd51146119145782638baf2957146118cb57826391d1485414611859578263929eea21146117d557826393084b34146115db578263a217fddf146115a2578263a526d83b1461148b578263af648c3d146112eb578263b8dc491b14611120578263bb927c46146110e3578263ce5c7f611461104c578263d547741f14610ff2578263dc4c90d314610f9c578263ddc6326214610f50578263e6a69ab814610f13578263e6bfbfd8146106a3578263ec342ad014610662578263efbb5cb014610620578263fcc5f59a1461026157505063fcf2d0ad146101d557600080fd5b3461025e57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e5761020c336125d8565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0060335416176033557f17fa25a1c2ac074f71f0cf4f6af525c06fab7d83eff5ffcf6df5277f2919ae248180a180f35b80fd5b83903461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760655461029d816121c8565b916102aa85519384612187565b8183527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06102d7836121c8565b01845b818110610605575050835b8281106103a557505050825191602080840190808552835180925285850181878460051b880101950193965b83881061031e5786860387f35b90919293948380827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a60019503018652885190610364825160808084528301906122a3565b918381015184830152868101518783015273ffffffffffffffffffffffffffffffffffffffff60608092015116910152970193019701969093929193610311565b6103ad6142f0565b6103b6826121e0565b905488517f8b2021760000000000000000000000000000000000000000000000000000000081528881878173ffffffffffffffffffffffffffffffffffffffff8096600398891b1c165afa9081156105fb578991610576575b5083528061041c856121e0565b905490841b1c16606084015280610432856121e0565b905490841b1c1691895180937fc1590cd7000000000000000000000000000000000000000000000000000000008252818860209687935afa90811561056c579187939185938c91610534575b508387015261048c876121e0565b9054911b1c168a51928380927f57ded9c90000000000000000000000000000000000000000000000000000000082525afa91821561052a5788926104f6575b5050878201526104f191906104e08287612e1e565b526104eb8186612e1e565b50612df1565b6102e5565b90809250813d8311610523575b61050d8183612187565b8101031261051f57516104f1896104cb565b8680fd5b503d610503565b89513d8a823e3d90fd5b929450509181813d8311610565575b61054d8183612187565b81010312610561579183918793518d61047e565b8980fd5b503d610543565b8b513d8c823e3d90fd5b90503d808a833e6105878183612187565b81019060209081818403126105f75780519067ffffffffffffffff82116105f357019082601f830112156105f757908b92918151926105d16105c885612246565b95519586612187565b8385528184840101116105f3576105ed92918482019101612280565b8a61040f565b8b80fd5b8a80fd5b8a513d8b823e3d90fd5b6020906106106142f0565b828288010152016102da565b5080fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b6143f2565b9051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209051670de0b6b3a76400008152f35b915034610f0f5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576106dc6120e9565b6106e46120c1565b916044359173ffffffffffffffffffffffffffffffffffffffff9182841691828503610f0b576064359267ffffffffffffffff8411610bcc5736602385011215610bcc578388013596610736886121c8565b9061074385519283612187565b8882526020958683016024809b60051b83010191368311610dea578b01905b828210610eef575050508a549760ff93848a60081c1680600014610ee657303b155b15610e655789898f928f90159d8e610e37575b506033547fffffffffffffffffffffff0000000000000000000000000000000000000000ff74ffffffffffffffffffffffffffffffffffffffff008c60081b1691161790816033558b51809481937ffc0c546a00000000000000000000000000000000000000000000000000000000835260081c165afa908115610e2d578b8f928c928591610e00575b5016807fffffffffffffffffffffffff000000000000000000000000000000000000000060345416176034558a51928380927f313ce5670000000000000000000000000000000000000000000000000000000082525afa918215610df557908792610db7575b5016604d8111610d8c57600a0a6035558015908115610d81575b8115610d75575b50610d4d578b949392916108be6108c392612a4e565b612a4e565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5629182855260019384885288878720911690818752885281878720541615610ce7575b50908291859387965284885284868520015492807fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9481868880a480868887200155857f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419786898098528383838320015489898480a42001558151908d5b828110610be157505050507ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab808c5283875283868d200154918c80a4828920015568056bc75e2d63100000603655603354927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00841660335580603454169360081c168151917fdd62ed3e000000000000000000000000000000000000000000000000000000008352308884015281878401528383604481885afa928315610bd7578993610ba4575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301809311610b7957517f095ea7b3000000000000000000000000000000000000000000000000000000009381019390935273ffffffffffffffffffffffffffffffffffffffff168583019081526020810191909152610b049290610aff9083906040015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101845283612187565b614e53565b610b4e575b603554916103e89280840293840403610b2457505060665580f35b601184917f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff8354168355610b09565b868960118a7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b9092508381813d8311610bd0575b610bbc8183612187565b81010312610bcc57519138610a4c565b8880fd5b503d610bb2565b81513d8b823e3d90fd5b90919293945089610bf28286612e1e565b511615610cbf57808e8b610c09610c4e9488612e1e565b51167ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab808352898d528b83208284528d52858c8420541615610c59575b505050612df1565b908694939291610984565b808352898d528b83208284528d528b83208a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d339380a48e3880610c46565b8c88517fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b8386528488528686208187528852868620857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790553390847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8880a438610906565b8a86517fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b905088831614386108a8565b838a161591506108a1565b8b8e60118f7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8092508a8092503d8311610dee575b610dd08183612187565b81010312610dea57518581168103610dea57859038610887565b8d80fd5b503d610dc6565b8951903d90823e3d90fd5b610e209150833d8511610e26575b610e188183612187565b810190612e45565b38610821565b503d610e0e565b89513d84823e3d90fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661010117845538610797565b60848d602e8e8c8c51937f08c379a00000000000000000000000000000000000000000000000000000000085528401528201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152fd5b858b1615610784565b81358a81168103610f07578152908801908801610762565b8e80fd5b8780fd5b8280fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090516301e185588152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f8933612769565b610f91612c08565b610f99613e5c565b80f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209073ffffffffffffffffffffffffffffffffffffffff60335460081c169051908152f35b915034610f0f57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57610f99913561104760016110346120c1565b93838752816020528620015433906128fa565b612b2a565b915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f578282359267ffffffffffffffff841161061c573660238501121561061c57830135926110b46110ab85612246565b93519384612187565b838352366024858301011161061c5783610f999460246020930183860137830101526110de612c08565b6132ff565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906065549051908152f35b915034610f0f57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576111586120e9565b6111606120c1565b9061116a336122e6565b73ffffffffffffffffffffffffffffffffffffffff908180603454169116918183146112c35784519061119c8261214f565b60018252602092838301843682378351156112975752815191885b83811061124e57505050508351947f70a0823100000000000000000000000000000000000000000000000000000000865230908601528085602481855afa9384156112455750859361120f575b50610f999350614df4565b90925083813d831161123e575b6112268183612187565b8101031261123a57610f9992519138611204565b8380fd5b503d61121c565b513d87823e3d90fd5b826112598284612e1e565b5116861461126f5761126a90612df1565b6111b7565b8888517fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b60248a60328b7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8585517fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576113256120e9565b9161132f336125d8565b837f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504180825260016020528282209373ffffffffffffffffffffffffffffffffffffffff8096169485845260205260ff8484205416611425575b60655495835b878110611399578480f35b816113a3826121e0565b90549060031b1c16803b156114215785809160448951809481937fd547741f0000000000000000000000000000000000000000000000000000000083528a8a8401528d60248401525af18015611417579061140392916114085750612df1565b61138e565b6114119061210c565b386104eb565b87513d88823e3d90fd5b8580fd5b81835260016020528383208584526020528383207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690553385837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b8680a4611388565b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57906114c66120e9565b906114d0336125d8565b6114d982612a4e565b8360655493819373ffffffffffffffffffffffffffffffffffffffff809116945b868110611505578380f35b8161150f826121e0565b90549060031b1c16803b1561159e5784809160448851809481937f2f2ff15d0000000000000000000000000000000000000000000000000000000083527f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50418a8401528c60248401525af18015611594579061158f92916114085750612df1565b6114fa565b86513d87823e3d90fd5b8480fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5751908152602090f35b83823461061c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57823573ffffffffffffffffffffffffffffffffffffffff918282169283830361159e57611638336122e6565b81517fa8c62e760000000000000000000000000000000000000000000000000000000081526020818881885afa9081156117cb5786916117ad575b5081309116036117855760655491855b838110611737575050506801000000000000000081101561170b57906116b28260016116e494016065556121e0565b90919082549060031b9173ffffffffffffffffffffffffffffffffffffffff9283811b93849216901b16911916179055565b7f1e7b117a6591133f0b36fc2c24d59f8465d806fdcad63aa33246b45fd62c89ff8280a280f35b6024846041877f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b82611741826121e0565b90549060031b1c16861461175d5761175890612df1565b611683565b8782517f7cc7731c000000000000000000000000000000000000000000000000000000008152fd5b8582517feeacc72d000000000000000000000000000000000000000000000000000000008152fd5b6117c5915060203d8111610e2657610e188183612187565b87611673565b83513d88823e3d90fd5b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f5735606554811015610f0f5773ffffffffffffffffffffffffffffffffffffffff906065602094527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70154169051908152f35b90915034610f0f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f578160209360ff926118996120c1565b903582526001865273ffffffffffffffffffffffffffffffffffffffff83832091168252855220541690519015158152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f996119066120e9565b61190f33612769565b614ae4565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906066549051908152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f9961198c6120e9565b611995336122e6565b614841565b833461025e57602091827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57803567ffffffffffffffff9182821161123a573660238301121561123a578101356119f6816121c8565b92611a0387519485612187565b81845260248685019260051b8401019236841161142157959695602401915b838310611a7b5750505050611a3690614585565b9190835194848695860192865281860152835180925280606086019401925b828110611a6457505050500390f35b835185528695509381019392810192600101611a55565b8297969735828116810361051f578152959695918701918701611a22565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b61449b565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209060ff6033541690519015158152f35b83903461061c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57611b50336122e6565b3560665580f35b833461025e57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f91612c08565b83903461061c57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57611bc66120c1565b903373ffffffffffffffffffffffffffffffffffffffff831603611bef5790610f999135612b2a565b60649060208551917f08c379a0000000000000000000000000000000000000000000000000000000008352820152600260248201527f37310000000000000000000000000000000000000000000000000000000000006044820152fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab8152f35b90915034610f0f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f573590611ce06120c1565b908284526001602052611cfa6001828620015433906128fa565b828452600160205273ffffffffffffffffffffffffffffffffffffffff81852092169182855260205260ff818520541615611d33578380f35b8284526001602052808420828552602052832060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905533917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8480a43880808380f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e5750611de090611dda336125d8565b3561422c565b611e03823373ffffffffffffffffffffffffffffffffffffffff60345416614df4565b82519182526020820152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50418152f35b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57816020936001923581528285522001549051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090611eec6143f2565b15159051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209073ffffffffffffffffffffffffffffffffffffffff603454169051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906036549051908152f35b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f577fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a8600916020913590611fe7336122e6565b8160365551908152a180f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b614326565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5628152f35b84903461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906035548152f35b6024359073ffffffffffffffffffffffffffffffffffffffff821682036120e457565b600080fd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036120e457565b67ffffffffffffffff811161212057604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761212057604052565b6080810190811067ffffffffffffffff82111761212057604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761212057604052565b67ffffffffffffffff81116121205760051b60200190565b6065548110156122175760656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b67ffffffffffffffff811161212057601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381106122935750506000910152565b8181015183820152602001612283565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936122df81518092818752878088019101612280565b0116010190565b73ffffffffffffffffffffffffffffffffffffffff1660008181527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db6020908152604080832054909391927f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419290916001919060ff161561236957505050505050565b61237290614c6e565b9285519161237f8361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116124e05750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b8401917f206973206d697373696e6720726f6c6520000000000000000000000000000000603784015251809386840190612280565b01036028810187520185612187565b519283927f08c379a0000000000000000000000000000000000000000000000000000000008452600484015260248301906122a3565b0390fd5b6064848651907f08c379a000000000000000000000000000000000000000000000000000000000825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a61251d8587614c5d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191906123ac565b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526032600452fd5b73ffffffffffffffffffffffffffffffffffffffff1660008181527f015260285f12fe1d77221203cd7e5aa67b79d47399b4bedd98b8730e56d911bf6020908152604080832054909391927f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5629290916001919060ff161561265b57505050505050565b61266490614c6e565b928551916126718361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116126f85750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a6127358587614c5d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01919061269e565b73ffffffffffffffffffffffffffffffffffffffff1660008181527f10c15aae13326e9b33c92ffbb94efb7492c500f0cca324caca9bd1aca194ed186020908152604080832054909391927ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab9290916001919060ff16156127ec57505050505050565b6127f590614c6e565b928551916128028361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116128895750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a6128c68587614c5d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01919061282f565b60009080825260019160209280845260409473ffffffffffffffffffffffffffffffffffffffff868420911690818452855260ff86842054161561294057505050505050565b61294990614c6e565b928551916129568361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116129dd5750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a612a1a8587614c5d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019190612983565b73ffffffffffffffffffffffffffffffffffffffff1660008181527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db60205260408120549091907f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419060ff1615612ac457505050565b8083526001602052604083208284526020526040832060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d339380a4565b90600091808352600160205273ffffffffffffffffffffffffffffffffffffffff6040842092169182845260205260ff604084205416612b6957505050565b808352600160205260408320828452602052604083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b339380a4565b91908203918211612bd957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080603354916040918251937fbf3759b500000000000000000000000000000000000000000000000000000000855273ffffffffffffffffffffffffffffffffffffffff90602086600481858560081c165afa958615612de7578496612db3575b5060ff1615612d7757612c83612c7e6143f2565b61422c565b508580821015612d5457612c98929350612bcc565b905b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d5096080612cc78488612bcc565b965b86519086825285602083015288888301526060820152a160335460081c16803b156120e45760009283606492865197889586947fa1d9bafc0000000000000000000000000000000000000000000000000000000086526004860152602485015260448401525af1908115612d4a5750612d3f5750565b612d489061210c565b565b513d6000823e3d90fd5b90818111612d64575b5050612c9a565b612d6f929450612bcc565b918438612d5d565b84925060809150612da87f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d50995612e7e565b969193909394612cc9565b9095506020813d8211612ddf575b81612dce60209383612187565b8101031261123a57519460ff612c6a565b3d9150612dc1565b85513d86823e3d90fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612bd95760010190565b80518210156122175760209160051b010190565b81810292918115918404141715612bd957565b908160209103126120e4575173ffffffffffffffffffffffffffffffffffffffff811681036120e45790565b91908201809211612bd957565b9060008091828492612e8e614326565b9573ffffffffffffffffffffffffffffffffffffffff908160345416906040938451998a927f70a08231000000000000000000000000000000000000000000000000000000009485855230600486015284602460209687935afa9b8c156131c257889c6131ef575b50612f01828d612e71565b91156131cc5750602460608660335460081c168851928380927f39ebf8230000000000000000000000000000000000000000000000000000000082523060048301525afa9081156131c2579084918991613133575b500151918282111561305f575090612f6d91612bcc565b98612f78888b612e71565b9384151580613056575b612f90575b50505050505050565b612fa3612f9e849387612bcc565b613efb565b506034541692602486518095819382523060048301525afa93841561304d5750849361301d575b50508110612fdd575b8080808080612f87565b91928286929611600014612ff757505092905b3880612fd3565b9094918561300491612bcc565b91508082101561301657505b90612ff0565b9050613010565b9080929350813d8311613046575b6130358183612187565b81010312610f0f5751903880612fca565b503d61302b565b513d86823e3d90fd5b50848210612f82565b9a995061306b91612bcc565b97613076888a612e71565b938415158061312a575b61308d5750505050505050565b61309b612f9e849387612bcc565b506034541692602486518095819382523060048301525afa93841561304d575084936130fa575b505081106130d4578080808080612f87565b919282859295116000146130ed57505091903880612fd3565b9093918461300491612bcc565b9080929350813d8311613123575b6131128183612187565b81010312610f0f57519038806130c2565b503d613108565b50848210613080565b9150506060813d82116131ba575b8161314e60609383612187565b81010312610f0b578651906060820182811067ffffffffffffffff82111761318d57885280518252808501518286015287015187820152839038612f56565b60248a7f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b3d9150613141565b87513d8a823e3d90fd5b955050505050508592939450949094116131e7575b50829190565b9150386131e1565b909b508381813d8311613217575b6132078183612187565b81010312610f0b57519a38612ef6565b503d6131fd565b60405190606554808352826020918282019060656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c7936000905b82821061327157505050612d4892500383612187565b855473ffffffffffffffffffffffffffffffffffffffff168452600195860195889550938101939091019061325b565b908160209103126120e4575180151581036120e45790565b7f80000000000000000000000000000000000000000000000000000000000000008114612bd95760000390565b81810392916000138015828513169184121617612bd957565b60ff6033541661387a5761331161321e565b8060a05251806080521561387a5780518101906020818184019303126120e457602081015167ffffffffffffffff918282116120e457019180603f840112156120e457602083015191613363836121c8565b936133716040519586612187565b8385526040602086019460051b8201019283116120e457604001925b828410613e0a5750505050600090606060c0528051613df7575b50600090600060e052600090816024602073ffffffffffffffffffffffffffffffffffffffff60345416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa908115613dea5760e05191613db2575b5060e051908182908260a05151917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061346461344e856121c8565b9461345c6040519687612187565b8086526121c8565b0136602085013760a05151937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60e05190603554915b878110613b22575050508561393e575b5050505050505010600014613775575050600090815b6080518110156135de5760006134d88260c051612e1e565b51126134ed575b6134e890612df1565b6134c0565b9160006135056134ff8560c051612e1e565b516132b9565b602073ffffffffffffffffffffffffffffffffffffffff6135288760a051612e1e565b5116602461353b6134ff8960c051612e1e565b60405195869384927f2e1a7d4d00000000000000000000000000000000000000000000000000000000845260048401525af19182156135d25760009261359c575b509161358e613594926134e894612bcc565b90612e71565b9290506134df565b90916020823d6020116135ca575b816135b760209383612187565b8101031261025e5750519061358e61357c565b3d91506135aa565b6040513d6000823e3d90fd5b5090606654811161374b576000905b60805182101561374757806136048360c051612e1e565b511315613705576136219061361b8360c051612e1e565b516132e6565b61362d8260c051612e1e565b5260009061368373ffffffffffffffffffffffffffffffffffffffff6034541673ffffffffffffffffffffffffffffffffffffffff61366e8460a051612e1e565b511661367c8460c051612e1e565b5191614df4565b73ffffffffffffffffffffffffffffffffffffffff6136a48260a051612e1e565b5116803b15610f0f578280916004604051809481937fd0e30db00000000000000000000000000000000000000000000000000000000083525af180156136fa57906136f492916114085750612df1565b906135ed565b6040513d85823e3d90fd5b9060006137148260c051612e1e565b5113613724575b6136f490612df1565b9061373f6136f4916137388460c051612e1e565b5190612bcc565b91905061371b565b5050565b60046040517f5c3810af000000000000000000000000000000000000000000000000000000008152fd5b6138af575b5073ffffffffffffffffffffffffffffffffffffffff603454166040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152602081602481855afa9081156135d25760009161387d575b50806137e2575050565b6138119173ffffffffffffffffffffffffffffffffffffffff61380960e05160a051612e1e565b511690614df4565b73ffffffffffffffffffffffffffffffffffffffff61383460e05160a051612e1e565b5116803b156120e457600080916004604051809481937fd0e30db00000000000000000000000000000000000000000000000000000000083525af180156135d257612d3f575b50565b906020823d6020116138a7575b8161389760209383612187565b8101031261025e575051386137d8565b3d915061388a565b602073ffffffffffffffffffffffffffffffffffffffff6138d460009360a051612e1e565b51166004604051809481937f853828b60000000000000000000000000000000000000000000000000000000083525af180156135d2571561377a576139309060203d602011613937575b6139288183612187565b8101906132a1565b503861377a565b503d61391e565b94965088958695869590915b81871061399e575050505050505080851180613991575b1561398057505061397490600193613e23565b388080808080806134aa565b61398c92919450613e23565b613974565b50600160a0515111613961565b9091929394959660e0518814600014613ad7576139c89061358e836139c38988612e71565b612e32565b9684151580613acd575b6139eb575b6139e090612df1565b95949392919061394a565b9a6139ff856139fa8887612e71565b612e71565b73ffffffffffffffffffffffffffffffffffffffff613a2260e05160a051612e1e565b5116906020613a318989612e71565b6024604051809581937fa7d385e200000000000000000000000000000000000000000000000000000000835260048301525afa918215613ac2578b92613a8c575b509161358e613a84926139e094612e32565b9b90506139d7565b9091506020813d602011613aba575b81613aa860209383612187565b810103126105f757519061358e613a72565b3d9150613a9b565b6040513d8d823e3d90fd5b50600183116139d2565b878d03613afc57613af66139e091613aef8a8a612e1e565b5190612e71565b97612df1565b613b1c889c613aef613b156139e094613aef8d8d612e1e565b9a8a612e1e565b9b612df1565b602498602073ffffffffffffffffffffffffffffffffffffffff613b488460a051612e1e565b51166040519b8c80927fa7d385e20000000000000000000000000000000000000000000000000000000082528b60048301525afa998a15613da5578e9a613d70575b50600490602073ffffffffffffffffffffffffffffffffffffffff613bb18560a051612e1e565b5116604051938480927fc1590cd70000000000000000000000000000000000000000000000000000000082525afa918215613cf0578f92613d3a575b5081613bf891612e71565b998b8111613d2a575b50600a848102048403613cfd5783600a028111613c28575b50613c2390612df1565b61349a565b6004602073ffffffffffffffffffffffffffffffffffffffff613c4d8560a051612e1e565b5116604051928380927f57ded9c90000000000000000000000000000000000000000000000000000000082525afa908115613cf0578f91613cbe575b50613c948282612e32565b613c9e848b612e1e565b52838110613cad575b50613c19565b925094509c50613c238d9038613ca7565b90506020813d602011613ce8575b81613cd960209383612187565b81010312610f07575138613c89565b3d9150613ccc565b8f604051903d90823e3d90fd5b60248e7f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b60e08390529a5093508338613c01565b9091506020813d602011613d68575b81613d5660209383612187565b81010312610f07575190613bf8613bed565b3d9150613d49565b9099506020813d602011613d9d575b81613d8c60209383612187565b81010312610dea5751986004613b8a565b3d9150613d7f565b8e604051903d90823e3d90fd5b90506020813d602011613de2575b81613dcd60209383612187565b81010312613ddc575138613413565b60e05180fd5b3d9150613dc0565b6040513d60e051823e3d90fd5b613e019150614585565b60c052386133a7565b835182811681036120e45781526020938401930161338d565b8115613e2d570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6040516020908181019067ffffffffffffffff928183108484111761212057929082604052600081526040519360408501918180870152518092526060850193926000905b838210613ee2575050505050906110de81612d4893037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612187565b8451811686529482019493820193600190910190613ea1565b600080613f0661321e565b928351928315614224576066549485831061421b5781959395935b613f2b8185612bcc565b871015614212577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff968397845b8881106140cb57505073ffffffffffffffffffffffffffffffffffffffff9788613f828286612e1e565b51166040998a51928380937f5be9b2d3000000000000000000000000000000000000000000000000000000008252602094859160049788915afa9081156140c15789916140a4575b50156140955760248392613fdf8e938a612e1e565b51169489613fed888d612bcc565b935196879485937f2e1a7d4d0000000000000000000000000000000000000000000000000000000085528401525af1998a1561124557508599614061575b505061403a8861404092612e71565b95612df1565b961561405757600687101561405757959395613f21565b5050505091505090565b9080929950813d831161408e575b6140798183612187565b8101031261123a57519661403a61404061402b565b503d61406f565b50505050965050505050505090565b6140bb9150843d8611613937576139288183612187565b38613fca565b8d513d8b823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff806140eb8388612e1e565b5116906040918251918280927f5be9b2d3000000000000000000000000000000000000000000000000000000008252602093849160049687915afa908115614208578b916141eb575b5061414c575b5050505061414790612df1565b613f58565b8190614158868b612e1e565b51168451938480927f57ded9c90000000000000000000000000000000000000000000000000000000082525afa9283156141e2575088926141b4575b50508281106141a6575b80808061413a565b91509850614147899061419e565b90809250813d83116141db575b6141cb8183612187565b8101031261051f57513880614194565b503d6141c1565b513d8a823e3d90fd5b6142029150833d8511613937576139288183612187565b38614134565b85513d8d823e3d90fd5b50505050505090565b50935050505090565b935050505090565b6024602073ffffffffffffffffffffffffffffffffffffffff60345416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9081156135d2576000916142bf575b50818110614299575090600090565b806139fa612f9e6142aa9385612bcc565b8181106142b8575090600090565b9160009150565b906020823d82116142e8575b816142d860209383612187565b8101031261025e5750513861428a565b3d91506142cb565b604051906080820182811067ffffffffffffffff8211176121205760405260006060838181528260208201528260408201520152565b600060655481905b80821061433a57505090565b9091614345836121e0565b9054906040918251917fc1590cd70000000000000000000000000000000000000000000000000000000083528260048173ffffffffffffffffffffffffffffffffffffffff602095869560031b1c165afa928315612d4a57506000926143c1575b50506143b5906143bb92612e71565b92612df1565b9061432e565b81819392933d83116143eb575b6143d88183612187565b8101031261025e575051816143b56143a6565b503d6143ce565b6024906143fd614326565b602073ffffffffffffffffffffffffffffffffffffffff60345416604051948580927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9283156135d257600093614468575b50916144659192612e71565b90565b6020813d8211614493575b8161448060209383612187565b8101031261123a57519250614465614459565b3d9150614473565b6144a36143f2565b90811561457f576000916065549280935b8085106144c75750614465929350613e23565b906144d1856121e0565b9054906040918251917f116ac4a30000000000000000000000000000000000000000000000000000000083528260048173ffffffffffffffffffffffffffffffffffffffff602095869560031b1c165afa928315612d4a575060009261454e575b50506145419061454792612e71565b94612df1565b93906144b4565b81819392933d8311614578575b6145658183612187565b8101031261025e57505181614541614532565b503d61455b565b60009150565b600090600091606554614597816121c8565b926040916145a783519586612187565b8085527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06145d4826121c8565b016020903682880137859683518303614818576145ef6143f2565b96871561480a57509291908380935b8385106146495750505050506127100361462057509061461d91613e23565b91565b600490517f6edcc523000000000000000000000000000000000000000000000000000000008152fd5b909192939661271061468761467467ffffffffffffffff988961466c8d88612e1e565b511690612e71565b9761467f8b86612e1e565b51168b612e32565b04614691896121e0565b9190548951927fc1590cd70000000000000000000000000000000000000000000000000000000084526004938881868173ffffffffffffffffffffffffffffffffffffffff8097600397881b1c165afa90811561480057918f8a94928f948b916147b5575b5084602494939261471561470d61471b948b6132e6565b978892612e1e565b526121e0565b9054911b1c16948c5195869384927fa7d385e20000000000000000000000000000000000000000000000000000000084528301525afa9182156147ab57859261477a575b509161358e613af69261477194612e32565b939291906145fe565b9091508581813d83116147a4575b6147928183612187565b8101031261159e57519061358e61475f565b503d614788565b89513d87823e3d90fd5b9395929450505081813d83116147f9575b6147d08183612187565b81010312610f0b5788928f9261471b8f809561471561470d6024975194505050929394506146f6565b503d6147c6565b8c513d8a823e3d90fd5b989750955050505050509190565b600485517fcdeedcbd000000000000000000000000000000000000000000000000000000008152fd5b61484961321e565b9081519160005b8381106148815760046040517f30990b67000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff806148a18385612e1e565b5116908085169182146148be5750506148b990612df1565b614850565b909460009450816148d184869596612e1e565b511692604094855180957f853828b600000000000000000000000000000000000000000000000000000000825260209687918160049b8c925af18015614ad957614abc575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92838101908111614a8e5784818303614a6d575b5050505060659081548015614a3f5784939291019061498f61496d836121e0565b73ffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055565b55603454169360248451809681937f70a0823100000000000000000000000000000000000000000000000000000000835230908301525afa918215612d4a5750600091614a13575b509050614a06575b7f95c84dbc5fd872c46b0e4290775a1a4ea1c8d760f9e4d38f48ba71b6f9a667db600080a2565b614a0e613e5c565b6149df565b82813d8311614a38575b614a278183612187565b8101031261025e57505180386149d7565b503d614a1d565b6031877f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b614a7d6116b292614a8595612e1e565b5116916121e0565b3880808461494c565b6011887f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b614ad290863d8811613937576139288183612187565b5038614916565b87513d6000823e3d90fd5b614aec61321e565b9081519160005b838110614b245760046040517f30990b67000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff80614b448385612e1e565b511690808516918214614b61575050614b5c90612df1565b614af3565b90946000945081614b7484869596612e1e565b511692604094855180957f853828b600000000000000000000000000000000000000000000000000000000825260209687918160049b8c925af1908115614ad957600091614c40575b5015614c18577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92838101908111614a8e5784818303614a6d575050505060659081548015614a3f5784939291019061498f61496d836121e0565b8686517fa1248235000000000000000000000000000000000000000000000000000000008152fd5b614c579150863d8811613937576139288183612187565b38614bbd565b908151811015612217570160200190565b604051906060820182811067ffffffffffffffff82111761212057604052602a82526020820160403682378251156122175760309053815160019081101561221757607860218401536029905b808211614d29575050614ccb5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015614dc6577f3031323334353637383961626364656600000000000000000000000000000000901a614d658486614c5d565b5360041c918015614d98577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190614cbb565b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff90921660248301526044820192909252612d4891610aff8260648101610ad3565b604051614edd9173ffffffffffffffffffffffffffffffffffffffff16614e798261214f565b6000806020958685527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656487860152868151910182855af13d15614f86573d91614ec183612246565b92614ecf6040519485612187565b83523d60008785013e614f8a565b80519081614eea57505050565b8280614efa9383010191016132a1565b15614f025750565b608490604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b6060915b919290156150055750815115614f9e575090565b3b15614fa75790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156150185750805190602001fd5b612480906040519182917f08c379a00000000000000000000000000000000000000000000000000000000083526020600484015260248301906122a356fea26469706673582212205d4371146c49584a2effa728df6c1c9f6fc2afa78935429a6b14719f26cf70c164736f6c63430008110033", + "nonce": "0x1ab", + "accessList": [] + }, + "additionalContracts": [] + } + ], + "receipts": [ + { + "transactionHash": "0xa1262d668c197705b2cda322153731ca350c1710945d0f8751c99da6329844e4", + "transactionIndex": "0x16", + "blockHash": "0xe1821b7f82c4f4b9c7da3788de3af83b046f9542f7cafaf8daaa5ed95f230328", + "blockNumber": "0x25478d1", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0x9cd6ac", + "gasUsed": "0x44c47a", + "contractAddress": "0x151B4aa3A1F553F8c4aC1463fEE41FdFa319ed35", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185", + "0x0000000000000000000000001efecb61a2f80aa34d3b9218b564a64d05946290" + ], + "data": "0x00000000000000000000000000000000000000000000000001f24fe30527693a000000000000000000000000000000000000000000000002096751845a53feef0000000000000000000000000000000000000000000007d9940f990fe5c3a491000000000000000000000000000000000000000000000002077501a1552c95b50000000000000000000000000000000000000000000007d99601e8f2eaeb0dcb", + "blockHash": "0xe1821b7f82c4f4b9c7da3788de3af83b046f9542f7cafaf8daaa5ed95f230328", + "blockNumber": "0x25478d1", + "transactionHash": "0xa1262d668c197705b2cda322153731ca350c1710945d0f8751c99da6329844e4", + "transactionIndex": "0x16", + "logIndex": "0x87", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000200000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000002000000000000000000000000200000000000000000000000000000000000000000000000000000000000005000000100000000000001000000000000000800000000000000100000000000002000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x3d654071c6" + } + ], + "libraries": [], + "pending": [], + "path": "/Users/gnervo/Documents/Angle/strategies-dev/broadcast/MigrationOptimizerAPRUSDC.s.sol/137/run-latest.json", + "returns": {}, + "timestamp": 1675932835, + "chain": 137, + "multi": false, + "commit": "5360538" +} \ No newline at end of file diff --git a/broadcast/MigrationOptimizerAPRUSDC.s.sol/137/run-1675942376.json b/broadcast/MigrationOptimizerAPRUSDC.s.sol/137/run-1675942376.json new file mode 100644 index 0000000..33b2566 --- /dev/null +++ b/broadcast/MigrationOptimizerAPRUSDC.s.sol/137/run-1675942376.json @@ -0,0 +1,34 @@ +{ + "transactions": [ + { + "hash": "0x51120d75e4d4f05a8ad12ec0e27a53c15781303a1e6ed0cd30ffc8516904e7ef", + "transactionType": "CREATE", + "contractName": "OptimizerAPRStrategy", + "contractAddress": "0x58f3684712E776980000EF1C6a79Ba5CA0518373", + "function": null, + "arguments": null, + "rpc": "https://polygon-mainnet.g.alchemy.com/v2/IJTj5SikhXCIV_a021XV2xpbLL8ibwUP", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x56d432", + "value": "0x0", + "data": "0x60806040523480156200001157600080fd5b50600054610100900460ff166200002f5760005460ff161562000039565b62000039620000de565b620000a15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b600054610100900460ff16158015620000c4576000805461ffff19166101011790555b8015620000d7576000805461ff00191690555b5062000102565b6000620000f630620000fc60201b620019901760201c565b15905090565b3b151590565b614e1480620001126000396000f3fe608060405234801561001057600080fd5b50600436106102ad5760003560e01c80637985fd511161017b578063ce5c7f61116100d8578063e6bfbfd81161008c578063efbb5cb011610071578063efbb5cb0146105c5578063fcc5f59a146105cd578063fcf2d0ad146105e257600080fd5b8063e6bfbfd8146105a3578063ec342ad0146105b657600080fd5b8063dc4c90d3116100bd578063dc4c90d314610560578063ddc6326214610585578063e6a69ab81461059857600080fd5b8063ce5c7f611461053a578063d547741f1461054d57600080fd5b8063a217fddf1161012f578063af648c3d11610114578063af648c3d1461050c578063b8dc491b1461051f578063bb927c461461053257600080fd5b8063a217fddf146104f1578063a526d83b146104f957600080fd5b806391d148541161016057806391d14854146104b8578063929eea21146104cb57806393084b34146104de57600080fd5b80637985fd511461049c5780638baf2957146104a557600080fd5b80632e1a7d4d116102295780634786b0cb116101dd5780635a5cd45e116101c25780635a5cd45e14610460578063708ba9bd1461046857806376ee75d81461048957600080fd5b80634786b0cb146104405780635641ec031461045357600080fd5b8063364bc15a1161020e578063364bc15a146103fe57806336568abe146104255780634641257d1461043857600080fd5b80632e1a7d4d146103c35780632f2ff15d146103eb57600080fd5b80631d12f28b1161028057806322f3e2d41161026557806322f3e2d414610360578063248a9ca31461037857806324ea54f41461039c57600080fd5b80631d12f28b146103125780631f1fcd511461031b57600080fd5b80630b6d1d17146102b25780630c016dc0146102ce5780630e6e15f0146102f55780630f969b87146102fd575b600080fd5b6102bb60355481565b6040519081526020015b60405180910390f35b6102bb7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe56281565b6102bb6105ea565b61031061030b3660046142fa565b6106cb565b005b6102bb60365481565b60345461033b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102c5565b610368610732565b60405190151581526020016102c5565b6102bb6103863660046142fa565b6000908152600160208190526040909120015490565b6102bb7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504181565b6103d66103d13660046142fa565b610743565b604080519283526020830191909152016102c5565b6103106103f9366004614335565b6107a9565b6102bb7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab81565b610310610433366004614335565b6107d5565b610310610867565b61031061044e3660046142fa565b610879565b6033546103689060ff1681565b6102bb6108aa565b61047b61047636600461441d565b6109b1565b6040516102c59291906144b1565b6103106104973660046144ff565b610cdb565b6102bb60665481565b6103106104b33660046144ff565b610d11565b6103686104c6366004614335565b610d47565b61033b6104d93660046142fa565b610d81565b6103106104ec3660046144ff565b610db8565b6102bb600081565b6103106105073660046144ff565b610fe5565b61031061051a3660046144ff565b611126565b61031061052d36600461451c565b611261565b6065546102bb565b610310610548366004614590565b611443565b61031061055b366004614335565b611457565b60335461033b90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6103106105933660046142fa565b61147e565b6102bb6301e1855881565b6103106105b136600461460b565b6114ba565b6102bb670de0b6b3a764000081565b6102bb6114de565b6105d5611588565b6040516102c5919061474b565b61031061190e565b6065546000908190815b818110156106c3576065818154811061060f5761060f61480a565b60009182526020918290200154604080517fc1590cd7000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263c1590cd7926004808401938290030181865afa158015610683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a79190614839565b6106b19084614881565b92506106bc81614894565b90506105f4565b509092915050565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50416106f68133611996565b60368290556040518281527fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a86009060200160405180910390a15050565b600061073c6114de565b1515919050565b6000807f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626107718133611996565b61077a84611a3f565b60345491945092506107a39073ffffffffffffffffffffffffffffffffffffffff163385611b29565b50915091565b600082815260016020819052604090912001546107c68133611996565b6107d08383611bfd565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f373100000000000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6108638282611c93565b5050565b61086f611d25565b610877611f0d565b565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50416108a48133611996565b50606655565b6000806108b56114de565b9050806000036108c757600091505090565b606554600090815b8181101561099e57606581815481106108ea576108ea61480a565b60009182526020918290200154604080517f116ac4a3000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263116ac4a3926004808401938290030181865afa15801561095e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109829190614839565b61098c9084614881565b925061099781614894565b90506108cf565b506109a983836148cc565b935050505090565b6065546000906060908067ffffffffffffffff8111156109d3576109d3614365565b6040519080825280602002602001820160405280156109fc578160200160208202803683370190505b50915083518114610a39576040517fcdeedcbd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610a436114de565b905080600003610a54575050915091565b6000805b83811015610c8b57868181518110610a7257610a7261480a565b602002602001015167ffffffffffffffff1682610a8f9190614881565b9150600061271067ffffffffffffffff16888381518110610ab257610ab261480a565b602002602001015167ffffffffffffffff1685610acf9190614907565b610ad991906148cc565b9050600060658381548110610af057610af061480a565b60009182526020918290200154604080517fc1590cd7000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263c1590cd7926004808401938290030181865afa158015610b64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b889190614839565b610b92908361491e565b905080878481518110610ba757610ba761480a565b60200260200101818152505060658381548110610bc657610bc661480a565b6000918252602090912001546040517fa7d385e20000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff9091169063a7d385e290602401602060405180830381865afa158015610c3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c629190614839565b610c6c9083614907565b610c769089614881565b9750505080610c8490614894565b9050610a58565b508061271014610cc7576040517f6edcc52300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cd182866148cc565b9450505050915091565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610d068133611996565b610863826001611f61565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab610d3c8133611996565b610863826000611f61565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff165b92915050565b60658181548110610d9157600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610de38133611996565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663a8c62e766040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e69919061493e565b73ffffffffffffffffffffffffffffffffffffffff1614610eb6576040517feeacc72d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60655460005b81811015610f455760658181548110610ed757610ed761480a565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff90811690851603610f35576040517f7cc7731c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f3e81614894565b9050610ebc565b506065805460018101825560009182527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915560405190917f1e7b117a6591133f0b36fc2c24d59f8465d806fdcad63aa33246b45fd62c89ff91a2505050565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626110108133611996565b61103a7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504183611bfd565b60655460005b81811015611120576065818154811061105b5761105b61480a565b6000918252602090912001546040517f2f2ff15d0000000000000000000000000000000000000000000000000000000081527f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041600482015273ffffffffffffffffffffffffffffffffffffffff868116602483015290911690632f2ff15d90604401600060405180830381600087803b1580156110f757600080fd5b505af115801561110b573d6000803e3d6000fd5b505050508061111990614894565b9050611040565b50505050565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626111518133611996565b61117b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504183611c93565b60655460005b81811015611120576065818154811061119c5761119c61480a565b6000918252602090912001546040517fd547741f0000000000000000000000000000000000000000000000000000000081527f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041600482015273ffffffffffffffffffffffffffffffffffffffff86811660248301529091169063d547741f90604401600060405180830381600087803b15801561123857600080fd5b505af115801561124c573d6000803e3d6000fd5b505050508061125a90614894565b9050611181565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504161128c8133611996565b60345473ffffffffffffffffffffffffffffffffffffffff908116908416036112e1576040517fc1ab6dc100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112eb61231e565b805190915060005b818110156113895782818151811061130d5761130d61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603611379576040517fc1ab6dc100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138281614894565b90506112f3565b506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015261143c90859073ffffffffffffffffffffffffffffffffffffffff8816906370a0823190602401602060405180830381865afa1580156113fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141e9190614839565b73ffffffffffffffffffffffffffffffffffffffff88169190611b29565b5050505050565b61144b611d25565b6114548161239b565b50565b600082815260016020819052604090912001546114748133611996565b6107d08383611c93565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab6114a98133611996565b6114b1611d25565b61086382612974565b6114c68484848461297e565b6035546114d5906103e8614907565b60665550505050565b6034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561154d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115719190614839565b6115796105ea565b6115839190614881565b905090565b60655460609060008167ffffffffffffffff8111156115a9576115a9614365565b60405190808252806020026020018201604052801561161b57816020015b6116086040518060800160405280606081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b8152602001906001900390816115c75790505b50905060005b828110156119075761166a6040518060800160405280606081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b6065828154811061167d5761167d61480a565b6000918252602082200154604080517f8b202176000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921692638b202176926004808401938290030181865afa1580156116ef573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611735919081019061495b565b8152606580548390811061174b5761174b61480a565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16606082015260658054839081106117865761178661480a565b60009182526020918290200154604080517fc1590cd7000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263c1590cd7926004808401938290030181865afa1580156117fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181e9190614839565b602082015260658054839081106118375761183761480a565b60009182526020918290200154604080517f57ded9c9000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff909216926357ded9c9926004808401938290030181865afa1580156118ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cf9190614839565b6040820152825181908490849081106118ea576118ea61480a565b6020026020010181905250508061190090614894565b9050611621565b5092915050565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626119398133611996565b603380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f17fa25a1c2ac074f71f0cf4f6af525c06fab7d83eff5ffcf6df5277f2919ae2490600090a150565b3b151590565b6119a08282610d47565b610863576119c58173ffffffffffffffffffffffffffffffffffffffff166014612f8a565b6119d0836020612f8a565b6040516020016119e19291906149d2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261085091600401614a53565b6034546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000918291829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611ab2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad69190614839565b9050838110611aea57509192600092509050565b600081611aff611afa8288614a66565b6131d4565b611b099190614881565b9050848110611b1e5750929360009350915050565b946000945092505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526107d09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613578565b611c078282610d47565b61086357600082815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616808652925280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b611c9d8282610d47565b1561086357600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000806000603360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf3759b56040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dbb9190614839565b60335490915060009060ff1615611e18576000611dd6613684565b905082811015611df157611dea8184614a66565b9350611e06565b82811115611e0657611e038382614a66565b94505b611e108484614a66565b915050611e29565b611e218261369c565b919550935090505b6040805185815260208101859052908101829052606081018390527f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d5099060800160405180910390a16033546040517fa1d9bafc00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044810183905261010090910473ffffffffffffffffffffffffffffffffffffffff169063a1d9bafc90606401600060405180830381600087803b158015611eef57600080fd5b505af1158015611f03573d6000803e3d6000fd5b5050505050505050565b61087760005b604051908082528060200260200182016040528015611f3c578160200160208202803683370190505b50604051602001611f4d9190614a79565b60405160208183030381529060405261239b565b60006065805480602002602001604051908101604052809291908181526020018280548015611fc657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611f9b575b505083519394506000925050505b818110156122eb57828181518110611fee57611fee61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036122db57600083828151811061203c5761203c61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663853828b66040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612090573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b49190614ac7565b9050841580156120c2575080155b156120f9576040517fa124823500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612104600184614a66565b821461218a5783612116600185614a66565b815181106121265761212661480a565b6020026020010151606583815481106121415761214161480a565b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b606580548061219b5761219b614ae9565b6000828152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908201810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690550190556034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015612261573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122859190614839565b1561229257612292611f0d565b60405173ffffffffffffffffffffffffffffffffffffffff8716907f95c84dbc5fd872c46b0e4290775a1a4ea1c8d760f9e4d38f48ba71b6f9a667db90600090a2505050505050565b6122e481614894565b9050611fd4565b506040517f30990b6700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051600180825281830190925260609160009190602080830190803683375050603454825192935073ffffffffffffffffffffffffffffffffffffffff16918391506000906123715761237161480a565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152919050565b60335460ff16156123a95750565b6000606580548060200260200160405190810160405280929190818152602001828054801561240e57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116123e3575b505050505090506000815190508060000361242857505050565b60008380602001905181019061243e9190614b18565b905060006060825160001461245c57612456836109b1565b90925090505b60008060008061246b89613a29565b93509350935093508581101561277f576000805b898110156125ac57600087828151811061249b5761249b61480a565b6020026020010151121561259c578a81815181106124bb576124bb61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8883815181106124f0576124f061480a565b602002602001015161250190614ba7565b6040518263ffffffff1660e01b815260040161251f91815260200190565b6020604051808303816000875af115801561253e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125629190614839565b8782815181106125745761257461480a565b602002602001015161258590614ba7565b61258f9190614a66565b6125999083614881565b91505b6125a581614894565b905061247f565b506066548111156125e9576040517f5c3810af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8981101561277857818782815181106126075761260761480a565b6020026020010151131561271e57818782815181106126285761262861480a565b6020026020010181815161263c919061491e565b9052508a51600092506126a0908c908390811061265b5761265b61480a565b60200260200101518883815181106126755761267561480a565b602090810291909101015160345473ffffffffffffffffffffffffffffffffffffffff169190611b29565b8a81815181106126b2576126b261480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561270157600080fd5b505af1158015612715573d6000803e3d6000fd5b50505050612768565b60008782815181106127325761273261480a565b60200260200101511315612768578681815181106127525761275261480a565b6020026020010151826127659190614a66565b91505b61277181614894565b90506125ec565b5050612968565b8115612811578884815181106127975761279761480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663853828b66040518163ffffffff1660e01b81526004016020604051808303816000875af11580156127eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061280f9190614ac7565b505b6034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a49190614839565b90508015612966576128ec8a85815181106128c1576128c161480a565b602090810291909101015160345473ffffffffffffffffffffffffffffffffffffffff169083611b29565b8984815181106128fe576128fe61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561294d57600080fd5b505af1158015612961573d6000803e3d6000fd5b505050505b505b50505050505050505050565b6114546000611f13565b600054610100900460ff166129995760005460ff161561299d565b303b155b612a29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610850565b600054610100900460ff16158015612a6857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b84603360016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550603360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3a919061493e565b603480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169182179055604080517f313ce567000000000000000000000000000000000000000000000000000000008152905163313ce567916004808201926020929091908290030181865afa158015612bd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf69190614bdf565b612c0190600a614d22565b60355573ffffffffffffffffffffffffffffffffffffffff83161580612c3b575073ffffffffffffffffffffffffffffffffffffffff8416155b80612c7157508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b15612ca8576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cd27f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504184613f76565b612cfc7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504185613f76565b612d267f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe56286613f76565b612d507f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe56280613f80565b612d9a7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50417f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe562613f80565b815160005b81811015612e7c57600073ffffffffffffffffffffffffffffffffffffffff16848281518110612dd157612dd161480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603612e26576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e6c7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab60001b858381518110612e5f57612e5f61480a565b6020026020010151613f76565b612e7581614894565b9050612d9f565b50612ec77ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041613f80565b612eda670de0b6b3a76400006064614907565b603655603380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690819055603454612f549173ffffffffffffffffffffffffffffffffffffffff91821691610100909104167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613fd7565b50801561143c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555050505050565b60606000612f99836002614907565b612fa4906002614881565b67ffffffffffffffff811115612fbc57612fbc614365565b6040519080825280601f01601f191660200182016040528015612fe6576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061301d5761301d61480a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106130805761308061480a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006130bc846002614907565b6130c7906001614881565b90505b6001811115613164577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106131085761310861480a565b1a60f81b82828151811061311e5761311e61480a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9361315d81614d31565b90506130ca565b5083156131cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610850565b9392505050565b600080606580548060200260200160405190810160405280929190818152602001828054801561323a57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161320f575b5050505050905060008151905080600003613259575060009392505050565b6066548085101561326f57506000949350505050565b60005b61327c8287614a66565b85101561356f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000805b858110156133ea578681815181106132c2576132c261480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16635be9b2d36040518163ffffffff1660e01b8152600401602060405180830381865afa158015613314573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133389190614ac7565b156133da5760008782815181106133515761335161480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166357ded9c96040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133c79190614839565b9050838110156133d8578093508192505b505b6133e381614894565b90506132a8565b508581815181106133fd576133fd61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16635be9b2d36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561344f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134739190614ac7565b61348257505050505050919050565b60008682815181106134965761349661480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d898b6134c59190614a66565b6040518263ffffffff1660e01b81526004016134e391815260200190565b6020604051808303816000875af1158015613502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135269190614839565b90506135328189614881565b975061353d84614894565b9350806000036135535750505050505050919050565b600684106135675750505050505050919050565b505050613272565b50505050919050565b60006135da826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166140d59092919063ffffffff16565b8051909150156107d057808060200190518101906135f89190614ac7565b6107d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610850565b60006136966136916114de565b611a3f565b50919050565b60008082816136a96105ea565b6034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291925060009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa15801561371d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137419190614839565b9050600061374f8383614881565b90508260000361376d5781841115613765578193505b505050613a22565b6033546040517f39ebf823000000000000000000000000000000000000000000000000000000008152306004820152600091610100900473ffffffffffffffffffffffffffffffffffffffff16906339ebf82390602401606060405180830381865afa1580156137e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138059190614d66565b6020015190508082111561391d5761381d8183614a66565b9650600061382b8689614881565b9050801580159061383b57508084105b156139175761384d611afa8583614a66565b506034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156138bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138e19190614839565b90508181101561391557808911156138ff5780985060009650613915565b61391261390c8a83614a66565b886140ec565b96505b505b50613a1d565b6139278282614a66565b955060006139358688614881565b9050801580159061394557508084105b15613a1b57613957611afa8583614a66565b506034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156139c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139eb9190614839565b905081811015613a195780881115613a095780975060009650613a19565b613a1661390c8983614a66565b96505b505b505b505050505b9193909250565b6034546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600091829182918291829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015613aa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ac49190614839565b905060008060008084905060008a5167ffffffffffffffff811115613aeb57613aeb614365565b604051908082528060200260200182016040528015613b14578160200160208202803683370190505b5090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005b8c51811015613d775760008d8281518110613b5857613b5861480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663a7d385e28a6040518263ffffffff1660e01b8152600401613b9a91815260200190565b602060405180830381865afa158015613bb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bdb9190614839565b905060008e8381518110613bf157613bf161480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663c1590cd76040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c679190614839565b9050613c738187614881565b955087821115613c8757819750809650829c505b603554613c9590600a614907565b811115613d645760008f8481518110613cb057613cb061480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166357ded9c96040518163ffffffff1660e01b8152600401602060405180830381865afa158015613d02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d269190614839565b9050613d328282614907565b868581518110613d4457613d4461480a565b60200260200101818152505084811015613d6257809450819950839e505b505b505080613d7090614894565b9050613b3b565b50508115613f695760008060005b8d51811015613f2e578b8103613e9c5786613da08a88614881565b613daa9190614907565b613db49084614881565b92508715801590613dc6575060018e51115b15613e97578d8c81518110613ddd57613ddd61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663a7d385e28a8a613e0c9190614881565b6040518263ffffffff1660e01b8152600401613e2a91815260200190565b602060405180830381865afa158015613e47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e6b9190614839565b88613e768b89614881565b613e809190614881565b613e8a9190614907565b613e949083614881565b91505b613f1e565b8c8103613ecf57838181518110613eb557613eb561480a565b602002602001015183613ec89190614881565b9250613f1e565b838181518110613ee157613ee161480a565b602002602001015183613ef49190614881565b9250838181518110613f0857613f0861480a565b602002602001015182613f1b9190614881565b91505b613f2781614894565b9050613d85565b508181118015613f3f575060018d51115b15613f595760019950613f5284826148cc565b9850613f66565b613f6384836148cc565b98505b50505b5050505050509193509193565b6108638282611bfd565b60008281526001602081905260409091200154819060405184907fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff90600090a4600091825260016020819052604090922090910155565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801561404e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140729190614839565b61407c9190614881565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506111209085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611b7b565b60606140e48484600085614102565b949350505050565b60008183106140fb57816131cd565b5090919050565b606082471015614194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610850565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516141bd9190614dc2565b60006040518083038185875af1925050503d80600081146141fa576040519150601f19603f3d011682016040523d82523d6000602084013e6141ff565b606091505b50915091506142108783838761421b565b979650505050505050565b606083156142b15782516000036142aa5773ffffffffffffffffffffffffffffffffffffffff85163b6142aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610850565b50816140e4565b6140e483838151156142c65781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108509190614a53565b60006020828403121561430c57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461145457600080fd5b6000806040838503121561434857600080fd5b82359150602083013561435a81614313565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156143db576143db614365565b604052919050565b600067ffffffffffffffff8211156143fd576143fd614365565b5060051b60200190565b67ffffffffffffffff8116811461145457600080fd5b6000602080838503121561443057600080fd5b823567ffffffffffffffff81111561444757600080fd5b8301601f8101851361445857600080fd5b803561446b614466826143e3565b614394565b81815260059190911b8201830190838101908783111561448a57600080fd5b928401925b828410156142105783356144a281614407565b8252928401929084019061448f565b6000604082018483526020604081850152818551808452606086019150828701935060005b818110156144f2578451835293830193918301916001016144d6565b5090979650505050505050565b60006020828403121561451157600080fd5b81356131cd81614313565b6000806040838503121561452f57600080fd5b823561453a81614313565b9150602083013561435a81614313565b600067ffffffffffffffff82111561456457614564614365565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b6000602082840312156145a257600080fd5b813567ffffffffffffffff8111156145b957600080fd5b8201601f810184136145ca57600080fd5b80356145d86144668261454a565b8181528560208385010111156145ed57600080fd5b81602084016020830137600091810160200191909152949350505050565b6000806000806080858703121561462157600080fd5b843561462c81614313565b935060208581013561463d81614313565b9350604086013561464d81614313565b9250606086013567ffffffffffffffff81111561466957600080fd5b8601601f8101881361467a57600080fd5b8035614688614466826143e3565b81815260059190911b8201830190838101908a8311156146a757600080fd5b928401925b828410156146ce5783356146bf81614313565b825292840192908401906146ac565b979a9699509497505050505050565b60005b838110156146f85781810151838201526020016146e0565b50506000910152565b600081518084526147198160208601602086016146dd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156147fc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08984030185528151608081518186526147b682870182614701565b838b0151878c0152898401518a88015260609384015173ffffffffffffffffffffffffffffffffffffffff16939096019290925250509386019390860190600101614772565b509098975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561484b57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610d7b57610d7b614852565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148c5576148c5614852565b5060010190565b600082614902577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082028115828204841417610d7b57610d7b614852565b818103600083128015838313168383128216171561190757611907614852565b60006020828403121561495057600080fd5b81516131cd81614313565b60006020828403121561496d57600080fd5b815167ffffffffffffffff81111561498457600080fd5b8201601f8101841361499557600080fd5b80516149a36144668261454a565b8181528560208385010111156149b857600080fd5b6149c98260208301602086016146dd565b95945050505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351614a0a8160178501602088016146dd565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351614a478160288401602088016146dd565b01602801949350505050565b6020815260006131cd6020830184614701565b81810381811115610d7b57610d7b614852565b6020808252825182820181905260009190848201906040850190845b81811015614abb57835167ffffffffffffffff1683529284019291840191600101614a95565b50909695505050505050565b600060208284031215614ad957600080fd5b815180151581146131cd57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006020808385031215614b2b57600080fd5b825167ffffffffffffffff811115614b4257600080fd5b8301601f81018513614b5357600080fd5b8051614b61614466826143e3565b81815260059190911b82018301908381019087831115614b8057600080fd5b928401925b82841015614210578351614b9881614407565b82529284019290840190614b85565b60007f80000000000000000000000000000000000000000000000000000000000000008203614bd857614bd8614852565b5060000390565b600060208284031215614bf157600080fd5b815160ff811681146131cd57600080fd5b600181815b80851115614c5b57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614c4157614c41614852565b80851615614c4e57918102915b93841c9390800290614c07565b509250929050565b600082614c7257506001610d7b565b81614c7f57506000610d7b565b8160018114614c955760028114614c9f57614cbb565b6001915050610d7b565b60ff841115614cb057614cb0614852565b50506001821b610d7b565b5060208310610133831016604e8410600b8410161715614cde575081810a610d7b565b614ce88383614c02565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614d1a57614d1a614852565b029392505050565b60006131cd60ff841683614c63565b600081614d4057614d40614852565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600060608284031215614d7857600080fd5b6040516060810181811067ffffffffffffffff82111715614d9b57614d9b614365565b80604052508251815260208301516020820152604083015160408201528091505092915050565b60008251614dd48184602087016146dd565b919091019291505056fea2646970667358221220c87a76c31f0456ef0717d5130419ac6f77b92dd570dccd680f54c8fcb72977f364736f6c63430008110033", + "nonce": "0x1b1", + "accessList": [] + }, + "additionalContracts": [] + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x51120d75e4d4f05a8ad12ec0e27a53c15781303a1e6ed0cd30ffc8516904e7ef" + ], + "path": "/Users/gnervo/Documents/Angle/strategies-dev/broadcast/MigrationOptimizerAPRUSDC.s.sol/137/run-latest.json", + "returns": {}, + "timestamp": 1675942376, + "chain": 137, + "multi": false, + "commit": "f38f269" +} \ No newline at end of file diff --git a/broadcast/MigrationOptimizerAPRUSDC.s.sol/137/run-1675942389.json b/broadcast/MigrationOptimizerAPRUSDC.s.sol/137/run-1675942389.json new file mode 100644 index 0000000..6615d7b --- /dev/null +++ b/broadcast/MigrationOptimizerAPRUSDC.s.sol/137/run-1675942389.json @@ -0,0 +1,66 @@ +{ + "transactions": [ + { + "hash": "0x51120d75e4d4f05a8ad12ec0e27a53c15781303a1e6ed0cd30ffc8516904e7ef", + "transactionType": "CREATE", + "contractName": "OptimizerAPRStrategy", + "contractAddress": "0x58f3684712E776980000EF1C6a79Ba5CA0518373", + "function": null, + "arguments": null, + "rpc": "https://polygon-mainnet.g.alchemy.com/v2/IJTj5SikhXCIV_a021XV2xpbLL8ibwUP", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x56d432", + "value": "0x0", + "data": "0x60806040523480156200001157600080fd5b50600054610100900460ff166200002f5760005460ff161562000039565b62000039620000de565b620000a15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b600054610100900460ff16158015620000c4576000805461ffff19166101011790555b8015620000d7576000805461ff00191690555b5062000102565b6000620000f630620000fc60201b620019901760201c565b15905090565b3b151590565b614e1480620001126000396000f3fe608060405234801561001057600080fd5b50600436106102ad5760003560e01c80637985fd511161017b578063ce5c7f61116100d8578063e6bfbfd81161008c578063efbb5cb011610071578063efbb5cb0146105c5578063fcc5f59a146105cd578063fcf2d0ad146105e257600080fd5b8063e6bfbfd8146105a3578063ec342ad0146105b657600080fd5b8063dc4c90d3116100bd578063dc4c90d314610560578063ddc6326214610585578063e6a69ab81461059857600080fd5b8063ce5c7f611461053a578063d547741f1461054d57600080fd5b8063a217fddf1161012f578063af648c3d11610114578063af648c3d1461050c578063b8dc491b1461051f578063bb927c461461053257600080fd5b8063a217fddf146104f1578063a526d83b146104f957600080fd5b806391d148541161016057806391d14854146104b8578063929eea21146104cb57806393084b34146104de57600080fd5b80637985fd511461049c5780638baf2957146104a557600080fd5b80632e1a7d4d116102295780634786b0cb116101dd5780635a5cd45e116101c25780635a5cd45e14610460578063708ba9bd1461046857806376ee75d81461048957600080fd5b80634786b0cb146104405780635641ec031461045357600080fd5b8063364bc15a1161020e578063364bc15a146103fe57806336568abe146104255780634641257d1461043857600080fd5b80632e1a7d4d146103c35780632f2ff15d146103eb57600080fd5b80631d12f28b1161028057806322f3e2d41161026557806322f3e2d414610360578063248a9ca31461037857806324ea54f41461039c57600080fd5b80631d12f28b146103125780631f1fcd511461031b57600080fd5b80630b6d1d17146102b25780630c016dc0146102ce5780630e6e15f0146102f55780630f969b87146102fd575b600080fd5b6102bb60355481565b6040519081526020015b60405180910390f35b6102bb7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe56281565b6102bb6105ea565b61031061030b3660046142fa565b6106cb565b005b6102bb60365481565b60345461033b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102c5565b610368610732565b60405190151581526020016102c5565b6102bb6103863660046142fa565b6000908152600160208190526040909120015490565b6102bb7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504181565b6103d66103d13660046142fa565b610743565b604080519283526020830191909152016102c5565b6103106103f9366004614335565b6107a9565b6102bb7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab81565b610310610433366004614335565b6107d5565b610310610867565b61031061044e3660046142fa565b610879565b6033546103689060ff1681565b6102bb6108aa565b61047b61047636600461441d565b6109b1565b6040516102c59291906144b1565b6103106104973660046144ff565b610cdb565b6102bb60665481565b6103106104b33660046144ff565b610d11565b6103686104c6366004614335565b610d47565b61033b6104d93660046142fa565b610d81565b6103106104ec3660046144ff565b610db8565b6102bb600081565b6103106105073660046144ff565b610fe5565b61031061051a3660046144ff565b611126565b61031061052d36600461451c565b611261565b6065546102bb565b610310610548366004614590565b611443565b61031061055b366004614335565b611457565b60335461033b90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6103106105933660046142fa565b61147e565b6102bb6301e1855881565b6103106105b136600461460b565b6114ba565b6102bb670de0b6b3a764000081565b6102bb6114de565b6105d5611588565b6040516102c5919061474b565b61031061190e565b6065546000908190815b818110156106c3576065818154811061060f5761060f61480a565b60009182526020918290200154604080517fc1590cd7000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263c1590cd7926004808401938290030181865afa158015610683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a79190614839565b6106b19084614881565b92506106bc81614894565b90506105f4565b509092915050565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50416106f68133611996565b60368290556040518281527fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a86009060200160405180910390a15050565b600061073c6114de565b1515919050565b6000807f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626107718133611996565b61077a84611a3f565b60345491945092506107a39073ffffffffffffffffffffffffffffffffffffffff163385611b29565b50915091565b600082815260016020819052604090912001546107c68133611996565b6107d08383611bfd565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f373100000000000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6108638282611c93565b5050565b61086f611d25565b610877611f0d565b565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50416108a48133611996565b50606655565b6000806108b56114de565b9050806000036108c757600091505090565b606554600090815b8181101561099e57606581815481106108ea576108ea61480a565b60009182526020918290200154604080517f116ac4a3000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263116ac4a3926004808401938290030181865afa15801561095e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109829190614839565b61098c9084614881565b925061099781614894565b90506108cf565b506109a983836148cc565b935050505090565b6065546000906060908067ffffffffffffffff8111156109d3576109d3614365565b6040519080825280602002602001820160405280156109fc578160200160208202803683370190505b50915083518114610a39576040517fcdeedcbd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610a436114de565b905080600003610a54575050915091565b6000805b83811015610c8b57868181518110610a7257610a7261480a565b602002602001015167ffffffffffffffff1682610a8f9190614881565b9150600061271067ffffffffffffffff16888381518110610ab257610ab261480a565b602002602001015167ffffffffffffffff1685610acf9190614907565b610ad991906148cc565b9050600060658381548110610af057610af061480a565b60009182526020918290200154604080517fc1590cd7000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263c1590cd7926004808401938290030181865afa158015610b64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b889190614839565b610b92908361491e565b905080878481518110610ba757610ba761480a565b60200260200101818152505060658381548110610bc657610bc661480a565b6000918252602090912001546040517fa7d385e20000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff9091169063a7d385e290602401602060405180830381865afa158015610c3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c629190614839565b610c6c9083614907565b610c769089614881565b9750505080610c8490614894565b9050610a58565b508061271014610cc7576040517f6edcc52300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cd182866148cc565b9450505050915091565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610d068133611996565b610863826001611f61565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab610d3c8133611996565b610863826000611f61565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff165b92915050565b60658181548110610d9157600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610de38133611996565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663a8c62e766040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e69919061493e565b73ffffffffffffffffffffffffffffffffffffffff1614610eb6576040517feeacc72d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60655460005b81811015610f455760658181548110610ed757610ed761480a565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff90811690851603610f35576040517f7cc7731c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f3e81614894565b9050610ebc565b506065805460018101825560009182527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915560405190917f1e7b117a6591133f0b36fc2c24d59f8465d806fdcad63aa33246b45fd62c89ff91a2505050565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626110108133611996565b61103a7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504183611bfd565b60655460005b81811015611120576065818154811061105b5761105b61480a565b6000918252602090912001546040517f2f2ff15d0000000000000000000000000000000000000000000000000000000081527f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041600482015273ffffffffffffffffffffffffffffffffffffffff868116602483015290911690632f2ff15d90604401600060405180830381600087803b1580156110f757600080fd5b505af115801561110b573d6000803e3d6000fd5b505050508061111990614894565b9050611040565b50505050565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626111518133611996565b61117b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504183611c93565b60655460005b81811015611120576065818154811061119c5761119c61480a565b6000918252602090912001546040517fd547741f0000000000000000000000000000000000000000000000000000000081527f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041600482015273ffffffffffffffffffffffffffffffffffffffff86811660248301529091169063d547741f90604401600060405180830381600087803b15801561123857600080fd5b505af115801561124c573d6000803e3d6000fd5b505050508061125a90614894565b9050611181565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504161128c8133611996565b60345473ffffffffffffffffffffffffffffffffffffffff908116908416036112e1576040517fc1ab6dc100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112eb61231e565b805190915060005b818110156113895782818151811061130d5761130d61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603611379576040517fc1ab6dc100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138281614894565b90506112f3565b506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015261143c90859073ffffffffffffffffffffffffffffffffffffffff8816906370a0823190602401602060405180830381865afa1580156113fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141e9190614839565b73ffffffffffffffffffffffffffffffffffffffff88169190611b29565b5050505050565b61144b611d25565b6114548161239b565b50565b600082815260016020819052604090912001546114748133611996565b6107d08383611c93565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab6114a98133611996565b6114b1611d25565b61086382612974565b6114c68484848461297e565b6035546114d5906103e8614907565b60665550505050565b6034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561154d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115719190614839565b6115796105ea565b6115839190614881565b905090565b60655460609060008167ffffffffffffffff8111156115a9576115a9614365565b60405190808252806020026020018201604052801561161b57816020015b6116086040518060800160405280606081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b8152602001906001900390816115c75790505b50905060005b828110156119075761166a6040518060800160405280606081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b6065828154811061167d5761167d61480a565b6000918252602082200154604080517f8b202176000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921692638b202176926004808401938290030181865afa1580156116ef573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611735919081019061495b565b8152606580548390811061174b5761174b61480a565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16606082015260658054839081106117865761178661480a565b60009182526020918290200154604080517fc1590cd7000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263c1590cd7926004808401938290030181865afa1580156117fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181e9190614839565b602082015260658054839081106118375761183761480a565b60009182526020918290200154604080517f57ded9c9000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff909216926357ded9c9926004808401938290030181865afa1580156118ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cf9190614839565b6040820152825181908490849081106118ea576118ea61480a565b6020026020010181905250508061190090614894565b9050611621565b5092915050565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626119398133611996565b603380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f17fa25a1c2ac074f71f0cf4f6af525c06fab7d83eff5ffcf6df5277f2919ae2490600090a150565b3b151590565b6119a08282610d47565b610863576119c58173ffffffffffffffffffffffffffffffffffffffff166014612f8a565b6119d0836020612f8a565b6040516020016119e19291906149d2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261085091600401614a53565b6034546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000918291829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611ab2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad69190614839565b9050838110611aea57509192600092509050565b600081611aff611afa8288614a66565b6131d4565b611b099190614881565b9050848110611b1e5750929360009350915050565b946000945092505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526107d09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613578565b611c078282610d47565b61086357600082815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616808652925280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b611c9d8282610d47565b1561086357600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000806000603360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf3759b56040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dbb9190614839565b60335490915060009060ff1615611e18576000611dd6613684565b905082811015611df157611dea8184614a66565b9350611e06565b82811115611e0657611e038382614a66565b94505b611e108484614a66565b915050611e29565b611e218261369c565b919550935090505b6040805185815260208101859052908101829052606081018390527f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d5099060800160405180910390a16033546040517fa1d9bafc00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044810183905261010090910473ffffffffffffffffffffffffffffffffffffffff169063a1d9bafc90606401600060405180830381600087803b158015611eef57600080fd5b505af1158015611f03573d6000803e3d6000fd5b5050505050505050565b61087760005b604051908082528060200260200182016040528015611f3c578160200160208202803683370190505b50604051602001611f4d9190614a79565b60405160208183030381529060405261239b565b60006065805480602002602001604051908101604052809291908181526020018280548015611fc657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611f9b575b505083519394506000925050505b818110156122eb57828181518110611fee57611fee61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036122db57600083828151811061203c5761203c61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663853828b66040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612090573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b49190614ac7565b9050841580156120c2575080155b156120f9576040517fa124823500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612104600184614a66565b821461218a5783612116600185614a66565b815181106121265761212661480a565b6020026020010151606583815481106121415761214161480a565b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b606580548061219b5761219b614ae9565b6000828152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908201810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690550190556034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015612261573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122859190614839565b1561229257612292611f0d565b60405173ffffffffffffffffffffffffffffffffffffffff8716907f95c84dbc5fd872c46b0e4290775a1a4ea1c8d760f9e4d38f48ba71b6f9a667db90600090a2505050505050565b6122e481614894565b9050611fd4565b506040517f30990b6700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051600180825281830190925260609160009190602080830190803683375050603454825192935073ffffffffffffffffffffffffffffffffffffffff16918391506000906123715761237161480a565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152919050565b60335460ff16156123a95750565b6000606580548060200260200160405190810160405280929190818152602001828054801561240e57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116123e3575b505050505090506000815190508060000361242857505050565b60008380602001905181019061243e9190614b18565b905060006060825160001461245c57612456836109b1565b90925090505b60008060008061246b89613a29565b93509350935093508581101561277f576000805b898110156125ac57600087828151811061249b5761249b61480a565b6020026020010151121561259c578a81815181106124bb576124bb61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8883815181106124f0576124f061480a565b602002602001015161250190614ba7565b6040518263ffffffff1660e01b815260040161251f91815260200190565b6020604051808303816000875af115801561253e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125629190614839565b8782815181106125745761257461480a565b602002602001015161258590614ba7565b61258f9190614a66565b6125999083614881565b91505b6125a581614894565b905061247f565b506066548111156125e9576040517f5c3810af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8981101561277857818782815181106126075761260761480a565b6020026020010151131561271e57818782815181106126285761262861480a565b6020026020010181815161263c919061491e565b9052508a51600092506126a0908c908390811061265b5761265b61480a565b60200260200101518883815181106126755761267561480a565b602090810291909101015160345473ffffffffffffffffffffffffffffffffffffffff169190611b29565b8a81815181106126b2576126b261480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561270157600080fd5b505af1158015612715573d6000803e3d6000fd5b50505050612768565b60008782815181106127325761273261480a565b60200260200101511315612768578681815181106127525761275261480a565b6020026020010151826127659190614a66565b91505b61277181614894565b90506125ec565b5050612968565b8115612811578884815181106127975761279761480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663853828b66040518163ffffffff1660e01b81526004016020604051808303816000875af11580156127eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061280f9190614ac7565b505b6034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a49190614839565b90508015612966576128ec8a85815181106128c1576128c161480a565b602090810291909101015160345473ffffffffffffffffffffffffffffffffffffffff169083611b29565b8984815181106128fe576128fe61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561294d57600080fd5b505af1158015612961573d6000803e3d6000fd5b505050505b505b50505050505050505050565b6114546000611f13565b600054610100900460ff166129995760005460ff161561299d565b303b155b612a29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610850565b600054610100900460ff16158015612a6857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b84603360016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550603360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3a919061493e565b603480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169182179055604080517f313ce567000000000000000000000000000000000000000000000000000000008152905163313ce567916004808201926020929091908290030181865afa158015612bd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf69190614bdf565b612c0190600a614d22565b60355573ffffffffffffffffffffffffffffffffffffffff83161580612c3b575073ffffffffffffffffffffffffffffffffffffffff8416155b80612c7157508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b15612ca8576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cd27f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504184613f76565b612cfc7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504185613f76565b612d267f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe56286613f76565b612d507f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe56280613f80565b612d9a7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50417f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe562613f80565b815160005b81811015612e7c57600073ffffffffffffffffffffffffffffffffffffffff16848281518110612dd157612dd161480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603612e26576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e6c7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab60001b858381518110612e5f57612e5f61480a565b6020026020010151613f76565b612e7581614894565b9050612d9f565b50612ec77ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041613f80565b612eda670de0b6b3a76400006064614907565b603655603380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690819055603454612f549173ffffffffffffffffffffffffffffffffffffffff91821691610100909104167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613fd7565b50801561143c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555050505050565b60606000612f99836002614907565b612fa4906002614881565b67ffffffffffffffff811115612fbc57612fbc614365565b6040519080825280601f01601f191660200182016040528015612fe6576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061301d5761301d61480a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106130805761308061480a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006130bc846002614907565b6130c7906001614881565b90505b6001811115613164577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106131085761310861480a565b1a60f81b82828151811061311e5761311e61480a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9361315d81614d31565b90506130ca565b5083156131cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610850565b9392505050565b600080606580548060200260200160405190810160405280929190818152602001828054801561323a57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161320f575b5050505050905060008151905080600003613259575060009392505050565b6066548085101561326f57506000949350505050565b60005b61327c8287614a66565b85101561356f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000805b858110156133ea578681815181106132c2576132c261480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16635be9b2d36040518163ffffffff1660e01b8152600401602060405180830381865afa158015613314573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133389190614ac7565b156133da5760008782815181106133515761335161480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166357ded9c96040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133c79190614839565b9050838110156133d8578093508192505b505b6133e381614894565b90506132a8565b508581815181106133fd576133fd61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16635be9b2d36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561344f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134739190614ac7565b61348257505050505050919050565b60008682815181106134965761349661480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d898b6134c59190614a66565b6040518263ffffffff1660e01b81526004016134e391815260200190565b6020604051808303816000875af1158015613502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135269190614839565b90506135328189614881565b975061353d84614894565b9350806000036135535750505050505050919050565b600684106135675750505050505050919050565b505050613272565b50505050919050565b60006135da826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166140d59092919063ffffffff16565b8051909150156107d057808060200190518101906135f89190614ac7565b6107d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610850565b60006136966136916114de565b611a3f565b50919050565b60008082816136a96105ea565b6034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291925060009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa15801561371d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137419190614839565b9050600061374f8383614881565b90508260000361376d5781841115613765578193505b505050613a22565b6033546040517f39ebf823000000000000000000000000000000000000000000000000000000008152306004820152600091610100900473ffffffffffffffffffffffffffffffffffffffff16906339ebf82390602401606060405180830381865afa1580156137e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138059190614d66565b6020015190508082111561391d5761381d8183614a66565b9650600061382b8689614881565b9050801580159061383b57508084105b156139175761384d611afa8583614a66565b506034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156138bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138e19190614839565b90508181101561391557808911156138ff5780985060009650613915565b61391261390c8a83614a66565b886140ec565b96505b505b50613a1d565b6139278282614a66565b955060006139358688614881565b9050801580159061394557508084105b15613a1b57613957611afa8583614a66565b506034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156139c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139eb9190614839565b905081811015613a195780881115613a095780975060009650613a19565b613a1661390c8983614a66565b96505b505b505b505050505b9193909250565b6034546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600091829182918291829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015613aa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ac49190614839565b905060008060008084905060008a5167ffffffffffffffff811115613aeb57613aeb614365565b604051908082528060200260200182016040528015613b14578160200160208202803683370190505b5090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005b8c51811015613d775760008d8281518110613b5857613b5861480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663a7d385e28a6040518263ffffffff1660e01b8152600401613b9a91815260200190565b602060405180830381865afa158015613bb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bdb9190614839565b905060008e8381518110613bf157613bf161480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663c1590cd76040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c679190614839565b9050613c738187614881565b955087821115613c8757819750809650829c505b603554613c9590600a614907565b811115613d645760008f8481518110613cb057613cb061480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166357ded9c96040518163ffffffff1660e01b8152600401602060405180830381865afa158015613d02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d269190614839565b9050613d328282614907565b868581518110613d4457613d4461480a565b60200260200101818152505084811015613d6257809450819950839e505b505b505080613d7090614894565b9050613b3b565b50508115613f695760008060005b8d51811015613f2e578b8103613e9c5786613da08a88614881565b613daa9190614907565b613db49084614881565b92508715801590613dc6575060018e51115b15613e97578d8c81518110613ddd57613ddd61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663a7d385e28a8a613e0c9190614881565b6040518263ffffffff1660e01b8152600401613e2a91815260200190565b602060405180830381865afa158015613e47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e6b9190614839565b88613e768b89614881565b613e809190614881565b613e8a9190614907565b613e949083614881565b91505b613f1e565b8c8103613ecf57838181518110613eb557613eb561480a565b602002602001015183613ec89190614881565b9250613f1e565b838181518110613ee157613ee161480a565b602002602001015183613ef49190614881565b9250838181518110613f0857613f0861480a565b602002602001015182613f1b9190614881565b91505b613f2781614894565b9050613d85565b508181118015613f3f575060018d51115b15613f595760019950613f5284826148cc565b9850613f66565b613f6384836148cc565b98505b50505b5050505050509193509193565b6108638282611bfd565b60008281526001602081905260409091200154819060405184907fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff90600090a4600091825260016020819052604090922090910155565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801561404e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140729190614839565b61407c9190614881565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506111209085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611b7b565b60606140e48484600085614102565b949350505050565b60008183106140fb57816131cd565b5090919050565b606082471015614194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610850565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516141bd9190614dc2565b60006040518083038185875af1925050503d80600081146141fa576040519150601f19603f3d011682016040523d82523d6000602084013e6141ff565b606091505b50915091506142108783838761421b565b979650505050505050565b606083156142b15782516000036142aa5773ffffffffffffffffffffffffffffffffffffffff85163b6142aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610850565b50816140e4565b6140e483838151156142c65781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108509190614a53565b60006020828403121561430c57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461145457600080fd5b6000806040838503121561434857600080fd5b82359150602083013561435a81614313565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156143db576143db614365565b604052919050565b600067ffffffffffffffff8211156143fd576143fd614365565b5060051b60200190565b67ffffffffffffffff8116811461145457600080fd5b6000602080838503121561443057600080fd5b823567ffffffffffffffff81111561444757600080fd5b8301601f8101851361445857600080fd5b803561446b614466826143e3565b614394565b81815260059190911b8201830190838101908783111561448a57600080fd5b928401925b828410156142105783356144a281614407565b8252928401929084019061448f565b6000604082018483526020604081850152818551808452606086019150828701935060005b818110156144f2578451835293830193918301916001016144d6565b5090979650505050505050565b60006020828403121561451157600080fd5b81356131cd81614313565b6000806040838503121561452f57600080fd5b823561453a81614313565b9150602083013561435a81614313565b600067ffffffffffffffff82111561456457614564614365565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b6000602082840312156145a257600080fd5b813567ffffffffffffffff8111156145b957600080fd5b8201601f810184136145ca57600080fd5b80356145d86144668261454a565b8181528560208385010111156145ed57600080fd5b81602084016020830137600091810160200191909152949350505050565b6000806000806080858703121561462157600080fd5b843561462c81614313565b935060208581013561463d81614313565b9350604086013561464d81614313565b9250606086013567ffffffffffffffff81111561466957600080fd5b8601601f8101881361467a57600080fd5b8035614688614466826143e3565b81815260059190911b8201830190838101908a8311156146a757600080fd5b928401925b828410156146ce5783356146bf81614313565b825292840192908401906146ac565b979a9699509497505050505050565b60005b838110156146f85781810151838201526020016146e0565b50506000910152565b600081518084526147198160208601602086016146dd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156147fc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08984030185528151608081518186526147b682870182614701565b838b0151878c0152898401518a88015260609384015173ffffffffffffffffffffffffffffffffffffffff16939096019290925250509386019390860190600101614772565b509098975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561484b57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610d7b57610d7b614852565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148c5576148c5614852565b5060010190565b600082614902577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082028115828204841417610d7b57610d7b614852565b818103600083128015838313168383128216171561190757611907614852565b60006020828403121561495057600080fd5b81516131cd81614313565b60006020828403121561496d57600080fd5b815167ffffffffffffffff81111561498457600080fd5b8201601f8101841361499557600080fd5b80516149a36144668261454a565b8181528560208385010111156149b857600080fd5b6149c98260208301602086016146dd565b95945050505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351614a0a8160178501602088016146dd565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351614a478160288401602088016146dd565b01602801949350505050565b6020815260006131cd6020830184614701565b81810381811115610d7b57610d7b614852565b6020808252825182820181905260009190848201906040850190845b81811015614abb57835167ffffffffffffffff1683529284019291840191600101614a95565b50909695505050505050565b600060208284031215614ad957600080fd5b815180151581146131cd57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006020808385031215614b2b57600080fd5b825167ffffffffffffffff811115614b4257600080fd5b8301601f81018513614b5357600080fd5b8051614b61614466826143e3565b81815260059190911b82018301908381019087831115614b8057600080fd5b928401925b82841015614210578351614b9881614407565b82529284019290840190614b85565b60007f80000000000000000000000000000000000000000000000000000000000000008203614bd857614bd8614852565b5060000390565b600060208284031215614bf157600080fd5b815160ff811681146131cd57600080fd5b600181815b80851115614c5b57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614c4157614c41614852565b80851615614c4e57918102915b93841c9390800290614c07565b509250929050565b600082614c7257506001610d7b565b81614c7f57506000610d7b565b8160018114614c955760028114614c9f57614cbb565b6001915050610d7b565b60ff841115614cb057614cb0614852565b50506001821b610d7b565b5060208310610133831016604e8410600b8410161715614cde575081810a610d7b565b614ce88383614c02565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614d1a57614d1a614852565b029392505050565b60006131cd60ff841683614c63565b600081614d4057614d40614852565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600060608284031215614d7857600080fd5b6040516060810181811067ffffffffffffffff82111715614d9b57614d9b614365565b80604052508251815260208301516020820152604083015160408201528091505092915050565b60008251614dd48184602087016146dd565b919091019291505056fea2646970667358221220c87a76c31f0456ef0717d5130419ac6f77b92dd570dccd680f54c8fcb72977f364736f6c63430008110033", + "nonce": "0x1b1", + "accessList": [] + }, + "additionalContracts": [] + } + ], + "receipts": [ + { + "transactionHash": "0x51120d75e4d4f05a8ad12ec0e27a53c15781303a1e6ed0cd30ffc8516904e7ef", + "transactionIndex": "0x46", + "blockHash": "0xeafb91a3859697e0efa830246e49715c3a64bed1ca5853c42ed8401cc7785df9", + "blockNumber": "0x25489e2", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0xd8e244", + "gasUsed": "0x42ca9d", + "contractAddress": "0x58f3684712E776980000EF1C6a79Ba5CA0518373", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185", + "0x00000000000000000000000026c80cc193b27d73d2c40943acec77f4da2c5bd8" + ], + "data": "0x00000000000000000000000000000000000000000000000002bc8f6b55478425000000000000000000000000000000000000000000000001bd3919c0dec492110000000000000000000000000000000000000000000001e56d15948edf473727000000000000000000000000000000000000000000000001ba7c8a55897d0dec0000000000000000000000000000000000000000000001e56fd223fa348ebb4c", + "blockHash": "0xeafb91a3859697e0efa830246e49715c3a64bed1ca5853c42ed8401cc7785df9", + "blockNumber": "0x25489e2", + "transactionHash": "0x51120d75e4d4f05a8ad12ec0e27a53c15781303a1e6ed0cd30ffc8516904e7ef", + "transactionIndex": "0x46", + "logIndex": "0xf9", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000108000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000002000000000000000000000000200000040000100000000000000000000000000000000000000000000000005000000000000000000001000000000000000800000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x4b1c10dc0b" + } + ], + "libraries": [], + "pending": [], + "path": "/Users/gnervo/Documents/Angle/strategies-dev/broadcast/MigrationOptimizerAPRUSDC.s.sol/137/run-latest.json", + "returns": {}, + "timestamp": 1675942389, + "chain": 137, + "multi": false, + "commit": "f38f269" +} \ No newline at end of file diff --git a/broadcast/MigrationOptimizerAPRUSDC.s.sol/137/run-1675942414.json b/broadcast/MigrationOptimizerAPRUSDC.s.sol/137/run-1675942414.json new file mode 100644 index 0000000..0422501 --- /dev/null +++ b/broadcast/MigrationOptimizerAPRUSDC.s.sol/137/run-1675942414.json @@ -0,0 +1,66 @@ +{ + "transactions": [ + { + "hash": "0x51120d75e4d4f05a8ad12ec0e27a53c15781303a1e6ed0cd30ffc8516904e7ef", + "transactionType": "CREATE", + "contractName": "OptimizerAPRStrategy", + "contractAddress": "0x58f3684712E776980000EF1C6a79Ba5CA0518373", + "function": null, + "arguments": null, + "rpc": "https://polygon-mainnet.g.alchemy.com/v2/IJTj5SikhXCIV_a021XV2xpbLL8ibwUP", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x56d432", + "value": "0x0", + "data": "0x60806040523480156200001157600080fd5b50600054610100900460ff166200002f5760005460ff161562000039565b62000039620000de565b620000a15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b600054610100900460ff16158015620000c4576000805461ffff19166101011790555b8015620000d7576000805461ff00191690555b5062000102565b6000620000f630620000fc60201b620019901760201c565b15905090565b3b151590565b614e1480620001126000396000f3fe608060405234801561001057600080fd5b50600436106102ad5760003560e01c80637985fd511161017b578063ce5c7f61116100d8578063e6bfbfd81161008c578063efbb5cb011610071578063efbb5cb0146105c5578063fcc5f59a146105cd578063fcf2d0ad146105e257600080fd5b8063e6bfbfd8146105a3578063ec342ad0146105b657600080fd5b8063dc4c90d3116100bd578063dc4c90d314610560578063ddc6326214610585578063e6a69ab81461059857600080fd5b8063ce5c7f611461053a578063d547741f1461054d57600080fd5b8063a217fddf1161012f578063af648c3d11610114578063af648c3d1461050c578063b8dc491b1461051f578063bb927c461461053257600080fd5b8063a217fddf146104f1578063a526d83b146104f957600080fd5b806391d148541161016057806391d14854146104b8578063929eea21146104cb57806393084b34146104de57600080fd5b80637985fd511461049c5780638baf2957146104a557600080fd5b80632e1a7d4d116102295780634786b0cb116101dd5780635a5cd45e116101c25780635a5cd45e14610460578063708ba9bd1461046857806376ee75d81461048957600080fd5b80634786b0cb146104405780635641ec031461045357600080fd5b8063364bc15a1161020e578063364bc15a146103fe57806336568abe146104255780634641257d1461043857600080fd5b80632e1a7d4d146103c35780632f2ff15d146103eb57600080fd5b80631d12f28b1161028057806322f3e2d41161026557806322f3e2d414610360578063248a9ca31461037857806324ea54f41461039c57600080fd5b80631d12f28b146103125780631f1fcd511461031b57600080fd5b80630b6d1d17146102b25780630c016dc0146102ce5780630e6e15f0146102f55780630f969b87146102fd575b600080fd5b6102bb60355481565b6040519081526020015b60405180910390f35b6102bb7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe56281565b6102bb6105ea565b61031061030b3660046142fa565b6106cb565b005b6102bb60365481565b60345461033b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102c5565b610368610732565b60405190151581526020016102c5565b6102bb6103863660046142fa565b6000908152600160208190526040909120015490565b6102bb7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504181565b6103d66103d13660046142fa565b610743565b604080519283526020830191909152016102c5565b6103106103f9366004614335565b6107a9565b6102bb7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab81565b610310610433366004614335565b6107d5565b610310610867565b61031061044e3660046142fa565b610879565b6033546103689060ff1681565b6102bb6108aa565b61047b61047636600461441d565b6109b1565b6040516102c59291906144b1565b6103106104973660046144ff565b610cdb565b6102bb60665481565b6103106104b33660046144ff565b610d11565b6103686104c6366004614335565b610d47565b61033b6104d93660046142fa565b610d81565b6103106104ec3660046144ff565b610db8565b6102bb600081565b6103106105073660046144ff565b610fe5565b61031061051a3660046144ff565b611126565b61031061052d36600461451c565b611261565b6065546102bb565b610310610548366004614590565b611443565b61031061055b366004614335565b611457565b60335461033b90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6103106105933660046142fa565b61147e565b6102bb6301e1855881565b6103106105b136600461460b565b6114ba565b6102bb670de0b6b3a764000081565b6102bb6114de565b6105d5611588565b6040516102c5919061474b565b61031061190e565b6065546000908190815b818110156106c3576065818154811061060f5761060f61480a565b60009182526020918290200154604080517fc1590cd7000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263c1590cd7926004808401938290030181865afa158015610683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a79190614839565b6106b19084614881565b92506106bc81614894565b90506105f4565b509092915050565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50416106f68133611996565b60368290556040518281527fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a86009060200160405180910390a15050565b600061073c6114de565b1515919050565b6000807f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626107718133611996565b61077a84611a3f565b60345491945092506107a39073ffffffffffffffffffffffffffffffffffffffff163385611b29565b50915091565b600082815260016020819052604090912001546107c68133611996565b6107d08383611bfd565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f373100000000000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6108638282611c93565b5050565b61086f611d25565b610877611f0d565b565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50416108a48133611996565b50606655565b6000806108b56114de565b9050806000036108c757600091505090565b606554600090815b8181101561099e57606581815481106108ea576108ea61480a565b60009182526020918290200154604080517f116ac4a3000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263116ac4a3926004808401938290030181865afa15801561095e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109829190614839565b61098c9084614881565b925061099781614894565b90506108cf565b506109a983836148cc565b935050505090565b6065546000906060908067ffffffffffffffff8111156109d3576109d3614365565b6040519080825280602002602001820160405280156109fc578160200160208202803683370190505b50915083518114610a39576040517fcdeedcbd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610a436114de565b905080600003610a54575050915091565b6000805b83811015610c8b57868181518110610a7257610a7261480a565b602002602001015167ffffffffffffffff1682610a8f9190614881565b9150600061271067ffffffffffffffff16888381518110610ab257610ab261480a565b602002602001015167ffffffffffffffff1685610acf9190614907565b610ad991906148cc565b9050600060658381548110610af057610af061480a565b60009182526020918290200154604080517fc1590cd7000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263c1590cd7926004808401938290030181865afa158015610b64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b889190614839565b610b92908361491e565b905080878481518110610ba757610ba761480a565b60200260200101818152505060658381548110610bc657610bc661480a565b6000918252602090912001546040517fa7d385e20000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff9091169063a7d385e290602401602060405180830381865afa158015610c3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c629190614839565b610c6c9083614907565b610c769089614881565b9750505080610c8490614894565b9050610a58565b508061271014610cc7576040517f6edcc52300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cd182866148cc565b9450505050915091565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610d068133611996565b610863826001611f61565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab610d3c8133611996565b610863826000611f61565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff165b92915050565b60658181548110610d9157600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610de38133611996565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663a8c62e766040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e69919061493e565b73ffffffffffffffffffffffffffffffffffffffff1614610eb6576040517feeacc72d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60655460005b81811015610f455760658181548110610ed757610ed761480a565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff90811690851603610f35576040517f7cc7731c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f3e81614894565b9050610ebc565b506065805460018101825560009182527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915560405190917f1e7b117a6591133f0b36fc2c24d59f8465d806fdcad63aa33246b45fd62c89ff91a2505050565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626110108133611996565b61103a7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504183611bfd565b60655460005b81811015611120576065818154811061105b5761105b61480a565b6000918252602090912001546040517f2f2ff15d0000000000000000000000000000000000000000000000000000000081527f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041600482015273ffffffffffffffffffffffffffffffffffffffff868116602483015290911690632f2ff15d90604401600060405180830381600087803b1580156110f757600080fd5b505af115801561110b573d6000803e3d6000fd5b505050508061111990614894565b9050611040565b50505050565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626111518133611996565b61117b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504183611c93565b60655460005b81811015611120576065818154811061119c5761119c61480a565b6000918252602090912001546040517fd547741f0000000000000000000000000000000000000000000000000000000081527f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041600482015273ffffffffffffffffffffffffffffffffffffffff86811660248301529091169063d547741f90604401600060405180830381600087803b15801561123857600080fd5b505af115801561124c573d6000803e3d6000fd5b505050508061125a90614894565b9050611181565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504161128c8133611996565b60345473ffffffffffffffffffffffffffffffffffffffff908116908416036112e1576040517fc1ab6dc100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112eb61231e565b805190915060005b818110156113895782818151811061130d5761130d61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603611379576040517fc1ab6dc100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138281614894565b90506112f3565b506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015261143c90859073ffffffffffffffffffffffffffffffffffffffff8816906370a0823190602401602060405180830381865afa1580156113fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141e9190614839565b73ffffffffffffffffffffffffffffffffffffffff88169190611b29565b5050505050565b61144b611d25565b6114548161239b565b50565b600082815260016020819052604090912001546114748133611996565b6107d08383611c93565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab6114a98133611996565b6114b1611d25565b61086382612974565b6114c68484848461297e565b6035546114d5906103e8614907565b60665550505050565b6034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561154d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115719190614839565b6115796105ea565b6115839190614881565b905090565b60655460609060008167ffffffffffffffff8111156115a9576115a9614365565b60405190808252806020026020018201604052801561161b57816020015b6116086040518060800160405280606081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b8152602001906001900390816115c75790505b50905060005b828110156119075761166a6040518060800160405280606081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b6065828154811061167d5761167d61480a565b6000918252602082200154604080517f8b202176000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921692638b202176926004808401938290030181865afa1580156116ef573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611735919081019061495b565b8152606580548390811061174b5761174b61480a565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16606082015260658054839081106117865761178661480a565b60009182526020918290200154604080517fc1590cd7000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263c1590cd7926004808401938290030181865afa1580156117fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181e9190614839565b602082015260658054839081106118375761183761480a565b60009182526020918290200154604080517f57ded9c9000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff909216926357ded9c9926004808401938290030181865afa1580156118ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cf9190614839565b6040820152825181908490849081106118ea576118ea61480a565b6020026020010181905250508061190090614894565b9050611621565b5092915050565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626119398133611996565b603380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f17fa25a1c2ac074f71f0cf4f6af525c06fab7d83eff5ffcf6df5277f2919ae2490600090a150565b3b151590565b6119a08282610d47565b610863576119c58173ffffffffffffffffffffffffffffffffffffffff166014612f8a565b6119d0836020612f8a565b6040516020016119e19291906149d2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261085091600401614a53565b6034546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000918291829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611ab2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad69190614839565b9050838110611aea57509192600092509050565b600081611aff611afa8288614a66565b6131d4565b611b099190614881565b9050848110611b1e5750929360009350915050565b946000945092505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526107d09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613578565b611c078282610d47565b61086357600082815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616808652925280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b611c9d8282610d47565b1561086357600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000806000603360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf3759b56040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dbb9190614839565b60335490915060009060ff1615611e18576000611dd6613684565b905082811015611df157611dea8184614a66565b9350611e06565b82811115611e0657611e038382614a66565b94505b611e108484614a66565b915050611e29565b611e218261369c565b919550935090505b6040805185815260208101859052908101829052606081018390527f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d5099060800160405180910390a16033546040517fa1d9bafc00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044810183905261010090910473ffffffffffffffffffffffffffffffffffffffff169063a1d9bafc90606401600060405180830381600087803b158015611eef57600080fd5b505af1158015611f03573d6000803e3d6000fd5b5050505050505050565b61087760005b604051908082528060200260200182016040528015611f3c578160200160208202803683370190505b50604051602001611f4d9190614a79565b60405160208183030381529060405261239b565b60006065805480602002602001604051908101604052809291908181526020018280548015611fc657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611f9b575b505083519394506000925050505b818110156122eb57828181518110611fee57611fee61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036122db57600083828151811061203c5761203c61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663853828b66040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612090573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b49190614ac7565b9050841580156120c2575080155b156120f9576040517fa124823500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612104600184614a66565b821461218a5783612116600185614a66565b815181106121265761212661480a565b6020026020010151606583815481106121415761214161480a565b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b606580548061219b5761219b614ae9565b6000828152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908201810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690550190556034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015612261573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122859190614839565b1561229257612292611f0d565b60405173ffffffffffffffffffffffffffffffffffffffff8716907f95c84dbc5fd872c46b0e4290775a1a4ea1c8d760f9e4d38f48ba71b6f9a667db90600090a2505050505050565b6122e481614894565b9050611fd4565b506040517f30990b6700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051600180825281830190925260609160009190602080830190803683375050603454825192935073ffffffffffffffffffffffffffffffffffffffff16918391506000906123715761237161480a565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152919050565b60335460ff16156123a95750565b6000606580548060200260200160405190810160405280929190818152602001828054801561240e57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116123e3575b505050505090506000815190508060000361242857505050565b60008380602001905181019061243e9190614b18565b905060006060825160001461245c57612456836109b1565b90925090505b60008060008061246b89613a29565b93509350935093508581101561277f576000805b898110156125ac57600087828151811061249b5761249b61480a565b6020026020010151121561259c578a81815181106124bb576124bb61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8883815181106124f0576124f061480a565b602002602001015161250190614ba7565b6040518263ffffffff1660e01b815260040161251f91815260200190565b6020604051808303816000875af115801561253e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125629190614839565b8782815181106125745761257461480a565b602002602001015161258590614ba7565b61258f9190614a66565b6125999083614881565b91505b6125a581614894565b905061247f565b506066548111156125e9576040517f5c3810af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8981101561277857818782815181106126075761260761480a565b6020026020010151131561271e57818782815181106126285761262861480a565b6020026020010181815161263c919061491e565b9052508a51600092506126a0908c908390811061265b5761265b61480a565b60200260200101518883815181106126755761267561480a565b602090810291909101015160345473ffffffffffffffffffffffffffffffffffffffff169190611b29565b8a81815181106126b2576126b261480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561270157600080fd5b505af1158015612715573d6000803e3d6000fd5b50505050612768565b60008782815181106127325761273261480a565b60200260200101511315612768578681815181106127525761275261480a565b6020026020010151826127659190614a66565b91505b61277181614894565b90506125ec565b5050612968565b8115612811578884815181106127975761279761480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663853828b66040518163ffffffff1660e01b81526004016020604051808303816000875af11580156127eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061280f9190614ac7565b505b6034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a49190614839565b90508015612966576128ec8a85815181106128c1576128c161480a565b602090810291909101015160345473ffffffffffffffffffffffffffffffffffffffff169083611b29565b8984815181106128fe576128fe61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561294d57600080fd5b505af1158015612961573d6000803e3d6000fd5b505050505b505b50505050505050505050565b6114546000611f13565b600054610100900460ff166129995760005460ff161561299d565b303b155b612a29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610850565b600054610100900460ff16158015612a6857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b84603360016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550603360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3a919061493e565b603480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169182179055604080517f313ce567000000000000000000000000000000000000000000000000000000008152905163313ce567916004808201926020929091908290030181865afa158015612bd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf69190614bdf565b612c0190600a614d22565b60355573ffffffffffffffffffffffffffffffffffffffff83161580612c3b575073ffffffffffffffffffffffffffffffffffffffff8416155b80612c7157508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b15612ca8576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cd27f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504184613f76565b612cfc7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504185613f76565b612d267f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe56286613f76565b612d507f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe56280613f80565b612d9a7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50417f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe562613f80565b815160005b81811015612e7c57600073ffffffffffffffffffffffffffffffffffffffff16848281518110612dd157612dd161480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603612e26576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e6c7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab60001b858381518110612e5f57612e5f61480a565b6020026020010151613f76565b612e7581614894565b9050612d9f565b50612ec77ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041613f80565b612eda670de0b6b3a76400006064614907565b603655603380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690819055603454612f549173ffffffffffffffffffffffffffffffffffffffff91821691610100909104167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613fd7565b50801561143c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555050505050565b60606000612f99836002614907565b612fa4906002614881565b67ffffffffffffffff811115612fbc57612fbc614365565b6040519080825280601f01601f191660200182016040528015612fe6576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061301d5761301d61480a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106130805761308061480a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006130bc846002614907565b6130c7906001614881565b90505b6001811115613164577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106131085761310861480a565b1a60f81b82828151811061311e5761311e61480a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9361315d81614d31565b90506130ca565b5083156131cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610850565b9392505050565b600080606580548060200260200160405190810160405280929190818152602001828054801561323a57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161320f575b5050505050905060008151905080600003613259575060009392505050565b6066548085101561326f57506000949350505050565b60005b61327c8287614a66565b85101561356f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000805b858110156133ea578681815181106132c2576132c261480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16635be9b2d36040518163ffffffff1660e01b8152600401602060405180830381865afa158015613314573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133389190614ac7565b156133da5760008782815181106133515761335161480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166357ded9c96040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133c79190614839565b9050838110156133d8578093508192505b505b6133e381614894565b90506132a8565b508581815181106133fd576133fd61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16635be9b2d36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561344f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134739190614ac7565b61348257505050505050919050565b60008682815181106134965761349661480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d898b6134c59190614a66565b6040518263ffffffff1660e01b81526004016134e391815260200190565b6020604051808303816000875af1158015613502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135269190614839565b90506135328189614881565b975061353d84614894565b9350806000036135535750505050505050919050565b600684106135675750505050505050919050565b505050613272565b50505050919050565b60006135da826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166140d59092919063ffffffff16565b8051909150156107d057808060200190518101906135f89190614ac7565b6107d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610850565b60006136966136916114de565b611a3f565b50919050565b60008082816136a96105ea565b6034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291925060009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa15801561371d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137419190614839565b9050600061374f8383614881565b90508260000361376d5781841115613765578193505b505050613a22565b6033546040517f39ebf823000000000000000000000000000000000000000000000000000000008152306004820152600091610100900473ffffffffffffffffffffffffffffffffffffffff16906339ebf82390602401606060405180830381865afa1580156137e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138059190614d66565b6020015190508082111561391d5761381d8183614a66565b9650600061382b8689614881565b9050801580159061383b57508084105b156139175761384d611afa8583614a66565b506034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156138bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138e19190614839565b90508181101561391557808911156138ff5780985060009650613915565b61391261390c8a83614a66565b886140ec565b96505b505b50613a1d565b6139278282614a66565b955060006139358688614881565b9050801580159061394557508084105b15613a1b57613957611afa8583614a66565b506034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156139c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139eb9190614839565b905081811015613a195780881115613a095780975060009650613a19565b613a1661390c8983614a66565b96505b505b505b505050505b9193909250565b6034546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600091829182918291829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015613aa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ac49190614839565b905060008060008084905060008a5167ffffffffffffffff811115613aeb57613aeb614365565b604051908082528060200260200182016040528015613b14578160200160208202803683370190505b5090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005b8c51811015613d775760008d8281518110613b5857613b5861480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663a7d385e28a6040518263ffffffff1660e01b8152600401613b9a91815260200190565b602060405180830381865afa158015613bb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bdb9190614839565b905060008e8381518110613bf157613bf161480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663c1590cd76040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c679190614839565b9050613c738187614881565b955087821115613c8757819750809650829c505b603554613c9590600a614907565b811115613d645760008f8481518110613cb057613cb061480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166357ded9c96040518163ffffffff1660e01b8152600401602060405180830381865afa158015613d02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d269190614839565b9050613d328282614907565b868581518110613d4457613d4461480a565b60200260200101818152505084811015613d6257809450819950839e505b505b505080613d7090614894565b9050613b3b565b50508115613f695760008060005b8d51811015613f2e578b8103613e9c5786613da08a88614881565b613daa9190614907565b613db49084614881565b92508715801590613dc6575060018e51115b15613e97578d8c81518110613ddd57613ddd61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663a7d385e28a8a613e0c9190614881565b6040518263ffffffff1660e01b8152600401613e2a91815260200190565b602060405180830381865afa158015613e47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e6b9190614839565b88613e768b89614881565b613e809190614881565b613e8a9190614907565b613e949083614881565b91505b613f1e565b8c8103613ecf57838181518110613eb557613eb561480a565b602002602001015183613ec89190614881565b9250613f1e565b838181518110613ee157613ee161480a565b602002602001015183613ef49190614881565b9250838181518110613f0857613f0861480a565b602002602001015182613f1b9190614881565b91505b613f2781614894565b9050613d85565b508181118015613f3f575060018d51115b15613f595760019950613f5284826148cc565b9850613f66565b613f6384836148cc565b98505b50505b5050505050509193509193565b6108638282611bfd565b60008281526001602081905260409091200154819060405184907fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff90600090a4600091825260016020819052604090922090910155565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801561404e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140729190614839565b61407c9190614881565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506111209085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611b7b565b60606140e48484600085614102565b949350505050565b60008183106140fb57816131cd565b5090919050565b606082471015614194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610850565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516141bd9190614dc2565b60006040518083038185875af1925050503d80600081146141fa576040519150601f19603f3d011682016040523d82523d6000602084013e6141ff565b606091505b50915091506142108783838761421b565b979650505050505050565b606083156142b15782516000036142aa5773ffffffffffffffffffffffffffffffffffffffff85163b6142aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610850565b50816140e4565b6140e483838151156142c65781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108509190614a53565b60006020828403121561430c57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461145457600080fd5b6000806040838503121561434857600080fd5b82359150602083013561435a81614313565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156143db576143db614365565b604052919050565b600067ffffffffffffffff8211156143fd576143fd614365565b5060051b60200190565b67ffffffffffffffff8116811461145457600080fd5b6000602080838503121561443057600080fd5b823567ffffffffffffffff81111561444757600080fd5b8301601f8101851361445857600080fd5b803561446b614466826143e3565b614394565b81815260059190911b8201830190838101908783111561448a57600080fd5b928401925b828410156142105783356144a281614407565b8252928401929084019061448f565b6000604082018483526020604081850152818551808452606086019150828701935060005b818110156144f2578451835293830193918301916001016144d6565b5090979650505050505050565b60006020828403121561451157600080fd5b81356131cd81614313565b6000806040838503121561452f57600080fd5b823561453a81614313565b9150602083013561435a81614313565b600067ffffffffffffffff82111561456457614564614365565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b6000602082840312156145a257600080fd5b813567ffffffffffffffff8111156145b957600080fd5b8201601f810184136145ca57600080fd5b80356145d86144668261454a565b8181528560208385010111156145ed57600080fd5b81602084016020830137600091810160200191909152949350505050565b6000806000806080858703121561462157600080fd5b843561462c81614313565b935060208581013561463d81614313565b9350604086013561464d81614313565b9250606086013567ffffffffffffffff81111561466957600080fd5b8601601f8101881361467a57600080fd5b8035614688614466826143e3565b81815260059190911b8201830190838101908a8311156146a757600080fd5b928401925b828410156146ce5783356146bf81614313565b825292840192908401906146ac565b979a9699509497505050505050565b60005b838110156146f85781810151838201526020016146e0565b50506000910152565b600081518084526147198160208601602086016146dd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156147fc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08984030185528151608081518186526147b682870182614701565b838b0151878c0152898401518a88015260609384015173ffffffffffffffffffffffffffffffffffffffff16939096019290925250509386019390860190600101614772565b509098975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561484b57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610d7b57610d7b614852565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148c5576148c5614852565b5060010190565b600082614902577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082028115828204841417610d7b57610d7b614852565b818103600083128015838313168383128216171561190757611907614852565b60006020828403121561495057600080fd5b81516131cd81614313565b60006020828403121561496d57600080fd5b815167ffffffffffffffff81111561498457600080fd5b8201601f8101841361499557600080fd5b80516149a36144668261454a565b8181528560208385010111156149b857600080fd5b6149c98260208301602086016146dd565b95945050505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351614a0a8160178501602088016146dd565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351614a478160288401602088016146dd565b01602801949350505050565b6020815260006131cd6020830184614701565b81810381811115610d7b57610d7b614852565b6020808252825182820181905260009190848201906040850190845b81811015614abb57835167ffffffffffffffff1683529284019291840191600101614a95565b50909695505050505050565b600060208284031215614ad957600080fd5b815180151581146131cd57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006020808385031215614b2b57600080fd5b825167ffffffffffffffff811115614b4257600080fd5b8301601f81018513614b5357600080fd5b8051614b61614466826143e3565b81815260059190911b82018301908381019087831115614b8057600080fd5b928401925b82841015614210578351614b9881614407565b82529284019290840190614b85565b60007f80000000000000000000000000000000000000000000000000000000000000008203614bd857614bd8614852565b5060000390565b600060208284031215614bf157600080fd5b815160ff811681146131cd57600080fd5b600181815b80851115614c5b57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614c4157614c41614852565b80851615614c4e57918102915b93841c9390800290614c07565b509250929050565b600082614c7257506001610d7b565b81614c7f57506000610d7b565b8160018114614c955760028114614c9f57614cbb565b6001915050610d7b565b60ff841115614cb057614cb0614852565b50506001821b610d7b565b5060208310610133831016604e8410600b8410161715614cde575081810a610d7b565b614ce88383614c02565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614d1a57614d1a614852565b029392505050565b60006131cd60ff841683614c63565b600081614d4057614d40614852565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600060608284031215614d7857600080fd5b6040516060810181811067ffffffffffffffff82111715614d9b57614d9b614365565b80604052508251815260208301516020820152604083015160408201528091505092915050565b60008251614dd48184602087016146dd565b919091019291505056fea2646970667358221220c87a76c31f0456ef0717d5130419ac6f77b92dd570dccd680f54c8fcb72977f364736f6c63430008110033", + "nonce": "0x1b1", + "accessList": [] + }, + "additionalContracts": [] + } + ], + "receipts": [ + { + "transactionHash": "0x51120d75e4d4f05a8ad12ec0e27a53c15781303a1e6ed0cd30ffc8516904e7ef", + "transactionIndex": "0x46", + "blockHash": "0xeafb91a3859697e0efa830246e49715c3a64bed1ca5853c42ed8401cc7785df9", + "blockNumber": "0x25489e2", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0xd8e244", + "gasUsed": "0x42ca9d", + "contractAddress": "0x58f3684712E776980000EF1C6a79Ba5CA0518373", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185", + "0x00000000000000000000000026c80cc193b27d73d2c40943acec77f4da2c5bd8" + ], + "data": "0x00000000000000000000000000000000000000000000000002bc8f6b55478425000000000000000000000000000000000000000000000001bd3919c0dec492110000000000000000000000000000000000000000000001e56d15948edf473727000000000000000000000000000000000000000000000001ba7c8a55897d0dec0000000000000000000000000000000000000000000001e56fd223fa348ebb4c", + "blockHash": "0xeafb91a3859697e0efa830246e49715c3a64bed1ca5853c42ed8401cc7785df9", + "blockNumber": "0x25489e2", + "transactionHash": "0x51120d75e4d4f05a8ad12ec0e27a53c15781303a1e6ed0cd30ffc8516904e7ef", + "transactionIndex": "0x46", + "logIndex": "0xf9", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000108000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000002000000000000000000000000200000040000100000000000000000000000000000000000000000000000005000000000000000000001000000000000000800000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x4b1c10dc0b" + } + ], + "libraries": [], + "pending": [], + "path": "/Users/gnervo/Documents/Angle/strategies-dev/broadcast/MigrationOptimizerAPRUSDC.s.sol/137/run-latest.json", + "returns": {}, + "timestamp": 1675942414, + "chain": 137, + "multi": false, + "commit": "f38f269" +} \ No newline at end of file diff --git a/broadcast/MigrationOptimizerAPRUSDC.s.sol/137/run-latest.json b/broadcast/MigrationOptimizerAPRUSDC.s.sol/137/run-latest.json new file mode 100644 index 0000000..0422501 --- /dev/null +++ b/broadcast/MigrationOptimizerAPRUSDC.s.sol/137/run-latest.json @@ -0,0 +1,66 @@ +{ + "transactions": [ + { + "hash": "0x51120d75e4d4f05a8ad12ec0e27a53c15781303a1e6ed0cd30ffc8516904e7ef", + "transactionType": "CREATE", + "contractName": "OptimizerAPRStrategy", + "contractAddress": "0x58f3684712E776980000EF1C6a79Ba5CA0518373", + "function": null, + "arguments": null, + "rpc": "https://polygon-mainnet.g.alchemy.com/v2/IJTj5SikhXCIV_a021XV2xpbLL8ibwUP", + "transaction": { + "type": "0x02", + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "gas": "0x56d432", + "value": "0x0", + "data": "0x60806040523480156200001157600080fd5b50600054610100900460ff166200002f5760005460ff161562000039565b62000039620000de565b620000a15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b600054610100900460ff16158015620000c4576000805461ffff19166101011790555b8015620000d7576000805461ff00191690555b5062000102565b6000620000f630620000fc60201b620019901760201c565b15905090565b3b151590565b614e1480620001126000396000f3fe608060405234801561001057600080fd5b50600436106102ad5760003560e01c80637985fd511161017b578063ce5c7f61116100d8578063e6bfbfd81161008c578063efbb5cb011610071578063efbb5cb0146105c5578063fcc5f59a146105cd578063fcf2d0ad146105e257600080fd5b8063e6bfbfd8146105a3578063ec342ad0146105b657600080fd5b8063dc4c90d3116100bd578063dc4c90d314610560578063ddc6326214610585578063e6a69ab81461059857600080fd5b8063ce5c7f611461053a578063d547741f1461054d57600080fd5b8063a217fddf1161012f578063af648c3d11610114578063af648c3d1461050c578063b8dc491b1461051f578063bb927c461461053257600080fd5b8063a217fddf146104f1578063a526d83b146104f957600080fd5b806391d148541161016057806391d14854146104b8578063929eea21146104cb57806393084b34146104de57600080fd5b80637985fd511461049c5780638baf2957146104a557600080fd5b80632e1a7d4d116102295780634786b0cb116101dd5780635a5cd45e116101c25780635a5cd45e14610460578063708ba9bd1461046857806376ee75d81461048957600080fd5b80634786b0cb146104405780635641ec031461045357600080fd5b8063364bc15a1161020e578063364bc15a146103fe57806336568abe146104255780634641257d1461043857600080fd5b80632e1a7d4d146103c35780632f2ff15d146103eb57600080fd5b80631d12f28b1161028057806322f3e2d41161026557806322f3e2d414610360578063248a9ca31461037857806324ea54f41461039c57600080fd5b80631d12f28b146103125780631f1fcd511461031b57600080fd5b80630b6d1d17146102b25780630c016dc0146102ce5780630e6e15f0146102f55780630f969b87146102fd575b600080fd5b6102bb60355481565b6040519081526020015b60405180910390f35b6102bb7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe56281565b6102bb6105ea565b61031061030b3660046142fa565b6106cb565b005b6102bb60365481565b60345461033b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102c5565b610368610732565b60405190151581526020016102c5565b6102bb6103863660046142fa565b6000908152600160208190526040909120015490565b6102bb7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504181565b6103d66103d13660046142fa565b610743565b604080519283526020830191909152016102c5565b6103106103f9366004614335565b6107a9565b6102bb7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab81565b610310610433366004614335565b6107d5565b610310610867565b61031061044e3660046142fa565b610879565b6033546103689060ff1681565b6102bb6108aa565b61047b61047636600461441d565b6109b1565b6040516102c59291906144b1565b6103106104973660046144ff565b610cdb565b6102bb60665481565b6103106104b33660046144ff565b610d11565b6103686104c6366004614335565b610d47565b61033b6104d93660046142fa565b610d81565b6103106104ec3660046144ff565b610db8565b6102bb600081565b6103106105073660046144ff565b610fe5565b61031061051a3660046144ff565b611126565b61031061052d36600461451c565b611261565b6065546102bb565b610310610548366004614590565b611443565b61031061055b366004614335565b611457565b60335461033b90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6103106105933660046142fa565b61147e565b6102bb6301e1855881565b6103106105b136600461460b565b6114ba565b6102bb670de0b6b3a764000081565b6102bb6114de565b6105d5611588565b6040516102c5919061474b565b61031061190e565b6065546000908190815b818110156106c3576065818154811061060f5761060f61480a565b60009182526020918290200154604080517fc1590cd7000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263c1590cd7926004808401938290030181865afa158015610683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a79190614839565b6106b19084614881565b92506106bc81614894565b90506105f4565b509092915050565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50416106f68133611996565b60368290556040518281527fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a86009060200160405180910390a15050565b600061073c6114de565b1515919050565b6000807f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626107718133611996565b61077a84611a3f565b60345491945092506107a39073ffffffffffffffffffffffffffffffffffffffff163385611b29565b50915091565b600082815260016020819052604090912001546107c68133611996565b6107d08383611bfd565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f373100000000000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6108638282611c93565b5050565b61086f611d25565b610877611f0d565b565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50416108a48133611996565b50606655565b6000806108b56114de565b9050806000036108c757600091505090565b606554600090815b8181101561099e57606581815481106108ea576108ea61480a565b60009182526020918290200154604080517f116ac4a3000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263116ac4a3926004808401938290030181865afa15801561095e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109829190614839565b61098c9084614881565b925061099781614894565b90506108cf565b506109a983836148cc565b935050505090565b6065546000906060908067ffffffffffffffff8111156109d3576109d3614365565b6040519080825280602002602001820160405280156109fc578160200160208202803683370190505b50915083518114610a39576040517fcdeedcbd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610a436114de565b905080600003610a54575050915091565b6000805b83811015610c8b57868181518110610a7257610a7261480a565b602002602001015167ffffffffffffffff1682610a8f9190614881565b9150600061271067ffffffffffffffff16888381518110610ab257610ab261480a565b602002602001015167ffffffffffffffff1685610acf9190614907565b610ad991906148cc565b9050600060658381548110610af057610af061480a565b60009182526020918290200154604080517fc1590cd7000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263c1590cd7926004808401938290030181865afa158015610b64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b889190614839565b610b92908361491e565b905080878481518110610ba757610ba761480a565b60200260200101818152505060658381548110610bc657610bc661480a565b6000918252602090912001546040517fa7d385e20000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff9091169063a7d385e290602401602060405180830381865afa158015610c3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c629190614839565b610c6c9083614907565b610c769089614881565b9750505080610c8490614894565b9050610a58565b508061271014610cc7576040517f6edcc52300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cd182866148cc565b9450505050915091565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610d068133611996565b610863826001611f61565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab610d3c8133611996565b610863826000611f61565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff165b92915050565b60658181548110610d9157600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610de38133611996565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663a8c62e766040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e69919061493e565b73ffffffffffffffffffffffffffffffffffffffff1614610eb6576040517feeacc72d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60655460005b81811015610f455760658181548110610ed757610ed761480a565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff90811690851603610f35576040517f7cc7731c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f3e81614894565b9050610ebc565b506065805460018101825560009182527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915560405190917f1e7b117a6591133f0b36fc2c24d59f8465d806fdcad63aa33246b45fd62c89ff91a2505050565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626110108133611996565b61103a7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504183611bfd565b60655460005b81811015611120576065818154811061105b5761105b61480a565b6000918252602090912001546040517f2f2ff15d0000000000000000000000000000000000000000000000000000000081527f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041600482015273ffffffffffffffffffffffffffffffffffffffff868116602483015290911690632f2ff15d90604401600060405180830381600087803b1580156110f757600080fd5b505af115801561110b573d6000803e3d6000fd5b505050508061111990614894565b9050611040565b50505050565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626111518133611996565b61117b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504183611c93565b60655460005b81811015611120576065818154811061119c5761119c61480a565b6000918252602090912001546040517fd547741f0000000000000000000000000000000000000000000000000000000081527f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041600482015273ffffffffffffffffffffffffffffffffffffffff86811660248301529091169063d547741f90604401600060405180830381600087803b15801561123857600080fd5b505af115801561124c573d6000803e3d6000fd5b505050508061125a90614894565b9050611181565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504161128c8133611996565b60345473ffffffffffffffffffffffffffffffffffffffff908116908416036112e1576040517fc1ab6dc100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112eb61231e565b805190915060005b818110156113895782818151811061130d5761130d61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603611379576040517fc1ab6dc100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138281614894565b90506112f3565b506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015261143c90859073ffffffffffffffffffffffffffffffffffffffff8816906370a0823190602401602060405180830381865afa1580156113fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141e9190614839565b73ffffffffffffffffffffffffffffffffffffffff88169190611b29565b5050505050565b61144b611d25565b6114548161239b565b50565b600082815260016020819052604090912001546114748133611996565b6107d08383611c93565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab6114a98133611996565b6114b1611d25565b61086382612974565b6114c68484848461297e565b6035546114d5906103e8614907565b60665550505050565b6034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561154d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115719190614839565b6115796105ea565b6115839190614881565b905090565b60655460609060008167ffffffffffffffff8111156115a9576115a9614365565b60405190808252806020026020018201604052801561161b57816020015b6116086040518060800160405280606081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b8152602001906001900390816115c75790505b50905060005b828110156119075761166a6040518060800160405280606081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b6065828154811061167d5761167d61480a565b6000918252602082200154604080517f8b202176000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921692638b202176926004808401938290030181865afa1580156116ef573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611735919081019061495b565b8152606580548390811061174b5761174b61480a565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16606082015260658054839081106117865761178661480a565b60009182526020918290200154604080517fc1590cd7000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263c1590cd7926004808401938290030181865afa1580156117fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181e9190614839565b602082015260658054839081106118375761183761480a565b60009182526020918290200154604080517f57ded9c9000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff909216926357ded9c9926004808401938290030181865afa1580156118ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cf9190614839565b6040820152825181908490849081106118ea576118ea61480a565b6020026020010181905250508061190090614894565b9050611621565b5092915050565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5626119398133611996565b603380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f17fa25a1c2ac074f71f0cf4f6af525c06fab7d83eff5ffcf6df5277f2919ae2490600090a150565b3b151590565b6119a08282610d47565b610863576119c58173ffffffffffffffffffffffffffffffffffffffff166014612f8a565b6119d0836020612f8a565b6040516020016119e19291906149d2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261085091600401614a53565b6034546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000918291829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611ab2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad69190614839565b9050838110611aea57509192600092509050565b600081611aff611afa8288614a66565b6131d4565b611b099190614881565b9050848110611b1e5750929360009350915050565b946000945092505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526107d09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613578565b611c078282610d47565b61086357600082815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616808652925280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b611c9d8282610d47565b1561086357600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000806000603360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf3759b56040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dbb9190614839565b60335490915060009060ff1615611e18576000611dd6613684565b905082811015611df157611dea8184614a66565b9350611e06565b82811115611e0657611e038382614a66565b94505b611e108484614a66565b915050611e29565b611e218261369c565b919550935090505b6040805185815260208101859052908101829052606081018390527f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d5099060800160405180910390a16033546040517fa1d9bafc00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044810183905261010090910473ffffffffffffffffffffffffffffffffffffffff169063a1d9bafc90606401600060405180830381600087803b158015611eef57600080fd5b505af1158015611f03573d6000803e3d6000fd5b5050505050505050565b61087760005b604051908082528060200260200182016040528015611f3c578160200160208202803683370190505b50604051602001611f4d9190614a79565b60405160208183030381529060405261239b565b60006065805480602002602001604051908101604052809291908181526020018280548015611fc657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611f9b575b505083519394506000925050505b818110156122eb57828181518110611fee57611fee61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036122db57600083828151811061203c5761203c61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663853828b66040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612090573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b49190614ac7565b9050841580156120c2575080155b156120f9576040517fa124823500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612104600184614a66565b821461218a5783612116600185614a66565b815181106121265761212661480a565b6020026020010151606583815481106121415761214161480a565b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b606580548061219b5761219b614ae9565b6000828152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908201810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690550190556034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015612261573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122859190614839565b1561229257612292611f0d565b60405173ffffffffffffffffffffffffffffffffffffffff8716907f95c84dbc5fd872c46b0e4290775a1a4ea1c8d760f9e4d38f48ba71b6f9a667db90600090a2505050505050565b6122e481614894565b9050611fd4565b506040517f30990b6700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051600180825281830190925260609160009190602080830190803683375050603454825192935073ffffffffffffffffffffffffffffffffffffffff16918391506000906123715761237161480a565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152919050565b60335460ff16156123a95750565b6000606580548060200260200160405190810160405280929190818152602001828054801561240e57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116123e3575b505050505090506000815190508060000361242857505050565b60008380602001905181019061243e9190614b18565b905060006060825160001461245c57612456836109b1565b90925090505b60008060008061246b89613a29565b93509350935093508581101561277f576000805b898110156125ac57600087828151811061249b5761249b61480a565b6020026020010151121561259c578a81815181106124bb576124bb61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8883815181106124f0576124f061480a565b602002602001015161250190614ba7565b6040518263ffffffff1660e01b815260040161251f91815260200190565b6020604051808303816000875af115801561253e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125629190614839565b8782815181106125745761257461480a565b602002602001015161258590614ba7565b61258f9190614a66565b6125999083614881565b91505b6125a581614894565b905061247f565b506066548111156125e9576040517f5c3810af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8981101561277857818782815181106126075761260761480a565b6020026020010151131561271e57818782815181106126285761262861480a565b6020026020010181815161263c919061491e565b9052508a51600092506126a0908c908390811061265b5761265b61480a565b60200260200101518883815181106126755761267561480a565b602090810291909101015160345473ffffffffffffffffffffffffffffffffffffffff169190611b29565b8a81815181106126b2576126b261480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561270157600080fd5b505af1158015612715573d6000803e3d6000fd5b50505050612768565b60008782815181106127325761273261480a565b60200260200101511315612768578681815181106127525761275261480a565b6020026020010151826127659190614a66565b91505b61277181614894565b90506125ec565b5050612968565b8115612811578884815181106127975761279761480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663853828b66040518163ffffffff1660e01b81526004016020604051808303816000875af11580156127eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061280f9190614ac7565b505b6034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a49190614839565b90508015612966576128ec8a85815181106128c1576128c161480a565b602090810291909101015160345473ffffffffffffffffffffffffffffffffffffffff169083611b29565b8984815181106128fe576128fe61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561294d57600080fd5b505af1158015612961573d6000803e3d6000fd5b505050505b505b50505050505050505050565b6114546000611f13565b600054610100900460ff166129995760005460ff161561299d565b303b155b612a29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610850565b600054610100900460ff16158015612a6857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b84603360016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550603360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3a919061493e565b603480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169182179055604080517f313ce567000000000000000000000000000000000000000000000000000000008152905163313ce567916004808201926020929091908290030181865afa158015612bd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf69190614bdf565b612c0190600a614d22565b60355573ffffffffffffffffffffffffffffffffffffffff83161580612c3b575073ffffffffffffffffffffffffffffffffffffffff8416155b80612c7157508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b15612ca8576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cd27f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504184613f76565b612cfc7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504185613f76565b612d267f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe56286613f76565b612d507f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe56280613f80565b612d9a7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50417f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe562613f80565b815160005b81811015612e7c57600073ffffffffffffffffffffffffffffffffffffffff16848281518110612dd157612dd161480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603612e26576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e6c7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab60001b858381518110612e5f57612e5f61480a565b6020026020010151613f76565b612e7581614894565b9050612d9f565b50612ec77ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041613f80565b612eda670de0b6b3a76400006064614907565b603655603380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690819055603454612f549173ffffffffffffffffffffffffffffffffffffffff91821691610100909104167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613fd7565b50801561143c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555050505050565b60606000612f99836002614907565b612fa4906002614881565b67ffffffffffffffff811115612fbc57612fbc614365565b6040519080825280601f01601f191660200182016040528015612fe6576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061301d5761301d61480a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106130805761308061480a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006130bc846002614907565b6130c7906001614881565b90505b6001811115613164577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106131085761310861480a565b1a60f81b82828151811061311e5761311e61480a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9361315d81614d31565b90506130ca565b5083156131cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610850565b9392505050565b600080606580548060200260200160405190810160405280929190818152602001828054801561323a57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161320f575b5050505050905060008151905080600003613259575060009392505050565b6066548085101561326f57506000949350505050565b60005b61327c8287614a66565b85101561356f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000805b858110156133ea578681815181106132c2576132c261480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16635be9b2d36040518163ffffffff1660e01b8152600401602060405180830381865afa158015613314573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133389190614ac7565b156133da5760008782815181106133515761335161480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166357ded9c96040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133c79190614839565b9050838110156133d8578093508192505b505b6133e381614894565b90506132a8565b508581815181106133fd576133fd61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16635be9b2d36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561344f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134739190614ac7565b61348257505050505050919050565b60008682815181106134965761349661480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d898b6134c59190614a66565b6040518263ffffffff1660e01b81526004016134e391815260200190565b6020604051808303816000875af1158015613502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135269190614839565b90506135328189614881565b975061353d84614894565b9350806000036135535750505050505050919050565b600684106135675750505050505050919050565b505050613272565b50505050919050565b60006135da826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166140d59092919063ffffffff16565b8051909150156107d057808060200190518101906135f89190614ac7565b6107d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610850565b60006136966136916114de565b611a3f565b50919050565b60008082816136a96105ea565b6034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291925060009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa15801561371d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137419190614839565b9050600061374f8383614881565b90508260000361376d5781841115613765578193505b505050613a22565b6033546040517f39ebf823000000000000000000000000000000000000000000000000000000008152306004820152600091610100900473ffffffffffffffffffffffffffffffffffffffff16906339ebf82390602401606060405180830381865afa1580156137e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138059190614d66565b6020015190508082111561391d5761381d8183614a66565b9650600061382b8689614881565b9050801580159061383b57508084105b156139175761384d611afa8583614a66565b506034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156138bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138e19190614839565b90508181101561391557808911156138ff5780985060009650613915565b61391261390c8a83614a66565b886140ec565b96505b505b50613a1d565b6139278282614a66565b955060006139358688614881565b9050801580159061394557508084105b15613a1b57613957611afa8583614a66565b506034546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156139c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139eb9190614839565b905081811015613a195780881115613a095780975060009650613a19565b613a1661390c8983614a66565b96505b505b505b505050505b9193909250565b6034546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600091829182918291829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015613aa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ac49190614839565b905060008060008084905060008a5167ffffffffffffffff811115613aeb57613aeb614365565b604051908082528060200260200182016040528015613b14578160200160208202803683370190505b5090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005b8c51811015613d775760008d8281518110613b5857613b5861480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663a7d385e28a6040518263ffffffff1660e01b8152600401613b9a91815260200190565b602060405180830381865afa158015613bb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bdb9190614839565b905060008e8381518110613bf157613bf161480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663c1590cd76040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c679190614839565b9050613c738187614881565b955087821115613c8757819750809650829c505b603554613c9590600a614907565b811115613d645760008f8481518110613cb057613cb061480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166357ded9c96040518163ffffffff1660e01b8152600401602060405180830381865afa158015613d02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d269190614839565b9050613d328282614907565b868581518110613d4457613d4461480a565b60200260200101818152505084811015613d6257809450819950839e505b505b505080613d7090614894565b9050613b3b565b50508115613f695760008060005b8d51811015613f2e578b8103613e9c5786613da08a88614881565b613daa9190614907565b613db49084614881565b92508715801590613dc6575060018e51115b15613e97578d8c81518110613ddd57613ddd61480a565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663a7d385e28a8a613e0c9190614881565b6040518263ffffffff1660e01b8152600401613e2a91815260200190565b602060405180830381865afa158015613e47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e6b9190614839565b88613e768b89614881565b613e809190614881565b613e8a9190614907565b613e949083614881565b91505b613f1e565b8c8103613ecf57838181518110613eb557613eb561480a565b602002602001015183613ec89190614881565b9250613f1e565b838181518110613ee157613ee161480a565b602002602001015183613ef49190614881565b9250838181518110613f0857613f0861480a565b602002602001015182613f1b9190614881565b91505b613f2781614894565b9050613d85565b508181118015613f3f575060018d51115b15613f595760019950613f5284826148cc565b9850613f66565b613f6384836148cc565b98505b50505b5050505050509193509193565b6108638282611bfd565b60008281526001602081905260409091200154819060405184907fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff90600090a4600091825260016020819052604090922090910155565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801561404e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140729190614839565b61407c9190614881565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506111209085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611b7b565b60606140e48484600085614102565b949350505050565b60008183106140fb57816131cd565b5090919050565b606082471015614194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610850565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516141bd9190614dc2565b60006040518083038185875af1925050503d80600081146141fa576040519150601f19603f3d011682016040523d82523d6000602084013e6141ff565b606091505b50915091506142108783838761421b565b979650505050505050565b606083156142b15782516000036142aa5773ffffffffffffffffffffffffffffffffffffffff85163b6142aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610850565b50816140e4565b6140e483838151156142c65781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108509190614a53565b60006020828403121561430c57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461145457600080fd5b6000806040838503121561434857600080fd5b82359150602083013561435a81614313565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156143db576143db614365565b604052919050565b600067ffffffffffffffff8211156143fd576143fd614365565b5060051b60200190565b67ffffffffffffffff8116811461145457600080fd5b6000602080838503121561443057600080fd5b823567ffffffffffffffff81111561444757600080fd5b8301601f8101851361445857600080fd5b803561446b614466826143e3565b614394565b81815260059190911b8201830190838101908783111561448a57600080fd5b928401925b828410156142105783356144a281614407565b8252928401929084019061448f565b6000604082018483526020604081850152818551808452606086019150828701935060005b818110156144f2578451835293830193918301916001016144d6565b5090979650505050505050565b60006020828403121561451157600080fd5b81356131cd81614313565b6000806040838503121561452f57600080fd5b823561453a81614313565b9150602083013561435a81614313565b600067ffffffffffffffff82111561456457614564614365565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b6000602082840312156145a257600080fd5b813567ffffffffffffffff8111156145b957600080fd5b8201601f810184136145ca57600080fd5b80356145d86144668261454a565b8181528560208385010111156145ed57600080fd5b81602084016020830137600091810160200191909152949350505050565b6000806000806080858703121561462157600080fd5b843561462c81614313565b935060208581013561463d81614313565b9350604086013561464d81614313565b9250606086013567ffffffffffffffff81111561466957600080fd5b8601601f8101881361467a57600080fd5b8035614688614466826143e3565b81815260059190911b8201830190838101908a8311156146a757600080fd5b928401925b828410156146ce5783356146bf81614313565b825292840192908401906146ac565b979a9699509497505050505050565b60005b838110156146f85781810151838201526020016146e0565b50506000910152565b600081518084526147198160208601602086016146dd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156147fc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08984030185528151608081518186526147b682870182614701565b838b0151878c0152898401518a88015260609384015173ffffffffffffffffffffffffffffffffffffffff16939096019290925250509386019390860190600101614772565b509098975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561484b57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610d7b57610d7b614852565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148c5576148c5614852565b5060010190565b600082614902577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082028115828204841417610d7b57610d7b614852565b818103600083128015838313168383128216171561190757611907614852565b60006020828403121561495057600080fd5b81516131cd81614313565b60006020828403121561496d57600080fd5b815167ffffffffffffffff81111561498457600080fd5b8201601f8101841361499557600080fd5b80516149a36144668261454a565b8181528560208385010111156149b857600080fd5b6149c98260208301602086016146dd565b95945050505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351614a0a8160178501602088016146dd565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351614a478160288401602088016146dd565b01602801949350505050565b6020815260006131cd6020830184614701565b81810381811115610d7b57610d7b614852565b6020808252825182820181905260009190848201906040850190845b81811015614abb57835167ffffffffffffffff1683529284019291840191600101614a95565b50909695505050505050565b600060208284031215614ad957600080fd5b815180151581146131cd57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006020808385031215614b2b57600080fd5b825167ffffffffffffffff811115614b4257600080fd5b8301601f81018513614b5357600080fd5b8051614b61614466826143e3565b81815260059190911b82018301908381019087831115614b8057600080fd5b928401925b82841015614210578351614b9881614407565b82529284019290840190614b85565b60007f80000000000000000000000000000000000000000000000000000000000000008203614bd857614bd8614852565b5060000390565b600060208284031215614bf157600080fd5b815160ff811681146131cd57600080fd5b600181815b80851115614c5b57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614c4157614c41614852565b80851615614c4e57918102915b93841c9390800290614c07565b509250929050565b600082614c7257506001610d7b565b81614c7f57506000610d7b565b8160018114614c955760028114614c9f57614cbb565b6001915050610d7b565b60ff841115614cb057614cb0614852565b50506001821b610d7b565b5060208310610133831016604e8410600b8410161715614cde575081810a610d7b565b614ce88383614c02565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614d1a57614d1a614852565b029392505050565b60006131cd60ff841683614c63565b600081614d4057614d40614852565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600060608284031215614d7857600080fd5b6040516060810181811067ffffffffffffffff82111715614d9b57614d9b614365565b80604052508251815260208301516020820152604083015160408201528091505092915050565b60008251614dd48184602087016146dd565b919091019291505056fea2646970667358221220c87a76c31f0456ef0717d5130419ac6f77b92dd570dccd680f54c8fcb72977f364736f6c63430008110033", + "nonce": "0x1b1", + "accessList": [] + }, + "additionalContracts": [] + } + ], + "receipts": [ + { + "transactionHash": "0x51120d75e4d4f05a8ad12ec0e27a53c15781303a1e6ed0cd30ffc8516904e7ef", + "transactionIndex": "0x46", + "blockHash": "0xeafb91a3859697e0efa830246e49715c3a64bed1ca5853c42ed8401cc7785df9", + "blockNumber": "0x25489e2", + "from": "0xfdA462548Ce04282f4B6D6619823a7C64Fdc0185", + "to": null, + "cumulativeGasUsed": "0xd8e244", + "gasUsed": "0x42ca9d", + "contractAddress": "0x58f3684712E776980000EF1C6a79Ba5CA0518373", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185", + "0x00000000000000000000000026c80cc193b27d73d2c40943acec77f4da2c5bd8" + ], + "data": "0x00000000000000000000000000000000000000000000000002bc8f6b55478425000000000000000000000000000000000000000000000001bd3919c0dec492110000000000000000000000000000000000000000000001e56d15948edf473727000000000000000000000000000000000000000000000001ba7c8a55897d0dec0000000000000000000000000000000000000000000001e56fd223fa348ebb4c", + "blockHash": "0xeafb91a3859697e0efa830246e49715c3a64bed1ca5853c42ed8401cc7785df9", + "blockNumber": "0x25489e2", + "transactionHash": "0x51120d75e4d4f05a8ad12ec0e27a53c15781303a1e6ed0cd30ffc8516904e7ef", + "transactionIndex": "0x46", + "logIndex": "0xf9", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000108000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000002000000000000000000000000200000040000100000000000000000000000000000000000000000000000005000000000000000000001000000000000000800000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "effectiveGasPrice": "0x4b1c10dc0b" + } + ], + "libraries": [], + "pending": [], + "path": "/Users/gnervo/Documents/Angle/strategies-dev/broadcast/MigrationOptimizerAPRUSDC.s.sol/137/run-latest.json", + "returns": {}, + "timestamp": 1675942414, + "chain": 137, + "multi": false, + "commit": "f38f269" +} \ No newline at end of file diff --git a/contracts/interfaces/IAngleHelper.sol b/contracts/interfaces/IAngleHelper.sol new file mode 100644 index 0000000..9efa734 --- /dev/null +++ b/contracts/interfaces/IAngleHelper.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity ^0.8.12; + +struct PerpetualManagerFeeData { + uint64[] xHAFeesDeposit; + uint64[] yHAFeesDeposit; + uint64[] xHAFeesWithdraw; + uint64[] yHAFeesWithdraw; + uint64 haBonusMalusDeposit; + uint64 haBonusMalusWithdraw; +} + +struct PerpetualManagerParamData { + uint64 maintenanceMargin; + uint64 maxLeverage; + uint64 targetHAHedge; + uint64 limitHAHedge; + uint64 lockTime; +} + +struct CollateralAddresses { + address stableMaster; + address poolManager; + address perpetualManager; + address sanToken; + address oracle; + address gauge; + address feeManager; + address[] strategies; +} + +interface IAngleHelper { + function getCollateralAddresses(address agToken, address collateral) + external + view + returns (CollateralAddresses memory addresses); + + function getStablecoinAddresses() external view returns (address[] memory, address[] memory); + + function getPoolManager(address agToken, address collateral) external view returns (address poolManager); +} diff --git a/contracts/strategies/BaseStrategyUpgradeable.sol b/contracts/strategies/BaseStrategyUpgradeable.sol index da74091..a265d74 100644 --- a/contracts/strategies/BaseStrategyUpgradeable.sol +++ b/contracts/strategies/BaseStrategyUpgradeable.sol @@ -51,19 +51,12 @@ abstract contract BaseStrategyUpgradeable is BaseStrategyEvents, AccessControlAn uint256 public constant BASE = 10**18; uint256 public constant SECONDS_PER_YEAR = 31556952; - // /// @notice Role for `PoolManager` only - keccak256("POOLMANAGER_ROLE") - // bytes32 public constant POOLMANAGER_ROLE = 0x5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe562; - // /// @notice Role for guardians and governors - keccak256("GUARDIAN_ROLE") - // bytes32 public constant GUARDIAN_ROLE = 0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041; - // /// @notice Role for keepers - keccak256("KEEPER_ROLE") - // bytes32 public constant KEEPER_ROLE = 0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab; - - /// @notice Role for `PoolManager` only - bytes32 public constant POOLMANAGER_ROLE = keccak256("POOLMANAGER_ROLE"); - /// @notice Role for guardians and governors - bytes32 public constant GUARDIAN_ROLE = keccak256("GUARDIAN_ROLE"); - /// @notice Role for keepers - bytes32 public constant KEEPER_ROLE = keccak256("KEEPER_ROLE"); + /// @notice Role for `PoolManager` only - keccak256("POOLMANAGER_ROLE") + bytes32 public constant POOLMANAGER_ROLE = 0x5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe562; + /// @notice Role for guardians and governors - keccak256("GUARDIAN_ROLE") + bytes32 public constant GUARDIAN_ROLE = 0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041; + /// @notice Role for keepers - keccak256("KEEPER_ROLE") + bytes32 public constant KEEPER_ROLE = 0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab; // ================================= REFERENCES ================================ diff --git a/contracts/strategies/OptimizerAPR/OptimizerAPRStrategy.sol b/contracts/strategies/OptimizerAPR/OptimizerAPRStrategy.sol index c515b5d..cdffdd0 100644 --- a/contracts/strategies/OptimizerAPR/OptimizerAPRStrategy.sol +++ b/contracts/strategies/OptimizerAPR/OptimizerAPRStrategy.sol @@ -160,10 +160,9 @@ contract OptimizerAPRStrategy is BaseStrategyUpgradeable { uint256 highestLenderNav; uint256 totalNav = looseAssets; uint256[] memory weightedAprs = new uint256[](lendersList.length); - uint256 lendersListLength = lendersList.length; { uint256 lowestApr = type(uint256).max; - for (uint256 i; i < lendersListLength; ++i) { + for (uint256 i; i < lendersList.length; ++i) { uint256 aprAfterDeposit = lendersList[i].aprAfterDeposit(int256(looseAssets)); uint256 nav = lendersList[i].nav(); totalNav += nav; @@ -192,10 +191,10 @@ contract OptimizerAPRStrategy is BaseStrategyUpgradeable { uint256 weightedApr1; // Case where funds are divested from the strategy with the lowest APR to be invested in the one with the highest APR uint256 weightedApr2; - for (uint256 i; i < lendersListLength; ++i) { + for (uint256 i; i < lendersList.length; ++i) { if (i == _highest) { weightedApr1 += (highestLenderNav + looseAssets) * highestApr; - if (lowestNav != 0 && lendersListLength > 1) + if (lowestNav != 0 && lendersList.length > 1) weightedApr2 += (highestLenderNav + looseAssets + lowestNav) * lendersList[_highest].aprAfterDeposit(int256(lowestNav + looseAssets)); diff --git a/deploy/OptimizerAPRStrategy.ts b/deploy/OptimizerAPRStrategy.ts new file mode 100644 index 0000000..226d987 --- /dev/null +++ b/deploy/OptimizerAPRStrategy.ts @@ -0,0 +1,24 @@ +import { DeployFunction } from 'hardhat-deploy/types'; +import yargs from 'yargs'; +const argv = yargs.env('').boolean('ci').parseSync(); + +const func: DeployFunction = async ({ deployments, ethers }) => { + const { deploy } = deployments; + const { deployer } = await ethers.getNamedSigners(); + + console.log('Now deploying the implementation for OptimizerAPRStrategy'); + await deploy('OptimizerAPRStrategy_Implementation', { + contract: 'OptimizerAPRStrategy', + from: deployer.address, + args: [], + log: !argv.ci, + }); + + const optimizerAPRStrategyImplementation = (await ethers.getContract('OptimizerAPRStrategy_Implementation')).address; + + console.log(`Successfully deployed the implementation for OptimizerAPR at ${optimizerAPRStrategyImplementation}`); + console.log(''); +}; + +func.tags = ['optimizerAPRImplementation']; +export default func; diff --git a/deployments/polygon/.chainId b/deployments/polygon/.chainId new file mode 100644 index 0000000..0973804 --- /dev/null +++ b/deployments/polygon/.chainId @@ -0,0 +1 @@ +137 \ No newline at end of file diff --git a/deployments/polygon/OptimizerAPRStrategy_Implementation.json b/deployments/polygon/OptimizerAPRStrategy_Implementation.json new file mode 100644 index 0000000..36b2299 --- /dev/null +++ b/deployments/polygon/OptimizerAPRStrategy_Implementation.json @@ -0,0 +1,1304 @@ +{ + "address": "0xe880fe143dc62aab47aba54e2165ee982b5bce3e", + "abi": [ + { + "inputs": [], + "name": "FailedWithdrawal", + "type": "error" + }, + { + "inputs": [], + "name": "IncorrectDistribution", + "type": "error" + }, + { + "inputs": [], + "name": "IncorrectListLength", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidShares", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidToken", + "type": "error" + }, + { + "inputs": [], + "name": "LenderAlreadyAdded", + "type": "error" + }, + { + "inputs": [], + "name": "NonExistentLender", + "type": "error" + }, + { + "inputs": [], + "name": "UndockedLender", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAddress", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "lender", + "type": "address" + } + ], + "name": "AddLender", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "EmergencyExitActivated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "profit", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "loss", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "debtPayment", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "debtOutstanding", + "type": "uint256" + } + ], + "name": "Harvested", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "lender", + "type": "address" + } + ], + "name": "RemoveLender", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "debtThreshold", + "type": "uint256" + } + ], + "name": "UpdatedDebtThreshold", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "activated", + "type": "bool" + } + ], + "name": "UpdatedIsRewardActivated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "delay", + "type": "uint256" + } + ], + "name": "UpdatedMaxReportDelayed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "delay", + "type": "uint256" + } + ], + "name": "UpdatedMinReportDelayed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "_rewardAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_minimumAmountMoved", + "type": "uint256" + } + ], + "name": "UpdatedRewardAmountAndMinimumAmountMoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "rewards", + "type": "address" + } + ], + "name": "UpdatedRewards", + "type": "event" + }, + { + "inputs": [], + "name": "BASE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "GUARDIAN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "KEEPER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "POOLMANAGER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SECONDS_PER_YEAR", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_guardian", + "type": "address" + } + ], + "name": "addGuardian", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGenericLender", + "name": "newLender", + "type": "address" + } + ], + "name": "addLender", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "debtThreshold", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "emergencyExit", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "estimatedAPR", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64[]", + "name": "shares", + "type": "uint64[]" + } + ], + "name": "estimatedAPR", + "outputs": [ + { + "internalType": "uint256", + "name": "weightedAPR", + "type": "uint256" + }, + { + "internalType": "int256[]", + "name": "lenderAdjustedAmounts", + "type": "int256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "estimatedTotalAssets", + "outputs": [ + { + "internalType": "uint256", + "name": "nav", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "lender", + "type": "address" + } + ], + "name": "forceRemoveLender", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "harvest", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "harvest", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "borrowInit", + "type": "uint256" + } + ], + "name": "harvest", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_poolManager", + "type": "address" + }, + { + "internalType": "address", + "name": "governor", + "type": "address" + }, + { + "internalType": "address", + "name": "guardian", + "type": "address" + }, + { + "internalType": "address[]", + "name": "keepers", + "type": "address[]" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "isActive", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lendStatuses", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rate", + "type": "uint256" + }, + { + "internalType": "address", + "name": "add", + "type": "address" + } + ], + "internalType": "struct LendStatus[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "lenders", + "outputs": [ + { + "internalType": "contract IGenericLender", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lentTotalAssets", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "numLenders", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "poolManager", + "outputs": [ + { + "internalType": "contract IPoolManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "guardian", + "type": "address" + } + ], + "name": "revokeGuardian", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "lender", + "type": "address" + } + ], + "name": "safeRemoveLender", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_debtThreshold", + "type": "uint256" + } + ], + "name": "setDebtThreshold", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "setEmergencyExit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + } + ], + "name": "setWithdrawalThreshold", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "sweep", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "want", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "wantBase", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amountNeeded", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [ + { + "internalType": "uint256", + "name": "amountFreed", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_loss", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "withdrawalThreshold", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0xa07a64f5a2d7b0e5c657ef1b3e674b8b0068acd04a32a68825bdb771b3dbf5fd", + "receipt": { + "to": null, + "from": "0xfda462548ce04282f4b6d6619823a7c64fdc0185", + "contractAddress": "0xe880fe143dc62aab47aba54e2165ee982b5bce3e", + "transactionIndex": "0x5", + "gasUsed": "0x44c46e", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000000000000080000000000000000040000000040000000000000000000000000002000000000000000000000000200000000000000000000000000000000000000000000000000000000000005000000000000000000001000000000000000800000000000000120000000000000000000000000000000000000000000000000000000000000000000000100000", + "blockHash": "0x7322b741d8c6e921c237c3abb487870528de2f7a9bb88d807ed31af6629e6643", + "transactionHash": "0xecc6178bdcfc9889b89f33fc9a404b1f849b5da05dd37e25b40d643f3e7a5565", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000fda462548ce04282f4b6d6619823a7c64fdc0185", + "0x0000000000000000000000009ead03f7136fc6b4bdb0780b00a1c14ae5a8b6d0" + ], + "data": "0x0000000000000000000000000000000000000000000000000c8788af452f3546000000000000000000000000000000000000000000000001f8e94d9e89ea2e930000000000000000000000000000000000000000000002d445ad7623142720b3000000000000000000000000000000000000000000000001ec61c4ef44baf94d0000000000000000000000000000000000000000000002d45234fed2595655f9", + "blockNumber": "0x2547ef6", + "transactionHash": "0xecc6178bdcfc9889b89f33fc9a404b1f849b5da05dd37e25b40d643f3e7a5565", + "transactionIndex": "0x5", + "blockHash": "0x7322b741d8c6e921c237c3abb487870528de2f7a9bb88d807ed31af6629e6643", + "logIndex": "0xc", + "removed": false + } + ], + "blockNumber": "0x2547ef6", + "cumulativeGasUsed": "0x4eadd0", + "status": "0x1" + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "0d3705635a12f691c993e4b380cb5060", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"FailedWithdrawal\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectDistribution\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectListLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidShares\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LenderAlreadyAdded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonExistentLender\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UndockedLender\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"lender\",\"type\":\"address\"}],\"name\":\"AddLender\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EmergencyExitActivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"profit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"loss\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"debtPayment\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"debtOutstanding\",\"type\":\"uint256\"}],\"name\":\"Harvested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"lender\",\"type\":\"address\"}],\"name\":\"RemoveLender\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"debtThreshold\",\"type\":\"uint256\"}],\"name\":\"UpdatedDebtThreshold\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"activated\",\"type\":\"bool\"}],\"name\":\"UpdatedIsRewardActivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"delay\",\"type\":\"uint256\"}],\"name\":\"UpdatedMaxReportDelayed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"delay\",\"type\":\"uint256\"}],\"name\":\"UpdatedMinReportDelayed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_rewardAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_minimumAmountMoved\",\"type\":\"uint256\"}],\"name\":\"UpdatedRewardAmountAndMinimumAmountMoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"rewards\",\"type\":\"address\"}],\"name\":\"UpdatedRewards\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BASE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"GUARDIAN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"KEEPER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"POOLMANAGER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SECONDS_PER_YEAR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_guardian\",\"type\":\"address\"}],\"name\":\"addGuardian\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IGenericLender\",\"name\":\"newLender\",\"type\":\"address\"}],\"name\":\"addLender\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"debtThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"emergencyExit\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"estimatedAPR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64[]\",\"name\":\"shares\",\"type\":\"uint64[]\"}],\"name\":\"estimatedAPR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"weightedAPR\",\"type\":\"uint256\"},{\"internalType\":\"int256[]\",\"name\":\"lenderAdjustedAmounts\",\"type\":\"int256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"estimatedTotalAssets\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"nav\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"lender\",\"type\":\"address\"}],\"name\":\"forceRemoveLender\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"harvest\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"harvest\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"borrowInit\",\"type\":\"uint256\"}],\"name\":\"harvest\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_poolManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"governor\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"guardian\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"keepers\",\"type\":\"address[]\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isActive\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lendStatuses\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rate\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"add\",\"type\":\"address\"}],\"internalType\":\"struct LendStatus[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"lenders\",\"outputs\":[{\"internalType\":\"contract IGenericLender\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lentTotalAssets\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"numLenders\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"poolManager\",\"outputs\":[{\"internalType\":\"contract IPoolManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"guardian\",\"type\":\"address\"}],\"name\":\"revokeGuardian\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"lender\",\"type\":\"address\"}],\"name\":\"safeRemoveLender\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_debtThreshold\",\"type\":\"uint256\"}],\"name\":\"setDebtThreshold\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"setEmergencyExit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_threshold\",\"type\":\"uint256\"}],\"name\":\"setWithdrawalThreshold\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"sweep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"want\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"wantBase\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_amountNeeded\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amountFreed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_loss\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawalThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Angle Labs, Inc.\",\"details\":\"This strategy works by taking plugins designed for standard lending platforms and automatically chooses to invest its funds in the best platforms to generate yield. The allocation is greedy and may be sub-optimal so there is an additional option to manually set positions\",\"kind\":\"dev\",\"methods\":{\"addGuardian(address)\":{\"details\":\"This internal function has to be put in this file because `AccessControl` is not defined in `PoolManagerInternal`\",\"params\":{\"_guardian\":\"New guardian address\"}},\"addLender(address)\":{\"details\":\"Governor, guardian or `PoolManager` only\",\"params\":{\"newLender\":\"The adapter to the added lending platform\"}},\"estimatedAPR()\":{\"details\":\"It's computed by doing: `sum(nav * apr) / totalNav`\"},\"estimatedAPR(uint64[])\":{\"params\":{\"shares\":\"List of shares (in bps of the nav) that should be allocated to each lender\"}},\"forceRemoveLender(address)\":{\"params\":{\"lender\":\"The address of the adapter to the lending platform to remove\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role.\"},\"harvest(bytes)\":{\"details\":\"Since this function is permissionless, strategy implementations should be made to remain safe regardless of the data that is passed in the call\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"initialize(address,address,address,address[])\":{\"params\":{\"_poolManager\":\"Address of the `PoolManager` lending to this strategy\",\"governor\":\"Address with governor privilege\",\"guardian\":\"Address of the guardian\"}},\"isActive()\":{\"returns\":{\"_0\":\"True if the strategy is actively managing a position.\"}},\"lendStatuses()\":{\"returns\":{\"_0\":\"Returns the status of all lenders attached the strategy\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`.\"},\"revokeGuardian(address)\":{\"params\":{\"guardian\":\"Old guardian address to revoke\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role.\"},\"safeRemoveLender(address)\":{\"params\":{\"lender\":\"The address of the adapter to the lending platform to remove\"}},\"setDebtThreshold(uint256)\":{\"details\":\"By default this is 0, meaning any losses would cause a harvest which will subsequently report the loss to the Manager for tracking.\",\"params\":{\"_debtThreshold\":\"How big of a loss this Strategy may carry without\"}},\"setEmergencyExit()\":{\"details\":\"This may only be called by the `PoolManager`, because when calling this the `PoolManager` should at the same time update the debt ratioThis function can only be called once by the `PoolManager` contractSee `poolManager.setEmergencyExit()` and `harvest()` for further details.\"},\"setWithdrawalThreshold(uint256)\":{\"details\":\"governor, guardian or `PoolManager` only\",\"params\":{\"_threshold\":\"New withdrawal threshold\"}},\"sweep(address,address)\":{\"details\":\"Implement `_protectedTokens()` to specify any additional tokens that should be protected from sweeping in addition to `want`.\",\"params\":{\"_token\":\"The token to transfer out of this `PoolManager`.\",\"to\":\"Address to send the tokens to.\"}},\"withdraw(uint256)\":{\"details\":\"This may only be called by the `PoolManager`\",\"params\":{\"_amountNeeded\":\"How much `want` to withdraw.\"},\"returns\":{\"_loss\":\"Any realized losses\",\"amountFreed\":\"How much `want` withdrawn.\"}}},\"title\":\"OptimizerAPRStrategy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"GUARDIAN_ROLE()\":{\"notice\":\"Role for guardians and governors - keccak256(\\\"GUARDIAN_ROLE\\\")\"},\"KEEPER_ROLE()\":{\"notice\":\"Role for keepers - keccak256(\\\"KEEPER_ROLE\\\")\"},\"POOLMANAGER_ROLE()\":{\"notice\":\"Role for `PoolManager` only - keccak256(\\\"POOLMANAGER_ROLE\\\")\"},\"addGuardian(address)\":{\"notice\":\"Adds a new guardian address and echoes the change to the contracts that interact with this collateral `PoolManager`\"},\"addLender(address)\":{\"notice\":\"Add lenders for the strategy to choose between\"},\"debtThreshold()\":{\"notice\":\"Use this to adjust the threshold at which running a debt causes a harvest trigger. See `setDebtThreshold()` for more details\"},\"emergencyExit()\":{\"notice\":\"See note on `setEmergencyExit()`\"},\"estimatedAPR()\":{\"notice\":\"Returns the weighted apr of all lenders\"},\"estimatedAPR(uint64[])\":{\"notice\":\"Returns the weighted apr in an hypothetical world where the strategy splits its nav in respect to shares\"},\"estimatedTotalAssets()\":{\"notice\":\"View function to check the total assets managed by the strategy\"},\"forceRemoveLender(address)\":{\"notice\":\"Removes a lending platform even if total withdrawal is impossible\"},\"harvest()\":{\"notice\":\"Harvests the Strategy, recognizing any profits or losses and adjusting the Strategy's position.\"},\"harvest(bytes)\":{\"notice\":\"Same as the function above with a `data` parameter to help adjust the position\"},\"harvest(uint256)\":{\"notice\":\"Same as above with a `borrowInit` parameter to help in case of the convergence of the `adjustPosition` method\"},\"initialize(address,address,address,address[])\":{\"notice\":\"Constructor of the `Strategy`\"},\"isActive()\":{\"notice\":\"Provides an indication of whether this strategy is currently \\\"active\\\" in that it is managing an active position, or will manage a position in the future. This should correlate to `harvest()` activity, so that Harvest events can be tracked externally by indexing agents.\"},\"lendStatuses()\":{\"notice\":\"View function to check the current state of the strategy\"},\"lentTotalAssets()\":{\"notice\":\"View function to check the total assets lent\"},\"numLenders()\":{\"notice\":\"View function to check the number of lending platforms\"},\"poolManager()\":{\"notice\":\"Reference to the protocol's collateral `PoolManager`\"},\"revokeGuardian(address)\":{\"notice\":\"Revokes the guardian role and propagates the change to other contracts\"},\"safeRemoveLender(address)\":{\"notice\":\"Removes a lending platform and fails if total withdrawal is impossible\"},\"setDebtThreshold(uint256)\":{\"notice\":\"Sets how far the Strategy can go into loss without a harvest and report being required.\"},\"setEmergencyExit()\":{\"notice\":\"Activates emergency exit. Once activated, the Strategy will exit its position upon the next harvest, depositing all funds into the Manager as quickly as is reasonable given on-chain conditions.\"},\"setWithdrawalThreshold(uint256)\":{\"notice\":\"Changes the withdrawal threshold\"},\"sweep(address,address)\":{\"notice\":\"Removes tokens from this Strategy that are not the type of tokens managed by this Strategy. This may be used in case of accidentally sending the wrong kind of token to this Strategy. Tokens will be sent to `governance()`. This will fail if an attempt is made to sweep `want`, or any tokens that are protected by this Strategy. This may only be called by governance.\"},\"want()\":{\"notice\":\"Reference to the ERC20 farmed by this strategy\"},\"wantBase()\":{\"notice\":\"Base of the ERC20 token farmed by this strategy\"},\"withdraw(uint256)\":{\"notice\":\"Withdraws `_amountNeeded` to `poolManager`.\"}},\"notice\":\"A lender optimisation strategy for any ERC20 asset, leveraging multiple lenders at once\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/strategies/OptimizerAPR/OptimizerAPRStrategy.sol\":\"OptimizerAPRStrategy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the\\n * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() initializer {}\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n bool private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Modifier to protect an initializer function from being invoked twice.\\n */\\n modifier initializer() {\\n // If the contract is initializing we ignore whether _initialized is set in order to support multiple\\n // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the\\n // contract may have been reentered.\\n require(_initializing ? _isConstructor() : !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n bool isTopLevelCall = !_initializing;\\n if (isTopLevelCall) {\\n _initializing = true;\\n _initialized = true;\\n }\\n\\n _;\\n\\n if (isTopLevelCall) {\\n _initializing = false;\\n }\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} modifier, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n function _isConstructor() private view returns (bool) {\\n return !AddressUpgradeable.isContract(address(this));\\n }\\n}\\n\",\"keccak256\":\"0x68861bcc80cacbd498efde75aab6c74a486cc48262660d326c8d7530d9752097\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize, which returns 0 for contracts in\\n // construction, since the code is only stored at the end of the\\n // constructor execution.\\n\\n uint256 size;\\n assembly {\\n size := extcodesize(account)\\n }\\n return size > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3f0f878c796dfc7feba6d3c4e3e526c14c7deae8b7bfc71088e3f38fab0d77b3\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary StringsUpgradeable {\\n bytes16 private constant _HEX_SYMBOLS = \\\"0123456789abcdef\\\";\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n // Inspired by OraclizeAPI's implementation - MIT licence\\n // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol\\n\\n if (value == 0) {\\n return \\\"0\\\";\\n }\\n uint256 temp = value;\\n uint256 digits;\\n while (temp != 0) {\\n digits++;\\n temp /= 10;\\n }\\n bytes memory buffer = new bytes(digits);\\n while (value != 0) {\\n digits -= 1;\\n buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));\\n value /= 10;\\n }\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n if (value == 0) {\\n return \\\"0x00\\\";\\n }\\n uint256 temp = value;\\n uint256 length = 0;\\n while (temp != 0) {\\n length++;\\n temp >>= 8;\\n }\\n return toHexString(value, length);\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _HEX_SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n}\\n\",\"keccak256\":\"0x398d3323c1932a5986bf36be7c57593e121e69d5db5b6574b4ee0d031443de37\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\nimport \\\"../extensions/draft-IERC20Permit.sol\\\";\\nimport \\\"../../../utils/Address.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n using Address for address;\\n\\n function safeTransfer(\\n IERC20 token,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n }\\n\\n function safeTransferFrom(\\n IERC20 token,\\n address from,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n }\\n\\n /**\\n * @dev Deprecated. This function has issues similar to the ones found in\\n * {IERC20-approve}, and its usage is discouraged.\\n *\\n * Whenever possible, use {safeIncreaseAllowance} and\\n * {safeDecreaseAllowance} instead.\\n */\\n function safeApprove(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n // safeApprove should only be called when setting an initial allowance,\\n // or when resetting it to zero. To increase and decrease it, use\\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n require(\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\n \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n );\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n }\\n\\n function safeIncreaseAllowance(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n uint256 newAllowance = token.allowance(address(this), spender) + value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n\\n function safeDecreaseAllowance(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n unchecked {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n uint256 newAllowance = oldAllowance - value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n }\\n\\n function safePermit(\\n IERC20Permit token,\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal {\\n uint256 nonceBefore = token.nonces(owner);\\n token.permit(owner, spender, value, deadline, v, r, s);\\n uint256 nonceAfter = token.nonces(owner);\\n require(nonceAfter == nonceBefore + 1, \\\"SafeERC20: permit did not succeed\\\");\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n */\\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\\n // the target address contains contract code and also asserts for success in the low-level call.\\n\\n bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n if (returndata.length > 0) {\\n // Return data is optional\\n require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0x9b72f93be69ca894d8492c244259615c4a742afc8d63720dbc8bb81087d9b238\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"contracts/external/AccessControlAngle.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity ^0.8.12;\\n\\nimport \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/Strings.sol\\\";\\n\\nimport \\\"../interfaces/IAccessControlAngle.sol\\\";\\n\\n/**\\n * @dev This contract is fully forked from OpenZeppelin `AccessControl`.\\n * The only difference is the removal of the ERC165 implementation as it's not\\n * needed in Angle.\\n *\\n * Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControlAngle is Context, IAccessControlAngle {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role, _msgSender());\\n _;\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(uint160(account), 20),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external override {\\n require(account == _msgSender(), \\\"71\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n */\\n function _setupRole(bytes32 role, address account) internal {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal {\\n emit RoleAdminChanged(role, getRoleAdmin(role), adminRole);\\n _roles[role].adminRole = adminRole;\\n }\\n\\n function _grantRole(bytes32 role, address account) internal {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n function _revokeRole(bytes32 role, address account) internal {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0xef4a7c307f5ce747b7223a71056a460c72c01129fdcef464aa7b160746a0a719\",\"license\":\"GPL-3.0\"},\"contracts/external/AccessControlAngleUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity ^0.8.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\n\\nimport \\\"../interfaces/IAccessControlAngle.sol\\\";\\n\\n/**\\n * @dev This contract is fully forked from OpenZeppelin `AccessControlUpgradeable`.\\n * The only difference is the removal of the ERC165 implementation as it's not\\n * needed in Angle.\\n *\\n * Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControlAngleUpgradeable is Initializable, IAccessControlAngle {\\n // solhint-disable-next-line\\n function __AccessControl_init() internal initializer {\\n __AccessControl_init_unchained();\\n }\\n\\n // solhint-disable-next-line\\n function __AccessControl_init_unchained() internal initializer {}\\n\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role, msg.sender);\\n _;\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n StringsUpgradeable.toHexString(uint160(account), 20),\\n \\\" is missing role \\\",\\n StringsUpgradeable.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external override {\\n require(account == msg.sender, \\\"71\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n */\\n function _setupRole(bytes32 role, address account) internal {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal {\\n emit RoleAdminChanged(role, getRoleAdmin(role), adminRole);\\n _roles[role].adminRole = adminRole;\\n }\\n\\n function _grantRole(bytes32 role, address account) internal {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, msg.sender);\\n }\\n }\\n\\n function _revokeRole(bytes32 role, address account) internal {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, msg.sender);\\n }\\n }\\n\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x9d8d018a41e16eba7a41b73d986f175e52a773819dbebde0623f93c23c365207\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IAccessControlAngle.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity ^0.8.12;\\n\\n/// @title IAccessControl\\n/// @author Forked from OpenZeppelin\\n/// @notice Interface for `AccessControl` contracts\\ninterface IAccessControlAngle {\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n function grantRole(bytes32 role, address account) external;\\n\\n function revokeRole(bytes32 role, address account) external;\\n\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x8d34c4bcd7eb669fe972901727c5467541591a67a4d05e5b609c0b1642478a3a\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IGenericLender.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity ^0.8.12;\\n\\nimport \\\"./IAccessControlAngle.sol\\\";\\n\\n/// @title IGenericLender\\n/// @author Yearn with slight modifications from Angle Core Team\\n/// @dev Interface for the `GenericLender` contract, the base interface for contracts interacting\\n/// with lending and yield farming platforms\\ninterface IGenericLender is IAccessControlAngle {\\n /// @notice Name of the lender on which funds are invested\\n function lenderName() external view returns (string memory);\\n\\n /// @notice Helper function to get the current total of assets managed by the lender.\\n function nav() external view returns (uint256);\\n\\n /// @notice Reference to the `Strategy` contract the lender interacts with\\n function strategy() external view returns (address);\\n\\n /// @notice Returns an estimation of the current Annual Percentage Rate on the lender\\n function apr() external view returns (uint256);\\n\\n /// @notice Returns an estimation of the current Annual Percentage Rate weighted by the assets under\\n /// management of the lender\\n function weightedApr() external view returns (uint256);\\n\\n /// @notice Withdraws a given amount from lender\\n /// @param amount The amount the caller wants to withdraw\\n /// @return Amount actually withdrawn\\n function withdraw(uint256 amount) external returns (uint256);\\n\\n /// @notice Withdraws as much as possible in case of emergency and sends it to the `PoolManager`\\n /// @param amount Amount to withdraw\\n /// @dev Does not check if any error occurs or if the amount withdrawn is correct\\n function emergencyWithdraw(uint256 amount) external;\\n\\n /// @notice Deposits the current balance of the contract to the lending platform\\n function deposit() external;\\n\\n /// @notice Withdraws as much as possible from the lending platform\\n /// @return Whether everything was withdrawn or not\\n function withdrawAll() external returns (bool);\\n\\n /// @notice Check if assets are currently managed by the lender\\n /// @dev We're considering that the strategy has no assets if it has less than 10 of the\\n /// underlying asset in total to avoid the case where there is dust remaining on the lending market\\n /// and we cannot withdraw everything\\n function hasAssets() external view returns (bool);\\n\\n /// @notice Returns an estimation of the current Annual Percentage Rate after a new deposit\\n /// of `amount`\\n /// @param amount Amount to add to the lending platform, and that we want to take into account\\n /// in the apr computation\\n function aprAfterDeposit(int256 amount) external view returns (uint256);\\n\\n /// @notice\\n /// Removes tokens from this Strategy that are not the type of tokens\\n /// managed by this Strategy. This may be used in case of accidentally\\n /// sending the wrong kind of token to this Strategy.\\n ///\\n /// Tokens will be sent to `governance()`.\\n ///\\n /// This will fail if an attempt is made to sweep `want`, or any tokens\\n /// that are protected by this Strategy.\\n ///\\n /// This may only be called by governance.\\n /// @param _token The token to transfer out of this poolManager.\\n /// @param to Address to send the tokens to.\\n /// @dev\\n /// Implement `_protectedTokens()` to specify any additional tokens that\\n /// should be protected from sweeping in addition to `want`.\\n function sweep(address _token, address to) external;\\n\\n /// @notice Returns the current balance invested on the lender and related staking contracts\\n function underlyingBalanceStored() external view returns (uint256 balance);\\n}\\n\",\"keccak256\":\"0xcbddd3da79f6edd333933e33c51e3b97aec4d56489984963223addb85f73ec44\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IPoolManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity ^0.8.12;\\n\\n// Struct for the parameters associated with a strategy interacting with a collateral `PoolManager`\\n// contract\\nstruct StrategyParams {\\n // Timestamp of last report made by this strategy\\n // It is also used to check if a strategy has been initialized\\n uint256 lastReport;\\n // Total amount the strategy is expected to have\\n uint256 totalStrategyDebt;\\n // The share of the total assets in the `PoolManager` contract that the `strategy` can access to.\\n uint256 debtRatio;\\n}\\n\\n/// @title IPoolManagerFunctions\\n/// @author Angle Core Team\\n/// @notice Interface for the collateral poolManager contracts handling each one type of collateral for\\n/// a given stablecoin\\n/// @dev Only the functions used in other contracts of the protocol are left here\\ninterface IPoolManagerFunctions {\\n // ============================ Yield Farming ==================================\\n\\n function creditAvailable() external view returns (uint256);\\n\\n function debtOutstanding() external view returns (uint256);\\n\\n function report(\\n uint256 _gain,\\n uint256 _loss,\\n uint256 _debtPayment\\n ) external;\\n\\n // ============================= Getters =======================================\\n\\n function getBalance() external view returns (uint256);\\n\\n function getTotalAsset() external view returns (uint256);\\n}\\n\\n/// @title IPoolManager\\n/// @author Angle Core Team\\n/// @notice Previous interface with additional getters for public variables and mappings\\n/// @dev Used in other contracts of the protocol\\ninterface IPoolManager is IPoolManagerFunctions {\\n function stableMaster() external view returns (address);\\n\\n function perpetualManager() external view returns (address);\\n\\n function token() external view returns (address);\\n\\n function totalDebt() external view returns (uint256);\\n\\n function strategies(address _strategy) external view returns (StrategyParams memory);\\n}\\n\",\"keccak256\":\"0x71b9368f8d68ffa38a45d7f02c4d0eced4319d8d53e2c534f5bcc1e9ca2a0d74\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IStrategy.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity ^0.8.12;\\n\\nimport \\\"./IAccessControlAngle.sol\\\";\\n\\nstruct LendStatus {\\n string name;\\n uint256 assets;\\n uint256 rate;\\n address add;\\n}\\n\\n/// @title IStrategy\\n/// @author Inspired by Yearn with slight changes\\n/// @notice Interface for yield farming strategies\\ninterface IStrategy is IAccessControlAngle {\\n function estimatedAPR() external view returns (uint256);\\n\\n function poolManager() external view returns (address);\\n\\n function want() external view returns (address);\\n\\n function isActive() external view returns (bool);\\n\\n function estimatedTotalAssets() external view returns (uint256);\\n\\n function harvestTrigger(uint256 callCost) external view returns (bool);\\n\\n function harvest() external;\\n\\n function withdraw(uint256 _amountNeeded) external returns (uint256 amountFreed, uint256 _loss);\\n\\n function setEmergencyExit() external;\\n\\n function addGuardian(address _guardian) external;\\n\\n function revokeGuardian(address _guardian) external;\\n}\\n\",\"keccak256\":\"0x0676c9594b963b16ec6ee5be640c978f6d337595f0d5f18be7f4701cde942223\",\"license\":\"GPL-3.0\"},\"contracts/strategies/BaseStrategyEvents.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity ^0.8.12;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\n\\nimport \\\"../external/AccessControlAngle.sol\\\";\\nimport \\\"../external/AccessControlAngleUpgradeable.sol\\\";\\n\\nimport \\\"../interfaces/IStrategy.sol\\\";\\nimport \\\"../interfaces/IPoolManager.sol\\\";\\n\\nimport \\\"../utils/Errors.sol\\\";\\n\\n/// @title BaseStrategyEvents\\n/// @author Angle Core Team\\n/// @notice Events used in the abstract `BaseStrategy` contract\\ncontract BaseStrategyEvents {\\n event Harvested(uint256 profit, uint256 loss, uint256 debtPayment, uint256 debtOutstanding);\\n\\n event UpdatedMinReportDelayed(uint256 delay);\\n\\n event UpdatedMaxReportDelayed(uint256 delay);\\n\\n event UpdatedDebtThreshold(uint256 debtThreshold);\\n\\n event UpdatedRewards(address rewards);\\n\\n event UpdatedIsRewardActivated(bool activated);\\n\\n event UpdatedRewardAmountAndMinimumAmountMoved(uint256 _rewardAmount, uint256 _minimumAmountMoved);\\n\\n event EmergencyExitActivated();\\n}\\n\",\"keccak256\":\"0xbcefeb25090e6774e50dbc9694c7df5052ca6f157f08f2be238f164853e64aa2\",\"license\":\"GPL-3.0\"},\"contracts/strategies/BaseStrategyUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\n/*\\n * \\u2588 \\n ***** \\u2593\\u2593\\u2593 \\n * \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\n * ///. \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\n ***** //////// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\n * ///////////// \\u2593\\u2593\\u2593 \\n \\u2593\\u2593 ////////////////// \\u2588 \\u2593\\u2593 \\n \\u2593\\u2593 \\u2593\\u2593 /////////////////////// \\u2593\\u2593 \\u2593\\u2593 \\n \\u2593\\u2593 \\u2593\\u2593 //////////////////////////// \\u2593\\u2593 \\u2593\\u2593 \\n \\u2593\\u2593 \\u2593\\u2593 /////////\\u2593\\u2593\\u2593///////\\u2593\\u2593\\u2593///////// \\u2593\\u2593 \\u2593\\u2593 \\n \\u2593\\u2593 ,////////////////////////////////////// \\u2593\\u2593 \\u2593\\u2593 \\n \\u2593\\u2593 ////////////////////////////////////////// \\u2593\\u2593 \\n \\u2593\\u2593 //////////////////////\\u2593\\u2593\\u2593\\u2593///////////////////// \\n ,//////////////////////////////////////////////////// \\n .////////////////////////////////////////////////////////// \\n .//////////////////////////\\u2588\\u2588.,//////////////////////////\\u2588 \\n .//////////////////////\\u2588\\u2588\\u2588\\u2588..,./////////////////////\\u2588\\u2588 \\n ...////////////////\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588.....,.////////////////\\u2588\\u2588\\u2588 \\n ,.,////////////\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 ........,///////////\\u2588\\u2588\\u2588\\u2588 \\n .,.,//////\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 ,.......///////\\u2588\\u2588\\u2588\\u2588 \\n ,..//\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 ........./\\u2588\\u2588\\u2588\\u2588 \\n ..,\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 .....,\\u2588\\u2588\\u2588 \\n .\\u2588\\u2588 ,.,\\u2588 \\n \\n \\n \\n \\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\n \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593 \\u2593\\u2593 \\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593 \\n \\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593 \\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593 \\n \\u2593\\u2593\\u2593 \\u2593\\u2593 \\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\n*/\\n\\npragma solidity ^0.8.12;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\\\";\\n\\nimport \\\"./BaseStrategyEvents.sol\\\";\\n\\n/// @title BaseStrategyUpgradeable\\n/// @author Forked from https://github.com/yearn/yearn-managers/blob/master/contracts/BaseStrategy.sol\\n/// @notice `BaseStrategyUpgradeable` implements all of the required functionalities to interoperate\\n/// with the `PoolManager` Contract.\\n/// @dev This contract should be inherited and the abstract methods implemented to adapt the `Strategy`\\n/// to the particular needs it has to create a return.\\nabstract contract BaseStrategyUpgradeable is BaseStrategyEvents, AccessControlAngleUpgradeable {\\n using SafeERC20 for IERC20;\\n\\n uint256 public constant BASE = 10**18;\\n uint256 public constant SECONDS_PER_YEAR = 31556952;\\n\\n /// @notice Role for `PoolManager` only - keccak256(\\\"POOLMANAGER_ROLE\\\")\\n bytes32 public constant POOLMANAGER_ROLE = 0x5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe562;\\n /// @notice Role for guardians and governors - keccak256(\\\"GUARDIAN_ROLE\\\")\\n bytes32 public constant GUARDIAN_ROLE = 0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041;\\n /// @notice Role for keepers - keccak256(\\\"KEEPER_ROLE\\\")\\n bytes32 public constant KEEPER_ROLE = 0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab;\\n\\n // ================================= REFERENCES ================================\\n\\n /// @notice See note on `setEmergencyExit()`\\n bool public emergencyExit;\\n\\n /// @notice Reference to the protocol's collateral `PoolManager`\\n IPoolManager public poolManager;\\n\\n /// @notice Reference to the ERC20 farmed by this strategy\\n IERC20 public want;\\n\\n /// @notice Base of the ERC20 token farmed by this strategy\\n uint256 public wantBase;\\n\\n // ================================= PARAMETERS ================================\\n\\n /// @notice Use this to adjust the threshold at which running a debt causes a\\n /// harvest trigger. See `setDebtThreshold()` for more details\\n uint256 public debtThreshold;\\n\\n uint256[46] private __gapBaseStrategy;\\n\\n // ================================ CONSTRUCTOR ================================\\n\\n /// @custom:oz-upgrades-unsafe-allow constructor\\n constructor() initializer {}\\n\\n /// @notice Constructor of the `BaseStrategyUpgradeable`\\n /// @param _poolManager Address of the `PoolManager` lending collateral to this strategy\\n /// @param governor Governor address of the protocol\\n /// @param guardian Address of the guardian\\n function _initialize(\\n address _poolManager,\\n address governor,\\n address guardian,\\n address[] memory keepers\\n ) internal initializer {\\n poolManager = IPoolManager(_poolManager);\\n want = IERC20(poolManager.token());\\n wantBase = 10**(IERC20Metadata(address(want)).decimals());\\n if (guardian == address(0) || governor == address(0) || governor == guardian) revert ZeroAddress();\\n // AccessControl\\n // Governor is guardian so no need for a governor role\\n _setupRole(GUARDIAN_ROLE, guardian);\\n _setupRole(GUARDIAN_ROLE, governor);\\n _setupRole(POOLMANAGER_ROLE, address(_poolManager));\\n _setRoleAdmin(POOLMANAGER_ROLE, POOLMANAGER_ROLE);\\n _setRoleAdmin(GUARDIAN_ROLE, POOLMANAGER_ROLE);\\n\\n // Initializing roles first\\n uint256 keepersLength = keepers.length;\\n for (uint256 i; i < keepersLength; ++i) {\\n if (keepers[i] == address(0)) revert ZeroAddress();\\n _setupRole(KEEPER_ROLE, keepers[i]);\\n }\\n _setRoleAdmin(KEEPER_ROLE, GUARDIAN_ROLE);\\n\\n debtThreshold = 100 * BASE;\\n emergencyExit = false;\\n // Give `PoolManager` unlimited access (might save gas)\\n want.safeIncreaseAllowance(address(poolManager), type(uint256).max);\\n }\\n\\n // =============================== CORE FUNCTIONS ==============================\\n\\n /// @notice Harvests the Strategy, recognizing any profits or losses and adjusting\\n /// the Strategy's position.\\n function harvest() external {\\n _report();\\n // Check if free returns are left, and re-invest them\\n _adjustPosition();\\n }\\n\\n /// @notice Same as the function above with a `data` parameter to help adjust the position\\n /// @dev Since this function is permissionless, strategy implementations should be made\\n /// to remain safe regardless of the data that is passed in the call\\n function harvest(bytes memory data) external virtual {\\n _report();\\n _adjustPosition(data);\\n }\\n\\n /// @notice Same as above with a `borrowInit` parameter to help in case of the convergence of the `adjustPosition`\\n /// method\\n function harvest(uint256 borrowInit) external onlyRole(KEEPER_ROLE) {\\n _report();\\n _adjustPosition(borrowInit);\\n }\\n\\n /// @notice Withdraws `_amountNeeded` to `poolManager`.\\n /// @param _amountNeeded How much `want` to withdraw.\\n /// @return amountFreed How much `want` withdrawn.\\n /// @return _loss Any realized losses\\n /// @dev This may only be called by the `PoolManager`\\n function withdraw(uint256 _amountNeeded)\\n external\\n onlyRole(POOLMANAGER_ROLE)\\n returns (uint256 amountFreed, uint256 _loss)\\n {\\n // Liquidate as much as possible `want` (up to `_amountNeeded`)\\n (amountFreed, _loss) = _liquidatePosition(_amountNeeded);\\n // Send it directly back (NOTE: Using `msg.sender` saves some gas here)\\n want.safeTransfer(msg.sender, amountFreed);\\n // NOTE: Reinvest anything leftover on next `tend`/`harvest`\\n }\\n\\n // =============================== VIEW FUNCTIONS ==============================\\n\\n /// @notice Provides an accurate estimate for the total amount of assets\\n /// (principle + return) that this Strategy is currently managing,\\n /// denominated in terms of `want` tokens.\\n /// This total should be \\\"realizable\\\" e.g. the total value that could\\n /// *actually* be obtained from this Strategy if it were to divest its\\n /// entire position based on current on-chain conditions.\\n /// @return The estimated total assets in this Strategy.\\n /// @dev Care must be taken in using this function, since it relies on external\\n /// systems, which could be manipulated by the attacker to give an inflated\\n /// (or reduced) value produced by this function, based on current on-chain\\n /// conditions (e.g. this function is possible to influence through\\n /// flashloan attacks, oracle manipulations, or other DeFi attack\\n /// mechanisms).\\n function estimatedTotalAssets() public view virtual returns (uint256);\\n\\n /// @notice Provides an indication of whether this strategy is currently \\\"active\\\"\\n /// in that it is managing an active position, or will manage a position in\\n /// the future. This should correlate to `harvest()` activity, so that Harvest\\n /// events can be tracked externally by indexing agents.\\n /// @return True if the strategy is actively managing a position.\\n function isActive() public view returns (bool) {\\n return estimatedTotalAssets() != 0;\\n }\\n\\n // ============================= INTERNAL FUNCTIONS ============================\\n\\n /// @notice Prepares the Strategy to return, recognizing any profits or losses\\n /// @dev In the rare case the Strategy is in emergency shutdown, this will exit\\n /// the Strategy's position.\\n /// @dev When `_report()` is called, the Strategy reports to the Manager (via\\n /// `poolManager.report()`), so in some cases `harvest()` must be called in order\\n /// to take in profits, to borrow newly available funds from the Manager, or\\n /// otherwise adjust its position. In other cases `harvest()` must be\\n /// called to report to the Manager on the Strategy's position, especially if\\n /// any losses have occurred.\\n /// @dev As keepers may directly profit from this function, there may be front-running problems with miners bots,\\n /// we may have to put an access control logic for this function to only allow white-listed addresses to act\\n /// as keepers for the protocol\\n function _report() internal {\\n uint256 profit;\\n uint256 loss;\\n uint256 debtOutstanding = poolManager.debtOutstanding();\\n uint256 debtPayment;\\n if (emergencyExit) {\\n // Free up as much capital as possible\\n uint256 amountFreed = _liquidateAllPositions();\\n if (amountFreed < debtOutstanding) {\\n loss = debtOutstanding - amountFreed;\\n } else if (amountFreed > debtOutstanding) {\\n profit = amountFreed - debtOutstanding;\\n }\\n debtPayment = debtOutstanding - loss;\\n } else {\\n // Free up returns for Manager to pull\\n (profit, loss, debtPayment) = _prepareReturn(debtOutstanding);\\n }\\n emit Harvested(profit, loss, debtPayment, debtOutstanding);\\n\\n // Allows Manager to take up to the \\\"harvested\\\" balance of this contract,\\n // which is the amount it has earned since the last time it reported to\\n // the Manager.\\n poolManager.report(profit, loss, debtPayment);\\n }\\n\\n /// @notice Performs any Strategy unwinding or other calls necessary to capture the\\n /// \\\"free return\\\" this Strategy has generated since the last time its core\\n /// position(s) were adjusted. Examples include unwrapping extra rewards.\\n /// This call is only used during \\\"normal operation\\\" of a Strategy, and\\n /// should be optimized to minimize losses as much as possible.\\n ///\\n /// This method returns any realized profits and/or realized losses\\n /// incurred, and should return the total amounts of profits/losses/debt\\n /// payments (in `want` tokens) for the Manager's accounting (e.g.\\n /// `want.balanceOf(this) >= _debtPayment + _profit`).\\n ///\\n /// `_debtOutstanding` will be 0 if the Strategy is not past the configured\\n /// debt limit, otherwise its value will be how far past the debt limit\\n /// the Strategy is. The Strategy's debt limit is configured in the Manager.\\n ///\\n /// NOTE: `_debtPayment` should be less than or equal to `_debtOutstanding`.\\n /// It is okay for it to be less than `_debtOutstanding`, as that\\n /// should only used as a guide for how much is left to pay back.\\n /// Payments should be made to minimize loss from slippage, debt,\\n /// withdrawal fees, etc.\\n ///\\n /// See `poolManager.debtOutstanding()`.\\n function _prepareReturn(uint256 _debtOutstanding)\\n internal\\n virtual\\n returns (\\n uint256 _profit,\\n uint256 _loss,\\n uint256 _debtPayment\\n );\\n\\n /// @notice Performs any adjustments to the core position(s) of this Strategy given\\n /// what change the Manager made in the \\\"investable capital\\\" available to the\\n /// Strategy. Note that all \\\"free capital\\\" in the Strategy after the report\\n /// was made is available for reinvestment. Also note that this number\\n /// could be 0, and you should handle that scenario accordingly.\\n function _adjustPosition() internal virtual;\\n\\n /// @notice same as _adjustPosition but with an initial parameter\\n function _adjustPosition(uint256) internal virtual;\\n\\n /// @notice same as _adjustPosition but with permissionless parameters\\n function _adjustPosition(bytes memory) internal virtual {\\n _adjustPosition();\\n }\\n\\n /// @notice Liquidates up to `_amountNeeded` of `want` of this strategy's positions,\\n /// irregardless of slippage. Any excess will be re-invested with `_adjustPosition()`.\\n /// This function should return the amount of `want` tokens made available by the\\n /// liquidation. If there is a difference between them, `_loss` indicates whether the\\n /// difference is due to a realized loss, or if there is some other situation at play\\n /// (e.g. locked funds) where the amount made available is less than what is needed.\\n ///\\n /// NOTE: The invariant `_liquidatedAmount + _loss <= _amountNeeded` should always be maintained\\n function _liquidatePosition(uint256 _amountNeeded)\\n internal\\n virtual\\n returns (uint256 _liquidatedAmount, uint256 _loss);\\n\\n /// @notice Liquidates everything and returns the amount that got freed.\\n /// This function is used during emergency exit instead of `_prepareReturn()` to\\n /// liquidate all of the Strategy's positions back to the Manager.\\n function _liquidateAllPositions() internal virtual returns (uint256 _amountFreed);\\n\\n /// @notice Override this to add all tokens/tokenized positions this contract\\n /// manages on a *persistent* basis (e.g. not just for swapping back to\\n /// want ephemerally).\\n ///\\n /// NOTE: Do *not* include `want`, already included in `sweep` below.\\n ///\\n /// Example:\\n /// ```\\n /// function _protectedTokens() internal override view returns (address[] memory) {\\n /// address[] memory protected = new address[](3);\\n /// protected[0] = tokenA;\\n /// protected[1] = tokenB;\\n /// protected[2] = tokenC;\\n /// return protected;\\n /// }\\n /// ```\\n function _protectedTokens() internal view virtual returns (address[] memory);\\n\\n // ================================= GOVERNANCE ================================\\n\\n /// @notice Activates emergency exit. Once activated, the Strategy will exit its\\n /// position upon the next harvest, depositing all funds into the Manager as\\n /// quickly as is reasonable given on-chain conditions.\\n /// @dev This may only be called by the `PoolManager`, because when calling this the `PoolManager` should at the same\\n /// time update the debt ratio\\n /// @dev This function can only be called once by the `PoolManager` contract\\n /// @dev See `poolManager.setEmergencyExit()` and `harvest()` for further details.\\n function setEmergencyExit() external onlyRole(POOLMANAGER_ROLE) {\\n emergencyExit = true;\\n emit EmergencyExitActivated();\\n }\\n\\n /// @notice Sets how far the Strategy can go into loss without a harvest and report\\n /// being required.\\n /// @param _debtThreshold How big of a loss this Strategy may carry without\\n /// @dev By default this is 0, meaning any losses would cause a harvest which\\n /// will subsequently report the loss to the Manager for tracking.\\n function setDebtThreshold(uint256 _debtThreshold) external onlyRole(GUARDIAN_ROLE) {\\n debtThreshold = _debtThreshold;\\n emit UpdatedDebtThreshold(_debtThreshold);\\n }\\n\\n /// @notice Removes tokens from this Strategy that are not the type of tokens\\n /// managed by this Strategy. This may be used in case of accidentally\\n /// sending the wrong kind of token to this Strategy.\\n ///\\n /// Tokens will be sent to `governance()`.\\n ///\\n /// This will fail if an attempt is made to sweep `want`, or any tokens\\n /// that are protected by this Strategy.\\n ///\\n /// This may only be called by governance.\\n /// @param _token The token to transfer out of this `PoolManager`.\\n /// @param to Address to send the tokens to.\\n /// @dev\\n /// Implement `_protectedTokens()` to specify any additional tokens that\\n /// should be protected from sweeping in addition to `want`.\\n function sweep(address _token, address to) external onlyRole(GUARDIAN_ROLE) {\\n if (_token == address(want)) revert InvalidToken();\\n\\n address[] memory __protectedTokens = _protectedTokens();\\n uint256 protectedTokensLength = __protectedTokens.length;\\n for (uint256 i; i < protectedTokensLength; ++i)\\n // In the strategy we use so far, the only protectedToken is the want token\\n // and this has been checked above\\n if (_token == __protectedTokens[i]) revert InvalidToken();\\n\\n IERC20(_token).safeTransfer(to, IERC20(_token).balanceOf(address(this)));\\n }\\n\\n // ============================= MANAGER FUNCTIONS =============================\\n\\n /// @notice Adds a new guardian address and echoes the change to the contracts\\n /// that interact with this collateral `PoolManager`\\n /// @param _guardian New guardian address\\n /// @dev This internal function has to be put in this file because Access Control is not defined\\n /// in PoolManagerInternal\\n function addGuardian(address _guardian) external virtual;\\n\\n /// @notice Revokes the guardian role and propagates the change to other contracts\\n /// @param guardian Old guardian address to revoke\\n function revokeGuardian(address guardian) external virtual;\\n}\\n\",\"keccak256\":\"0x5e4df3040b02a882c1ce43fd090503a45916c4c9bd240751b3adec2a7bae9d4c\",\"license\":\"GPL-3.0\"},\"contracts/strategies/OptimizerAPR/OptimizerAPRStrategy.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity ^0.8.12;\\n\\nimport { Math } from \\\"@openzeppelin/contracts/utils/math/Math.sol\\\";\\n\\nimport \\\"../BaseStrategyUpgradeable.sol\\\";\\n\\nimport \\\"../../interfaces/IGenericLender.sol\\\";\\n\\n/// @title OptimizerAPRStrategy\\n/// @author Angle Labs, Inc.\\n/// @notice A lender optimisation strategy for any ERC20 asset, leveraging multiple lenders at once\\n/// @dev This strategy works by taking plugins designed for standard lending platforms and automatically\\n/// chooses to invest its funds in the best platforms to generate yield.\\n/// The allocation is greedy and may be sub-optimal so there is an additional option to manually set positions\\ncontract OptimizerAPRStrategy is BaseStrategyUpgradeable {\\n using SafeERC20 for IERC20;\\n using Address for address;\\n\\n // ================================= CONSTANTS =================================\\n\\n uint64 internal constant _BPS = 10000;\\n\\n // ============================ CONTRACTS REFERENCES ===========================\\n\\n IGenericLender[] public lenders;\\n\\n // ================================= PARAMETERS ================================\\n\\n uint256 public withdrawalThreshold;\\n\\n // =================================== EVENTS ==================================\\n\\n event AddLender(address indexed lender);\\n event RemoveLender(address indexed lender);\\n\\n /// @notice Constructor of the `Strategy`\\n /// @param _poolManager Address of the `PoolManager` lending to this strategy\\n /// @param governor Address with governor privilege\\n /// @param guardian Address of the guardian\\n function initialize(\\n address _poolManager,\\n address governor,\\n address guardian,\\n address[] memory keepers\\n ) external {\\n _initialize(_poolManager, governor, guardian, keepers);\\n withdrawalThreshold = 1000 * wantBase;\\n }\\n\\n // ============================= INTERNAL FUNCTIONS ============================\\n\\n /// @notice Frees up profit plus `_debtOutstanding`.\\n /// @param _debtOutstanding Amount to withdraw\\n /// @return _profit Profit freed by the call\\n /// @return _loss Loss discovered by the call\\n /// @return _debtPayment Amount freed to reimburse the debt\\n /// @dev If `_debtOutstanding` is more than we can free we get as much as possible.\\n function _prepareReturn(uint256 _debtOutstanding)\\n internal\\n override\\n returns (\\n uint256 _profit,\\n uint256 _loss,\\n uint256 _debtPayment\\n )\\n {\\n _debtPayment = _debtOutstanding;\\n\\n uint256 lentAssets = lentTotalAssets();\\n\\n uint256 looseAssets = want.balanceOf(address(this));\\n\\n uint256 total = looseAssets + lentAssets;\\n\\n if (lentAssets == 0) {\\n // No position to harvest or profit to report\\n if (_debtPayment > looseAssets) {\\n // We can only return looseAssets\\n _debtPayment = looseAssets;\\n }\\n\\n return (_profit, _loss, _debtPayment);\\n }\\n\\n uint256 debt = poolManager.strategies(address(this)).totalStrategyDebt;\\n\\n if (total > debt) {\\n _profit = total - debt;\\n\\n uint256 amountToFree = _profit + _debtPayment;\\n // We need to add outstanding to our profit\\n // don't need to do logic if there is nothing to free\\n if (amountToFree != 0 && looseAssets < amountToFree) {\\n // Withdraw what we can withdraw\\n _withdrawSome(amountToFree - looseAssets);\\n uint256 newLoose = want.balanceOf(address(this));\\n\\n // If we dont have enough money adjust _debtOutstanding and only change profit if needed\\n if (newLoose < amountToFree) {\\n if (_profit > newLoose) {\\n _profit = newLoose;\\n _debtPayment = 0;\\n } else {\\n _debtPayment = Math.min(newLoose - _profit, _debtPayment);\\n }\\n }\\n }\\n } else {\\n // Serious loss should never happen but if it does lets record it accurately\\n _loss = debt - total;\\n\\n uint256 amountToFree = _loss + _debtPayment;\\n if (amountToFree != 0 && looseAssets < amountToFree) {\\n // Withdraw what we can withdraw\\n\\n _withdrawSome(amountToFree - looseAssets);\\n uint256 newLoose = want.balanceOf(address(this));\\n\\n // If we dont have enough money adjust `_debtOutstanding` and only change profit if needed\\n if (newLoose < amountToFree) {\\n if (_loss > newLoose) {\\n _loss = newLoose;\\n _debtPayment = 0;\\n } else {\\n _debtPayment = Math.min(newLoose - _loss, _debtPayment);\\n }\\n }\\n }\\n }\\n }\\n\\n /// @notice Estimates highest and lowest apr lenders among a `lendersList`\\n /// @param lendersList List of all the lender contracts associated to this strategy\\n /// @return _lowest The index of the lender in the `lendersList` with lowest apr\\n /// @return _highest The index of the lender with highest apr\\n /// @return _investmentStrategy Whether we should invest from the lowest to the highest yielding strategy or simply invest loose assets\\n /// @return _totalApr The APR computed according to (greedy) heuristics that will determine whether positions should be adjusted\\n /// according to the solution proposed by the caller or according to the greedy method\\n /// @dev `lendersList` is kept as a parameter to avoid multiplying reads in storage to the `lenders` array\\n function _estimateGreedyAdjustPosition(IGenericLender[] memory lendersList)\\n internal\\n view\\n returns (\\n uint256 _lowest,\\n uint256 _highest,\\n bool _investmentStrategy,\\n uint256 _totalApr\\n )\\n {\\n // All loose assets are to be invested\\n uint256 looseAssets = want.balanceOf(address(this));\\n\\n // Simple greedy algo:\\n // - Get the lowest apr strat\\n // - Cycle through and see who could take its funds to improve the overall highest APR\\n uint256 lowestNav;\\n uint256 highestApr;\\n uint256 highestLenderNav;\\n uint256 totalNav = looseAssets;\\n uint256[] memory weightedAprs = new uint256[](lendersList.length);\\n uint256 lendersListLength = lendersList.length;\\n {\\n uint256 lowestApr = type(uint256).max;\\n for (uint256 i; i < lendersListLength; ++i) {\\n uint256 aprAfterDeposit = lendersList[i].aprAfterDeposit(int256(looseAssets));\\n uint256 nav = lendersList[i].nav();\\n totalNav += nav;\\n if (aprAfterDeposit > highestApr) {\\n highestApr = aprAfterDeposit;\\n highestLenderNav = nav;\\n _highest = i;\\n }\\n // Checking strategies that have assets\\n if (nav > 10 * wantBase) {\\n uint256 apr = lendersList[i].apr();\\n weightedAprs[i] = apr * nav;\\n if (apr < lowestApr) {\\n lowestApr = apr;\\n lowestNav = nav;\\n _lowest = i;\\n }\\n }\\n }\\n }\\n\\n // Comparing if we are better off removing from the lowest APR yielding strategy to invest in the highest or just invest\\n // the loose assets in the highest yielding strategy\\n if (totalNav > 0) {\\n // Case where only loose assets are invested\\n uint256 weightedApr1;\\n // Case where funds are divested from the strategy with the lowest APR to be invested in the one with the highest APR\\n uint256 weightedApr2;\\n for (uint256 i; i < lendersListLength; ++i) {\\n if (i == _highest) {\\n weightedApr1 += (highestLenderNav + looseAssets) * highestApr;\\n if (lowestNav != 0 && lendersListLength > 1)\\n weightedApr2 +=\\n (highestLenderNav + looseAssets + lowestNav) *\\n lendersList[_highest].aprAfterDeposit(int256(lowestNav + looseAssets));\\n } else if (i == _lowest) {\\n weightedApr1 += weightedAprs[i];\\n // In the second case funds are divested so the lowest strat does not contribute to the highest APR case\\n } else {\\n weightedApr1 += weightedAprs[i];\\n weightedApr2 += weightedAprs[i];\\n }\\n }\\n if (weightedApr2 > weightedApr1 && lendersList.length > 1) {\\n _investmentStrategy = true;\\n _totalApr = weightedApr2 / totalNav;\\n } else _totalApr = weightedApr1 / totalNav;\\n }\\n }\\n\\n /// @inheritdoc BaseStrategyUpgradeable\\n function _adjustPosition(bytes memory data) internal override {\\n // Emergency exit is dealt with at beginning of harvest\\n if (emergencyExit) return;\\n\\n // Storing the `lenders` array in a cache variable\\n IGenericLender[] memory lendersList = lenders;\\n uint256 lendersListLength = lendersList.length;\\n // We just keep all money in `want` if we dont have any lenders\\n if (lendersListLength == 0) return;\\n\\n uint64[] memory lenderSharesHint = abi.decode(data, (uint64[]));\\n\\n uint256 estimatedAprHint;\\n int256[] memory lenderAdjustedAmounts;\\n if (lenderSharesHint.length != 0) (estimatedAprHint, lenderAdjustedAmounts) = estimatedAPR(lenderSharesHint);\\n (uint256 lowest, uint256 highest, bool _investmentStrategy, uint256 _totalApr) = _estimateGreedyAdjustPosition(\\n lendersList\\n );\\n\\n // The hint was successful --> we find a better allocation than the current one\\n if (_totalApr < estimatedAprHint) {\\n uint256 deltaWithdraw;\\n for (uint256 i; i < lendersListLength; ++i) {\\n if (lenderAdjustedAmounts[i] < 0) {\\n deltaWithdraw +=\\n uint256(-lenderAdjustedAmounts[i]) -\\n lendersList[i].withdraw(uint256(-lenderAdjustedAmounts[i]));\\n }\\n }\\n\\n // If the strategy didn't succeed to withdraw the intended funds -> revert and force the greedy path\\n if (deltaWithdraw > withdrawalThreshold) revert IncorrectDistribution();\\n\\n for (uint256 i; i < lendersListLength; ++i) {\\n // As `deltaWithdraw` is inferior to `withdrawalThreshold` (a dust)\\n // It is not critical to compensate on an arbitrary lender as it will only slightly impact global APR\\n if (lenderAdjustedAmounts[i] > int256(deltaWithdraw)) {\\n lenderAdjustedAmounts[i] -= int256(deltaWithdraw);\\n deltaWithdraw = 0;\\n want.safeTransfer(address(lendersList[i]), uint256(lenderAdjustedAmounts[i]));\\n lendersList[i].deposit();\\n } else if (lenderAdjustedAmounts[i] > 0) deltaWithdraw -= uint256(lenderAdjustedAmounts[i]);\\n }\\n } else {\\n if (_investmentStrategy) {\\n lendersList[lowest].withdrawAll();\\n }\\n\\n uint256 bal = want.balanceOf(address(this));\\n if (bal != 0) {\\n want.safeTransfer(address(lendersList[highest]), bal);\\n lendersList[highest].deposit();\\n }\\n }\\n }\\n\\n /// @inheritdoc BaseStrategyUpgradeable\\n function _adjustPosition() internal override {\\n _adjustPosition(abi.encode(new uint64[](0)));\\n }\\n\\n /// @inheritdoc BaseStrategyUpgradeable\\n function _adjustPosition(uint256) internal override {\\n _adjustPosition(abi.encode(new uint64[](0)));\\n }\\n\\n /// @notice Withdraws a given amount from lenders\\n /// @param _amount The amount to withdraw\\n /// @dev Cycle through withdrawing from worst rate first\\n function _withdrawSome(uint256 _amount) internal returns (uint256 amountWithdrawn) {\\n IGenericLender[] memory lendersList = lenders;\\n uint256 lendersListLength = lendersList.length;\\n if (lendersListLength == 0) {\\n return 0;\\n }\\n\\n // Don't withdraw dust\\n uint256 _withdrawalThreshold = withdrawalThreshold;\\n if (_amount < _withdrawalThreshold) {\\n return 0;\\n }\\n\\n amountWithdrawn;\\n // In most situations this will only run once. Only big withdrawals will be a gas guzzler\\n uint256 j;\\n while (amountWithdrawn < _amount - _withdrawalThreshold) {\\n uint256 lowestApr = type(uint256).max;\\n uint256 lowest;\\n for (uint256 i; i < lendersListLength; ++i) {\\n if (lendersList[i].hasAssets()) {\\n uint256 apr = lendersList[i].apr();\\n if (apr < lowestApr) {\\n lowestApr = apr;\\n lowest = i;\\n }\\n }\\n }\\n if (!lendersList[lowest].hasAssets()) {\\n return amountWithdrawn;\\n }\\n uint256 amountWithdrawnFromStrat = lendersList[lowest].withdraw(_amount - amountWithdrawn);\\n // To avoid staying on the same strat if we can't withdraw anythin from it\\n amountWithdrawn += amountWithdrawnFromStrat;\\n ++j;\\n // not best solution because it would be better to move to the 2nd lowestAPR instead of quiting\\n if (amountWithdrawnFromStrat == 0) {\\n return amountWithdrawn;\\n }\\n // To avoid want infinite loop\\n if (j >= 6) {\\n return amountWithdrawn;\\n }\\n }\\n }\\n\\n /// @notice Liquidates up to `_amountNeeded` of `want` of this strategy's positions,\\n /// irregardless of slippage. Any excess will be re-invested with `_adjustPosition()`.\\n /// This function should return the amount of `want` tokens made available by the\\n /// liquidation. If there is a difference between them, `_loss` indicates whether the\\n /// difference is due to a realized loss, or if there is some other sitution at play\\n /// (e.g. locked funds) where the amount made available is less than what is needed.\\n ///\\n /// NOTE: The invariant `_liquidatedAmount + _loss <= _amountNeeded` should always be maintained\\n function _liquidatePosition(uint256 _amountNeeded) internal override returns (uint256 _amountFreed, uint256 _loss) {\\n uint256 _balance = want.balanceOf(address(this));\\n\\n if (_balance >= _amountNeeded) {\\n //if we don't set reserve here withdrawer will be sent our full balance\\n return (_amountNeeded, 0);\\n } else {\\n uint256 received = _withdrawSome(_amountNeeded - _balance) + (_balance);\\n if (received >= _amountNeeded) {\\n return (_amountNeeded, 0);\\n } else {\\n return (received, 0);\\n }\\n }\\n }\\n\\n /// @notice Liquidates everything and returns the amount that got freed.\\n /// This function is used during emergency exit instead of `_prepareReturn()` to\\n /// liquidate all of the Strategy's positions back to the Manager.\\n function _liquidateAllPositions() internal override returns (uint256 _amountFreed) {\\n (_amountFreed, ) = _liquidatePosition(estimatedTotalAssets());\\n }\\n\\n // =============================== VIEW FUNCTIONS ==============================\\n\\n /// @notice View function to check the current state of the strategy\\n /// @return Returns the status of all lenders attached the strategy\\n function lendStatuses() external view returns (LendStatus[] memory) {\\n uint256 lendersLength = lenders.length;\\n LendStatus[] memory statuses = new LendStatus[](lendersLength);\\n for (uint256 i; i < lendersLength; ++i) {\\n LendStatus memory s;\\n s.name = lenders[i].lenderName();\\n s.add = address(lenders[i]);\\n s.assets = lenders[i].nav();\\n s.rate = lenders[i].apr();\\n statuses[i] = s;\\n }\\n return statuses;\\n }\\n\\n /// @notice View function to check the total assets lent\\n function lentTotalAssets() public view returns (uint256) {\\n uint256 nav;\\n uint256 lendersLength = lenders.length;\\n for (uint256 i; i < lendersLength; ++i) {\\n nav += lenders[i].nav();\\n }\\n return nav;\\n }\\n\\n /// @notice View function to check the total assets managed by the strategy\\n function estimatedTotalAssets() public view override returns (uint256 nav) {\\n nav = lentTotalAssets() + want.balanceOf(address(this));\\n }\\n\\n /// @notice View function to check the number of lending platforms\\n function numLenders() external view returns (uint256) {\\n return lenders.length;\\n }\\n\\n /// @notice Returns the weighted apr of all lenders\\n /// @dev It's computed by doing: `sum(nav * apr) / totalNav`\\n function estimatedAPR() external view returns (uint256) {\\n uint256 bal = estimatedTotalAssets();\\n if (bal == 0) {\\n return 0;\\n }\\n\\n uint256 weightedAPR;\\n uint256 lendersLength = lenders.length;\\n for (uint256 i; i < lendersLength; ++i) {\\n weightedAPR += lenders[i].weightedApr();\\n }\\n\\n return weightedAPR / bal;\\n }\\n\\n /// @notice Returns the weighted apr in an hypothetical world where the strategy splits its nav\\n /// in respect to shares\\n /// @param shares List of shares (in bps of the nav) that should be allocated to each lender\\n function estimatedAPR(uint64[] memory shares)\\n public\\n view\\n returns (uint256 weightedAPR, int256[] memory lenderAdjustedAmounts)\\n {\\n uint256 lenderLength = lenders.length;\\n lenderAdjustedAmounts = new int256[](lenderLength);\\n if (lenderLength != shares.length) revert IncorrectListLength();\\n\\n uint256 bal = estimatedTotalAssets();\\n if (bal == 0) return (weightedAPR, lenderAdjustedAmounts);\\n\\n uint256 share;\\n for (uint256 i; i < lenderLength; ++i) {\\n share += shares[i];\\n uint256 futureDeposit = (bal * shares[i]) / _BPS;\\n // It won't overflow for `decimals <= 18`, as it would mean gigantic amounts\\n int256 adjustedAmount = int256(futureDeposit) - int256(lenders[i].nav());\\n lenderAdjustedAmounts[i] = adjustedAmount;\\n weightedAPR += futureDeposit * lenders[i].aprAfterDeposit(adjustedAmount);\\n }\\n if (share != 10000) revert InvalidShares();\\n\\n weightedAPR /= bal;\\n }\\n\\n /// @notice Prevents governance from withdrawing `want` tokens\\n function _protectedTokens() internal view override returns (address[] memory) {\\n address[] memory protected = new address[](1);\\n protected[0] = address(want);\\n return protected;\\n }\\n\\n // ================================= GOVERNANCE ================================\\n\\n /// @notice Changes the withdrawal threshold\\n /// @param _threshold New withdrawal threshold\\n /// @dev governor, guardian or `PoolManager` only\\n function setWithdrawalThreshold(uint256 _threshold) external onlyRole(GUARDIAN_ROLE) {\\n withdrawalThreshold = _threshold;\\n }\\n\\n /// @notice Add lenders for the strategy to choose between\\n /// @param newLender The adapter to the added lending platform\\n /// @dev Governor, guardian or `PoolManager` only\\n function addLender(IGenericLender newLender) external onlyRole(GUARDIAN_ROLE) {\\n if (newLender.strategy() != address(this)) revert UndockedLender();\\n uint256 lendersLength = lenders.length;\\n for (uint256 i; i < lendersLength; ++i) {\\n if (address(newLender) == address(lenders[i])) revert LenderAlreadyAdded();\\n }\\n lenders.push(newLender);\\n\\n emit AddLender(address(newLender));\\n }\\n\\n /// @notice Removes a lending platform and fails if total withdrawal is impossible\\n /// @param lender The address of the adapter to the lending platform to remove\\n function safeRemoveLender(address lender) external onlyRole(KEEPER_ROLE) {\\n _removeLender(lender, false);\\n }\\n\\n /// @notice Removes a lending platform even if total withdrawal is impossible\\n /// @param lender The address of the adapter to the lending platform to remove\\n function forceRemoveLender(address lender) external onlyRole(GUARDIAN_ROLE) {\\n _removeLender(lender, true);\\n }\\n\\n /// @notice Internal function to handle lending platform removal\\n /// @param lender The address of the adapter for the lending platform to remove\\n /// @param force Whether it is required that all the funds are withdrawn prior to removal\\n function _removeLender(address lender, bool force) internal {\\n IGenericLender[] memory lendersList = lenders;\\n uint256 lendersListLength = lendersList.length;\\n for (uint256 i; i < lendersListLength; ++i) {\\n if (lender == address(lendersList[i])) {\\n bool allWithdrawn = lendersList[i].withdrawAll();\\n\\n if (!force && !allWithdrawn) revert FailedWithdrawal();\\n\\n // Put the last index here\\n // then remove last index\\n if (i != lendersListLength - 1) {\\n lenders[i] = lendersList[lendersListLength - 1];\\n }\\n\\n // Pop shortens array by 1 thereby deleting the last index\\n lenders.pop();\\n\\n // If balance to spend we might as well put it into the best lender\\n if (want.balanceOf(address(this)) != 0) {\\n _adjustPosition();\\n }\\n\\n emit RemoveLender(lender);\\n\\n return;\\n }\\n }\\n revert NonExistentLender();\\n }\\n\\n // ============================= MANAGER FUNCTIONS =============================\\n\\n /// @notice Adds a new guardian address and echoes the change to the contracts\\n /// that interact with this collateral `PoolManager`\\n /// @param _guardian New guardian address\\n /// @dev This internal function has to be put in this file because `AccessControl` is not defined\\n /// in `PoolManagerInternal`\\n function addGuardian(address _guardian) external override onlyRole(POOLMANAGER_ROLE) {\\n // Granting the new role\\n // Access control for this contract\\n _grantRole(GUARDIAN_ROLE, _guardian);\\n // Propagating the new role to underyling lenders\\n uint256 lendersLength = lenders.length;\\n for (uint256 i; i < lendersLength; ++i) {\\n lenders[i].grantRole(GUARDIAN_ROLE, _guardian);\\n }\\n }\\n\\n /// @notice Revokes the guardian role and propagates the change to other contracts\\n /// @param guardian Old guardian address to revoke\\n function revokeGuardian(address guardian) external override onlyRole(POOLMANAGER_ROLE) {\\n _revokeRole(GUARDIAN_ROLE, guardian);\\n uint256 lendersLength = lenders.length;\\n for (uint256 i; i < lendersLength; ++i) {\\n lenders[i].revokeRole(GUARDIAN_ROLE, guardian);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xc8d580d60cff417dc0656ad79ec3750dfde5c85de930ca48e85973e7534c2cf6\",\"license\":\"GPL-3.0\"},\"contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity ^0.8.12;\\n\\nerror ErrorSwap();\\nerror FailedToMint();\\nerror FailedToRecoverETH();\\nerror FailedToRedeem();\\nerror FailedWithdrawal();\\nerror IncompatibleLengths();\\nerror IncorrectDistribution();\\nerror IncorrectListLength();\\nerror InvalidOracleValue();\\nerror InvalidSender();\\nerror InvalidSetOfParameters();\\nerror InvalidShares();\\nerror InvalidToken();\\nerror InvalidWithdrawCheck();\\nerror LenderAlreadyAdded();\\nerror NoLockedLiquidity();\\nerror NonExistentLender();\\nerror PoolNotIncentivized();\\nerror ProtectedToken();\\nerror TooHighParameterValue();\\nerror TooSmallAmount();\\nerror TooSmallAmountOut();\\nerror TooSmallStakingPeriod();\\nerror UndockedLender();\\nerror WrongCToken();\\nerror ZeroAddress();\\n\",\"keccak256\":\"0xfa9b61c467cdf0c762bd8e9d8f5eba220a05f1b2056e60567c5677977b2ac80c\",\"license\":\"GPL-3.0\"}},\"version\":1}", + "bytecode": "0x60808060405234620000d3576000549060ff8260081c169081600014620000c857303b155b156200006f57501590816200005c575b506200004b575b60405161508c9081620000d98239f35b61ff0019600054166000556200003b565b61ffff1916610101176000553862000034565b62461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b60ff83161562000024565b600080fdfe6101006040908082526004918236101561001857600080fd5b600092833560e01c9283630b6d1d1714612087575082630c016dc01461202e5782630e6e15f014611ff35782630f969b8714611f855782631d12f28b14611f485782631f1fcd5114611ef557826322f3e2d414611eb1578263248a9ca314611e6857826324ea54f414611e0f5782632e1a7d4d14611d9c5782632f2ff15d14611ca5578263364bc15a14611c4c57826336568abe14611b8e5782634641257d14611b575782634786b0cb14611b165782635641ec0314611ad45782635a5cd45e14611a99578263708ba9bd1461199a57826376ee75d8146119515782637985fd51146119145782638baf2957146118cb57826391d1485414611859578263929eea21146117d557826393084b34146115db578263a217fddf146115a2578263a526d83b1461148b578263af648c3d146112eb578263b8dc491b14611120578263bb927c46146110e3578263ce5c7f611461104c578263d547741f14610ff2578263dc4c90d314610f9c578263ddc6326214610f50578263e6a69ab814610f13578263e6bfbfd8146106a3578263ec342ad014610662578263efbb5cb014610620578263fcc5f59a1461026157505063fcf2d0ad146101d557600080fd5b3461025e57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e5761020c336125d8565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0060335416176033557f17fa25a1c2ac074f71f0cf4f6af525c06fab7d83eff5ffcf6df5277f2919ae248180a180f35b80fd5b83903461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760655461029d816121c8565b916102aa85519384612187565b8183527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06102d7836121c8565b01845b818110610605575050835b8281106103a557505050825191602080840190808552835180925285850181878460051b880101950193965b83881061031e5786860387f35b90919293948380827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a60019503018652885190610364825160808084528301906122a3565b918381015184830152868101518783015273ffffffffffffffffffffffffffffffffffffffff60608092015116910152970193019701969093929193610311565b6103ad6146e9565b6103b6826121e0565b905488517f8b2021760000000000000000000000000000000000000000000000000000000081528881878173ffffffffffffffffffffffffffffffffffffffff8096600398891b1c165afa9081156105fb578991610576575b5083528061041c856121e0565b905490841b1c16606084015280610432856121e0565b905490841b1c1691895180937fc1590cd7000000000000000000000000000000000000000000000000000000008252818860209687935afa90811561056c579187939185938c91610534575b508387015261048c876121e0565b9054911b1c168a51928380927f57ded9c90000000000000000000000000000000000000000000000000000000082525afa91821561052a5788926104f6575b5050878201526104f191906104e0828761324f565b526104eb818661324f565b50613222565b6102e5565b90809250813d8311610523575b61050d8183612187565b8101031261051f57516104f1896104cb565b8680fd5b503d610503565b89513d8a823e3d90fd5b929450509181813d8311610565575b61054d8183612187565b81010312610561579183918793518d61047e565b8980fd5b503d610543565b8b513d8c823e3d90fd5b90503d808a833e6105878183612187565b81019060209081818403126105f75780519067ffffffffffffffff82116105f357019082601f830112156105f757908b92918151926105d16105c885612246565b95519586612187565b8385528184840101116105f3576105ed92918482019101612280565b8a61040f565b8b80fd5b8a80fd5b8a513d8b823e3d90fd5b6020906106106146e9565b828288010152016102da565b5080fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b6147eb565b9051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209051670de0b6b3a76400008152f35b915034610f0f5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576106dc6120e9565b6106e46120c1565b916044359173ffffffffffffffffffffffffffffffffffffffff9182841691828503610f0b576064359267ffffffffffffffff8411610bcc5736602385011215610bcc578388013596610736886121c8565b9061074385519283612187565b8882526020958683016024809b60051b83010191368311610dea578b01905b828210610eef575050508a549760ff93848a60081c1680600014610ee657303b155b15610e655789898f928f90159d8e610e37575b506033547fffffffffffffffffffffff0000000000000000000000000000000000000000ff74ffffffffffffffffffffffffffffffffffffffff008c60081b1691161790816033558b51809481937ffc0c546a00000000000000000000000000000000000000000000000000000000835260081c165afa908115610e2d578b8f928c928591610e00575b5016807fffffffffffffffffffffffff000000000000000000000000000000000000000060345416176034558a51928380927f313ce5670000000000000000000000000000000000000000000000000000000082525afa918215610df557908792610db7575b5016604d8111610d8c57600a0a6035558015908115610d81575b8115610d75575b50610d4d578b949392916108be6108c392612c34565b612c34565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5629182855260019384885288878720911690818752885281878720541615610ce7575b50908291859387965284885284868520015492807fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9481868880a480868887200155857f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419786898098528383838320015489898480a42001558151908d5b828110610be157505050507ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab808c5283875283868d200154918c80a4828920015568056bc75e2d63100000603655603354927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00841660335580603454169360081c168151917fdd62ed3e000000000000000000000000000000000000000000000000000000008352308884015281878401528383604481885afa928315610bd7578993610ba4575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301809311610b7957517f095ea7b3000000000000000000000000000000000000000000000000000000009381019390935273ffffffffffffffffffffffffffffffffffffffff168583019081526020810191909152610b049290610aff9083906040015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101845283612187565b612e2b565b610b4e575b603554916103e89280840293840403610b2457505060665580f35b601184917f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff8354168355610b09565b868960118a7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b9092508381813d8311610bd0575b610bbc8183612187565b81010312610bcc57519138610a4c565b8880fd5b503d610bb2565b81513d8b823e3d90fd5b90919293945089610bf2828661324f565b511615610cbf57808e8b610c09610c4e948861324f565b51167ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab808352898d528b83208284528d52858c8420541615610c59575b505050613222565b908694939291610984565b808352898d528b83208284528d528b83208a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d339380a48e3880610c46565b8c88517fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b8386528488528686208187528852868620857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790553390847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8880a438610906565b8a86517fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b905088831614386108a8565b838a161591506108a1565b8b8e60118f7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8092508a8092503d8311610dee575b610dd08183612187565b81010312610dea57518581168103610dea57859038610887565b8d80fd5b503d610dc6565b8951903d90823e3d90fd5b610e209150833d8511610e26575b610e188183612187565b810190613263565b38610821565b503d610e0e565b89513d84823e3d90fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661010117845538610797565b60848d602e8e8c8c51937f08c379a00000000000000000000000000000000000000000000000000000000085528401528201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152fd5b858b1615610784565b81358a81168103610f07578152908801908801610762565b8e80fd5b8780fd5b8280fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090516301e185588152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f8933612769565b610f9161303b565b610f99614255565b80f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209073ffffffffffffffffffffffffffffffffffffffff60335460081c169051908152f35b915034610f0f57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57610f99913561104760016110346120c1565b93838752816020528620015433906128fa565b612d10565b915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f578282359267ffffffffffffffff841161061c573660238501121561061c57830135926110b46110ab85612246565b93519384612187565b838352366024858301011161061c5783610f999460246020930183860137830101526110de61303b565b6136f8565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906065549051908152f35b915034610f0f57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576111586120e9565b6111606120c1565b9061116a336122e6565b73ffffffffffffffffffffffffffffffffffffffff908180603454169116918183146112c35784519061119c8261214f565b60018252602092838301843682378351156112975752815191885b83811061124e57505050508351947f70a0823100000000000000000000000000000000000000000000000000000000865230908601528085602481855afa9384156112455750859361120f575b50610f999350612db2565b90925083813d831161123e575b6112268183612187565b8101031261123a57610f9992519138611204565b8380fd5b503d61121c565b513d87823e3d90fd5b82611259828461324f565b5116861461126f5761126a90613222565b6111b7565b8888517fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b60248a60328b7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8585517fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576113256120e9565b9161132f336125d8565b837f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504180825260016020528282209373ffffffffffffffffffffffffffffffffffffffff8096169485845260205260ff8484205416611425575b60655495835b878110611399578480f35b816113a3826121e0565b90549060031b1c16803b156114215785809160448951809481937fd547741f0000000000000000000000000000000000000000000000000000000083528a8a8401528d60248401525af18015611417579061140392916114085750613222565b61138e565b6114119061210c565b386104eb565b87513d88823e3d90fd5b8580fd5b81835260016020528383208584526020528383207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690553385837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b8680a4611388565b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57906114c66120e9565b906114d0336125d8565b6114d982612c34565b8360655493819373ffffffffffffffffffffffffffffffffffffffff809116945b868110611505578380f35b8161150f826121e0565b90549060031b1c16803b1561159e5784809160448851809481937f2f2ff15d0000000000000000000000000000000000000000000000000000000083527f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50418a8401528c60248401525af18015611594579061158f92916114085750613222565b6114fa565b86513d87823e3d90fd5b8480fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5751908152602090f35b83823461061c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57823573ffffffffffffffffffffffffffffffffffffffff918282169283830361159e57611638336122e6565b81517fa8c62e760000000000000000000000000000000000000000000000000000000081526020818881885afa9081156117cb5786916117ad575b5081309116036117855760655491855b838110611737575050506801000000000000000081101561170b57906116b28260016116e494016065556121e0565b90919082549060031b9173ffffffffffffffffffffffffffffffffffffffff9283811b93849216901b16911916179055565b7f1e7b117a6591133f0b36fc2c24d59f8465d806fdcad63aa33246b45fd62c89ff8280a280f35b6024846041877f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b82611741826121e0565b90549060031b1c16861461175d5761175890613222565b611683565b8782517f7cc7731c000000000000000000000000000000000000000000000000000000008152fd5b8582517feeacc72d000000000000000000000000000000000000000000000000000000008152fd5b6117c5915060203d8111610e2657610e188183612187565b87611673565b83513d88823e3d90fd5b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f5735606554811015610f0f5773ffffffffffffffffffffffffffffffffffffffff906065602094527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70154169051908152f35b90915034610f0f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f578160209360ff926118996120c1565b903582526001865273ffffffffffffffffffffffffffffffffffffffff83832091168252855220541690519015158152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f996119066120e9565b61190f33612769565b614edd565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906066549051908152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f9961198c6120e9565b611995336122e6565b614c3a565b833461025e57602091827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57803567ffffffffffffffff9182821161123a573660238301121561123a578101356119f6816121c8565b92611a0387519485612187565b81845260248685019260051b8401019236841161142157959695602401915b838310611a7b5750505050611a369061497e565b9190835194848695860192865281860152835180925280606086019401925b828110611a6457505050500390f35b835185528695509381019392810192600101611a55565b8297969735828116810361051f578152959695918701918701611a22565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b614894565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209060ff6033541690519015158152f35b83903461061c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57611b50336122e6565b3560665580f35b833461025e57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f9161303b565b83903461061c57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57611bc66120c1565b903373ffffffffffffffffffffffffffffffffffffffff831603611bef5790610f999135612d10565b60649060208551917f08c379a0000000000000000000000000000000000000000000000000000000008352820152600260248201527f37310000000000000000000000000000000000000000000000000000000000006044820152fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab8152f35b90915034610f0f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f573590611ce06120c1565b908284526001602052611cfa6001828620015433906128fa565b828452600160205273ffffffffffffffffffffffffffffffffffffffff81852092169182855260205260ff818520541615611d33578380f35b8284526001602052808420828552602052832060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905533917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8480a43880808380f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e5750611de090611dda336125d8565b35614625565b611e03823373ffffffffffffffffffffffffffffffffffffffff60345416612db2565b82519182526020820152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50418152f35b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57816020936001923581528285522001549051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090611eec6147eb565b15159051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209073ffffffffffffffffffffffffffffffffffffffff603454169051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906036549051908152f35b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f577fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a8600916020913590611fe7336122e6565b8160365551908152a180f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b61471f565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5628152f35b84903461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906035548152f35b6024359073ffffffffffffffffffffffffffffffffffffffff821682036120e457565b600080fd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036120e457565b67ffffffffffffffff811161212057604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761212057604052565b6080810190811067ffffffffffffffff82111761212057604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761212057604052565b67ffffffffffffffff81116121205760051b60200190565b6065548110156122175760656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b67ffffffffffffffff811161212057601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381106122935750506000910152565b8181015183820152602001612283565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936122df81518092818752878088019101612280565b0116010190565b73ffffffffffffffffffffffffffffffffffffffff1660008181527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db6020908152604080832054909391927f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419290916001919060ff161561236957505050505050565b61237290612aae565b9285519161237f8361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116124e05750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b8401917f206973206d697373696e6720726f6c6520000000000000000000000000000000603784015251809386840190612280565b01036028810187520185612187565b519283927f08c379a0000000000000000000000000000000000000000000000000000000008452600484015260248301906122a3565b0390fd5b6064848651907f08c379a000000000000000000000000000000000000000000000000000000000825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a61251d8587612a9d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191906123ac565b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526032600452fd5b73ffffffffffffffffffffffffffffffffffffffff1660008181527f015260285f12fe1d77221203cd7e5aa67b79d47399b4bedd98b8730e56d911bf6020908152604080832054909391927f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5629290916001919060ff161561265b57505050505050565b61266490612aae565b928551916126718361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116126f85750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a6127358587612a9d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01919061269e565b73ffffffffffffffffffffffffffffffffffffffff1660008181527f10c15aae13326e9b33c92ffbb94efb7492c500f0cca324caca9bd1aca194ed186020908152604080832054909391927ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab9290916001919060ff16156127ec57505050505050565b6127f590612aae565b928551916128028361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116128895750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a6128c68587612a9d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01919061282f565b60009080825260019160209280845260409473ffffffffffffffffffffffffffffffffffffffff868420911690818452855260ff86842054161561294057505050505050565b61294990612aae565b928551916129568361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116129dd5750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a612a1a8587612a9d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019190612983565b81810292918115918404141715612a6157565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b91908201809211612a6157565b908151811015612217570160200190565b604051906060820182811067ffffffffffffffff82111761212057604052602a82526020820160403682378251156122175760309053815160019081101561221757607860218401536029905b808211612b69575050612b0b5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015612c06577f3031323334353637383961626364656600000000000000000000000000000000901a612ba58486612a9d565b5360041c918015612bd8577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190612afb565b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b73ffffffffffffffffffffffffffffffffffffffff1660008181527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db60205260408120549091907f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419060ff1615612caa57505050565b8083526001602052604083208284526020526040832060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d339380a4565b90600091808352600160205273ffffffffffffffffffffffffffffffffffffffff6040842092169182845260205260ff604084205416612d4f57505050565b808352600160205260408320828452602052604083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b339380a4565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff90921660248301526044820192909252612e1191610aff8260648101610ad3565b565b908160209103126120e4575180151581036120e45790565b604051612eb59173ffffffffffffffffffffffffffffffffffffffff16612e518261214f565b6000806020958685527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656487860152868151910182855af13d15612f5e573d91612e9983612246565b92612ea76040519485612187565b83523d60008785013e612f62565b80519081612ec257505050565b8280612ed2938301019101612e13565b15612eda5750565b608490604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b6060915b91929015612fdd5750815115612f76575090565b3b15612f7f5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b825190915015612ff05750805190602001fd5b612480906040519182917f08c379a00000000000000000000000000000000000000000000000000000000083526020600484015260248301906122a3565b91908203918211612a6157565b600080603354916040918251937fbf3759b500000000000000000000000000000000000000000000000000000000855273ffffffffffffffffffffffffffffffffffffffff90602086600481858560081c165afa9586156132185784966131e4575b5060ff16156131a8576130b66130b16147eb565b614625565b508580821015613185576130cb92935061302e565b905b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d50960806130fa848861302e565b965b86519086825285602083015288888301526060820152a160335460081c16803b156120e45760009283606492865197889586947fa1d9bafc0000000000000000000000000000000000000000000000000000000086526004860152602485015260448401525af190811561317b57506131725750565b612e119061210c565b513d6000823e3d90fd5b90818111613195575b50506130cd565b6131a092945061302e565b91843861318e565b849250608091506131d97f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d5099561328f565b9691939093946130fc565b9095506020813d8211613210575b816131ff60209383612187565b8101031261123a57519460ff61309d565b3d91506131f2565b85513d86823e3d90fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612a615760010190565b80518210156122175760209160051b010190565b908160209103126120e4575173ffffffffffffffffffffffffffffffffffffffff811681036120e45790565b906000809182849261329f61471f565b9573ffffffffffffffffffffffffffffffffffffffff908160345416906040938451998a927f70a08231000000000000000000000000000000000000000000000000000000009485855230600486015284602460209687935afa9b8c156135d357889c613600575b50613312828d612a90565b91156135dd5750602460608660335460081c168851928380927f39ebf8230000000000000000000000000000000000000000000000000000000082523060048301525afa9081156135d3579084918991613544575b500151918282111561347057509061337e9161302e565b98613389888b612a90565b9384151580613467575b6133a1575b50505050505050565b6133b46133af84938761302e565b6142f4565b506034541692602486518095819382523060048301525afa93841561345e5750849361342e575b505081106133ee575b8080808080613398565b9192828692961160001461340857505092905b38806133e4565b909491856134159161302e565b91508082101561342757505b90613401565b9050613421565b9080929350813d8311613457575b6134468183612187565b81010312610f0f57519038806133db565b503d61343c565b513d86823e3d90fd5b50848210613393565b9a995061347c9161302e565b97613487888a612a90565b938415158061353b575b61349e5750505050505050565b6134ac6133af84938761302e565b506034541692602486518095819382523060048301525afa93841561345e5750849361350b575b505081106134e5578080808080613398565b919282859295116000146134fe575050919038806133e4565b909391846134159161302e565b9080929350813d8311613534575b6135238183612187565b81010312610f0f57519038806134d3565b503d613519565b50848210613491565b9150506060813d82116135cb575b8161355f60609383612187565b81010312610f0b578651906060820182811067ffffffffffffffff82111761359e57885280518252808501518286015287015187820152839038613367565b60248a7f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b3d9150613552565b87513d8a823e3d90fd5b955050505050508592939450949094116135f8575b50829190565b9150386135f2565b909b508381813d8311613628575b6136188183612187565b81010312610f0b57519a38613307565b503d61360e565b60405190606554808352826020918282019060656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c7936000905b82821061368257505050612e1192500383612187565b855473ffffffffffffffffffffffffffffffffffffffff168452600195860195889550938101939091019061366c565b7f80000000000000000000000000000000000000000000000000000000000000008114612a615760000390565b81810392916000138015828513169184121617612a6157565b60ff60335416613c735761370a61362f565b8060c052518060a05215613c735780518101906020818184019303126120e457602081015167ffffffffffffffff918282116120e457019180603f840112156120e45760208301519161375c836121c8565b9361376a6040519586612187565b8385526040602086019460051b8201019283116120e457604001925b8284106142035750505050600090606060e05280516141f0575b506000906000608052600090816024602073ffffffffffffffffffffffffffffffffffffffff60345416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9081156141e357608051916141ab575b50608051908182908260c05151917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061385d613847856121c8565b946138556040519687612187565b8086526121c8565b0136602085013760c05151937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60805190603554915b878110613f1b5750505085613d37575b5050505050505010600014613b6e575050600090815b60a0518110156139d75760006138d18260e05161324f565b51126138e6575b6138e190613222565b6138b9565b9160006138fe6138f88560e05161324f565b516136b2565b602073ffffffffffffffffffffffffffffffffffffffff6139218760c05161324f565b511660246139346138f88960e05161324f565b60405195869384927f2e1a7d4d00000000000000000000000000000000000000000000000000000000845260048401525af19182156139cb57600092613995575b509161398761398d926138e19461302e565b90612a90565b9290506138d8565b90916020823d6020116139c3575b816139b060209383612187565b8101031261025e57505190613987613975565b3d91506139a3565b6040513d6000823e3d90fd5b50906066548111613b44576000905b60a051821015613b4057806139fd8360e05161324f565b511315613afe57613a1a90613a148360e05161324f565b516136df565b613a268260e05161324f565b52600090613a7c73ffffffffffffffffffffffffffffffffffffffff6034541673ffffffffffffffffffffffffffffffffffffffff613a678460c05161324f565b5116613a758460e05161324f565b5191612db2565b73ffffffffffffffffffffffffffffffffffffffff613a9d8260c05161324f565b5116803b15610f0f578280916004604051809481937fd0e30db00000000000000000000000000000000000000000000000000000000083525af18015613af35790613aed92916114085750613222565b906139e6565b6040513d85823e3d90fd5b906000613b0d8260e05161324f565b5113613b1d575b613aed90613222565b90613b38613aed91613b318460e05161324f565b519061302e565b919050613b14565b5050565b60046040517f5c3810af000000000000000000000000000000000000000000000000000000008152fd5b613ca8575b5073ffffffffffffffffffffffffffffffffffffffff603454166040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152602081602481855afa9081156139cb57600091613c76575b5080613bdb575050565b613c0a9173ffffffffffffffffffffffffffffffffffffffff613c0260805160c05161324f565b511690612db2565b73ffffffffffffffffffffffffffffffffffffffff613c2d60805160c05161324f565b5116803b156120e457600080916004604051809481937fd0e30db00000000000000000000000000000000000000000000000000000000083525af180156139cb57613172575b50565b906020823d602011613ca0575b81613c9060209383612187565b8101031261025e57505138613bd1565b3d9150613c83565b602073ffffffffffffffffffffffffffffffffffffffff613ccd60009360c05161324f565b51166004604051809481937f853828b60000000000000000000000000000000000000000000000000000000083525af180156139cb5715613b7357613d299060203d602011613d30575b613d218183612187565b810190612e13565b5038613b73565b503d613d17565b94965088958695869590915b818710613d97575050505050505080851180613d8a575b15613d79575050613d6d9060019361421c565b388080808080806138a3565b613d859291945061421c565b613d6d565b50600160c0515111613d5a565b909192939495966080518814600014613ed057613dc19061398783613dbc8988612a90565b612a4e565b9684151580613ec6575b613de4575b613dd990613222565b959493929190613d43565b9a613df885613df38887612a90565b612a90565b73ffffffffffffffffffffffffffffffffffffffff613e1b60805160c05161324f565b5116906020613e2a8989612a90565b6024604051809581937fa7d385e200000000000000000000000000000000000000000000000000000000835260048301525afa918215613ebb578b92613e85575b5091613987613e7d92613dd994612a4e565b9b9050613dd0565b9091506020813d602011613eb3575b81613ea160209383612187565b810103126105f7575190613987613e6b565b3d9150613e94565b6040513d8d823e3d90fd5b5060018311613dcb565b878d03613ef557613eef613dd991613ee88a8a61324f565b5190612a90565b97613222565b613f15889c613ee8613f0e613dd994613ee88d8d61324f565b9a8a61324f565b9b613222565b602498602073ffffffffffffffffffffffffffffffffffffffff613f418460c05161324f565b51166040519b8c80927fa7d385e20000000000000000000000000000000000000000000000000000000082528b60048301525afa998a1561419e578e9a614169575b50600490602073ffffffffffffffffffffffffffffffffffffffff613faa8560c05161324f565b5116604051938480927fc1590cd70000000000000000000000000000000000000000000000000000000082525afa9182156140e9578f92614133575b5081613ff191612a90565b998b8111614123575b50600a8481020484036140f65783600a028111614021575b5061401c90613222565b613893565b6004602073ffffffffffffffffffffffffffffffffffffffff6140468560c05161324f565b5116604051928380927f57ded9c90000000000000000000000000000000000000000000000000000000082525afa9081156140e9578f916140b7575b5061408d8282612a4e565b614097848b61324f565b528381106140a6575b50614012565b925094509c5061401c8d90386140a0565b90506020813d6020116140e1575b816140d260209383612187565b81010312610f07575138614082565b3d91506140c5565b8f604051903d90823e3d90fd5b60248e7f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b60808390529a5093508338613ffa565b9091506020813d602011614161575b8161414f60209383612187565b81010312610f07575190613ff1613fe6565b3d9150614142565b9099506020813d602011614196575b8161418560209383612187565b81010312610dea5751986004613f83565b3d9150614178565b8e604051903d90823e3d90fd5b90506020813d6020116141db575b816141c660209383612187565b810103126141d557513861380c565b60805180fd5b3d91506141b9565b6040513d608051823e3d90fd5b6141fa915061497e565b60e052386137a0565b835182811681036120e457815260209384019301613786565b8115614226570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6040516020908181019067ffffffffffffffff928183108484111761212057929082604052600081526040519360408501918180870152518092526060850193926000905b8382106142db575050505050906110de81612e1193037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612187565b845181168652948201949382019360019091019061429a565b6000806142ff61362f565b92835192831561461d57606654948583106146145781959395935b614324818561302e565b87101561460b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff968397845b8881106144c457505073ffffffffffffffffffffffffffffffffffffffff978861437b828661324f565b51166040998a51928380937f5be9b2d3000000000000000000000000000000000000000000000000000000008252602094859160049788915afa9081156144ba57899161449d575b501561448e57602483926143d88e938a61324f565b511694896143e6888d61302e565b935196879485937f2e1a7d4d0000000000000000000000000000000000000000000000000000000085528401525af1998a156112455750859961445a575b50506144338861443992612a90565b95613222565b96156144505760068710156144505795939561431a565b5050505091505090565b9080929950813d8311614487575b6144728183612187565b8101031261123a575196614433614439614424565b503d614468565b50505050965050505050505090565b6144b49150843d8611613d3057613d218183612187565b386143c3565b8d513d8b823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff806144e4838861324f565b5116906040918251918280927f5be9b2d3000000000000000000000000000000000000000000000000000000008252602093849160049687915afa908115614601578b916145e4575b50614545575b5050505061454090613222565b614351565b8190614551868b61324f565b51168451938480927f57ded9c90000000000000000000000000000000000000000000000000000000082525afa9283156145db575088926145ad575b505082811061459f575b808080614533565b915098506145408990614597565b90809250813d83116145d4575b6145c48183612187565b8101031261051f5751388061458d565b503d6145ba565b513d8a823e3d90fd5b6145fb9150833d8511613d3057613d218183612187565b3861452d565b85513d8d823e3d90fd5b50505050505090565b50935050505090565b935050505090565b6024602073ffffffffffffffffffffffffffffffffffffffff60345416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9081156139cb576000916146b8575b50818110614692575090600090565b80613df36133af6146a3938561302e565b8181106146b1575090600090565b9160009150565b906020823d82116146e1575b816146d160209383612187565b8101031261025e57505138614683565b3d91506146c4565b604051906080820182811067ffffffffffffffff8211176121205760405260006060838181528260208201528260408201520152565b600060655481905b80821061473357505090565b909161473e836121e0565b9054906040918251917fc1590cd70000000000000000000000000000000000000000000000000000000083528260048173ffffffffffffffffffffffffffffffffffffffff602095869560031b1c165afa92831561317b57506000926147ba575b50506147ae906147b492612a90565b92613222565b90614727565b81819392933d83116147e4575b6147d18183612187565b8101031261025e575051816147ae61479f565b503d6147c7565b6024906147f661471f565b602073ffffffffffffffffffffffffffffffffffffffff60345416604051948580927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9283156139cb57600093614861575b509161485e9192612a90565b90565b6020813d821161488c575b8161487960209383612187565b8101031261123a5751925061485e614852565b3d915061486c565b61489c6147eb565b908115614978576000916065549280935b8085106148c0575061485e92935061421c565b906148ca856121e0565b9054906040918251917f116ac4a30000000000000000000000000000000000000000000000000000000083528260048173ffffffffffffffffffffffffffffffffffffffff602095869560031b1c165afa92831561317b5750600092614947575b505061493a9061494092612a90565b94613222565b93906148ad565b81819392933d8311614971575b61495e8183612187565b8101031261025e5750518161493a61492b565b503d614954565b60009150565b600090600091606554614990816121c8565b926040916149a083519586612187565b8085527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06149cd826121c8565b016020903682880137859683518303614c11576149e86147eb565b968715614c0357509291908380935b838510614a4257505050505061271003614a19575090614a169161421c565b91565b600490517f6edcc523000000000000000000000000000000000000000000000000000000008152fd5b9091929396612710614a80614a6d67ffffffffffffffff9889614a658d8861324f565b511690612a90565b97614a788b8661324f565b51168b612a4e565b04614a8a896121e0565b9190548951927fc1590cd70000000000000000000000000000000000000000000000000000000084526004938881868173ffffffffffffffffffffffffffffffffffffffff8097600397881b1c165afa908115614bf957918f8a94928f948b91614bae575b50846024949392614b0e614b06614b14948b6136df565b97889261324f565b526121e0565b9054911b1c16948c5195869384927fa7d385e20000000000000000000000000000000000000000000000000000000084528301525afa918215614ba4578592614b73575b5091613987613eef92614b6a94612a4e565b939291906149f7565b9091508581813d8311614b9d575b614b8b8183612187565b8101031261159e575190613987614b58565b503d614b81565b89513d87823e3d90fd5b9395929450505081813d8311614bf2575b614bc98183612187565b81010312610f0b5788928f92614b148f8095614b0e614b06602497519450505092939450614aef565b503d614bbf565b8c513d8a823e3d90fd5b989750955050505050509190565b600485517fcdeedcbd000000000000000000000000000000000000000000000000000000008152fd5b614c4261362f565b9081519160005b838110614c7a5760046040517f30990b67000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff80614c9a838561324f565b511690808516918214614cb7575050614cb290613222565b614c49565b90946000945081614cca8486959661324f565b511692604094855180957f853828b600000000000000000000000000000000000000000000000000000000825260209687918160049b8c925af18015614ed257614eb5575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92838101908111614e875784818303614e66575b5050505060659081548015614e3857849392910190614d88614d66836121e0565b73ffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055565b55603454169360248451809681937f70a0823100000000000000000000000000000000000000000000000000000000835230908301525afa91821561317b5750600091614e0c575b509050614dff575b7f95c84dbc5fd872c46b0e4290775a1a4ea1c8d760f9e4d38f48ba71b6f9a667db600080a2565b614e07614255565b614dd8565b82813d8311614e31575b614e208183612187565b8101031261025e5750518038614dd0565b503d614e16565b6031877f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b614e766116b292614e7e9561324f565b5116916121e0565b38808084614d45565b6011887f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b614ecb90863d8811613d3057613d218183612187565b5038614d0f565b87513d6000823e3d90fd5b614ee561362f565b9081519160005b838110614f1d5760046040517f30990b67000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff80614f3d838561324f565b511690808516918214614f5a575050614f5590613222565b614eec565b90946000945081614f6d8486959661324f565b511692604094855180957f853828b600000000000000000000000000000000000000000000000000000000825260209687918160049b8c925af1908115614ed257600091615039575b5015615011577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92838101908111614e875784818303614e66575050505060659081548015614e3857849392910190614d88614d66836121e0565b8686517fa1248235000000000000000000000000000000000000000000000000000000008152fd5b6150509150863d8811613d3057613d218183612187565b38614fb656fea2646970667358221220253f687410d062e3d20cc43e53ef42861f85e0c45153a61314a7003d37c12c3d64736f6c63430008110033", + "deployedBytecode": "0x6101006040908082526004918236101561001857600080fd5b600092833560e01c9283630b6d1d1714612087575082630c016dc01461202e5782630e6e15f014611ff35782630f969b8714611f855782631d12f28b14611f485782631f1fcd5114611ef557826322f3e2d414611eb1578263248a9ca314611e6857826324ea54f414611e0f5782632e1a7d4d14611d9c5782632f2ff15d14611ca5578263364bc15a14611c4c57826336568abe14611b8e5782634641257d14611b575782634786b0cb14611b165782635641ec0314611ad45782635a5cd45e14611a99578263708ba9bd1461199a57826376ee75d8146119515782637985fd51146119145782638baf2957146118cb57826391d1485414611859578263929eea21146117d557826393084b34146115db578263a217fddf146115a2578263a526d83b1461148b578263af648c3d146112eb578263b8dc491b14611120578263bb927c46146110e3578263ce5c7f611461104c578263d547741f14610ff2578263dc4c90d314610f9c578263ddc6326214610f50578263e6a69ab814610f13578263e6bfbfd8146106a3578263ec342ad014610662578263efbb5cb014610620578263fcc5f59a1461026157505063fcf2d0ad146101d557600080fd5b3461025e57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e5761020c336125d8565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0060335416176033557f17fa25a1c2ac074f71f0cf4f6af525c06fab7d83eff5ffcf6df5277f2919ae248180a180f35b80fd5b83903461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760655461029d816121c8565b916102aa85519384612187565b8183527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06102d7836121c8565b01845b818110610605575050835b8281106103a557505050825191602080840190808552835180925285850181878460051b880101950193965b83881061031e5786860387f35b90919293948380827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a60019503018652885190610364825160808084528301906122a3565b918381015184830152868101518783015273ffffffffffffffffffffffffffffffffffffffff60608092015116910152970193019701969093929193610311565b6103ad6146e9565b6103b6826121e0565b905488517f8b2021760000000000000000000000000000000000000000000000000000000081528881878173ffffffffffffffffffffffffffffffffffffffff8096600398891b1c165afa9081156105fb578991610576575b5083528061041c856121e0565b905490841b1c16606084015280610432856121e0565b905490841b1c1691895180937fc1590cd7000000000000000000000000000000000000000000000000000000008252818860209687935afa90811561056c579187939185938c91610534575b508387015261048c876121e0565b9054911b1c168a51928380927f57ded9c90000000000000000000000000000000000000000000000000000000082525afa91821561052a5788926104f6575b5050878201526104f191906104e0828761324f565b526104eb818661324f565b50613222565b6102e5565b90809250813d8311610523575b61050d8183612187565b8101031261051f57516104f1896104cb565b8680fd5b503d610503565b89513d8a823e3d90fd5b929450509181813d8311610565575b61054d8183612187565b81010312610561579183918793518d61047e565b8980fd5b503d610543565b8b513d8c823e3d90fd5b90503d808a833e6105878183612187565b81019060209081818403126105f75780519067ffffffffffffffff82116105f357019082601f830112156105f757908b92918151926105d16105c885612246565b95519586612187565b8385528184840101116105f3576105ed92918482019101612280565b8a61040f565b8b80fd5b8a80fd5b8a513d8b823e3d90fd5b6020906106106146e9565b828288010152016102da565b5080fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b6147eb565b9051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209051670de0b6b3a76400008152f35b915034610f0f5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576106dc6120e9565b6106e46120c1565b916044359173ffffffffffffffffffffffffffffffffffffffff9182841691828503610f0b576064359267ffffffffffffffff8411610bcc5736602385011215610bcc578388013596610736886121c8565b9061074385519283612187565b8882526020958683016024809b60051b83010191368311610dea578b01905b828210610eef575050508a549760ff93848a60081c1680600014610ee657303b155b15610e655789898f928f90159d8e610e37575b506033547fffffffffffffffffffffff0000000000000000000000000000000000000000ff74ffffffffffffffffffffffffffffffffffffffff008c60081b1691161790816033558b51809481937ffc0c546a00000000000000000000000000000000000000000000000000000000835260081c165afa908115610e2d578b8f928c928591610e00575b5016807fffffffffffffffffffffffff000000000000000000000000000000000000000060345416176034558a51928380927f313ce5670000000000000000000000000000000000000000000000000000000082525afa918215610df557908792610db7575b5016604d8111610d8c57600a0a6035558015908115610d81575b8115610d75575b50610d4d578b949392916108be6108c392612c34565b612c34565b7f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5629182855260019384885288878720911690818752885281878720541615610ce7575b50908291859387965284885284868520015492807fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9481868880a480868887200155857f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419786898098528383838320015489898480a42001558151908d5b828110610be157505050507ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab808c5283875283868d200154918c80a4828920015568056bc75e2d63100000603655603354927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00841660335580603454169360081c168151917fdd62ed3e000000000000000000000000000000000000000000000000000000008352308884015281878401528383604481885afa928315610bd7578993610ba4575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301809311610b7957517f095ea7b3000000000000000000000000000000000000000000000000000000009381019390935273ffffffffffffffffffffffffffffffffffffffff168583019081526020810191909152610b049290610aff9083906040015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101845283612187565b612e2b565b610b4e575b603554916103e89280840293840403610b2457505060665580f35b601184917f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff8354168355610b09565b868960118a7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b9092508381813d8311610bd0575b610bbc8183612187565b81010312610bcc57519138610a4c565b8880fd5b503d610bb2565b81513d8b823e3d90fd5b90919293945089610bf2828661324f565b511615610cbf57808e8b610c09610c4e948861324f565b51167ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab808352898d528b83208284528d52858c8420541615610c59575b505050613222565b908694939291610984565b808352898d528b83208284528d528b83208a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d339380a48e3880610c46565b8c88517fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b8386528488528686208187528852868620857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790553390847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8880a438610906565b8a86517fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b905088831614386108a8565b838a161591506108a1565b8b8e60118f7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8092508a8092503d8311610dee575b610dd08183612187565b81010312610dea57518581168103610dea57859038610887565b8d80fd5b503d610dc6565b8951903d90823e3d90fd5b610e209150833d8511610e26575b610e188183612187565b810190613263565b38610821565b503d610e0e565b89513d84823e3d90fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661010117845538610797565b60848d602e8e8c8c51937f08c379a00000000000000000000000000000000000000000000000000000000085528401528201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152fd5b858b1615610784565b81358a81168103610f07578152908801908801610762565b8e80fd5b8780fd5b8280fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090516301e185588152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f8933612769565b610f9161303b565b610f99614255565b80f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209073ffffffffffffffffffffffffffffffffffffffff60335460081c169051908152f35b915034610f0f57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57610f99913561104760016110346120c1565b93838752816020528620015433906128fa565b612d10565b915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f578282359267ffffffffffffffff841161061c573660238501121561061c57830135926110b46110ab85612246565b93519384612187565b838352366024858301011161061c5783610f999460246020930183860137830101526110de61303b565b6136f8565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906065549051908152f35b915034610f0f57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576111586120e9565b6111606120c1565b9061116a336122e6565b73ffffffffffffffffffffffffffffffffffffffff908180603454169116918183146112c35784519061119c8261214f565b60018252602092838301843682378351156112975752815191885b83811061124e57505050508351947f70a0823100000000000000000000000000000000000000000000000000000000865230908601528085602481855afa9384156112455750859361120f575b50610f999350612db2565b90925083813d831161123e575b6112268183612187565b8101031261123a57610f9992519138611204565b8380fd5b503d61121c565b513d87823e3d90fd5b82611259828461324f565b5116861461126f5761126a90613222565b6111b7565b8888517fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b60248a60328b7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8585517fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f576113256120e9565b9161132f336125d8565b837f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504180825260016020528282209373ffffffffffffffffffffffffffffffffffffffff8096169485845260205260ff8484205416611425575b60655495835b878110611399578480f35b816113a3826121e0565b90549060031b1c16803b156114215785809160448951809481937fd547741f0000000000000000000000000000000000000000000000000000000083528a8a8401528d60248401525af18015611417579061140392916114085750613222565b61138e565b6114119061210c565b386104eb565b87513d88823e3d90fd5b8580fd5b81835260016020528383208584526020528383207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690553385837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b8680a4611388565b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57906114c66120e9565b906114d0336125d8565b6114d982612c34565b8360655493819373ffffffffffffffffffffffffffffffffffffffff809116945b868110611505578380f35b8161150f826121e0565b90549060031b1c16803b1561159e5784809160448851809481937f2f2ff15d0000000000000000000000000000000000000000000000000000000083527f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50418a8401528c60248401525af18015611594579061158f92916114085750613222565b6114fa565b86513d87823e3d90fd5b8480fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5751908152602090f35b83823461061c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57823573ffffffffffffffffffffffffffffffffffffffff918282169283830361159e57611638336122e6565b81517fa8c62e760000000000000000000000000000000000000000000000000000000081526020818881885afa9081156117cb5786916117ad575b5081309116036117855760655491855b838110611737575050506801000000000000000081101561170b57906116b28260016116e494016065556121e0565b90919082549060031b9173ffffffffffffffffffffffffffffffffffffffff9283811b93849216901b16911916179055565b7f1e7b117a6591133f0b36fc2c24d59f8465d806fdcad63aa33246b45fd62c89ff8280a280f35b6024846041877f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b82611741826121e0565b90549060031b1c16861461175d5761175890613222565b611683565b8782517f7cc7731c000000000000000000000000000000000000000000000000000000008152fd5b8582517feeacc72d000000000000000000000000000000000000000000000000000000008152fd5b6117c5915060203d8111610e2657610e188183612187565b87611673565b83513d88823e3d90fd5b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f5735606554811015610f0f5773ffffffffffffffffffffffffffffffffffffffff906065602094527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70154169051908152f35b90915034610f0f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f578160209360ff926118996120c1565b903582526001865273ffffffffffffffffffffffffffffffffffffffff83832091168252855220541690519015158152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f996119066120e9565b61190f33612769565b614edd565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906066549051908152f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f9961198c6120e9565b611995336122e6565b614c3a565b833461025e57602091827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57803567ffffffffffffffff9182821161123a573660238301121561123a578101356119f6816121c8565b92611a0387519485612187565b81845260248685019260051b8401019236841161142157959695602401915b838310611a7b5750505050611a369061497e565b9190835194848695860192865281860152835180925280606086019401925b828110611a6457505050500390f35b835185528695509381019392810192600101611a55565b8297969735828116810361051f578152959695918701918701611a22565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b614894565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209060ff6033541690519015158152f35b83903461061c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57611b50336122e6565b3560665580f35b833461025e57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e57610f9161303b565b83903461061c57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57611bc66120c1565b903373ffffffffffffffffffffffffffffffffffffffff831603611bef5790610f999135612d10565b60649060208551917f08c379a0000000000000000000000000000000000000000000000000000000008352820152600260248201527f37310000000000000000000000000000000000000000000000000000000000006044820152fd5b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab8152f35b90915034610f0f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f573590611ce06120c1565b908284526001602052611cfa6001828620015433906128fa565b828452600160205273ffffffffffffffffffffffffffffffffffffffff81852092169182855260205260ff818520541615611d33578380f35b8284526001602052808420828552602052832060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905533917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8480a43880808380f35b833461025e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025e5750611de090611dda336125d8565b35614625565b611e03823373ffffffffffffffffffffffffffffffffffffffff60345416612db2565b82519182526020820152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50418152f35b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f57816020936001923581528285522001549051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090611eec6147eb565b15159051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209073ffffffffffffffffffffffffffffffffffffffff603454169051908152f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906036549051908152f35b90915034610f0f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f0f577fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a8600916020913590611fe7336122e6565b8160365551908152a180f35b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c5760209061065b61471f565b83823461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c57602090517f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5628152f35b84903461061c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061c576020906035548152f35b6024359073ffffffffffffffffffffffffffffffffffffffff821682036120e457565b600080fd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036120e457565b67ffffffffffffffff811161212057604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761212057604052565b6080810190811067ffffffffffffffff82111761212057604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761212057604052565b67ffffffffffffffff81116121205760051b60200190565b6065548110156122175760656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b67ffffffffffffffff811161212057601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381106122935750506000910152565b8181015183820152602001612283565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936122df81518092818752878088019101612280565b0116010190565b73ffffffffffffffffffffffffffffffffffffffff1660008181527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db6020908152604080832054909391927f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419290916001919060ff161561236957505050505050565b61237290612aae565b9285519161237f8361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116124e05750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b8401917f206973206d697373696e6720726f6c6520000000000000000000000000000000603784015251809386840190612280565b01036028810187520185612187565b519283927f08c379a0000000000000000000000000000000000000000000000000000000008452600484015260248301906122a3565b0390fd5b6064848651907f08c379a000000000000000000000000000000000000000000000000000000000825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a61251d8587612a9d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191906123ac565b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526032600452fd5b73ffffffffffffffffffffffffffffffffffffffff1660008181527f015260285f12fe1d77221203cd7e5aa67b79d47399b4bedd98b8730e56d911bf6020908152604080832054909391927f5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe5629290916001919060ff161561265b57505050505050565b61266490612aae565b928551916126718361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116126f85750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a6127358587612a9d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01919061269e565b73ffffffffffffffffffffffffffffffffffffffff1660008181527f10c15aae13326e9b33c92ffbb94efb7492c500f0cca324caca9bd1aca194ed186020908152604080832054909391927ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab9290916001919060ff16156127ec57505050505050565b6127f590612aae565b928551916128028361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116128895750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a6128c68587612a9d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01919061282f565b60009080825260019160209280845260409473ffffffffffffffffffffffffffffffffffffffff868420911690818452855260ff86842054161561294057505050505050565b61294990612aae565b928551916129568361216b565b604283528583019360603686378351156125ab576030855383518210156125ab5790607860218501536041915b8183116129dd5750505061248457604861248093869361244a9361243b98519889937f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008a860152612406815180928c603789019101612280565b909192600f8116601081101561257e577f3031323334353637383961626364656600000000000000000000000000000000901a612a1a8587612a9d565b5360041c928015612551577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019190612983565b81810292918115918404141715612a6157565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b91908201809211612a6157565b908151811015612217570160200190565b604051906060820182811067ffffffffffffffff82111761212057604052602a82526020820160403682378251156122175760309053815160019081101561221757607860218401536029905b808211612b69575050612b0b5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015612c06577f3031323334353637383961626364656600000000000000000000000000000000901a612ba58486612a9d565b5360041c918015612bd8577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190612afb565b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b73ffffffffffffffffffffffffffffffffffffffff1660008181527fe8fad4b49f5ba25b2c682cfec2ac50a7a40bbd1e12ab51733ec3e9c2f6f1c5db60205260408120549091907f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50419060ff1615612caa57505050565b8083526001602052604083208284526020526040832060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d339380a4565b90600091808352600160205273ffffffffffffffffffffffffffffffffffffffff6040842092169182845260205260ff604084205416612d4f57505050565b808352600160205260408320828452602052604083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b339380a4565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff90921660248301526044820192909252612e1191610aff8260648101610ad3565b565b908160209103126120e4575180151581036120e45790565b604051612eb59173ffffffffffffffffffffffffffffffffffffffff16612e518261214f565b6000806020958685527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656487860152868151910182855af13d15612f5e573d91612e9983612246565b92612ea76040519485612187565b83523d60008785013e612f62565b80519081612ec257505050565b8280612ed2938301019101612e13565b15612eda5750565b608490604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b6060915b91929015612fdd5750815115612f76575090565b3b15612f7f5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b825190915015612ff05750805190602001fd5b612480906040519182917f08c379a00000000000000000000000000000000000000000000000000000000083526020600484015260248301906122a3565b91908203918211612a6157565b600080603354916040918251937fbf3759b500000000000000000000000000000000000000000000000000000000855273ffffffffffffffffffffffffffffffffffffffff90602086600481858560081c165afa9586156132185784966131e4575b5060ff16156131a8576130b66130b16147eb565b614625565b508580821015613185576130cb92935061302e565b905b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d50960806130fa848861302e565b965b86519086825285602083015288888301526060820152a160335460081c16803b156120e45760009283606492865197889586947fa1d9bafc0000000000000000000000000000000000000000000000000000000086526004860152602485015260448401525af190811561317b57506131725750565b612e119061210c565b513d6000823e3d90fd5b90818111613195575b50506130cd565b6131a092945061302e565b91843861318e565b849250608091506131d97f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d5099561328f565b9691939093946130fc565b9095506020813d8211613210575b816131ff60209383612187565b8101031261123a57519460ff61309d565b3d91506131f2565b85513d86823e3d90fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612a615760010190565b80518210156122175760209160051b010190565b908160209103126120e4575173ffffffffffffffffffffffffffffffffffffffff811681036120e45790565b906000809182849261329f61471f565b9573ffffffffffffffffffffffffffffffffffffffff908160345416906040938451998a927f70a08231000000000000000000000000000000000000000000000000000000009485855230600486015284602460209687935afa9b8c156135d357889c613600575b50613312828d612a90565b91156135dd5750602460608660335460081c168851928380927f39ebf8230000000000000000000000000000000000000000000000000000000082523060048301525afa9081156135d3579084918991613544575b500151918282111561347057509061337e9161302e565b98613389888b612a90565b9384151580613467575b6133a1575b50505050505050565b6133b46133af84938761302e565b6142f4565b506034541692602486518095819382523060048301525afa93841561345e5750849361342e575b505081106133ee575b8080808080613398565b9192828692961160001461340857505092905b38806133e4565b909491856134159161302e565b91508082101561342757505b90613401565b9050613421565b9080929350813d8311613457575b6134468183612187565b81010312610f0f57519038806133db565b503d61343c565b513d86823e3d90fd5b50848210613393565b9a995061347c9161302e565b97613487888a612a90565b938415158061353b575b61349e5750505050505050565b6134ac6133af84938761302e565b506034541692602486518095819382523060048301525afa93841561345e5750849361350b575b505081106134e5578080808080613398565b919282859295116000146134fe575050919038806133e4565b909391846134159161302e565b9080929350813d8311613534575b6135238183612187565b81010312610f0f57519038806134d3565b503d613519565b50848210613491565b9150506060813d82116135cb575b8161355f60609383612187565b81010312610f0b578651906060820182811067ffffffffffffffff82111761359e57885280518252808501518286015287015187820152839038613367565b60248a7f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b3d9150613552565b87513d8a823e3d90fd5b955050505050508592939450949094116135f8575b50829190565b9150386135f2565b909b508381813d8311613628575b6136188183612187565b81010312610f0b57519a38613307565b503d61360e565b60405190606554808352826020918282019060656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c7936000905b82821061368257505050612e1192500383612187565b855473ffffffffffffffffffffffffffffffffffffffff168452600195860195889550938101939091019061366c565b7f80000000000000000000000000000000000000000000000000000000000000008114612a615760000390565b81810392916000138015828513169184121617612a6157565b60ff60335416613c735761370a61362f565b8060c052518060a05215613c735780518101906020818184019303126120e457602081015167ffffffffffffffff918282116120e457019180603f840112156120e45760208301519161375c836121c8565b9361376a6040519586612187565b8385526040602086019460051b8201019283116120e457604001925b8284106142035750505050600090606060e05280516141f0575b506000906000608052600090816024602073ffffffffffffffffffffffffffffffffffffffff60345416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9081156141e357608051916141ab575b50608051908182908260c05151917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061385d613847856121c8565b946138556040519687612187565b8086526121c8565b0136602085013760c05151937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60805190603554915b878110613f1b5750505085613d37575b5050505050505010600014613b6e575050600090815b60a0518110156139d75760006138d18260e05161324f565b51126138e6575b6138e190613222565b6138b9565b9160006138fe6138f88560e05161324f565b516136b2565b602073ffffffffffffffffffffffffffffffffffffffff6139218760c05161324f565b511660246139346138f88960e05161324f565b60405195869384927f2e1a7d4d00000000000000000000000000000000000000000000000000000000845260048401525af19182156139cb57600092613995575b509161398761398d926138e19461302e565b90612a90565b9290506138d8565b90916020823d6020116139c3575b816139b060209383612187565b8101031261025e57505190613987613975565b3d91506139a3565b6040513d6000823e3d90fd5b50906066548111613b44576000905b60a051821015613b4057806139fd8360e05161324f565b511315613afe57613a1a90613a148360e05161324f565b516136df565b613a268260e05161324f565b52600090613a7c73ffffffffffffffffffffffffffffffffffffffff6034541673ffffffffffffffffffffffffffffffffffffffff613a678460c05161324f565b5116613a758460e05161324f565b5191612db2565b73ffffffffffffffffffffffffffffffffffffffff613a9d8260c05161324f565b5116803b15610f0f578280916004604051809481937fd0e30db00000000000000000000000000000000000000000000000000000000083525af18015613af35790613aed92916114085750613222565b906139e6565b6040513d85823e3d90fd5b906000613b0d8260e05161324f565b5113613b1d575b613aed90613222565b90613b38613aed91613b318460e05161324f565b519061302e565b919050613b14565b5050565b60046040517f5c3810af000000000000000000000000000000000000000000000000000000008152fd5b613ca8575b5073ffffffffffffffffffffffffffffffffffffffff603454166040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152602081602481855afa9081156139cb57600091613c76575b5080613bdb575050565b613c0a9173ffffffffffffffffffffffffffffffffffffffff613c0260805160c05161324f565b511690612db2565b73ffffffffffffffffffffffffffffffffffffffff613c2d60805160c05161324f565b5116803b156120e457600080916004604051809481937fd0e30db00000000000000000000000000000000000000000000000000000000083525af180156139cb57613172575b50565b906020823d602011613ca0575b81613c9060209383612187565b8101031261025e57505138613bd1565b3d9150613c83565b602073ffffffffffffffffffffffffffffffffffffffff613ccd60009360c05161324f565b51166004604051809481937f853828b60000000000000000000000000000000000000000000000000000000083525af180156139cb5715613b7357613d299060203d602011613d30575b613d218183612187565b810190612e13565b5038613b73565b503d613d17565b94965088958695869590915b818710613d97575050505050505080851180613d8a575b15613d79575050613d6d9060019361421c565b388080808080806138a3565b613d859291945061421c565b613d6d565b50600160c0515111613d5a565b909192939495966080518814600014613ed057613dc19061398783613dbc8988612a90565b612a4e565b9684151580613ec6575b613de4575b613dd990613222565b959493929190613d43565b9a613df885613df38887612a90565b612a90565b73ffffffffffffffffffffffffffffffffffffffff613e1b60805160c05161324f565b5116906020613e2a8989612a90565b6024604051809581937fa7d385e200000000000000000000000000000000000000000000000000000000835260048301525afa918215613ebb578b92613e85575b5091613987613e7d92613dd994612a4e565b9b9050613dd0565b9091506020813d602011613eb3575b81613ea160209383612187565b810103126105f7575190613987613e6b565b3d9150613e94565b6040513d8d823e3d90fd5b5060018311613dcb565b878d03613ef557613eef613dd991613ee88a8a61324f565b5190612a90565b97613222565b613f15889c613ee8613f0e613dd994613ee88d8d61324f565b9a8a61324f565b9b613222565b602498602073ffffffffffffffffffffffffffffffffffffffff613f418460c05161324f565b51166040519b8c80927fa7d385e20000000000000000000000000000000000000000000000000000000082528b60048301525afa998a1561419e578e9a614169575b50600490602073ffffffffffffffffffffffffffffffffffffffff613faa8560c05161324f565b5116604051938480927fc1590cd70000000000000000000000000000000000000000000000000000000082525afa9182156140e9578f92614133575b5081613ff191612a90565b998b8111614123575b50600a8481020484036140f65783600a028111614021575b5061401c90613222565b613893565b6004602073ffffffffffffffffffffffffffffffffffffffff6140468560c05161324f565b5116604051928380927f57ded9c90000000000000000000000000000000000000000000000000000000082525afa9081156140e9578f916140b7575b5061408d8282612a4e565b614097848b61324f565b528381106140a6575b50614012565b925094509c5061401c8d90386140a0565b90506020813d6020116140e1575b816140d260209383612187565b81010312610f07575138614082565b3d91506140c5565b8f604051903d90823e3d90fd5b60248e7f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b60808390529a5093508338613ffa565b9091506020813d602011614161575b8161414f60209383612187565b81010312610f07575190613ff1613fe6565b3d9150614142565b9099506020813d602011614196575b8161418560209383612187565b81010312610dea5751986004613f83565b3d9150614178565b8e604051903d90823e3d90fd5b90506020813d6020116141db575b816141c660209383612187565b810103126141d557513861380c565b60805180fd5b3d91506141b9565b6040513d608051823e3d90fd5b6141fa915061497e565b60e052386137a0565b835182811681036120e457815260209384019301613786565b8115614226570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6040516020908181019067ffffffffffffffff928183108484111761212057929082604052600081526040519360408501918180870152518092526060850193926000905b8382106142db575050505050906110de81612e1193037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612187565b845181168652948201949382019360019091019061429a565b6000806142ff61362f565b92835192831561461d57606654948583106146145781959395935b614324818561302e565b87101561460b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff968397845b8881106144c457505073ffffffffffffffffffffffffffffffffffffffff978861437b828661324f565b51166040998a51928380937f5be9b2d3000000000000000000000000000000000000000000000000000000008252602094859160049788915afa9081156144ba57899161449d575b501561448e57602483926143d88e938a61324f565b511694896143e6888d61302e565b935196879485937f2e1a7d4d0000000000000000000000000000000000000000000000000000000085528401525af1998a156112455750859961445a575b50506144338861443992612a90565b95613222565b96156144505760068710156144505795939561431a565b5050505091505090565b9080929950813d8311614487575b6144728183612187565b8101031261123a575196614433614439614424565b503d614468565b50505050965050505050505090565b6144b49150843d8611613d3057613d218183612187565b386143c3565b8d513d8b823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff806144e4838861324f565b5116906040918251918280927f5be9b2d3000000000000000000000000000000000000000000000000000000008252602093849160049687915afa908115614601578b916145e4575b50614545575b5050505061454090613222565b614351565b8190614551868b61324f565b51168451938480927f57ded9c90000000000000000000000000000000000000000000000000000000082525afa9283156145db575088926145ad575b505082811061459f575b808080614533565b915098506145408990614597565b90809250813d83116145d4575b6145c48183612187565b8101031261051f5751388061458d565b503d6145ba565b513d8a823e3d90fd5b6145fb9150833d8511613d3057613d218183612187565b3861452d565b85513d8d823e3d90fd5b50505050505090565b50935050505090565b935050505090565b6024602073ffffffffffffffffffffffffffffffffffffffff60345416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9081156139cb576000916146b8575b50818110614692575090600090565b80613df36133af6146a3938561302e565b8181106146b1575090600090565b9160009150565b906020823d82116146e1575b816146d160209383612187565b8101031261025e57505138614683565b3d91506146c4565b604051906080820182811067ffffffffffffffff8211176121205760405260006060838181528260208201528260408201520152565b600060655481905b80821061473357505090565b909161473e836121e0565b9054906040918251917fc1590cd70000000000000000000000000000000000000000000000000000000083528260048173ffffffffffffffffffffffffffffffffffffffff602095869560031b1c165afa92831561317b57506000926147ba575b50506147ae906147b492612a90565b92613222565b90614727565b81819392933d83116147e4575b6147d18183612187565b8101031261025e575051816147ae61479f565b503d6147c7565b6024906147f661471f565b602073ffffffffffffffffffffffffffffffffffffffff60345416604051948580927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9283156139cb57600093614861575b509161485e9192612a90565b90565b6020813d821161488c575b8161487960209383612187565b8101031261123a5751925061485e614852565b3d915061486c565b61489c6147eb565b908115614978576000916065549280935b8085106148c0575061485e92935061421c565b906148ca856121e0565b9054906040918251917f116ac4a30000000000000000000000000000000000000000000000000000000083528260048173ffffffffffffffffffffffffffffffffffffffff602095869560031b1c165afa92831561317b5750600092614947575b505061493a9061494092612a90565b94613222565b93906148ad565b81819392933d8311614971575b61495e8183612187565b8101031261025e5750518161493a61492b565b503d614954565b60009150565b600090600091606554614990816121c8565b926040916149a083519586612187565b8085527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06149cd826121c8565b016020903682880137859683518303614c11576149e86147eb565b968715614c0357509291908380935b838510614a4257505050505061271003614a19575090614a169161421c565b91565b600490517f6edcc523000000000000000000000000000000000000000000000000000000008152fd5b9091929396612710614a80614a6d67ffffffffffffffff9889614a658d8861324f565b511690612a90565b97614a788b8661324f565b51168b612a4e565b04614a8a896121e0565b9190548951927fc1590cd70000000000000000000000000000000000000000000000000000000084526004938881868173ffffffffffffffffffffffffffffffffffffffff8097600397881b1c165afa908115614bf957918f8a94928f948b91614bae575b50846024949392614b0e614b06614b14948b6136df565b97889261324f565b526121e0565b9054911b1c16948c5195869384927fa7d385e20000000000000000000000000000000000000000000000000000000084528301525afa918215614ba4578592614b73575b5091613987613eef92614b6a94612a4e565b939291906149f7565b9091508581813d8311614b9d575b614b8b8183612187565b8101031261159e575190613987614b58565b503d614b81565b89513d87823e3d90fd5b9395929450505081813d8311614bf2575b614bc98183612187565b81010312610f0b5788928f92614b148f8095614b0e614b06602497519450505092939450614aef565b503d614bbf565b8c513d8a823e3d90fd5b989750955050505050509190565b600485517fcdeedcbd000000000000000000000000000000000000000000000000000000008152fd5b614c4261362f565b9081519160005b838110614c7a5760046040517f30990b67000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff80614c9a838561324f565b511690808516918214614cb7575050614cb290613222565b614c49565b90946000945081614cca8486959661324f565b511692604094855180957f853828b600000000000000000000000000000000000000000000000000000000825260209687918160049b8c925af18015614ed257614eb5575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92838101908111614e875784818303614e66575b5050505060659081548015614e3857849392910190614d88614d66836121e0565b73ffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055565b55603454169360248451809681937f70a0823100000000000000000000000000000000000000000000000000000000835230908301525afa91821561317b5750600091614e0c575b509050614dff575b7f95c84dbc5fd872c46b0e4290775a1a4ea1c8d760f9e4d38f48ba71b6f9a667db600080a2565b614e07614255565b614dd8565b82813d8311614e31575b614e208183612187565b8101031261025e5750518038614dd0565b503d614e16565b6031877f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b614e766116b292614e7e9561324f565b5116916121e0565b38808084614d45565b6011887f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b614ecb90863d8811613d3057613d218183612187565b5038614d0f565b87513d6000823e3d90fd5b614ee561362f565b9081519160005b838110614f1d5760046040517f30990b67000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff80614f3d838561324f565b511690808516918214614f5a575050614f5590613222565b614eec565b90946000945081614f6d8486959661324f565b511692604094855180957f853828b600000000000000000000000000000000000000000000000000000000825260209687918160049b8c925af1908115614ed257600091615039575b5015615011577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92838101908111614e875784818303614e66575050505060659081548015614e3857849392910190614d88614d66836121e0565b8686517fa1248235000000000000000000000000000000000000000000000000000000008152fd5b6150509150863d8811613d3057613d218183612187565b38614fb656fea2646970667358221220253f687410d062e3d20cc43e53ef42861f85e0c45153a61314a7003d37c12c3d64736f6c63430008110033", + "devdoc": { + "author": "Angle Labs, Inc.", + "details": "This strategy works by taking plugins designed for standard lending platforms and automatically chooses to invest its funds in the best platforms to generate yield. The allocation is greedy and may be sub-optimal so there is an additional option to manually set positions", + "kind": "dev", + "methods": { + "addGuardian(address)": { + "details": "This internal function has to be put in this file because `AccessControl` is not defined in `PoolManagerInternal`", + "params": { + "_guardian": "New guardian address" + } + }, + "addLender(address)": { + "details": "Governor, guardian or `PoolManager` only", + "params": { + "newLender": "The adapter to the added lending platform" + } + }, + "estimatedAPR()": { + "details": "It's computed by doing: `sum(nav * apr) / totalNav`" + }, + "estimatedAPR(uint64[])": { + "params": { + "shares": "List of shares (in bps of the nav) that should be allocated to each lender" + } + }, + "forceRemoveLender(address)": { + "params": { + "lender": "The address of the adapter to the lending platform to remove" + } + }, + "getRoleAdmin(bytes32)": { + "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}." + }, + "grantRole(bytes32,address)": { + "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role." + }, + "harvest(bytes)": { + "details": "Since this function is permissionless, strategy implementations should be made to remain safe regardless of the data that is passed in the call" + }, + "hasRole(bytes32,address)": { + "details": "Returns `true` if `account` has been granted `role`." + }, + "initialize(address,address,address,address[])": { + "params": { + "_poolManager": "Address of the `PoolManager` lending to this strategy", + "governor": "Address with governor privilege", + "guardian": "Address of the guardian" + } + }, + "isActive()": { + "returns": { + "_0": "True if the strategy is actively managing a position." + } + }, + "lendStatuses()": { + "returns": { + "_0": "Returns the status of all lenders attached the strategy" + } + }, + "renounceRole(bytes32,address)": { + "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`." + }, + "revokeGuardian(address)": { + "params": { + "guardian": "Old guardian address to revoke" + } + }, + "revokeRole(bytes32,address)": { + "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role." + }, + "safeRemoveLender(address)": { + "params": { + "lender": "The address of the adapter to the lending platform to remove" + } + }, + "setDebtThreshold(uint256)": { + "details": "By default this is 0, meaning any losses would cause a harvest which will subsequently report the loss to the Manager for tracking.", + "params": { + "_debtThreshold": "How big of a loss this Strategy may carry without" + } + }, + "setEmergencyExit()": { + "details": "This may only be called by the `PoolManager`, because when calling this the `PoolManager` should at the same time update the debt ratioThis function can only be called once by the `PoolManager` contractSee `poolManager.setEmergencyExit()` and `harvest()` for further details." + }, + "setWithdrawalThreshold(uint256)": { + "details": "governor, guardian or `PoolManager` only", + "params": { + "_threshold": "New withdrawal threshold" + } + }, + "sweep(address,address)": { + "details": "Implement `_protectedTokens()` to specify any additional tokens that should be protected from sweeping in addition to `want`.", + "params": { + "_token": "The token to transfer out of this `PoolManager`.", + "to": "Address to send the tokens to." + } + }, + "withdraw(uint256)": { + "details": "This may only be called by the `PoolManager`", + "params": { + "_amountNeeded": "How much `want` to withdraw." + }, + "returns": { + "_loss": "Any realized losses", + "amountFreed": "How much `want` withdrawn." + } + } + }, + "title": "OptimizerAPRStrategy", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "GUARDIAN_ROLE()": { + "notice": "Role for guardians and governors - keccak256(\"GUARDIAN_ROLE\")" + }, + "KEEPER_ROLE()": { + "notice": "Role for keepers - keccak256(\"KEEPER_ROLE\")" + }, + "POOLMANAGER_ROLE()": { + "notice": "Role for `PoolManager` only - keccak256(\"POOLMANAGER_ROLE\")" + }, + "addGuardian(address)": { + "notice": "Adds a new guardian address and echoes the change to the contracts that interact with this collateral `PoolManager`" + }, + "addLender(address)": { + "notice": "Add lenders for the strategy to choose between" + }, + "debtThreshold()": { + "notice": "Use this to adjust the threshold at which running a debt causes a harvest trigger. See `setDebtThreshold()` for more details" + }, + "emergencyExit()": { + "notice": "See note on `setEmergencyExit()`" + }, + "estimatedAPR()": { + "notice": "Returns the weighted apr of all lenders" + }, + "estimatedAPR(uint64[])": { + "notice": "Returns the weighted apr in an hypothetical world where the strategy splits its nav in respect to shares" + }, + "estimatedTotalAssets()": { + "notice": "View function to check the total assets managed by the strategy" + }, + "forceRemoveLender(address)": { + "notice": "Removes a lending platform even if total withdrawal is impossible" + }, + "harvest()": { + "notice": "Harvests the Strategy, recognizing any profits or losses and adjusting the Strategy's position." + }, + "harvest(bytes)": { + "notice": "Same as the function above with a `data` parameter to help adjust the position" + }, + "harvest(uint256)": { + "notice": "Same as above with a `borrowInit` parameter to help in case of the convergence of the `adjustPosition` method" + }, + "initialize(address,address,address,address[])": { + "notice": "Constructor of the `Strategy`" + }, + "isActive()": { + "notice": "Provides an indication of whether this strategy is currently \"active\" in that it is managing an active position, or will manage a position in the future. This should correlate to `harvest()` activity, so that Harvest events can be tracked externally by indexing agents." + }, + "lendStatuses()": { + "notice": "View function to check the current state of the strategy" + }, + "lentTotalAssets()": { + "notice": "View function to check the total assets lent" + }, + "numLenders()": { + "notice": "View function to check the number of lending platforms" + }, + "poolManager()": { + "notice": "Reference to the protocol's collateral `PoolManager`" + }, + "revokeGuardian(address)": { + "notice": "Revokes the guardian role and propagates the change to other contracts" + }, + "safeRemoveLender(address)": { + "notice": "Removes a lending platform and fails if total withdrawal is impossible" + }, + "setDebtThreshold(uint256)": { + "notice": "Sets how far the Strategy can go into loss without a harvest and report being required." + }, + "setEmergencyExit()": { + "notice": "Activates emergency exit. Once activated, the Strategy will exit its position upon the next harvest, depositing all funds into the Manager as quickly as is reasonable given on-chain conditions." + }, + "setWithdrawalThreshold(uint256)": { + "notice": "Changes the withdrawal threshold" + }, + "sweep(address,address)": { + "notice": "Removes tokens from this Strategy that are not the type of tokens managed by this Strategy. This may be used in case of accidentally sending the wrong kind of token to this Strategy. Tokens will be sent to `governance()`. This will fail if an attempt is made to sweep `want`, or any tokens that are protected by this Strategy. This may only be called by governance." + }, + "want()": { + "notice": "Reference to the ERC20 farmed by this strategy" + }, + "wantBase()": { + "notice": "Base of the ERC20 token farmed by this strategy" + }, + "withdraw(uint256)": { + "notice": "Withdraws `_amountNeeded` to `poolManager`." + } + }, + "notice": "A lender optimisation strategy for any ERC20 asset, leveraging multiple lenders at once", + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 52, + "contract": "contracts/strategies/OptimizerAPR/OptimizerAPRStrategy.sol:OptimizerAPRStrategy", + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_bool" + }, + { + "astId": 55, + "contract": "contracts/strategies/OptimizerAPR/OptimizerAPRStrategy.sol:OptimizerAPRStrategy", + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool" + }, + { + "astId": 4391, + "contract": "contracts/strategies/OptimizerAPR/OptimizerAPRStrategy.sol:OptimizerAPRStrategy", + "label": "_roles", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_bytes32,t_struct(RoleData)4386_storage)" + }, + { + "astId": 4677, + "contract": "contracts/strategies/OptimizerAPR/OptimizerAPRStrategy.sol:OptimizerAPRStrategy", + "label": "__gap", + "offset": 0, + "slot": "2", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 14545, + "contract": "contracts/strategies/OptimizerAPR/OptimizerAPRStrategy.sol:OptimizerAPRStrategy", + "label": "emergencyExit", + "offset": 0, + "slot": "51", + "type": "t_bool" + }, + { + "astId": 14549, + "contract": "contracts/strategies/OptimizerAPR/OptimizerAPRStrategy.sol:OptimizerAPRStrategy", + "label": "poolManager", + "offset": 1, + "slot": "51", + "type": "t_contract(IPoolManager)5511" + }, + { + "astId": 14553, + "contract": "contracts/strategies/OptimizerAPR/OptimizerAPRStrategy.sol:OptimizerAPRStrategy", + "label": "want", + "offset": 0, + "slot": "52", + "type": "t_contract(IERC20)2219" + }, + { + "astId": 14556, + "contract": "contracts/strategies/OptimizerAPR/OptimizerAPRStrategy.sol:OptimizerAPRStrategy", + "label": "wantBase", + "offset": 0, + "slot": "53", + "type": "t_uint256" + }, + { + "astId": 14559, + "contract": "contracts/strategies/OptimizerAPR/OptimizerAPRStrategy.sol:OptimizerAPRStrategy", + "label": "debtThreshold", + "offset": 0, + "slot": "54", + "type": "t_uint256" + }, + { + "astId": 14563, + "contract": "contracts/strategies/OptimizerAPR/OptimizerAPRStrategy.sol:OptimizerAPRStrategy", + "label": "__gapBaseStrategy", + "offset": 0, + "slot": "55", + "type": "t_array(t_uint256)46_storage" + }, + { + "astId": 16496, + "contract": "contracts/strategies/OptimizerAPR/OptimizerAPRStrategy.sol:OptimizerAPRStrategy", + "label": "lenders", + "offset": 0, + "slot": "101", + "type": "t_array(t_contract(IGenericLender)5439)dyn_storage" + }, + { + "astId": 16498, + "contract": "contracts/strategies/OptimizerAPR/OptimizerAPRStrategy.sol:OptimizerAPRStrategy", + "label": "withdrawalThreshold", + "offset": 0, + "slot": "102", + "type": "t_uint256" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_contract(IGenericLender)5439)dyn_storage": { + "base": "t_contract(IGenericLender)5439", + "encoding": "dynamic_array", + "label": "contract IGenericLender[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)46_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[46]", + "numberOfBytes": "1472" + }, + "t_array(t_uint256)49_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_contract(IERC20)2219": { + "encoding": "inplace", + "label": "contract IERC20", + "numberOfBytes": "20" + }, + "t_contract(IGenericLender)5439": { + "encoding": "inplace", + "label": "contract IGenericLender", + "numberOfBytes": "20" + }, + "t_contract(IPoolManager)5511": { + "encoding": "inplace", + "label": "contract IPoolManager", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_bool)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_bytes32,t_struct(RoleData)4386_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct AccessControlAngleUpgradeable.RoleData)", + "numberOfBytes": "32", + "value": "t_struct(RoleData)4386_storage" + }, + "t_struct(RoleData)4386_storage": { + "encoding": "inplace", + "label": "struct AccessControlAngleUpgradeable.RoleData", + "members": [ + { + "astId": 4383, + "contract": "contracts/strategies/OptimizerAPR/OptimizerAPRStrategy.sol:OptimizerAPRStrategy", + "label": "members", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_bool)" + }, + { + "astId": 4385, + "contract": "contracts/strategies/OptimizerAPR/OptimizerAPRStrategy.sol:OptimizerAPRStrategy", + "label": "adminRole", + "offset": 0, + "slot": "1", + "type": "t_bytes32" + } + ], + "numberOfBytes": "64" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/deployments/polygon/solcInputs/0d3705635a12f691c993e4b380cb5060.json b/deployments/polygon/solcInputs/0d3705635a12f691c993e4b380cb5060.json new file mode 100644 index 0000000..cd1b2a0 --- /dev/null +++ b/deployments/polygon/solcInputs/0d3705635a12f691c993e4b380cb5060.json @@ -0,0 +1,312 @@ +{ + "language": "Solidity", + "sources": { + "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface AggregatorV3Interface {\n\n function decimals()\n external\n view\n returns (\n uint8\n );\n\n function description()\n external\n view\n returns (\n string memory\n );\n\n function version()\n external\n view\n returns (\n uint256\n );\n\n // getRoundData and latestRoundData should both raise \"No data present\"\n // if they do not have data to report, instead of returning unset values\n // which could be misinterpreted as actual reported values.\n function getRoundData(\n uint80 _roundId\n )\n external\n view\n returns (\n uint80 roundId,\n int256 answer,\n uint256 startedAt,\n uint256 updatedAt,\n uint80 answeredInRound\n );\n\n function latestRoundData()\n external\n view\n returns (\n uint80 roundId,\n int256 answer,\n uint256 startedAt,\n uint256 updatedAt,\n uint80 answeredInRound\n );\n\n}\n" + }, + "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the\n * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() initializer {}\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n */\n bool private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Modifier to protect an initializer function from being invoked twice.\n */\n modifier initializer() {\n // If the contract is initializing we ignore whether _initialized is set in order to support multiple\n // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the\n // contract may have been reentered.\n require(_initializing ? _isConstructor() : !_initialized, \"Initializable: contract is already initialized\");\n\n bool isTopLevelCall = !_initializing;\n if (isTopLevelCall) {\n _initializing = true;\n _initialized = true;\n }\n\n _;\n\n if (isTopLevelCall) {\n _initializing = false;\n }\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} modifier, directly or indirectly.\n */\n modifier onlyInitializing() {\n require(_initializing, \"Initializable: contract is not initializing\");\n _;\n }\n\n function _isConstructor() private view returns (bool) {\n return !AddressUpgradeable.isContract(address(this));\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize, which returns 0 for contracts in\n // construction, since the code is only stored at the end of the\n // constructor execution.\n\n uint256 size;\n assembly {\n size := extcodesize(account)\n }\n return size > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev String operations.\n */\nlibrary StringsUpgradeable {\n bytes16 private constant _HEX_SYMBOLS = \"0123456789abcdef\";\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n // Inspired by OraclizeAPI's implementation - MIT licence\n // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol\n\n if (value == 0) {\n return \"0\";\n }\n uint256 temp = value;\n uint256 digits;\n while (temp != 0) {\n digits++;\n temp /= 10;\n }\n bytes memory buffer = new bytes(digits);\n while (value != 0) {\n digits -= 1;\n buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));\n value /= 10;\n }\n return string(buffer);\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n if (value == 0) {\n return \"0x00\";\n }\n uint256 temp = value;\n uint256 length = 0;\n while (temp != 0) {\n length++;\n temp >>= 8;\n }\n return toHexString(value, length);\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _HEX_SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n}\n" + }, + "@openzeppelin/contracts/access/AccessControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IAccessControl.sol\";\nimport \"../utils/Context.sol\";\nimport \"../utils/Strings.sol\";\nimport \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```\n * function foo() public {\n * require(hasRole(MY_ROLE, msg.sender));\n * ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it.\n */\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\n struct RoleData {\n mapping(address => bool) members;\n bytes32 adminRole;\n }\n\n mapping(bytes32 => RoleData) private _roles;\n\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n /**\n * @dev Modifier that checks that an account has a specific role. Reverts\n * with a standardized message including the required role.\n *\n * The format of the revert reason is given by the following regular expression:\n *\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n *\n * _Available since v4.1._\n */\n modifier onlyRole(bytes32 role) {\n _checkRole(role);\n _;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\n return _roles[role].members[account];\n }\n\n /**\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\n * Overriding this function changes the behavior of the {onlyRole} modifier.\n *\n * Format of the revert message is described in {_checkRole}.\n *\n * _Available since v4.6._\n */\n function _checkRole(bytes32 role) internal view virtual {\n _checkRole(role, _msgSender());\n }\n\n /**\n * @dev Revert with a standard message if `account` is missing `role`.\n *\n * The format of the revert reason is given by the following regular expression:\n *\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n */\n function _checkRole(bytes32 role, address account) internal view virtual {\n if (!hasRole(role, account)) {\n revert(\n string(\n abi.encodePacked(\n \"AccessControl: account \",\n Strings.toHexString(account),\n \" is missing role \",\n Strings.toHexString(uint256(role), 32)\n )\n )\n );\n }\n }\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\n return _roles[role].adminRole;\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleGranted} event.\n */\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\n _grantRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleRevoked} event.\n */\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\n _revokeRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `account`.\n *\n * May emit a {RoleRevoked} event.\n */\n function renounceRole(bytes32 role, address account) public virtual override {\n require(account == _msgSender(), \"AccessControl: can only renounce roles for self\");\n\n _revokeRole(role, account);\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event. Note that unlike {grantRole}, this function doesn't perform any\n * checks on the calling account.\n *\n * May emit a {RoleGranted} event.\n *\n * [WARNING]\n * ====\n * This function should only be called from the constructor when setting\n * up the initial roles for the system.\n *\n * Using this function in any other way is effectively circumventing the admin\n * system imposed by {AccessControl}.\n * ====\n *\n * NOTE: This function is deprecated in favor of {_grantRole}.\n */\n function _setupRole(bytes32 role, address account) internal virtual {\n _grantRole(role, account);\n }\n\n /**\n * @dev Sets `adminRole` as ``role``'s admin role.\n *\n * Emits a {RoleAdminChanged} event.\n */\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n bytes32 previousAdminRole = getRoleAdmin(role);\n _roles[role].adminRole = adminRole;\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleGranted} event.\n */\n function _grantRole(bytes32 role, address account) internal virtual {\n if (!hasRole(role, account)) {\n _roles[role].members[account] = true;\n emit RoleGranted(role, account, _msgSender());\n }\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleRevoked} event.\n */\n function _revokeRole(bytes32 role, address account) internal virtual {\n if (hasRole(role, account)) {\n _roles[role].members[account] = false;\n emit RoleRevoked(role, account, _msgSender());\n }\n }\n}\n" + }, + "@openzeppelin/contracts/access/IAccessControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev External interface of AccessControl declared to support ERC165 detection.\n */\ninterface IAccessControl {\n /**\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n *\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n * {RoleAdminChanged} not being emitted signaling this.\n *\n * _Available since v3.1._\n */\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n /**\n * @dev Emitted when `account` is granted `role`.\n *\n * `sender` is the account that originated the contract call, an admin role\n * bearer except when using {AccessControl-_setupRole}.\n */\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Emitted when `account` is revoked `role`.\n *\n * `sender` is the account that originated the contract call:\n * - if using `revokeRole`, it is the admin role bearer\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\n */\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) external view returns (bool);\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function grantRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function revokeRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been granted `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `account`.\n */\n function renounceRole(bytes32 role, address account) external;\n}\n" + }, + "@openzeppelin/contracts/access/Ownable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _transferOwnership(_msgSender());\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" + }, + "@openzeppelin/contracts/interfaces/draft-IERC1822.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\n * proxy whose upgrades are fully controlled by the current implementation.\n */\ninterface IERC1822Proxiable {\n /**\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\n * address.\n *\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n * function revert if invoked through a proxy.\n */\n function proxiableUUID() external view returns (bytes32);\n}\n" + }, + "@openzeppelin/contracts/interfaces/IERC3156FlashBorrower.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (interfaces/IERC3156FlashBorrower.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC3156 FlashBorrower, as defined in\n * https://eips.ethereum.org/EIPS/eip-3156[ERC-3156].\n *\n * _Available since v4.1._\n */\ninterface IERC3156FlashBorrower {\n /**\n * @dev Receive a flash loan.\n * @param initiator The initiator of the loan.\n * @param token The loan currency.\n * @param amount The amount of tokens lent.\n * @param fee The additional amount of tokens to repay.\n * @param data Arbitrary data structure, intended to contain user-defined parameters.\n * @return The keccak256 hash of \"IERC3156FlashBorrower.onFlashLoan\"\n */\n function onFlashLoan(\n address initiator,\n address token,\n uint256 amount,\n uint256 fee,\n bytes calldata data\n ) external returns (bytes32);\n}\n" + }, + "@openzeppelin/contracts/interfaces/IERC3156FlashLender.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (interfaces/IERC3156FlashLender.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC3156FlashBorrower.sol\";\n\n/**\n * @dev Interface of the ERC3156 FlashLender, as defined in\n * https://eips.ethereum.org/EIPS/eip-3156[ERC-3156].\n *\n * _Available since v4.1._\n */\ninterface IERC3156FlashLender {\n /**\n * @dev The amount of currency available to be lended.\n * @param token The loan currency.\n * @return The amount of `token` that can be borrowed.\n */\n function maxFlashLoan(address token) external view returns (uint256);\n\n /**\n * @dev The fee to be charged for a given loan.\n * @param token The loan currency.\n * @param amount The amount of tokens lent.\n * @return The amount of `token` to be charged for the loan, on top of the returned principal.\n */\n function flashFee(address token, uint256 amount) external view returns (uint256);\n\n /**\n * @dev Initiate a flash loan.\n * @param receiver The receiver of the tokens in the loan, and the receiver of the callback.\n * @param token The loan currency.\n * @param amount The amount of tokens lent.\n * @param data Arbitrary data structure, intended to contain user-defined parameters.\n */\n function flashLoan(\n IERC3156FlashBorrower receiver,\n address token,\n uint256 amount,\n bytes calldata data\n ) external returns (bool);\n}\n" + }, + "@openzeppelin/contracts/proxy/beacon/IBeacon.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeacon {\n /**\n * @dev Must return an address that can be used as a delegate call target.\n *\n * {BeaconProxy} will check that this address is a contract.\n */\n function implementation() external view returns (address);\n}\n" + }, + "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/ERC1967/ERC1967Proxy.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Proxy.sol\";\nimport \"./ERC1967Upgrade.sol\";\n\n/**\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\n * implementation address that can be changed. This address is stored in storage in the location specified by\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\n * implementation behind the proxy.\n */\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\n /**\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\n *\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\n * function call, and allows initializing the storage of the proxy like a Solidity constructor.\n */\n constructor(address _logic, bytes memory _data) payable {\n _upgradeToAndCall(_logic, _data, false);\n }\n\n /**\n * @dev Returns the current implementation address.\n */\n function _implementation() internal view virtual override returns (address impl) {\n return ERC1967Upgrade._getImplementation();\n }\n}\n" + }, + "@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../beacon/IBeacon.sol\";\nimport \"../../interfaces/draft-IERC1822.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/StorageSlot.sol\";\n\n/**\n * @dev This abstract contract provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\n *\n * _Available since v4.1._\n *\n * @custom:oz-upgrades-unsafe-allow delegatecall\n */\nabstract contract ERC1967Upgrade {\n // This is the keccak-256 hash of \"eip1967.proxy.rollback\" subtracted by 1\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\n\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n /**\n * @dev Emitted when the implementation is upgraded.\n */\n event Upgraded(address indexed implementation);\n\n /**\n * @dev Returns the current implementation address.\n */\n function _getImplementation() internal view returns (address) {\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the EIP1967 implementation slot.\n */\n function _setImplementation(address newImplementation) private {\n require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n }\n\n /**\n * @dev Perform implementation upgrade\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeTo(address newImplementation) internal {\n _setImplementation(newImplementation);\n emit Upgraded(newImplementation);\n }\n\n /**\n * @dev Perform implementation upgrade with additional setup call.\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeToAndCall(\n address newImplementation,\n bytes memory data,\n bool forceCall\n ) internal {\n _upgradeTo(newImplementation);\n if (data.length > 0 || forceCall) {\n Address.functionDelegateCall(newImplementation, data);\n }\n }\n\n /**\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeToAndCallUUPS(\n address newImplementation,\n bytes memory data,\n bool forceCall\n ) internal {\n // Upgrades from old implementations will perform a rollback test. This test requires the new\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\n // this special case will break upgrade paths from old UUPS implementation to new ones.\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\n _setImplementation(newImplementation);\n } else {\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\n require(slot == _IMPLEMENTATION_SLOT, \"ERC1967Upgrade: unsupported proxiableUUID\");\n } catch {\n revert(\"ERC1967Upgrade: new implementation is not UUPS\");\n }\n _upgradeToAndCall(newImplementation, data, forceCall);\n }\n }\n\n /**\n * @dev Storage slot with the admin of the contract.\n * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /**\n * @dev Emitted when the admin account has changed.\n */\n event AdminChanged(address previousAdmin, address newAdmin);\n\n /**\n * @dev Returns the current admin.\n */\n function _getAdmin() internal view returns (address) {\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the EIP1967 admin slot.\n */\n function _setAdmin(address newAdmin) private {\n require(newAdmin != address(0), \"ERC1967: new admin is the zero address\");\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {AdminChanged} event.\n */\n function _changeAdmin(address newAdmin) internal {\n emit AdminChanged(_getAdmin(), newAdmin);\n _setAdmin(newAdmin);\n }\n\n /**\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\n */\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n /**\n * @dev Emitted when the beacon is upgraded.\n */\n event BeaconUpgraded(address indexed beacon);\n\n /**\n * @dev Returns the current beacon.\n */\n function _getBeacon() internal view returns (address) {\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\n }\n\n /**\n * @dev Stores a new beacon in the EIP1967 beacon slot.\n */\n function _setBeacon(address newBeacon) private {\n require(Address.isContract(newBeacon), \"ERC1967: new beacon is not a contract\");\n require(\n Address.isContract(IBeacon(newBeacon).implementation()),\n \"ERC1967: beacon implementation is not a contract\"\n );\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\n }\n\n /**\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\n *\n * Emits a {BeaconUpgraded} event.\n */\n function _upgradeBeaconToAndCall(\n address newBeacon,\n bytes memory data,\n bool forceCall\n ) internal {\n _setBeacon(newBeacon);\n emit BeaconUpgraded(newBeacon);\n if (data.length > 0 || forceCall) {\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n }\n }\n}\n" + }, + "@openzeppelin/contracts/proxy/Proxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\n * be specified by overriding the virtual {_implementation} function.\n *\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\n * different contract through the {_delegate} function.\n *\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\n */\nabstract contract Proxy {\n /**\n * @dev Delegates the current call to `implementation`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _delegate(address implementation) internal virtual {\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 {\n revert(0, returndatasize())\n }\n default {\n return(0, returndatasize())\n }\n }\n }\n\n /**\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\n * and {_fallback} should delegate.\n */\n function _implementation() internal view virtual returns (address);\n\n /**\n * @dev Delegates the current call to the address returned by `_implementation()`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _fallback() internal virtual {\n _beforeFallback();\n _delegate(_implementation());\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\n * function in the contract matches the call data.\n */\n fallback() external payable virtual {\n _fallback();\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\n * is empty.\n */\n receive() external payable virtual {\n _fallback();\n }\n\n /**\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\n * call, or as part of the Solidity `fallback` or `receive` functions.\n *\n * If overridden should call `super._beforeFallback()`.\n */\n function _beforeFallback() internal virtual {}\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\n // decrementing then incrementing.\n _balances[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n unchecked {\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\n _balances[account] += amount;\n }\n\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n // Overflow not possible: amount <= accountBalance <= totalSupply.\n _totalSupply -= amount;\n }\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) external returns (bool);\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../extensions/draft-IERC20Permit.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n function safeTransfer(\n IERC20 token,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(\n IERC20 token,\n address from,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n uint256 newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20 token,\n address spender,\n uint256 value\n ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n function safePermit(\n IERC20Permit token,\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal {\n uint256 nonceBefore = token.nonces(owner);\n token.permit(owner, spender, value, deadline, v, r, s);\n uint256 nonceAfter = token.nonces(owner);\n require(nonceAfter == nonceBefore + 1, \"SafeERC20: permit did not succeed\");\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) {\n // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Address.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n" + }, + "@openzeppelin/contracts/utils/introspection/ERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" + }, + "@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" + }, + "@openzeppelin/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10**64) {\n value /= 10**64;\n result += 64;\n }\n if (value >= 10**32) {\n value /= 10**32;\n result += 32;\n }\n if (value >= 10**16) {\n value /= 10**16;\n result += 16;\n }\n if (value >= 10**8) {\n value /= 10**8;\n result += 8;\n }\n if (value >= 10**4) {\n value /= 10**4;\n result += 4;\n }\n if (value >= 10**2) {\n value /= 10**2;\n result += 2;\n }\n if (value >= 10**1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\n }\n }\n}\n" + }, + "@openzeppelin/contracts/utils/StorageSlot.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC1967 implementation slot:\n * ```\n * contract ERC1967 {\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n *\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Strings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n}\n" + }, + "contracts/external/AccessControlAngle.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"@openzeppelin/contracts/utils/Context.sol\";\nimport \"@openzeppelin/contracts/utils/Strings.sol\";\n\nimport \"../interfaces/IAccessControlAngle.sol\";\n\n/**\n * @dev This contract is fully forked from OpenZeppelin `AccessControl`.\n * The only difference is the removal of the ERC165 implementation as it's not\n * needed in Angle.\n *\n * Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```\n * function foo() public {\n * require(hasRole(MY_ROLE, msg.sender));\n * ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it.\n */\nabstract contract AccessControlAngle is Context, IAccessControlAngle {\n struct RoleData {\n mapping(address => bool) members;\n bytes32 adminRole;\n }\n\n mapping(bytes32 => RoleData) private _roles;\n\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n /**\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n *\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n * {RoleAdminChanged} not being emitted signaling this.\n *\n * _Available since v3.1._\n */\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n /**\n * @dev Emitted when `account` is granted `role`.\n *\n * `sender` is the account that originated the contract call, an admin role\n * bearer except when using {_setupRole}.\n */\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Emitted when `account` is revoked `role`.\n *\n * `sender` is the account that originated the contract call:\n * - if using `revokeRole`, it is the admin role bearer\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\n */\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Modifier that checks that an account has a specific role. Reverts\n * with a standardized message including the required role.\n *\n * The format of the revert reason is given by the following regular expression:\n *\n * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/\n *\n * _Available since v4.1._\n */\n modifier onlyRole(bytes32 role) {\n _checkRole(role, _msgSender());\n _;\n }\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) public view override returns (bool) {\n return _roles[role].members[account];\n }\n\n /**\n * @dev Revert with a standard message if `account` is missing `role`.\n *\n * The format of the revert reason is given by the following regular expression:\n *\n * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/\n */\n function _checkRole(bytes32 role, address account) internal view {\n if (!hasRole(role, account)) {\n revert(\n string(\n abi.encodePacked(\n \"AccessControl: account \",\n Strings.toHexString(uint160(account), 20),\n \" is missing role \",\n Strings.toHexString(uint256(role), 32)\n )\n )\n );\n }\n }\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) public view override returns (bytes32) {\n return _roles[role].adminRole;\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function grantRole(bytes32 role, address account) external override onlyRole(getRoleAdmin(role)) {\n _grantRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function revokeRole(bytes32 role, address account) external override onlyRole(getRoleAdmin(role)) {\n _revokeRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been granted `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `account`.\n */\n function renounceRole(bytes32 role, address account) external override {\n require(account == _msgSender(), \"71\");\n\n _revokeRole(role, account);\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event. Note that unlike {grantRole}, this function doesn't perform any\n * checks on the calling account.\n *\n * [WARNING]\n * ====\n * This function should only be called from the constructor when setting\n * up the initial roles for the system.\n *\n * Using this function in any other way is effectively circumventing the admin\n * system imposed by {AccessControl}.\n * ====\n */\n function _setupRole(bytes32 role, address account) internal {\n _grantRole(role, account);\n }\n\n /**\n * @dev Sets `adminRole` as ``role``'s admin role.\n *\n * Emits a {RoleAdminChanged} event.\n */\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal {\n emit RoleAdminChanged(role, getRoleAdmin(role), adminRole);\n _roles[role].adminRole = adminRole;\n }\n\n function _grantRole(bytes32 role, address account) internal {\n if (!hasRole(role, account)) {\n _roles[role].members[account] = true;\n emit RoleGranted(role, account, _msgSender());\n }\n }\n\n function _revokeRole(bytes32 role, address account) internal {\n if (hasRole(role, account)) {\n _roles[role].members[account] = false;\n emit RoleRevoked(role, account, _msgSender());\n }\n }\n}\n" + }, + "contracts/external/AccessControlAngleUpgradeable.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\n\nimport \"../interfaces/IAccessControlAngle.sol\";\n\n/**\n * @dev This contract is fully forked from OpenZeppelin `AccessControlUpgradeable`.\n * The only difference is the removal of the ERC165 implementation as it's not\n * needed in Angle.\n *\n * Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```\n * function foo() public {\n * require(hasRole(MY_ROLE, msg.sender));\n * ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it.\n */\nabstract contract AccessControlAngleUpgradeable is Initializable, IAccessControlAngle {\n // solhint-disable-next-line\n function __AccessControl_init() internal initializer {\n __AccessControl_init_unchained();\n }\n\n // solhint-disable-next-line\n function __AccessControl_init_unchained() internal initializer {}\n\n struct RoleData {\n mapping(address => bool) members;\n bytes32 adminRole;\n }\n\n mapping(bytes32 => RoleData) private _roles;\n\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n /**\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n *\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n * {RoleAdminChanged} not being emitted signaling this.\n *\n * _Available since v3.1._\n */\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n /**\n * @dev Emitted when `account` is granted `role`.\n *\n * `sender` is the account that originated the contract call, an admin role\n * bearer except when using {_setupRole}.\n */\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Emitted when `account` is revoked `role`.\n *\n * `sender` is the account that originated the contract call:\n * - if using `revokeRole`, it is the admin role bearer\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\n */\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Modifier that checks that an account has a specific role. Reverts\n * with a standardized message including the required role.\n *\n * The format of the revert reason is given by the following regular expression:\n *\n * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/\n *\n * _Available since v4.1._\n */\n modifier onlyRole(bytes32 role) {\n _checkRole(role, msg.sender);\n _;\n }\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) public view override returns (bool) {\n return _roles[role].members[account];\n }\n\n /**\n * @dev Revert with a standard message if `account` is missing `role`.\n *\n * The format of the revert reason is given by the following regular expression:\n *\n * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/\n */\n function _checkRole(bytes32 role, address account) internal view {\n if (!hasRole(role, account)) {\n revert(\n string(\n abi.encodePacked(\n \"AccessControl: account \",\n StringsUpgradeable.toHexString(uint160(account), 20),\n \" is missing role \",\n StringsUpgradeable.toHexString(uint256(role), 32)\n )\n )\n );\n }\n }\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) public view override returns (bytes32) {\n return _roles[role].adminRole;\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function grantRole(bytes32 role, address account) external override onlyRole(getRoleAdmin(role)) {\n _grantRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function revokeRole(bytes32 role, address account) external override onlyRole(getRoleAdmin(role)) {\n _revokeRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been granted `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `account`.\n */\n function renounceRole(bytes32 role, address account) external override {\n require(account == msg.sender, \"71\");\n\n _revokeRole(role, account);\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event. Note that unlike {grantRole}, this function doesn't perform any\n * checks on the calling account.\n *\n * [WARNING]\n * ====\n * This function should only be called from the constructor when setting\n * up the initial roles for the system.\n *\n * Using this function in any other way is effectively circumventing the admin\n * system imposed by {AccessControl}.\n * ====\n */\n function _setupRole(bytes32 role, address account) internal {\n _grantRole(role, account);\n }\n\n /**\n * @dev Sets `adminRole` as ``role``'s admin role.\n *\n * Emits a {RoleAdminChanged} event.\n */\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal {\n emit RoleAdminChanged(role, getRoleAdmin(role), adminRole);\n _roles[role].adminRole = adminRole;\n }\n\n function _grantRole(bytes32 role, address account) internal {\n if (!hasRole(role, account)) {\n _roles[role].members[account] = true;\n emit RoleGranted(role, account, msg.sender);\n }\n }\n\n function _revokeRole(bytes32 role, address account) internal {\n if (hasRole(role, account)) {\n _roles[role].members[account] = false;\n emit RoleRevoked(role, account, msg.sender);\n }\n }\n\n uint256[49] private __gap;\n}\n" + }, + "contracts/external/ComputePower.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nlibrary ComputePower {\n /// @notice Calculates (1+x)**n where x is a small number in base `base`\n /// @param ratePerSecond x value\n /// @param exp n value\n /// @param base Base in which the `ratePerSecond` is\n /// @dev This function avoids expensive exponentiation and the calculation is performed using a binomial approximation\n /// (1+x)^n = 1+n*x+[n/2*(n-1)]*x^2+[n/6*(n-1)*(n-2)*x^3...\n /// @dev This function was mostly inspired from Aave implementation and comes with the advantage of a great gas cost\n /// reduction with respect to the base power implementation\n function computePower(\n uint256 ratePerSecond,\n uint256 exp,\n uint256 base\n ) internal pure returns (uint256) {\n if (exp == 0 || ratePerSecond == 0) return base;\n uint256 halfBase = base / 2;\n uint256 expMinusOne = exp - 1;\n uint256 expMinusTwo = exp > 2 ? exp - 2 : 0;\n uint256 basePowerTwo = (ratePerSecond * ratePerSecond + halfBase) / base;\n uint256 basePowerThree = (basePowerTwo * ratePerSecond + halfBase) / base;\n uint256 secondTerm = (exp * expMinusOne * basePowerTwo) / 2;\n uint256 thirdTerm = (exp * expMinusOne * expMinusTwo * basePowerThree) / 6;\n return base + ratePerSecond * exp + secondTerm + thirdTerm;\n }\n}\n" + }, + "contracts/external/FullMath.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity >=0.4.0;\n\n/// @title Contains 512-bit math functions\n/// @notice Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision\n/// @dev Handles \"phantom overflow\" i.e., allows multiplication and division where an intermediate value overflows 256 bits\n/// @dev This contract was forked from Uniswap V3's contract `FullMath.sol` available here\n/// https://github.com/Uniswap/uniswap-v3-core/blob/main/contracts/libraries/FullMath.sol\n//solhint-disable\nabstract contract FullMath {\n /// @notice Calculates floor(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n /// @param a The multiplicand\n /// @param b The multiplier\n /// @param denominator The divisor\n /// @return result The 256-bit result\n /// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv\n function _mulDiv(\n uint256 a,\n uint256 b,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n // 512-bit multiply [prod1 prod0] = a * b\n // Compute the product mod 2**256 and mod 2**256 - 1\n // then use the Chinese Remainder Theorem to reconstruct\n // the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2**256 + prod0\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(a, b, not(0))\n prod0 := mul(a, b)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division\n if (prod1 == 0) {\n require(denominator > 0);\n assembly {\n result := div(prod0, denominator)\n }\n return result;\n }\n\n // Make sure the result is less than 2**256.\n // Also prevents denominator == 0\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0]\n // Compute remainder using mulmod\n uint256 remainder;\n assembly {\n remainder := mulmod(a, b, denominator)\n }\n // Subtract 256 bit number from 512 bit number\n assembly {\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator\n // Compute largest power of two divisor of denominator.\n // Always >= 1.\n uint256 twos = denominator & (~denominator + 1);\n // Divide denominator by power of two\n assembly {\n denominator := div(denominator, twos)\n }\n\n // Divide [prod1 prod0] by the factors of two\n assembly {\n prod0 := div(prod0, twos)\n }\n // Shift in bits from prod1 into prod0. For this we need\n // to flip `twos` such that it is 2**256 / twos.\n // If twos is zero, then it becomes one\n assembly {\n twos := add(div(sub(0, twos), twos), 1)\n }\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2**256\n // Now that denominator is an odd number, it has an inverse\n // modulo 2**256 such that denominator * inv = 1 mod 2**256.\n // Compute the inverse by starting with a seed that is correct\n // correct for four bits. That is, denominator * inv = 1 mod 2**4\n uint256 inv = (3 * denominator) ^ 2;\n // Now use Newton-Raphson iteration to improve the precision.\n // Thanks to Hensel's lifting lemma, this also works in modular\n // arithmetic, doubling the correct bits in each step.\n inv *= 2 - denominator * inv; // inverse mod 2**8\n inv *= 2 - denominator * inv; // inverse mod 2**16\n inv *= 2 - denominator * inv; // inverse mod 2**32\n inv *= 2 - denominator * inv; // inverse mod 2**64\n inv *= 2 - denominator * inv; // inverse mod 2**128\n inv *= 2 - denominator * inv; // inverse mod 2**256\n\n // Because the division is now exact we can divide by multiplying\n // with the modular inverse of denominator. This will give us the\n // correct result modulo 2**256. Since the precoditions guarantee\n // that the outcome is less than 2**256, this is the final result.\n // We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inv;\n return result;\n }\n}\n" + }, + "contracts/external/ProxyAdmin.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"./TransparentUpgradeableProxy.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @dev This is an auxiliary contract meant to be assigned as the admin of a {TransparentUpgradeableProxy}. For an\n * explanation of why you would want to use this see the documentation for {TransparentUpgradeableProxy}.\n * This contract was fully forked from OpenZeppelin `ProxyAdmin`\n */\ncontract ProxyAdmin is Ownable {\n /**\n * @dev Returns the current implementation of `proxy`.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n */\n function getProxyImplementation(TransparentUpgradeableProxy proxy) public view virtual returns (address) {\n // We need to manually run the static call since the getter cannot be flagged as view\n // bytes4(keccak256(\"implementation()\")) == 0x5c60da1b\n (bool success, bytes memory returndata) = address(proxy).staticcall(hex\"5c60da1b\");\n require(success);\n return abi.decode(returndata, (address));\n }\n\n /**\n * @dev Returns the current admin of `proxy`.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n */\n function getProxyAdmin(TransparentUpgradeableProxy proxy) public view virtual returns (address) {\n // We need to manually run the static call since the getter cannot be flagged as view\n // bytes4(keccak256(\"admin()\")) == 0xf851a440\n (bool success, bytes memory returndata) = address(proxy).staticcall(hex\"f851a440\");\n require(success);\n return abi.decode(returndata, (address));\n }\n\n /**\n * @dev Changes the admin of `proxy` to `newAdmin`.\n *\n * Requirements:\n *\n * - This contract must be the current admin of `proxy`.\n */\n function changeProxyAdmin(TransparentUpgradeableProxy proxy, address newAdmin) public virtual onlyOwner {\n proxy.changeAdmin(newAdmin);\n }\n\n /**\n * @dev Upgrades `proxy` to `implementation`. See {TransparentUpgradeableProxy-upgradeTo}.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n */\n function upgrade(TransparentUpgradeableProxy proxy, address implementation) public virtual onlyOwner {\n proxy.upgradeTo(implementation);\n }\n\n /**\n * @dev Upgrades `proxy` to `implementation` and calls a function on the new implementation. See\n * {TransparentUpgradeableProxy-upgradeToAndCall}.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n */\n function upgradeAndCall(\n TransparentUpgradeableProxy proxy,\n address implementation,\n bytes memory data\n ) public payable virtual onlyOwner {\n proxy.upgradeToAndCall{ value: msg.value }(implementation, data);\n }\n}\n" + }, + "contracts/external/RPow.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\n// From MakerDAO DSS\n\n// Copyright (C) 2018 Rain \n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\nlibrary RPow {\n function rpow(\n uint256 x,\n uint256 n,\n uint256 base\n ) internal pure returns (uint256 z) {\n // solhint-disable-next-line\n assembly {\n switch x\n case 0 {\n switch n\n case 0 {\n z := base\n }\n default {\n z := 0\n }\n }\n default {\n switch mod(n, 2)\n case 0 {\n z := base\n }\n default {\n z := x\n }\n let half := div(base, 2) // for rounding.\n for {\n n := div(n, 2)\n } n {\n n := div(n, 2)\n } {\n let xx := mul(x, x)\n if iszero(eq(div(xx, x), x)) {\n revert(0, 0)\n }\n let xxRound := add(xx, half)\n if lt(xxRound, xx) {\n revert(0, 0)\n }\n x := div(xxRound, base)\n if mod(n, 2) {\n let zx := mul(z, x)\n if and(iszero(iszero(x)), iszero(eq(div(zx, x), z))) {\n revert(0, 0)\n }\n let zxRound := add(zx, half)\n if lt(zxRound, zx) {\n revert(0, 0)\n }\n z := div(zxRound, base)\n }\n }\n }\n }\n }\n}\n" + }, + "contracts/external/TransparentUpgradeableProxy.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\";\n\n/**\n * @dev This contract implements a proxy that is upgradeable by an admin. It is fully forked from OpenZeppelin\n * `TransparentUpgradeableProxy`\n *\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\n * clashing], which can potentially be used in an attack, this contract uses the\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\n * things that go hand in hand:\n *\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\n * that call matches one of the admin functions exposed by the proxy itself.\n * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the\n * implementation. If the admin tries to call a function on the implementation it will fail with an error that says\n * \"admin cannot fallback to proxy target\".\n *\n * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing\n * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due\n * to sudden errors when trying to call a function from the proxy implementation.\n *\n * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,\n * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.\n */\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\n /**\n * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and\n * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.\n */\n constructor(\n address _logic,\n address admin_,\n bytes memory _data\n ) payable ERC1967Proxy(_logic, _data) {\n assert(_ADMIN_SLOT == bytes32(uint256(keccak256(\"eip1967.proxy.admin\")) - 1));\n _changeAdmin(admin_);\n }\n\n /**\n * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.\n */\n modifier ifAdmin() {\n if (msg.sender == _getAdmin()) {\n _;\n } else {\n _fallback();\n }\n }\n\n /**\n * @dev Returns the current admin.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n */\n function admin() external ifAdmin returns (address admin_) {\n admin_ = _getAdmin();\n }\n\n /**\n * @dev Returns the current implementation.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\n */\n function implementation() external ifAdmin returns (address implementation_) {\n implementation_ = _implementation();\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {AdminChanged} event.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}.\n */\n function changeAdmin(address newAdmin) external virtual ifAdmin {\n _changeAdmin(newAdmin);\n }\n\n /**\n * @dev Upgrade the implementation of the proxy.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.\n */\n function upgradeTo(address newImplementation) external ifAdmin {\n _upgradeToAndCall(newImplementation, bytes(\"\"), false);\n }\n\n /**\n * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified\n * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the\n * proxied contract.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.\n */\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {\n _upgradeToAndCall(newImplementation, data, true);\n }\n\n /**\n * @dev Returns the current admin.\n */\n function _admin() internal view virtual returns (address) {\n return _getAdmin();\n }\n\n /**\n * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.\n */\n function _beforeFallback() internal virtual override {\n require(msg.sender != _getAdmin(), \"TransparentUpgradeableProxy: admin cannot fallback to proxy target\");\n super._beforeFallback();\n }\n}\n" + }, + "contracts/interfaces/external/aave/IAave.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\nlibrary DataTypes {\n // refer to the whitepaper, section 1.1 basic concepts for a formal description of these properties.\n struct ReserveData {\n //stores the reserve configuration\n ReserveConfigurationMap configuration;\n //the liquidity index. Expressed in ray\n uint128 liquidityIndex;\n //variable borrow index. Expressed in ray\n uint128 variableBorrowIndex;\n //the current supply rate. Expressed in ray\n uint128 currentLiquidityRate;\n //the current variable borrow rate. Expressed in ray\n uint128 currentVariableBorrowRate;\n //the current stable borrow rate. Expressed in ray\n uint128 currentStableBorrowRate;\n uint40 lastUpdateTimestamp;\n //tokens addresses\n address aTokenAddress;\n address stableDebtTokenAddress;\n address variableDebtTokenAddress;\n //address of the interest rate strategy\n address interestRateStrategyAddress;\n //the id of the reserve. Represents the position in the list of the active reserves\n uint8 id;\n }\n\n struct ReserveConfigurationMap {\n //bit 0-15: LTV\n //bit 16-31: Liq. threshold\n //bit 32-47: Liq. bonus\n //bit 48-55: Decimals\n //bit 56: Reserve is active\n //bit 57: reserve is frozen\n //bit 58: borrowing is enabled\n //bit 59: stable rate borrowing enabled\n //bit 60-63: reserved\n //bit 64-79: reserve factor\n uint256 data;\n }\n\n struct UserConfigurationMap {\n uint256 data;\n }\n\n enum InterestRateMode {\n NONE,\n STABLE,\n VARIABLE\n }\n}\n\ninterface IOptionalERC20 {\n function decimals() external view returns (uint8);\n}\n\ninterface IPriceOracle {\n function getAssetPrice(address _asset) external view returns (uint256);\n\n function getAssetsPrices(address[] calldata _assets) external view returns (uint256[] memory);\n\n function getSourceOfAsset(address _asset) external view returns (address);\n\n function getFallbackOracle() external view returns (address);\n}\n\ninterface IStakedAave is IERC20 {\n function stake(address to, uint256 amount) external;\n\n function redeem(address to, uint256 amount) external;\n\n function cooldown() external;\n\n function claimRewards(address to, uint256 amount) external;\n\n function getTotalRewardsBalance(address) external view returns (uint256);\n\n // solhint-disable-next-line\n function COOLDOWN_SECONDS() external view returns (uint256);\n\n function stakersCooldowns(address) external view returns (uint256);\n\n // solhint-disable-next-line\n function UNSTAKE_WINDOW() external view returns (uint256);\n}\n\n/**\n * @title IReserveInterestRateStrategyInterface interface\n * @dev Interface for the calculation of the interest rates\n * @author Aave\n */\ninterface IReserveInterestRateStrategy {\n function baseVariableBorrowRate() external view returns (uint256);\n\n function getMaxVariableBorrowRate() external view returns (uint256);\n\n function stableRateSlope1() external view returns (uint256);\n\n function stableRateSlope2() external view returns (uint256);\n\n function variableRateSlope1() external view returns (uint256);\n\n function variableRateSlope2() external view returns (uint256);\n\n // solhint-disable-next-line\n function OPTIMAL_UTILIZATION_RATE() external view returns (uint256);\n\n function calculateInterestRates(\n address reserve,\n uint256 availableLiquidity,\n uint256 totalStableDebt,\n uint256 totalVariableDebt,\n uint256 averageStableBorrowRate,\n uint256 reserveFactor\n )\n external\n view\n returns (\n uint256 liquidityRate,\n uint256 stableBorrowRate,\n uint256 variableBorrowRate\n );\n\n function calculateInterestRates(\n address reserve,\n address aToken,\n uint256 liquidityAdded,\n uint256 liquidityTaken,\n uint256 totalStableDebt,\n uint256 totalVariableDebt,\n uint256 averageStableBorrowRate,\n uint256 reserveFactor\n )\n external\n view\n returns (\n uint256 liquidityRate,\n uint256 stableBorrowRate,\n uint256 variableBorrowRate\n );\n}\n" + }, + "contracts/interfaces/external/aave/IAaveIncentivesController.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\ninterface IAaveIncentivesController {\n /**\n * @dev Returns the total of rewards of an user, already accrued + not yet accrued\n * @param user The address of the user\n * @return The rewards\n **/\n function getRewardsBalance(address[] calldata assets, address user) external view returns (uint256);\n\n /**\n * @dev Claims reward for an user, on all the assets of the lending pool, accumulating the pending rewards\n * @param amount Amount of rewards to claim\n * @param to Address that will be receiving the rewards\n * @return Rewards claimed\n **/\n function claimRewards(\n address[] calldata assets,\n uint256 amount,\n address to\n ) external returns (uint256);\n\n /**\n * @dev Claims reward for an user on behalf, on all the assets of the lending pool, accumulating the pending rewards. The caller must\n * be whitelisted via \"allowClaimOnBehalf\" function by the RewardsAdmin role manager\n * @param amount Amount of rewards to claim\n * @param user Address to check and claim rewards\n * @param to Address that will be receiving the rewards\n * @return Rewards claimed\n **/\n function claimRewardsOnBehalf(\n address[] calldata assets,\n uint256 amount,\n address user,\n address to\n ) external returns (uint256);\n\n /**\n * @dev returns the unclaimed rewards of the user\n * @param user the address of the user\n * @return the unclaimed user rewards\n */\n function getUserUnclaimedRewards(address user) external view returns (uint256);\n\n /**\n * @dev for backward compatibility with previous implementation of the Incentives controller\n */\n // solhint-disable-next-line\n function REWARD_TOKEN() external view returns (address);\n\n function getDistributionEnd() external view returns (uint256);\n\n function getAssetData(address asset)\n external\n view\n returns (\n uint256,\n uint256,\n uint256\n );\n\n function assets(address asset)\n external\n view\n returns (\n uint256 emissionPerSecond,\n uint256 index,\n uint256 lastUpdateTimestamp\n );\n\n function configureAssets(address[] calldata assets, uint256[] calldata emissionsPerSecond) external;\n}\n" + }, + "contracts/interfaces/external/aave/IAaveToken.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"./IAaveIncentivesController.sol\";\nimport \"./ILendingPool.sol\";\n\ninterface IScaledBalanceToken {\n /**\n * @dev Returns the scaled balance of the user. The scaled balance is the sum of all the\n * updated stored balance divided by the reserve's liquidity index at the moment of the update\n * @param user The user whose balance is calculated\n * @return The scaled balance of the user\n **/\n function scaledBalanceOf(address user) external view returns (uint256);\n\n /**\n * @dev Returns the scaled balance of the user and the scaled total supply.\n * @param user The address of the user\n * @return The scaled balance of the user\n * @return The scaled balance and the scaled total supply\n **/\n function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256);\n\n /**\n * @dev Returns the scaled total supply of the variable debt token. Represents sum(debt/index)\n * @return The scaled total supply\n **/\n function scaledTotalSupply() external view returns (uint256);\n}\n\n/**\n * @title IVariableDebtToken\n * @author Aave\n * @notice Defines the basic interface for a variable debt token.\n **/\ninterface IVariableDebtToken is IERC20, IScaledBalanceToken {\n /**\n * @dev Emitted after the mint action\n * @param from The address performing the mint\n * @param onBehalfOf The address of the user on which behalf minting has been performed\n * @param value The amount to be minted\n * @param index The last index of the reserve\n **/\n event Mint(address indexed from, address indexed onBehalfOf, uint256 value, uint256 index);\n\n /**\n * @dev Mints debt token to the `onBehalfOf` address\n * @param user The address receiving the borrowed underlying, being the delegatee in case\n * of credit delegate, or same as `onBehalfOf` otherwise\n * @param onBehalfOf The address receiving the debt tokens\n * @param amount The amount of debt being minted\n * @param index The variable debt index of the reserve\n * @return `true` if the the previous balance of the user is 0\n **/\n function mint(\n address user,\n address onBehalfOf,\n uint256 amount,\n uint256 index\n ) external returns (bool);\n\n /**\n * @dev Emitted when variable debt is burnt\n * @param user The user which debt has been burned\n * @param amount The amount of debt being burned\n * @param index The index of the user\n **/\n event Burn(address indexed user, uint256 amount, uint256 index);\n\n /**\n * @dev Burns user variable debt\n * @param user The user which debt is burnt\n * @param index The variable debt index of the reserve\n **/\n function burn(\n address user,\n uint256 amount,\n uint256 index\n ) external;\n\n /**\n * @dev Returns the address of the incentives controller contract\n **/\n function getIncentivesController() external view returns (IAaveIncentivesController);\n}\n\n/**\n * @title IInitializableAToken\n * @notice Interface for the initialize function on AToken\n * @author Aave\n **/\ninterface IInitializableAToken {\n /**\n * @dev Emitted when an aToken is initialized\n * @param underlyingAsset The address of the underlying asset\n * @param pool The address of the associated lending pool\n * @param treasury The address of the treasury\n * @param incentivesController The address of the incentives controller for this aToken\n * @param aTokenDecimals the decimals of the underlying\n * @param aTokenName the name of the aToken\n * @param aTokenSymbol the symbol of the aToken\n * @param params A set of encoded parameters for additional initialization\n **/\n event Initialized(\n address indexed underlyingAsset,\n address indexed pool,\n address treasury,\n address incentivesController,\n uint8 aTokenDecimals,\n string aTokenName,\n string aTokenSymbol,\n bytes params\n );\n\n /**\n * @dev Initializes the aToken\n * @param pool The address of the lending pool where this aToken will be used\n * @param treasury The address of the Aave treasury, receiving the fees on this aToken\n * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH)\n * @param incentivesController The smart contract managing potential incentives distribution\n * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's\n * @param aTokenName The name of the aToken\n * @param aTokenSymbol The symbol of the aToken\n */\n function initialize(\n ILendingPool pool,\n address treasury,\n address underlyingAsset,\n IAaveIncentivesController incentivesController,\n uint8 aTokenDecimals,\n string calldata aTokenName,\n string calldata aTokenSymbol,\n bytes calldata params\n ) external;\n}\n\ninterface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken {\n /**\n * @dev Emitted after the mint action\n * @param from The address performing the mint\n * @param value The amount being\n * @param index The new liquidity index of the reserve\n **/\n event Mint(address indexed from, uint256 value, uint256 index);\n\n /**\n * @dev Mints `amount` aTokens to `user`\n * @param user The address receiving the minted tokens\n * @param amount The amount of tokens getting minted\n * @param index The new liquidity index of the reserve\n * @return `true` if the the previous balance of the user was 0\n */\n function mint(\n address user,\n uint256 amount,\n uint256 index\n ) external returns (bool);\n\n /**\n * @dev Emitted after aTokens are burned\n * @param from The owner of the aTokens, getting them burned\n * @param target The address that will receive the underlying\n * @param value The amount being burned\n * @param index The new liquidity index of the reserve\n **/\n event Burn(address indexed from, address indexed target, uint256 value, uint256 index);\n\n /**\n * @dev Emitted during the transfer action\n * @param from The user whose tokens are being transferred\n * @param to The recipient\n * @param value The amount being transferred\n * @param index The new liquidity index of the reserve\n **/\n event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index);\n\n /**\n * @dev Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying`\n * @param user The owner of the aTokens, getting them burned\n * @param receiverOfUnderlying The address that will receive the underlying\n * @param amount The amount being burned\n * @param index The new liquidity index of the reserve\n **/\n function burn(\n address user,\n address receiverOfUnderlying,\n uint256 amount,\n uint256 index\n ) external;\n\n /**\n * @dev Mints aTokens to the reserve treasury\n * @param amount The amount of tokens getting minted\n * @param index The new liquidity index of the reserve\n */\n function mintToTreasury(uint256 amount, uint256 index) external;\n\n /**\n * @dev Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken\n * @param from The address getting liquidated, current owner of the aTokens\n * @param to The recipient\n * @param value The amount of tokens getting transferred\n **/\n function transferOnLiquidation(\n address from,\n address to,\n uint256 value\n ) external;\n\n /**\n * @dev Transfers the underlying asset to `target`. Used by the LendingPool to transfer\n * assets in borrow(), withdraw() and flashLoan()\n * @param user The recipient of the underlying\n * @param amount The amount getting transferred\n * @return The amount transferred\n **/\n function transferUnderlyingTo(address user, uint256 amount) external returns (uint256);\n\n /**\n * @dev Invoked to execute actions on the aToken side after a repayment.\n * @param user The user executing the repayment\n * @param amount The amount getting repaid\n **/\n function handleRepayment(address user, uint256 amount) external;\n\n /**\n * @dev Returns the address of the incentives controller contract\n **/\n function getIncentivesController() external view returns (IAaveIncentivesController);\n\n /**\n * @dev Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH)\n **/\n // solhint-disable-next-line\n function UNDERLYING_ASSET_ADDRESS() external view returns (address);\n}\n" + }, + "contracts/interfaces/external/aave/ILendingPool.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport { DataTypes } from \"./IAave.sol\";\n\n/**\n * @title LendingPoolAddressesProvider contract\n * @dev Main registry of addresses part of or connected to the protocol, including permissioned roles\n * - Acting also as factory of proxies and admin of those, so with right to change its implementations\n * - Owned by the Aave Governance\n * @author Aave\n **/\ninterface ILendingPoolAddressesProvider {\n event MarketIdSet(string newMarketId);\n event LendingPoolUpdated(address indexed newAddress);\n event ConfigurationAdminUpdated(address indexed newAddress);\n event EmergencyAdminUpdated(address indexed newAddress);\n event LendingPoolConfiguratorUpdated(address indexed newAddress);\n event LendingPoolCollateralManagerUpdated(address indexed newAddress);\n event PriceOracleUpdated(address indexed newAddress);\n event LendingRateOracleUpdated(address indexed newAddress);\n event ProxyCreated(bytes32 id, address indexed newAddress);\n event AddressSet(bytes32 id, address indexed newAddress, bool hasProxy);\n\n function getMarketId() external view returns (string memory);\n\n function setMarketId(string calldata marketId) external;\n\n function setAddress(bytes32 id, address newAddress) external;\n\n function setAddressAsProxy(bytes32 id, address impl) external;\n\n function getAddress(bytes32 id) external view returns (address);\n\n function getLendingPool() external view returns (address);\n\n function setLendingPoolImpl(address pool) external;\n\n function getLendingPoolConfigurator() external view returns (address);\n\n function setLendingPoolConfiguratorImpl(address configurator) external;\n\n function getLendingPoolCollateralManager() external view returns (address);\n\n function setLendingPoolCollateralManager(address manager) external;\n\n function getPoolAdmin() external view returns (address);\n\n function setPoolAdmin(address admin) external;\n\n function getEmergencyAdmin() external view returns (address);\n\n function setEmergencyAdmin(address admin) external;\n\n function getPriceOracle() external view returns (address);\n\n function setPriceOracle(address priceOracle) external;\n\n function getLendingRateOracle() external view returns (address);\n\n function setLendingRateOracle(address lendingRateOracle) external;\n}\n\ninterface ILendingPool {\n /**\n * @dev Emitted on deposit()\n * @param reserve The address of the underlying asset of the reserve\n * @param user The address initiating the deposit\n * @param onBehalfOf The beneficiary of the deposit, receiving the aTokens\n * @param amount The amount deposited\n * @param referral The referral code used\n **/\n event Deposit(\n address indexed reserve,\n address user,\n address indexed onBehalfOf,\n uint256 amount,\n uint16 indexed referral\n );\n\n /**\n * @dev Emitted on withdraw()\n * @param reserve The address of the underlyng asset being withdrawn\n * @param user The address initiating the withdrawal, owner of aTokens\n * @param to Address that will receive the underlying\n * @param amount The amount to be withdrawn\n **/\n event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount);\n\n /**\n * @dev Emitted on borrow() and flashLoan() when debt needs to be opened\n * @param reserve The address of the underlying asset being borrowed\n * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just\n * initiator of the transaction on flashLoan()\n * @param onBehalfOf The address that will be getting the debt\n * @param amount The amount borrowed out\n * @param borrowRateMode The rate mode: 1 for Stable, 2 for Variable\n * @param borrowRate The numeric rate at which the user has borrowed\n * @param referral The referral code used\n **/\n event Borrow(\n address indexed reserve,\n address user,\n address indexed onBehalfOf,\n uint256 amount,\n uint256 borrowRateMode,\n uint256 borrowRate,\n uint16 indexed referral\n );\n\n /**\n * @dev Emitted on repay()\n * @param reserve The address of the underlying asset of the reserve\n * @param user The beneficiary of the repayment, getting his debt reduced\n * @param repayer The address of the user initiating the repay(), providing the funds\n * @param amount The amount repaid\n **/\n event Repay(address indexed reserve, address indexed user, address indexed repayer, uint256 amount);\n\n /**\n * @dev Emitted on swapBorrowRateMode()\n * @param reserve The address of the underlying asset of the reserve\n * @param user The address of the user swapping his rate mode\n * @param rateMode The rate mode that the user wants to swap to\n **/\n event Swap(address indexed reserve, address indexed user, uint256 rateMode);\n\n /**\n * @dev Emitted on setUserUseReserveAsCollateral()\n * @param reserve The address of the underlying asset of the reserve\n * @param user The address of the user enabling the usage as collateral\n **/\n event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user);\n\n /**\n * @dev Emitted on setUserUseReserveAsCollateral()\n * @param reserve The address of the underlying asset of the reserve\n * @param user The address of the user enabling the usage as collateral\n **/\n event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user);\n\n /**\n * @dev Emitted on rebalanceStableBorrowRate()\n * @param reserve The address of the underlying asset of the reserve\n * @param user The address of the user for which the rebalance has been executed\n **/\n event RebalanceStableBorrowRate(address indexed reserve, address indexed user);\n\n /**\n * @dev Emitted on flashLoan()\n * @param target The address of the flash loan receiver contract\n * @param initiator The address initiating the flash loan\n * @param asset The address of the asset being flash borrowed\n * @param amount The amount flash borrowed\n * @param premium The fee flash borrowed\n * @param referralCode The referral code used\n **/\n event FlashLoan(\n address indexed target,\n address indexed initiator,\n address indexed asset,\n uint256 amount,\n uint256 premium,\n uint16 referralCode\n );\n\n /**\n * @dev Emitted when the pause is triggered.\n */\n event Paused();\n\n /**\n * @dev Emitted when the pause is lifted.\n */\n event Unpaused();\n\n /**\n * @dev Emitted when a borrower is liquidated. This event is emitted by the LendingPool via\n * LendingPoolCollateral manager using a DELEGATECALL\n * This allows to have the events in the generated ABI for LendingPool.\n * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation\n * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation\n * @param user The address of the borrower getting liquidated\n * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover\n * @param liquidatedCollateralAmount The amount of collateral received by the liiquidator\n * @param liquidator The address of the liquidator\n * @param receiveAToken `true` if the liquidators wants to receive the collateral aTokens, `false` if he wants\n * to receive the underlying collateral asset directly\n **/\n event LiquidationCall(\n address indexed collateralAsset,\n address indexed debtAsset,\n address indexed user,\n uint256 debtToCover,\n uint256 liquidatedCollateralAmount,\n address liquidator,\n bool receiveAToken\n );\n\n /**\n * @dev Emitted when the state of a reserve is updated. NOTE: This event is actually declared\n * in the ReserveLogic library and emitted in the updateInterestRates() function. Since the function is internal,\n * the event will actually be fired by the LendingPool contract. The event is therefore replicated here so it\n * gets added to the LendingPool ABI\n * @param reserve The address of the underlying asset of the reserve\n * @param liquidityRate The new liquidity rate\n * @param stableBorrowRate The new stable borrow rate\n * @param variableBorrowRate The new variable borrow rate\n * @param liquidityIndex The new liquidity index\n * @param variableBorrowIndex The new variable borrow index\n **/\n event ReserveDataUpdated(\n address indexed reserve,\n uint256 liquidityRate,\n uint256 stableBorrowRate,\n uint256 variableBorrowRate,\n uint256 liquidityIndex,\n uint256 variableBorrowIndex\n );\n\n /**\n * @dev Deposits an `amount` of underlying asset into the reserve, receiving in return overlying aTokens.\n * - E.g. User deposits 100 USDC and gets in return 100 aUSDC\n * @param asset The address of the underlying asset to deposit\n * @param amount The amount to be deposited\n * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user\n * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens\n * is a different wallet\n * @param referralCode Code used to register the integrator originating the operation, for potential rewards.\n * 0 if the action is executed directly by the user, without any middle-man\n **/\n function deposit(\n address asset,\n uint256 amount,\n address onBehalfOf,\n uint16 referralCode\n ) external;\n\n /**\n * @dev Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned\n * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC\n * @param asset The address of the underlying asset to withdraw\n * @param amount The underlying amount to be withdrawn\n * - Send the value type(uint256).max in order to withdraw the whole aToken balance\n * @param to Address that will receive the underlying, same as msg.sender if the user\n * wants to receive it on his own wallet, or a different address if the beneficiary is a\n * different wallet\n * @return The final amount withdrawn\n **/\n function withdraw(\n address asset,\n uint256 amount,\n address to\n ) external returns (uint256);\n\n /**\n * @dev Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower\n * already deposited enough collateral, or he was given enough allowance by a credit delegator on the\n * corresponding debt token (StableDebtToken or VariableDebtToken)\n * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet\n * and 100 stable/variable debt tokens, depending on the `interestRateMode`\n * @param asset The address of the underlying asset to borrow\n * @param amount The amount to be borrowed\n * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable\n * @param referralCode Code used to register the integrator originating the operation, for potential rewards.\n * 0 if the action is executed directly by the user, without any middle-man\n * @param onBehalfOf Address of the user who will receive the debt. Should be the address of the borrower itself\n * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator\n * if he has been given credit delegation allowance\n **/\n function borrow(\n address asset,\n uint256 amount,\n uint256 interestRateMode,\n uint16 referralCode,\n address onBehalfOf\n ) external;\n\n /**\n * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned\n * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address\n * @param asset The address of the borrowed underlying asset previously borrowed\n * @param amount The amount to repay\n * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode`\n * @param rateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable\n * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the\n * user calling the function if he wants to reduce/remove his own debt, or the address of any other\n * other borrower whose debt should be removed\n * @return The final amount repaid\n **/\n function repay(\n address asset,\n uint256 amount,\n uint256 rateMode,\n address onBehalfOf\n ) external returns (uint256);\n\n /**\n * @dev Allows a borrower to swap his debt between stable and variable mode, or viceversa\n * @param asset The address of the underlying asset borrowed\n * @param rateMode The rate mode that the user wants to swap to\n **/\n function swapBorrowRateMode(address asset, uint256 rateMode) external;\n\n /**\n * @dev Rebalances the stable interest rate of a user to the current stable rate defined on the reserve.\n * - Users can be rebalanced if the following conditions are satisfied:\n * 1. Usage ratio is above 95%\n * 2. the current deposit APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too much has been\n * borrowed at a stable rate and depositors are not earning enough\n * @param asset The address of the underlying asset borrowed\n * @param user The address of the user to be rebalanced\n **/\n function rebalanceStableBorrowRate(address asset, address user) external;\n\n /**\n * @dev Allows depositors to enable/disable a specific deposited asset as collateral\n * @param asset The address of the underlying asset deposited\n * @param useAsCollateral `true` if the user wants to use the deposit as collateral, `false` otherwise\n **/\n function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external;\n\n /**\n * @dev Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1\n * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives\n * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk\n * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation\n * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation\n * @param user The address of the borrower getting liquidated\n * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover\n * @param receiveAToken `true` if the liquidators wants to receive the collateral aTokens, `false` if he wants\n * to receive the underlying collateral asset directly\n **/\n function liquidationCall(\n address collateralAsset,\n address debtAsset,\n address user,\n uint256 debtToCover,\n bool receiveAToken\n ) external;\n\n /**\n * @dev Allows smartcontracts to access the liquidity of the pool within one transaction,\n * as long as the amount taken plus a fee is returned.\n * IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept into consideration.\n * For further details please visit https://developers.aave.com\n * @param receiverAddress The address of the contract receiving the funds, implementing the IFlashLoanReceiver interface\n * @param assets The addresses of the assets being flash-borrowed\n * @param amounts The amounts amounts being flash-borrowed\n * @param modes Types of the debt to open if the flash loan is not returned:\n * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver\n * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address\n * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address\n * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2\n * @param params Variadic packed params to pass to the receiver as extra information\n * @param referralCode Code used to register the integrator originating the operation, for potential rewards.\n * 0 if the action is executed directly by the user, without any middle-man\n **/\n function flashLoan(\n address receiverAddress,\n address[] calldata assets,\n uint256[] calldata amounts,\n uint256[] calldata modes,\n address onBehalfOf,\n bytes calldata params,\n uint16 referralCode\n ) external;\n\n /**\n * @dev Returns the user account data across all the reserves\n * @param user The address of the user\n * @return totalCollateralETH the total collateral in ETH of the user\n * @return totalDebtETH the total debt in ETH of the user\n * @return availableBorrowsETH the borrowing power left of the user\n * @return currentLiquidationThreshold the liquidation threshold of the user\n * @return ltv the loan to value of the user\n * @return healthFactor the current health factor of the user\n **/\n function getUserAccountData(address user)\n external\n view\n returns (\n uint256 totalCollateralETH,\n uint256 totalDebtETH,\n uint256 availableBorrowsETH,\n uint256 currentLiquidationThreshold,\n uint256 ltv,\n uint256 healthFactor\n );\n\n function initReserve(\n address reserve,\n address aTokenAddress,\n address stableDebtAddress,\n address variableDebtAddress,\n address interestRateStrategyAddress\n ) external;\n\n function setReserveInterestRateStrategyAddress(address reserve, address rateStrategyAddress) external;\n\n function setConfiguration(address reserve, uint256 configuration) external;\n\n /**\n * @dev Returns the configuration of the reserve\n * @param asset The address of the underlying asset of the reserve\n * @return The configuration of the reserve\n **/\n function getConfiguration(address asset) external view returns (DataTypes.ReserveConfigurationMap memory);\n\n /**\n * @dev Returns the configuration of the user across all the reserves\n * @param user The user address\n * @return The configuration of the user\n **/\n function getUserConfiguration(address user) external view returns (DataTypes.UserConfigurationMap memory);\n\n /**\n * @dev Returns the normalized income normalized income of the reserve\n * @param asset The address of the underlying asset of the reserve\n * @return The reserve's normalized income\n */\n function getReserveNormalizedIncome(address asset) external view returns (uint256);\n\n /**\n * @dev Returns the normalized variable debt per unit of asset\n * @param asset The address of the underlying asset of the reserve\n * @return The reserve normalized variable debt\n */\n function getReserveNormalizedVariableDebt(address asset) external view returns (uint256);\n\n /**\n * @dev Returns the state and configuration of the reserve\n * @param asset The address of the underlying asset of the reserve\n * @return The state of the reserve\n **/\n function getReserveData(address asset) external view returns (DataTypes.ReserveData memory);\n\n function finalizeTransfer(\n address asset,\n address from,\n address to,\n uint256 amount,\n uint256 balanceFromAfter,\n uint256 balanceToBefore\n ) external;\n\n function getReservesList() external view returns (address[] memory);\n\n function getAddressesProvider() external view returns (ILendingPoolAddressesProvider);\n\n function setPause(bool val) external;\n\n function paused() external view returns (bool);\n}\n" + }, + "contracts/interfaces/external/aave/IProtocolDataProvider.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport { ILendingPoolAddressesProvider } from \"./ILendingPool.sol\";\n\ninterface IProtocolDataProvider {\n struct TokenData {\n string symbol;\n address tokenAddress;\n }\n\n // solhint-disable-next-line\n function ADDRESSES_PROVIDER() external view returns (ILendingPoolAddressesProvider);\n\n function getAllReservesTokens() external view returns (TokenData[] memory);\n\n function getAllATokens() external view returns (TokenData[] memory);\n\n function getReserveConfigurationData(address asset)\n external\n view\n returns (\n uint256 decimals,\n uint256 ltv,\n uint256 liquidationThreshold,\n uint256 liquidationBonus,\n uint256 reserveFactor,\n bool usageAsCollateralEnabled,\n bool borrowingEnabled,\n bool stableBorrowRateEnabled,\n bool isActive,\n bool isFrozen\n );\n\n function getReserveData(address asset)\n external\n view\n returns (\n uint256 availableLiquidity,\n uint256 totalStableDebt,\n uint256 totalVariableDebt,\n uint256 liquidityRate,\n uint256 variableBorrowRate,\n uint256 stableBorrowRate,\n uint256 averageStableBorrowRate,\n uint256 liquidityIndex,\n uint256 variableBorrowIndex,\n uint40 lastUpdateTimestamp\n );\n\n function getUserReserveData(address asset, address user)\n external\n view\n returns (\n uint256 currentATokenBalance,\n uint256 currentStableDebt,\n uint256 currentVariableDebt,\n uint256 principalStableDebt,\n uint256 scaledVariableDebt,\n uint256 stableBorrowRate,\n uint256 liquidityRate,\n uint40 stableRateLastUpdated,\n bool usageAsCollateralEnabled\n );\n\n function getReserveTokensAddresses(address asset)\n external\n view\n returns (\n address aTokenAddress,\n address stableDebtTokenAddress,\n address variableDebtTokenAddress\n );\n}\n" + }, + "contracts/interfaces/external/compound/CErc20I.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity >=0.5.0;\n\nimport \"./CTokenI.sol\";\n\ninterface CErc20I is CTokenI {\n function mint(uint256 mintAmount) external returns (uint256);\n\n function redeemUnderlying(uint256 redeemAmount) external returns (uint256);\n\n function underlying() external view returns (address);\n\n function borrow(uint256 borrowAmount) external returns (uint256);\n\n function decimals() external returns (uint8);\n\n function accrueInterest() external returns (uint256);\n}\n" + }, + "contracts/interfaces/external/compound/CEtherI.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity >=0.5.0;\n\nimport \"./CTokenI.sol\";\n\ninterface CEtherI is CTokenI {\n function mint() external payable;\n\n function redeemUnderlying(uint256 redeemAmount) external returns (uint256);\n\n function borrow(uint256 borrowAmount) external returns (uint256);\n}\n" + }, + "contracts/interfaces/external/compound/CTokenI.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\nimport \"./InterestRateModel.sol\";\n\ninterface CTokenI {\n function balanceOf(address owner) external view returns (uint256);\n\n function balanceOfUnderlying(address owner) external returns (uint256);\n\n function supplyRatePerBlock() external view returns (uint256);\n\n function exchangeRateCurrent() external returns (uint256);\n\n function exchangeRateStored() external view returns (uint256);\n\n function interestRateModel() external view returns (InterestRateModel);\n\n function totalReserves() external view returns (uint256);\n\n function reserveFactorMantissa() external view returns (uint256);\n\n function totalBorrows() external view returns (uint256);\n\n function totalSupply() external view returns (uint256);\n}\n" + }, + "contracts/interfaces/external/compound/IComptroller.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"./CTokenI.sol\";\n\ninterface IComptroller {\n function compSupplySpeeds(address cToken) external view returns (uint256);\n\n function claimComp(\n address[] memory holders,\n CTokenI[] memory cTokens,\n bool borrowers,\n bool suppliers\n ) external;\n}\n" + }, + "contracts/interfaces/external/compound/InterestRateModel.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\ninterface InterestRateModel {\n /**\n * @notice Calculates the current supply interest rate per block\n * @param cash The total amount of cash the market has\n * @param borrows The total amount of borrows the market has outstanding\n * @param reserves The total amount of reserves the market has\n * @param reserveFactorMantissa The current reserve factor the market has\n * @return The supply rate per block (as a percentage, and scaled by 1e18)\n */\n function getSupplyRate(\n uint256 cash,\n uint256 borrows,\n uint256 reserves,\n uint256 reserveFactorMantissa\n ) external view returns (uint256);\n\n // Rinkeby function\n function getBorrowRate(\n uint256 cash,\n uint256 borrows,\n uint256 _reserves\n ) external view returns (uint256, uint256);\n}\n" + }, + "contracts/interfaces/external/convex/frax/IBoosterFrax.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\ninterface IBoosterFrax {\n function createVault(uint256 _pid) external;\n}\n" + }, + "contracts/interfaces/external/convex/frax/IFeeRegistryFrax.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\ninterface IFeeRegistryFrax {\n function totalFees() external view returns (uint256);\n}\n" + }, + "contracts/interfaces/external/convex/frax/IPoolRegistryFrax.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\ninterface IPoolRegistryFrax {\n //clone a new user vault\n function vaultMap(uint256 _pid, address _user) external view returns (address);\n}\n" + }, + "contracts/interfaces/external/convex/frax/IStakingProxyERC20.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\ninterface IStakingProxyERC20 {\n //create a new locked state of _secs timelength\n function stakeLocked(uint256 _liquidity, uint256 _secs) external;\n\n //add to a current lock\n // solhint-disable-next-line\n function lockAdditional(bytes32 _kek_id, uint256 _addl_liq) external;\n\n //withdraw a staked position\n // solhint-disable-next-line\n function withdrawLocked(bytes32 _kek_id) external;\n\n //helper function to combine earned tokens on staking contract and any tokens that are on this vault\n // solhint-disable-next-line\n function earned() external view returns (address[] memory token_addresses, uint256[] memory total_earned);\n\n /*\n claim flow:\n claim rewards directly to the vault\n calculate fees to send to fee deposit\n send fxs to booster for fees\n get reward list of tokens that were received\n send all remaining tokens to owner\n\n A slightly less gas intensive approach could be to send rewards directly to booster and have it sort everything out.\n However that makes the logic a bit more complex as well as runs a few future proofing risks\n */\n function getReward() external;\n\n //get reward with claim option.\n //_claim bool is for the off chance that rewardCollectionPause is true so getReward() fails but\n //there are tokens on this vault for cases such as withdraw() also calling claim.\n //can also be used to rescue tokens on the vault\n function getReward(bool _claim) external;\n}\n" + }, + "contracts/interfaces/external/convex/IBaseRewardPool.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\ninterface IConvexBaseRewardPool {\n function balanceOf(address account) external view returns (uint256);\n\n function duration() external view returns (uint256);\n\n function earned(address account) external view returns (uint256);\n\n function extraRewards(uint256) external view returns (address);\n\n function extraRewardsLength() external view returns (uint256);\n\n function getReward() external returns (bool);\n\n function getReward(address _account, bool _claimExtras) external returns (bool);\n\n function lastTimeRewardApplicable() external view returns (uint256);\n\n function lastUpdateTime() external view returns (uint256);\n\n function newRewardRatio() external view returns (uint256);\n\n function periodFinish() external view returns (uint256);\n\n function pid() external view returns (uint256);\n\n function rewardRate() external view returns (uint256);\n\n function rewardToken() external view returns (address);\n\n function stake(uint256 _amount) external returns (bool);\n\n function stakeAll() external returns (bool);\n\n function stakeFor(address _for, uint256 _amount) external returns (bool);\n\n function stakingToken() external view returns (address);\n\n function totalSupply() external view returns (uint256);\n\n function withdraw(uint256 amount, bool claim) external returns (bool);\n\n function withdrawAll(bool claim) external;\n\n function withdrawAllAndUnwrap(bool claim) external;\n\n function withdrawAndUnwrap(uint256 amount, bool claim) external returns (bool);\n}\n" + }, + "contracts/interfaces/external/convex/IBooster.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\n// solhint-disable\ninterface IConvexBooster {\n function FEE_DENOMINATOR() external view returns (uint256);\n\n function addPool(\n address _lptoken,\n address _gauge,\n uint256 _stashVersion\n ) external returns (bool);\n\n function claimRewards(uint256 _pid, address _gauge) external returns (bool);\n\n function deposit(\n uint256 _pid,\n uint256 _amount,\n bool _stake\n ) external returns (bool);\n\n function depositAll(uint256 _pid, bool _stake) external returns (bool);\n\n function gaugeMap(address) external view returns (bool);\n\n function poolInfo(uint256)\n external\n view\n returns (\n address lptoken,\n address token,\n address gauge,\n address crvRewards,\n address stash,\n bool shutdown\n );\n\n function staker() external view returns (address);\n\n function withdraw(uint256 _pid, uint256 _amount) external returns (bool);\n\n function withdrawAll(uint256 _pid) external returns (bool);\n\n function withdrawTo(\n uint256 _pid,\n uint256 _amount,\n address _to\n ) external returns (bool);\n}\n" + }, + "contracts/interfaces/external/convex/IClaimZap.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\ninterface IConvexClaimZap {\n function claimRewards(\n address[] calldata rewardContracts,\n address[] calldata extraRewardContracts,\n address[] calldata tokenRewardContracts,\n address[] calldata tokenRewardTokens,\n uint256 depositCrvMaxAmount,\n uint256 minAmountOut,\n uint256 depositCvxMaxAmount,\n uint256 spendCvxAmount,\n uint256 options\n ) external;\n}\n" + }, + "contracts/interfaces/external/convex/ICvxRewardPool.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\ninterface ICvxRewardPool {\n function balanceOf(address account) external view returns (uint256);\n\n function duration() external view returns (uint256);\n\n function earned(address account) external view returns (uint256);\n\n function extraRewards(uint256) external view returns (address);\n\n function extraRewardsLength() external view returns (uint256);\n\n function getReward(bool stake) external returns (bool);\n\n function getReward(\n address _account,\n bool _claimExtras,\n bool stake\n ) external returns (bool);\n\n function lastTimeRewardApplicable() external view returns (uint256);\n\n function rewardRate() external view returns (uint256);\n\n function stake(uint256 _amount) external returns (bool);\n\n function stakeAll() external returns (bool);\n\n function stakeFor(address _for, uint256 _amount) external returns (bool);\n\n function totalSupply() external view returns (uint256);\n\n function withdraw(uint256 amount, bool claim) external returns (bool);\n\n function withdrawAll(bool claim) external;\n}\n" + }, + "contracts/interfaces/external/convex/IVirtualBalanceRewardPool.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\ninterface IVirtualBalanceRewardPool {\n function balanceOf(address account) external view returns (uint256);\n\n function currentRewards() external view returns (uint256);\n\n function deposits() external view returns (address);\n\n function duration() external view returns (uint256);\n\n function earned(address account) external view returns (uint256);\n\n function getReward() external;\n\n function getReward(address _account) external;\n\n function lastTimeRewardApplicable() external view returns (uint256);\n\n function lastUpdateTime() external view returns (uint256);\n\n function operator() external view returns (address);\n\n function periodFinish() external view returns (uint256);\n\n function rewardRate() external view returns (uint256);\n\n function rewardToken() external view returns (address);\n\n function rewards(address) external view returns (uint256);\n\n function stake(address _account, uint256 amount) external;\n\n function totalSupply() external view returns (uint256);\n\n function withdraw(address _account, uint256 amount) external;\n}\n" + }, + "contracts/interfaces/external/curve/ICurveCryptoSwapPool.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n// solhint-disable\ninterface ICurveCryptoSwapPool is IERC20 {\n function A() external view returns (uint256);\n\n function get_virtual_price() external view returns (uint256);\n\n function calc_token_fee(uint256[3] memory amounts, uint256[3] memory xp) external view returns (uint256);\n\n function calc_token_amount(uint256[3] memory amounts, bool deposit) external view returns (uint256);\n\n function add_liquidity(uint256[3] memory amounts, uint256 min_mint_amount) external;\n\n function get_dy(\n int128 i,\n int128 j,\n uint256 dx\n ) external view returns (uint256);\n\n function exchange(\n int128 i,\n int128 j,\n uint256 dx,\n uint256 min_dy\n ) external;\n\n function remove_liquidity(uint256 _amount, uint256[3] memory min_amounts) external;\n\n function remove_liquidity_imbalance(uint256[3] memory amounts, uint256 max_burn_amount) external;\n\n function calc_withdraw_one_coin(uint256 _token_amount, int128 i) external view returns (uint256);\n\n function remove_liquidity_one_coin(\n uint256 _token_amount,\n int128 i,\n uint256 min_amount\n ) external;\n}\n" + }, + "contracts/interfaces/external/curve/IMetaPool.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n// solhint-disable\ninterface IMetaPool is IERC20 {\n function get_previous_balances() external view returns (uint256[] memory);\n\n function get_twap_balances(\n uint256[] memory _first_balances,\n uint256[] memory _last_balances,\n uint256 _time_elapsed\n ) external view returns (uint256[] memory);\n\n function get_price_cumulative_last() external view returns (uint256[] memory);\n\n function admin_fee() external view returns (uint256);\n\n function A() external view returns (uint256);\n\n function A_precise() external view returns (uint256);\n\n function get_virtual_price() external view returns (uint256);\n\n function calc_token_amount(uint256[] memory _amounts, bool _is_deposit) external view returns (uint256);\n\n function calc_token_amount(\n uint256[] memory _amounts,\n bool _is_deposit,\n bool _previous\n ) external view returns (uint256);\n\n function add_liquidity(uint256[2] memory _amounts, uint256 _min_mint_amount) external returns (uint256);\n\n function add_liquidity(\n uint256[] memory _amounts,\n uint256 _min_mint_amount,\n address _receiver\n ) external returns (uint256);\n\n function get_dy(\n int128 i,\n int128 j,\n uint256 dx\n ) external view returns (uint256);\n\n function get_dy(\n int128 i,\n int128 j,\n uint256 dx,\n uint256[] memory _balances\n ) external view returns (uint256);\n\n function get_dy_underlying(\n int128 i,\n int128 j,\n uint256 dx\n ) external view returns (uint256);\n\n function get_dy_underlying(\n int128 i,\n int128 j,\n uint256 dx,\n uint256[] memory _balances\n ) external view returns (uint256);\n\n function exchange(\n int128 i,\n int128 j,\n uint256 dx,\n uint256 min_dy\n ) external returns (uint256);\n\n function exchange(\n int128 i,\n int128 j,\n uint256 dx,\n uint256 min_dy,\n address _receiver\n ) external returns (uint256);\n\n function exchange_underlying(\n int128 i,\n int128 j,\n uint256 dx,\n uint256 min_dy\n ) external returns (uint256);\n\n function exchange_underlying(\n int128 i,\n int128 j,\n uint256 dx,\n uint256 min_dy,\n address _receiver\n ) external returns (uint256);\n\n function remove_liquidity(uint256 _burn_amount, uint256[] memory _min_amounts) external returns (uint256[] memory);\n\n function remove_liquidity(\n uint256 _burn_amount,\n uint256[] memory _min_amounts,\n address _receiver\n ) external returns (uint256[] memory);\n\n function remove_liquidity_imbalance(uint256[] memory _amounts, uint256 _max_burn_amount) external returns (uint256);\n\n function remove_liquidity_imbalance(\n uint256[] memory _amounts,\n uint256 _max_burn_amount,\n address _receiver\n ) external returns (uint256);\n\n function calc_withdraw_one_coin(uint256 _burn_amount, int128 i) external view returns (uint256);\n\n function calc_withdraw_one_coin(\n uint256 _burn_amount,\n int128 i,\n bool _previous\n ) external view returns (uint256);\n\n function remove_liquidity_one_coin(\n uint256 _burn_amount,\n int128 i,\n uint256 _min_received\n ) external returns (uint256);\n\n function remove_liquidity_one_coin(\n uint256 _burn_amount,\n int128 i,\n uint256 _min_received,\n address _receiver\n ) external returns (uint256);\n\n function admin_balances(uint256 i) external view returns (uint256);\n\n function withdraw_admin_fees() external;\n}\n" + }, + "contracts/interfaces/external/curve/IStableSwapPool.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n// this interface doesn't wok with 3Pool as it doesn't return anything on add_liquidity, remove_liquidity_one_coin\n\n// solhint-disable\ninterface IStableSwapPool is IERC20 {\n function A() external view returns (uint256);\n\n function get_virtual_price() external view returns (uint256);\n\n function calc_token_amount(uint256[3] memory amounts, bool deposit) external view returns (uint256);\n\n function add_liquidity(uint256[3] memory amounts, uint256 min_mint_amount) external returns (uint256);\n\n function get_dy(\n int128 i,\n int128 j,\n uint256 dx\n ) external view returns (uint256);\n\n function exchange(\n int128 i,\n int128 j,\n uint256 dx,\n uint256 min_dy\n ) external payable;\n\n function remove_liquidity(uint256 _amount, uint256[3] memory min_amounts) external;\n\n function remove_liquidity_imbalance(uint256[3] memory amounts, uint256 max_burn_amount) external;\n\n function calc_withdraw_one_coin(uint256 _token_amount, int128 i) external view returns (uint256);\n\n function remove_liquidity_one_coin(\n uint256 _token_amount,\n int128 i,\n uint256 min_amount\n ) external returns (uint256);\n}\n" + }, + "contracts/interfaces/external/euler/IEuler.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\n// Forked from https://github.com/euler-xyz/euler-interfaces\npragma solidity ^0.8.12;\n\n/// @notice Main storage contract for the Euler system\ninterface IEulerConstants {\n /// @notice gives the maxExternalAmount in base 18\n //solhint-disable-next-line\n function MAX_SANE_AMOUNT() external view returns (uint256);\n}\n\n/// @notice Main storage contract for the Euler system\ninterface IEuler {\n /// @notice Lookup the current implementation contract for a module\n /// @param moduleId Fixed constant that refers to a module type (ie MODULEID__ETOKEN)\n /// @return An internal address specifies the module's implementation code\n function moduleIdToImplementation(uint256 moduleId) external view returns (address);\n\n /// @notice Lookup a proxy that can be used to interact with a module (only valid for single-proxy modules)\n /// @param moduleId Fixed constant that refers to a module type (ie MODULEID__MARKETS)\n /// @return An address that should be cast to the appropriate module interface, ie IEulerMarkets(moduleIdToProxy(2))\n function moduleIdToProxy(uint256 moduleId) external view returns (address);\n\n /// @notice Euler-related configuration for an asset\n struct AssetConfig {\n address eTokenAddress;\n bool borrowIsolated;\n uint32 collateralFactor;\n uint32 borrowFactor;\n uint24 twapWindow;\n }\n}\n\n/// @notice Activating and querying markets, and maintaining entered markets lists\ninterface IEulerMarkets {\n /// @notice Create an Euler pool and associated EToken and DToken addresses.\n /// @param underlying The address of an ERC20-compliant token. There must be an initialised uniswap3 pool for the underlying/reference asset pair.\n /// @return The created EToken, or the existing EToken if already activated.\n function activateMarket(address underlying) external returns (address);\n\n /// @notice Create a pToken and activate it on Euler. pTokens are protected wrappers around assets that prevent borrowing.\n /// @param underlying The address of an ERC20-compliant token. There must already be an activated market on Euler for this underlying, and it must have a non-zero collateral factor.\n /// @return The created pToken, or an existing one if already activated.\n function activatePToken(address underlying) external returns (address);\n\n /// @notice Given an underlying, lookup the associated EToken\n /// @param underlying Token address\n /// @return EToken address, or address(0) if not activated\n function underlyingToEToken(address underlying) external view returns (address);\n\n /// @notice Given an underlying, lookup the associated DToken\n /// @param underlying Token address\n /// @return DToken address, or address(0) if not activated\n function underlyingToDToken(address underlying) external view returns (address);\n\n /// @notice Given an underlying, lookup the associated PToken\n /// @param underlying Token address\n /// @return PToken address, or address(0) if it doesn't exist\n function underlyingToPToken(address underlying) external view returns (address);\n\n /// @notice Looks up the Euler-related configuration for a token, and resolves all default-value placeholders to their currently configured values.\n /// @param underlying Token address\n /// @return Configuration struct\n function underlyingToAssetConfig(address underlying) external view returns (IEuler.AssetConfig memory);\n\n /// @notice Looks up the Euler-related configuration for a token, and returns it unresolved (with default-value placeholders)\n /// @param underlying Token address\n /// @return config Configuration struct\n function underlyingToAssetConfigUnresolved(address underlying)\n external\n view\n returns (IEuler.AssetConfig memory config);\n\n /// @notice Given an EToken address, looks up the associated underlying\n /// @param eToken EToken address\n /// @return underlying Token address\n function eTokenToUnderlying(address eToken) external view returns (address underlying);\n\n /// @notice Given an EToken address, looks up the associated DToken\n /// @param eToken EToken address\n /// @return dTokenAddr DToken address\n function eTokenToDToken(address eToken) external view returns (address dTokenAddr);\n\n /// @notice Looks up an asset's currently configured interest rate model\n /// @param underlying Token address\n /// @return Module ID that represents the interest rate model (IRM)\n function interestRateModel(address underlying) external view returns (uint256);\n\n /// @notice Retrieves the current interest rate for an asset\n /// @param underlying Token address\n /// @return The interest rate in yield-per-second, scaled by 10**27\n function interestRate(address underlying) external view returns (int96);\n\n /// @notice Retrieves the current interest rate accumulator for an asset\n /// @param underlying Token address\n /// @return An opaque accumulator that increases as interest is accrued\n function interestAccumulator(address underlying) external view returns (uint256);\n\n /// @notice Retrieves the reserve fee in effect for an asset\n /// @param underlying Token address\n /// @return Amount of interest that is redirected to the reserves, as a fraction scaled by RESERVE_FEE_SCALE (4e9)\n function reserveFee(address underlying) external view returns (uint32);\n\n /// @notice Retrieves the pricing config for an asset\n /// @param underlying Token address\n /// @return pricingType (1=pegged, 2=uniswap3, 3=forwarded)\n /// @return pricingParameters If uniswap3 pricingType then this represents the uniswap pool fee used, otherwise unused\n /// @return pricingForwarded If forwarded pricingType then this is the address prices are forwarded to, otherwise address(0)\n function getPricingConfig(address underlying)\n external\n view\n returns (\n uint16 pricingType,\n uint32 pricingParameters,\n address pricingForwarded\n );\n\n /// @notice Retrieves the list of entered markets for an account (assets enabled for collateral or borrowing)\n /// @param account User account\n /// @return List of underlying token addresses\n function getEnteredMarkets(address account) external view returns (address[] memory);\n\n /// @notice Add an asset to the entered market list, or do nothing if already entered\n /// @param subAccountId 0 for primary, 1-255 for a sub-account\n /// @param newMarket Underlying token address\n function enterMarket(uint256 subAccountId, address newMarket) external;\n\n /// @notice Remove an asset from the entered market list, or do nothing if not already present\n /// @param subAccountId 0 for primary, 1-255 for a sub-account\n /// @param oldMarket Underlying token address\n function exitMarket(uint256 subAccountId, address oldMarket) external;\n}\n\n/// @notice Definition of callback method that deferLiquidityCheck will invoke on your contract\ninterface IDeferredLiquidityCheck {\n function onDeferredLiquidityCheck(bytes memory data) external;\n}\n\n/// @notice Batch executions, liquidity check deferrals, and interfaces to fetch prices and account liquidity\ninterface IEulerExec {\n /// @notice Liquidity status for an account, either in aggregate or for a particular asset\n struct LiquidityStatus {\n uint256 collateralValue;\n uint256 liabilityValue;\n uint256 numBorrows;\n bool borrowIsolated;\n }\n\n /// @notice Aggregate struct for reporting detailed (per-asset) liquidity for an account\n struct AssetLiquidity {\n address underlying;\n LiquidityStatus status;\n }\n\n /// @notice Single item in a batch request\n struct EulerBatchItem {\n bool allowError;\n address proxyAddr;\n bytes data;\n }\n\n /// @notice Single item in a batch response\n struct EulerBatchItemResponse {\n bool success;\n bytes result;\n }\n\n /// @notice Compute aggregate liquidity for an account\n /// @param account User address\n /// @return status Aggregate liquidity (sum of all entered assets)\n function liquidity(address account) external returns (LiquidityStatus memory status);\n\n /// @notice Compute detailed liquidity for an account, broken down by asset\n /// @param account User address\n /// @return assets List of user's entered assets and each asset's corresponding liquidity\n function detailedLiquidity(address account) external returns (AssetLiquidity[] memory assets);\n\n /// @notice Retrieve Euler's view of an asset's price\n /// @param underlying Token address\n /// @return twap Time-weighted average price\n /// @return twapPeriod TWAP duration, either the twapWindow value in AssetConfig, or less if that duration not available\n function getPrice(address underlying) external view returns (uint256 twap, uint256 twapPeriod);\n\n /// @notice Retrieve Euler's view of an asset's price, as well as the current marginal price on uniswap\n /// @param underlying Token address\n /// @return twap Time-weighted average price\n /// @return twapPeriod TWAP duration, either the twapWindow value in AssetConfig, or less if that duration not available\n /// @return currPrice The current marginal price on uniswap3 (informational: not used anywhere in the Euler protocol)\n function getPriceFull(address underlying)\n external\n returns (\n uint256 twap,\n uint256 twapPeriod,\n uint256 currPrice\n );\n\n /// @notice Defer liquidity checking for an account, to perform rebalancing, flash loans, etc. msg.sender must implement IDeferredLiquidityCheck\n /// @param account The account to defer liquidity for. Usually address(this), although not always\n /// @param data Passed through to the onDeferredLiquidityCheck() callback, so contracts don't need to store transient data in storage\n function deferLiquidityCheck(address account, bytes memory data) external;\n\n /// @notice Execute several operations in a single transaction\n /// @param items List of operations to execute\n /// @param deferLiquidityChecks List of user accounts to defer liquidity checks for\n /// @return List of operation results\n function batchDispatch(EulerBatchItem[] calldata items, address[] calldata deferLiquidityChecks)\n external\n returns (EulerBatchItemResponse[] memory);\n\n /// @notice Results of a batchDispatch, but with extra information\n struct EulerBatchExtra {\n EulerBatchItemResponse[] responses;\n uint256 gasUsed;\n AssetLiquidity[][] liquidities;\n }\n\n /// @notice Call batchDispatch, but return extra information. Only intended to be used with callStatic.\n /// @param items List of operations to execute\n /// @param deferLiquidityChecks List of user accounts to defer liquidity checks for\n /// @param queryLiquidity List of user accounts to return detailed liquidity information for\n /// @return output Structure with extra information\n function batchDispatchExtra(\n EulerBatchItem[] calldata items,\n address[] calldata deferLiquidityChecks,\n address[] calldata queryLiquidity\n ) external returns (EulerBatchExtra memory output);\n\n /// @notice Enable average liquidity tracking for your account. Operations will cost more gas, but you may get additional benefits when performing liquidations\n /// @param subAccountId subAccountId 0 for primary, 1-255 for a sub-account.\n /// @param delegate An address of another account that you would allow to use the benefits of your account's average liquidity (use the null address if you don't care about this). The other address must also reciprocally delegate to your account.\n /// @param onlyDelegate Set this flag to skip tracking average liquidity and only set the delegate.\n function trackAverageLiquidity(\n uint256 subAccountId,\n address delegate,\n bool onlyDelegate\n ) external;\n\n /// @notice Disable average liquidity tracking for your account and remove delegate\n /// @param subAccountId subAccountId 0 for primary, 1-255 for a sub-account\n function unTrackAverageLiquidity(uint256 subAccountId) external;\n\n /// @notice Retrieve the average liquidity for an account\n /// @param account User account (xor in subAccountId, if applicable)\n /// @return The average liquidity, in terms of the reference asset, and post risk-adjustment\n function getAverageLiquidity(address account) external returns (uint256);\n\n /// @notice Retrieve the average liquidity for an account or a delegate account, if set\n /// @param account User account (xor in subAccountId, if applicable)\n /// @return The average liquidity, in terms of the reference asset, and post risk-adjustment\n function getAverageLiquidityWithDelegate(address account) external returns (uint256);\n\n /// @notice Retrieve the account which delegates average liquidity for an account, if set\n /// @param account User account (xor in subAccountId, if applicable)\n /// @return The average liquidity delegate account\n function getAverageLiquidityDelegateAccount(address account) external view returns (address);\n\n /// @notice Transfer underlying tokens from sender's wallet into the pToken wrapper. Allowance should be set for the euler address.\n /// @param underlying Token address\n /// @param amount The amount to wrap in underlying units\n function pTokenWrap(address underlying, uint256 amount) external;\n\n /// @notice Transfer underlying tokens from the pToken wrapper to the sender's wallet.\n /// @param underlying Token address\n /// @param amount The amount to unwrap in underlying units\n function pTokenUnWrap(address underlying, uint256 amount) external;\n}\n\n/// @notice Tokenised representation of assets\ninterface IEulerEToken is IEulerConstants {\n /// @notice Pool name, ie \"Euler Pool: DAI\"\n function name() external view returns (string memory);\n\n /// @notice Pool symbol, ie \"eDAI\"\n function symbol() external view returns (string memory);\n\n /// @notice Decimals, always normalised to 18.\n function decimals() external pure returns (uint8);\n\n /// @notice Sum of all balances, in internal book-keeping units (non-increasing)\n function totalSupply() external view returns (uint256);\n\n /// @notice Sum of all balances, in underlying units (increases as interest is earned)\n function totalSupplyUnderlying() external view returns (uint256);\n\n /// @notice Balance of a particular account, in internal book-keeping units (non-increasing)\n function balanceOf(address account) external view returns (uint256);\n\n /// @notice Balance of a particular account, in underlying units (increases as interest is earned)\n function balanceOfUnderlying(address account) external view returns (uint256);\n\n /// @notice Balance of the reserves, in internal book-keeping units (non-increasing)\n function reserveBalance() external view returns (uint256);\n\n /// @notice Balance of the reserves, in underlying units (increases as interest is earned)\n function reserveBalanceUnderlying() external view returns (uint256);\n\n /// @notice Updates interest accumulator and totalBorrows, credits reserves, re-targets interest rate, and logs asset status\n function touch() external;\n\n /// @notice Transfer underlying tokens from sender to the Euler pool, and increase account's eTokens\n /// @param subAccountId 0 for primary, 1-255 for a sub-account\n /// @param amount In underlying units (use max uint256 for full underlying token balance)\n function deposit(uint256 subAccountId, uint256 amount) external;\n\n /// @notice Transfer underlying tokens from Euler pool to sender, and decrease account's eTokens\n /// @param subAccountId 0 for primary, 1-255 for a sub-account\n /// @param amount In underlying units (use max uint256 for full pool balance)\n function withdraw(uint256 subAccountId, uint256 amount) external;\n\n /// @notice Convert an eToken balance to an underlying amount, taking into account current exchange rate\n /// @param balance eToken balance, in internal book-keeping units (18 decimals)\n /// @return Amount in underlying units, (same decimals as underlying token)\n function convertBalanceToUnderlying(uint256 balance) external view returns (uint256);\n\n /// @notice Convert an underlying amount to an eToken balance, taking into account current exchange rate\n /// @param underlyingAmount Amount in underlying units (same decimals as underlying token)\n /// @return eToken balance, in internal book-keeping units (18 decimals)\n function convertUnderlyingToBalance(uint256 underlyingAmount) external view returns (uint256);\n}\n\ninterface IEulerDToken is IEulerConstants {\n /// @notice Debt token name, ie \"Euler Debt: DAI\"\n function name() external view returns (string memory);\n\n /// @notice Debt token symbol, ie \"dDAI\"\n function symbol() external view returns (string memory);\n\n /// @notice Decimals, always normalised to 18.\n function decimals() external pure returns (uint8);\n\n /// @notice Sum of all outstanding debts, in underlying units (increases as interest is accrued)\n function totalSupply() external view returns (uint256);\n\n /// @notice Sum of all outstanding debts, in underlying units with extra precision (increases as interest is accrued)\n function totalSupplyExact() external view returns (uint256);\n\n /// @notice Debt owed by a particular account, in underlying units\n function balanceOf(address account) external view returns (uint256);\n\n /// @notice Debt owed by a particular account, in underlying units with extra precision\n function balanceOfExact(address account) external view returns (uint256);\n\n /// @notice Transfer underlying tokens from the Euler pool to the sender, and increase sender's dTokens\n /// @param subAccountId 0 for primary, 1-255 for a sub-account\n /// @param amount In underlying units (use max uint256 for all available tokens)\n function borrow(uint256 subAccountId, uint256 amount) external;\n\n /// @notice Transfer underlying tokens from the sender to the Euler pool, and decrease sender's dTokens\n /// @param subAccountId 0 for primary, 1-255 for a sub-account\n /// @param amount In underlying units (use max uint256 for full debt owed)\n function repay(uint256 subAccountId, uint256 amount) external;\n\n /// @notice Allow spender to send an amount of dTokens to a particular sub-account\n /// @param subAccountId 0 for primary, 1-255 for a sub-account\n /// @param spender Trusted address\n /// @param amount Use max uint256 for \"infinite\" allowance\n function approveDebt(\n uint256 subAccountId,\n address spender,\n uint256 amount\n ) external returns (bool);\n\n /// @notice Retrieve the current debt allowance\n /// @param holder Xor with the desired sub-account ID (if applicable)\n /// @param spender Trusted address\n function debtAllowance(address holder, address spender) external view returns (uint256);\n}\n\ninterface IBaseIRM {\n function computeInterestRate(address underlying, uint32 utilisation) external view returns (int96);\n}\n\ninterface IGovernance {\n function setIRM(\n address underlying,\n uint256 interestRateModel,\n bytes calldata resetParams\n ) external;\n\n function setReserveFee(address underlying, uint32 newReserveFee) external;\n\n function getGovernorAdmin() external view returns (address);\n}\n" + }, + "contracts/interfaces/external/euler/IEulerStakingRewards.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.0;\n\n// Original contract can be found under the following link:\n// https://github.com/Synthetixio/synthetix/blob/master/contracts/interfaces/IStakingRewards.sol\ninterface IEulerStakingRewards {\n // Views\n\n function balanceOf(address account) external view returns (uint256);\n\n function earned(address account) external view returns (uint256);\n\n function getRewardForDuration() external view returns (uint256);\n\n function lastTimeRewardApplicable() external view returns (uint256);\n\n function rewardPerToken() external view returns (uint256);\n\n function rewardRate() external view returns (uint256);\n\n function totalSupply() external view returns (uint256);\n\n function periodFinish() external view returns (uint256);\n\n // Mutative\n\n function exit() external;\n\n function exit(uint256 subAccountId) external;\n\n function getReward() external;\n\n function stake(uint256 amount) external;\n\n function stake(uint256 subAccountId, uint256 amount) external;\n\n function withdraw(uint256 amount) external;\n\n function withdraw(uint256 subAccountId, uint256 amount) external;\n\n function notifyRewardAmount(uint256 reward) external;\n}\n" + }, + "contracts/interfaces/external/frax/IFraxUnifiedFarmTemplate.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\n// solhint-disable\ninterface IFraxUnifiedFarmTemplate {\n // Struct for the stake\n struct LockedStake {\n bytes32 kek_id;\n uint256 start_timestamp;\n uint256 liquidity;\n uint256 ending_timestamp;\n uint256 lock_multiplier; // 6 decimals of precision. 1x = 1000000\n }\n\n // Calculate the combined weight for an account\n function calcCurCombinedWeight(address account)\n external\n view\n returns (\n uint256 old_combined_weight,\n uint256 new_vefxs_multiplier,\n uint256 new_combined_weight\n );\n\n // get the current minimum lockTime on the staking contract\n function lock_time_min() external view returns (uint256);\n\n /// @notice Send the rewards to the destination\n /// @return Array of all sent rewards (only the amounts you need to know the order of the rewards)\n function getReward(address destination_address) external returns (uint256[] memory);\n\n // ------ LOCK RELATED ------\n\n /// @notice get the current lock amount (without accruing interest) useful to compute the kekId\n function lockedLiquidityOf(address account) external view returns (uint256);\n\n // Add additional LPs to an existing locked stake\n // REBASE: If you simply want to accrue interest, call this with addl_liq = 0\n function lockAdditional(bytes32 kek_id, uint256 addl_liq) external;\n\n /// @notice Two different stake functions are needed because of delegateCall and msg.sender issues (important for migration)\n /// @return the keckId\n function stakeLocked(uint256 liquidity, uint256 secs) external returns (bytes32);\n\n // ------ WITHDRAWING ------\n\n /// @notice Each withdraw will delete the locked associated to the `keck_id`\n /// @return Liquidity withdrawn from the locker\n function withdrawLocked(bytes32 kek_id, address destination_address) external returns (uint256);\n\n // ------ REWARDS ------\n\n function stakerSetVeFXSProxy(address proxy_address) external;\n\n function rewardRates(uint256 token_idx) external view returns (uint256 rwd_rate);\n\n function lockMultiplier(uint256 secs) external view returns (uint256);\n\n function totalCombinedWeight() external view returns (uint256);\n}\n" + }, + "contracts/interfaces/external/IWETH9.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n/// @title Interface for WETH9\ninterface IWETH9 is IERC20 {\n /// @notice Deposit ether to get wrapped ether\n function deposit() external payable;\n\n /// @notice Withdraw wrapped ether to get ether\n function withdraw(uint256) external;\n}\n" + }, + "contracts/interfaces/external/lido/ISteth.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\ninterface ISteth is IERC20 {\n event Submitted(address sender, uint256 amount, address referral);\n\n function submit(address) external payable returns (uint256);\n}\n" + }, + "contracts/interfaces/external/mock/IMockFraxUnifiedFarm.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\n// solhint-disable\ninterface IMockFraxUnifiedFarm {\n // Struct for the stake\n struct LockedStake {\n bytes32 kek_id;\n uint256 start_timestamp;\n uint256 liquidity;\n uint256 ending_timestamp;\n uint256 lock_multiplier; // 6 decimals of precision. 1x = 1000000\n }\n\n // Calculate the combined weight for an account\n function calcCurCombinedWeight(address account)\n external\n view\n returns (\n uint256 old_combined_weight,\n uint256 new_vefxs_multiplier,\n uint256 new_combined_weight\n );\n\n // get the current minimum lockTime on the staking contract\n function lock_time_min() external view returns (uint256);\n\n /// @notice Send the rewards to the destination\n /// @return Array of all sent rewards (only the amounts you need to know the order of the rewards)\n function getReward(address destination_address) external returns (uint256[] memory);\n\n // ------ LOCK RELATED ------\n\n // Add additional LPs to an existing locked stake\n // REBASE: If you simply want to accrue interest, call this with addl_liq = 0\n function lockAdditional(bytes32 kek_id, uint256 addl_liq) external;\n\n /// @notice Two different stake functions are needed because of delegateCall and msg.sender issues (important for migration)\n /// @return the keckId\n function stakeLocked(uint256 liquidity, uint256 secs) external returns (bytes32);\n\n // ------ WITHDRAWING ------\n\n /// @notice Each withdraw will delete the locked associated to the `keck_id`\n /// @return Liquidity withdrawn from the locker\n function withdrawLocked(bytes32 kek_id, address destination_address) external returns (uint256);\n\n // ------ REWARDS ------\n\n function stakerSetVeFXSProxy(address proxy_address) external;\n\n function rewardRates(uint256 token_idx) external view returns (uint256 rwd_rate);\n\n function lockMultiplier(uint256 secs) external view returns (uint256);\n\n function totalCombinedWeight() external view returns (uint256);\n\n // just for the mock and testing\n\n function proxyToggleStaker(address staker_address) external;\n\n function veFXSMultiplier(address account) external view returns (uint256 vefxs_multiplier);\n\n function toggleValidVeFXSProxy(address _proxy_addr) external;\n\n function setMiscVariables(uint256[6] memory _misc_vars) external;\n\n function getProxyFor(address _proxy_addr) external view returns (address);\n\n function storedStkLiqIdx(bytes32) external view returns (uint256);\n\n function currLiqIdx() external view returns (uint256);\n\n function lockedStakes(address, uint256) external view returns (LockedStake memory);\n}\n" + }, + "contracts/interfaces/external/uniswap/IUniswapV3Pool.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity >=0.5.0;\n\n/// @title Pool state that is not stored\n/// @notice Contains view functions to provide information about the pool that is computed rather than stored on the\n/// blockchain. The functions here may have variable gas costs.\ninterface IUniswapV3Pool {\n /// @notice Returns the cumulative tick and liquidity as of each timestamp `secondsAgo` from the current block timestamp\n /// @dev To get a time weighted average tick or liquidity-in-range, you must call this with two values, one representing\n /// the beginning of the period and another for the end of the period. E.g., to get the last hour time-weighted average tick,\n /// you must call it with secondsAgos = [3600, 0].\n /// @dev The time weighted average tick represents the geometric time weighted average price of the pool, in\n /// log base sqrt(1.0001) of token1 / token0. The TickMath library can be used to go from a tick value to a ratio.\n /// @param secondsAgos From how long ago each cumulative tick and liquidity value should be returned\n /// @return tickCumulatives Cumulative tick values as of each `secondsAgos` from the current block timestamp\n /// @return secondsPerLiquidityCumulativeX128s Cumulative seconds per liquidity-in-range value as of each `secondsAgos` from the current block\n /// timestamp\n function observe(uint32[] calldata secondsAgos)\n external\n view\n returns (int56[] memory tickCumulatives, uint160[] memory secondsPerLiquidityCumulativeX128s);\n}\n" + }, + "contracts/interfaces/IAccessControlAngle.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\n/// @title IAccessControl\n/// @author Forked from OpenZeppelin\n/// @notice Interface for `AccessControl` contracts\ninterface IAccessControlAngle {\n function hasRole(bytes32 role, address account) external view returns (bool);\n\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n function grantRole(bytes32 role, address account) external;\n\n function revokeRole(bytes32 role, address account) external;\n\n function renounceRole(bytes32 role, address account) external;\n}\n" + }, + "contracts/interfaces/IAngleHelper.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nstruct PerpetualManagerFeeData {\n uint64[] xHAFeesDeposit;\n uint64[] yHAFeesDeposit;\n uint64[] xHAFeesWithdraw;\n uint64[] yHAFeesWithdraw;\n uint64 haBonusMalusDeposit;\n uint64 haBonusMalusWithdraw;\n}\n\nstruct PerpetualManagerParamData {\n uint64 maintenanceMargin;\n uint64 maxLeverage;\n uint64 targetHAHedge;\n uint64 limitHAHedge;\n uint64 lockTime;\n}\n\nstruct CollateralAddresses {\n address stableMaster;\n address poolManager;\n address perpetualManager;\n address sanToken;\n address oracle;\n address gauge;\n address feeManager;\n address[] strategies;\n}\n\ninterface IAngleHelper {\n function getCollateralAddresses(address agToken, address collateral)\n external\n view\n returns (CollateralAddresses memory addresses);\n\n function getStablecoinAddresses() external view returns (address[] memory, address[] memory);\n\n function getPoolManager(address agToken, address collateral) external view returns (address poolManager);\n}\n" + }, + "contracts/interfaces/IGenericLender.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"./IAccessControlAngle.sol\";\n\n/// @title IGenericLender\n/// @author Yearn with slight modifications from Angle Core Team\n/// @dev Interface for the `GenericLender` contract, the base interface for contracts interacting\n/// with lending and yield farming platforms\ninterface IGenericLender is IAccessControlAngle {\n /// @notice Name of the lender on which funds are invested\n function lenderName() external view returns (string memory);\n\n /// @notice Helper function to get the current total of assets managed by the lender.\n function nav() external view returns (uint256);\n\n /// @notice Reference to the `Strategy` contract the lender interacts with\n function strategy() external view returns (address);\n\n /// @notice Returns an estimation of the current Annual Percentage Rate on the lender\n function apr() external view returns (uint256);\n\n /// @notice Returns an estimation of the current Annual Percentage Rate weighted by the assets under\n /// management of the lender\n function weightedApr() external view returns (uint256);\n\n /// @notice Withdraws a given amount from lender\n /// @param amount The amount the caller wants to withdraw\n /// @return Amount actually withdrawn\n function withdraw(uint256 amount) external returns (uint256);\n\n /// @notice Withdraws as much as possible in case of emergency and sends it to the `PoolManager`\n /// @param amount Amount to withdraw\n /// @dev Does not check if any error occurs or if the amount withdrawn is correct\n function emergencyWithdraw(uint256 amount) external;\n\n /// @notice Deposits the current balance of the contract to the lending platform\n function deposit() external;\n\n /// @notice Withdraws as much as possible from the lending platform\n /// @return Whether everything was withdrawn or not\n function withdrawAll() external returns (bool);\n\n /// @notice Check if assets are currently managed by the lender\n /// @dev We're considering that the strategy has no assets if it has less than 10 of the\n /// underlying asset in total to avoid the case where there is dust remaining on the lending market\n /// and we cannot withdraw everything\n function hasAssets() external view returns (bool);\n\n /// @notice Returns an estimation of the current Annual Percentage Rate after a new deposit\n /// of `amount`\n /// @param amount Amount to add to the lending platform, and that we want to take into account\n /// in the apr computation\n function aprAfterDeposit(int256 amount) external view returns (uint256);\n\n /// @notice\n /// Removes tokens from this Strategy that are not the type of tokens\n /// managed by this Strategy. This may be used in case of accidentally\n /// sending the wrong kind of token to this Strategy.\n ///\n /// Tokens will be sent to `governance()`.\n ///\n /// This will fail if an attempt is made to sweep `want`, or any tokens\n /// that are protected by this Strategy.\n ///\n /// This may only be called by governance.\n /// @param _token The token to transfer out of this poolManager.\n /// @param to Address to send the tokens to.\n /// @dev\n /// Implement `_protectedTokens()` to specify any additional tokens that\n /// should be protected from sweeping in addition to `want`.\n function sweep(address _token, address to) external;\n\n /// @notice Returns the current balance invested on the lender and related staking contracts\n function underlyingBalanceStored() external view returns (uint256 balance);\n}\n" + }, + "contracts/interfaces/IPoolManager.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\n// Struct for the parameters associated with a strategy interacting with a collateral `PoolManager`\n// contract\nstruct StrategyParams {\n // Timestamp of last report made by this strategy\n // It is also used to check if a strategy has been initialized\n uint256 lastReport;\n // Total amount the strategy is expected to have\n uint256 totalStrategyDebt;\n // The share of the total assets in the `PoolManager` contract that the `strategy` can access to.\n uint256 debtRatio;\n}\n\n/// @title IPoolManagerFunctions\n/// @author Angle Core Team\n/// @notice Interface for the collateral poolManager contracts handling each one type of collateral for\n/// a given stablecoin\n/// @dev Only the functions used in other contracts of the protocol are left here\ninterface IPoolManagerFunctions {\n // ============================ Yield Farming ==================================\n\n function creditAvailable() external view returns (uint256);\n\n function debtOutstanding() external view returns (uint256);\n\n function report(\n uint256 _gain,\n uint256 _loss,\n uint256 _debtPayment\n ) external;\n\n // ============================= Getters =======================================\n\n function getBalance() external view returns (uint256);\n\n function getTotalAsset() external view returns (uint256);\n}\n\n/// @title IPoolManager\n/// @author Angle Core Team\n/// @notice Previous interface with additional getters for public variables and mappings\n/// @dev Used in other contracts of the protocol\ninterface IPoolManager is IPoolManagerFunctions {\n function stableMaster() external view returns (address);\n\n function perpetualManager() external view returns (address);\n\n function token() external view returns (address);\n\n function totalDebt() external view returns (uint256);\n\n function strategies(address _strategy) external view returns (StrategyParams memory);\n}\n" + }, + "contracts/interfaces/IStrategy.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"./IAccessControlAngle.sol\";\n\nstruct LendStatus {\n string name;\n uint256 assets;\n uint256 rate;\n address add;\n}\n\n/// @title IStrategy\n/// @author Inspired by Yearn with slight changes\n/// @notice Interface for yield farming strategies\ninterface IStrategy is IAccessControlAngle {\n function estimatedAPR() external view returns (uint256);\n\n function poolManager() external view returns (address);\n\n function want() external view returns (address);\n\n function isActive() external view returns (bool);\n\n function estimatedTotalAssets() external view returns (uint256);\n\n function harvestTrigger(uint256 callCost) external view returns (bool);\n\n function harvest() external;\n\n function withdraw(uint256 _amountNeeded) external returns (uint256 amountFreed, uint256 _loss);\n\n function setEmergencyExit() external;\n\n function addGuardian(address _guardian) external;\n\n function revokeGuardian(address _guardian) external;\n}\n" + }, + "contracts/mock/MockAave.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport \"@openzeppelin/contracts/interfaces/IERC3156FlashBorrower.sol\";\n\nimport { IPriceOracle, IOptionalERC20, DataTypes, IStakedAave, IReserveInterestRateStrategy } from \"../interfaces/external/aave/IAave.sol\";\nimport { IAToken } from \"../interfaces/external/aave/IAaveToken.sol\";\nimport { IAToken } from \"../interfaces/external/aave/IAaveToken.sol\";\nimport { IProtocolDataProvider } from \"../interfaces/external/aave/IProtocolDataProvider.sol\";\nimport { ILendingPool, ILendingPoolAddressesProvider } from \"../interfaces/external/aave/ILendingPool.sol\";\nimport { IAaveIncentivesController } from \"../interfaces/external/aave/IAaveIncentivesController.sol\";\nimport { IVariableDebtToken } from \"../interfaces/external/aave/IAaveToken.sol\";\n\nabstract contract MockAave is\n IAaveIncentivesController,\n ILendingPoolAddressesProvider,\n IReserveInterestRateStrategy,\n IStakedAave\n{\n using SafeERC20 for IERC20;\n\n uint256 public constant BASE = 10**27;\n\n uint256 public distributionEnd = type(uint256).max;\n uint256 public emissionsPerSecond = 10;\n uint256 public unstakeWindow = type(uint256).max;\n uint256 public stakersCooldownsValue = 0;\n uint256 public rewardsBalance = 0;\n\n function getRewardsBalance(address[] calldata, address) external view override returns (uint256) {\n return rewardsBalance;\n }\n\n function setRewardsBalance(uint256 _rewardsBalance) external {\n rewardsBalance = _rewardsBalance;\n }\n\n function claimRewards(\n address[] calldata,\n uint256,\n address\n ) external pure override returns (uint256) {\n return uint256(0);\n }\n\n function getDistributionEnd() external view override returns (uint256) {\n return distributionEnd;\n }\n\n function setDistributionEnd(uint256 _distributionEnd) external {\n distributionEnd = _distributionEnd;\n }\n\n function getAssetData(address)\n external\n view\n override\n returns (\n uint256,\n uint256,\n uint256\n )\n {\n return (0, emissionsPerSecond, 0);\n }\n\n function setEmissionsPerSecond(uint256 _emissionsPerSecond) external {\n emissionsPerSecond = _emissionsPerSecond;\n }\n\n function getLendingPool() external view override returns (address) {\n return address(this);\n }\n\n function calculateInterestRates(\n address,\n uint256,\n uint256,\n uint256,\n uint256,\n uint256\n )\n external\n pure\n override\n returns (\n uint256 liquidityRate,\n uint256 stableBorrowRate,\n uint256 variableBorrowRate\n )\n {\n return (0.04 ether, 0.04 ether, 0.04 ether);\n }\n\n function stake(address to, uint256 amount) external override {}\n\n function redeem(address to, uint256 amount) external override {}\n\n function cooldown() external override {}\n\n function claimRewards(address to, uint256 amount) external override {}\n\n function getTotalRewardsBalance(address) external view override returns (uint256) {}\n\n // solhint-disable-next-line\n function COOLDOWN_SECONDS() external pure override returns (uint256) {\n return 0;\n }\n\n function stakersCooldowns(address) external view override returns (uint256) {\n return stakersCooldownsValue;\n }\n\n // solhint-disable-next-line\n function UNSTAKE_WINDOW() external view override returns (uint256) {\n return unstakeWindow;\n }\n\n function setUnstakeWindowAndStakers(uint256 _unstakeWindow, uint256 _stakersCooldownsValue) external {\n unstakeWindow = _unstakeWindow;\n stakersCooldownsValue = _stakersCooldownsValue;\n }\n\n function getPriceOracle() external view override returns (address) {\n return address(this);\n }\n\n function getAssetsPrices(address[] calldata) external pure returns (uint256[] memory) {\n uint256[] memory _ret = new uint256[](2);\n _ret[0] = uint256(392936527437060);\n _ret[1] = uint256(394087347138603);\n return _ret;\n }\n}\n\ncontract MockMKRLender {\n mapping(address => uint256) public maxFlashLoan;\n uint256 public compilerMuter;\n\n constructor(address _token, uint256 _maxFlashLoan) {\n maxFlashLoan[_token] = _maxFlashLoan;\n }\n\n function flashFee(address, uint256) external view returns (uint256) {\n compilerMuter;\n return 0;\n }\n\n function flashLoan(\n IERC3156FlashBorrower,\n address,\n uint256,\n bytes calldata\n ) external returns (bool) {\n compilerMuter = 0;\n return true;\n }\n}\n\ncontract MockAToken is ERC20 {\n event Minting(address indexed _to, address indexed _minter, uint256 _amount);\n event Burning(address indexed _from, address indexed _burner, uint256 _amount);\n\n /// @notice constructor\n /// @param name_ of the token lent\n /// @param symbol_ of the token lent\n constructor(\n string memory name_,\n string memory symbol_,\n uint256 decimals\n ) ERC20(name_, symbol_) {}\n\n function mint(address account, uint256 amount) external {\n _mint(account, amount);\n emit Minting(account, msg.sender, amount);\n }\n\n function burn(address account, uint256 amount) public {\n _burn(account, amount);\n emit Burning(account, msg.sender, amount);\n }\n\n function getIncentivesController() external view returns (IAaveIncentivesController) {\n return IAaveIncentivesController(address(this));\n }\n}\n\nabstract contract MockLendingPool is ILendingPool {\n using SafeERC20 for IERC20;\n\n uint256 public constant BASE = 10**27;\n\n MockAToken public immutable aToken;\n MockAToken public immutable debtToken;\n uint128 public currentLiquidityRate = 0;\n uint256 public compilerMuter;\n\n constructor(address _aToken, address _debtToken) {\n aToken = MockAToken(_aToken);\n debtToken = MockAToken(_debtToken);\n }\n\n mapping(address => uint256) public reserveNormalizedIncomes; // Mapping between an underlying asset and its reserveNoramlized income\n\n function deployNewUnderlying(address underlying) external {\n reserveNormalizedIncomes[underlying] = BASE;\n }\n\n function getReserveNormalizedIncome(address asset) external view override returns (uint256) {\n return reserveNormalizedIncomes[asset] / BASE;\n }\n\n function changeReserveNormalizedIncome(uint256 newIncome, address asset) external {\n reserveNormalizedIncomes[asset] = newIncome * BASE;\n }\n\n function setCurrentLiquidityRate(uint128 _liquidityRate) external {\n currentLiquidityRate = _liquidityRate;\n }\n\n function getReserveData(address) external view override returns (DataTypes.ReserveData memory) {\n return\n DataTypes.ReserveData(\n DataTypes.ReserveConfigurationMap(uint256(0)),\n uint128(0),\n uint128(0),\n currentLiquidityRate,\n uint128(0),\n uint128(0),\n uint40(0),\n address(this),\n address(this),\n address(this),\n address(this),\n uint8(0)\n );\n }\n\n function deposit(\n address asset,\n uint256 amount,\n address onBehalfOf,\n uint16\n ) external override {\n IERC20 underlying = IERC20(asset);\n underlying.safeTransferFrom(msg.sender, address(this), amount);\n // With Aave the amount of cToken is exactly what has been given\n uint256 reserveNormalizedIncome_ = reserveNormalizedIncomes[asset];\n aToken.mint(onBehalfOf, (amount * BASE) / reserveNormalizedIncome_); // Here we don't exactly respect what Aave is doing\n }\n\n function withdraw(\n address asset,\n uint256 amount,\n address to\n ) external override returns (uint256) {\n uint256 reserveNormalizedIncome_ = reserveNormalizedIncomes[asset];\n uint256 amountcToken = (amount * BASE) / reserveNormalizedIncome_;\n aToken.burn(msg.sender, amountcToken);\n uint256 amountToken = (amountcToken * reserveNormalizedIncome_) / BASE;\n IERC20(asset).safeTransfer(to, amountToken);\n return (amountToken);\n }\n\n function borrow(\n address asset,\n uint256 amount,\n uint256 interestRateMode,\n uint16 referralCode,\n address onBehalfOf\n ) external override {}\n\n function repay(\n address,\n uint256,\n uint256,\n address\n ) external override returns (uint256) {\n compilerMuter = 0;\n return 0;\n }\n}\n\ncontract MockProtocolDataProvider {\n uint256 public availableLiquidityStorage = 0;\n\n address public immutable aToken;\n address public immutable debtToken;\n MockAave public immutable mockAave;\n\n constructor(\n address _aToken,\n address _debtToken,\n address _mockAave\n ) {\n aToken = _aToken;\n debtToken = _debtToken;\n mockAave = MockAave(_mockAave);\n }\n\n function getReserveTokensAddresses(address)\n external\n view\n returns (\n address aTokenAddress,\n address stableDebtTokenAddress,\n address variableDebtTokenAddress\n )\n {\n aTokenAddress = aToken;\n stableDebtTokenAddress = debtToken;\n variableDebtTokenAddress = debtToken;\n }\n\n // solhint-disable-next-line\n function ADDRESSES_PROVIDER() external view returns (ILendingPoolAddressesProvider) {\n return ILendingPoolAddressesProvider(mockAave);\n }\n\n function getReserveConfigurationData(address)\n external\n pure\n returns (\n uint256 decimals,\n uint256 ltv,\n uint256 liquidationThreshold,\n uint256 liquidationBonus,\n uint256 reserveFactor,\n bool usageAsCollateralEnabled,\n bool borrowingEnabled,\n bool stableBorrowRateEnabled,\n bool isActive,\n bool isFrozen\n )\n {\n // https://etherscan.io/address/0x057835ad21a177dbdd3090bb1cae03eacf78fc6d#readContract\n return (uint256(6), uint256(8250), uint256(8500), uint256(10400), uint256(1000), true, true, true, true, false);\n }\n\n function setAvailableLiquidity(uint256 _availableLiquidity) external {\n availableLiquidityStorage = _availableLiquidity;\n }\n\n function getReserveData(address)\n external\n view\n returns (\n uint256 availableLiquidity,\n uint256 totalStableDebt,\n uint256 totalVariableDebt,\n uint256 liquidityRate,\n uint256 variableBorrowRate,\n uint256 stableBorrowRate,\n uint256 averageStableBorrowRate,\n uint256 liquidityIndex,\n uint256 variableBorrowIndex,\n uint40 lastUpdateTimestamp\n )\n {\n availableLiquidity = availableLiquidityStorage;\n return (\n availableLiquidity,\n uint256(0),\n uint256(0),\n uint256(0),\n uint256(0),\n uint256(0),\n uint256(0),\n uint256(0),\n uint256(0),\n uint40(0)\n );\n }\n}\n" + }, + "contracts/mock/MockCurveStETHETH.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\n// Contract we have to fix flash attacks\ncontract MockCurveStETHETH {\n using SafeERC20 for IERC20;\n\n address public stETH;\n uint256 public dy;\n\n constructor(address _stETH) {\n stETH = _stETH;\n dy = 10**18;\n }\n\n receive() external payable {}\n\n function exchange(\n int128 from,\n int128 to,\n // solhint-disable-next-line\n uint256 _from_amount,\n uint256\n ) external payable {\n if (from == 0 && to == 1) {\n IERC20(stETH).transfer(msg.sender, (msg.value * dy) / 10**18);\n } else {\n IERC20(stETH).transferFrom(msg.sender, address(this), _from_amount);\n // solhint-disable-next-line\n (bool sent, ) = msg.sender.call{ value: (_from_amount * 10**18) / dy }(\"\");\n require(sent, \"Failed to send Ether\");\n }\n }\n\n function setDy(uint256 _dy) external {\n dy = _dy;\n }\n\n // solhint-disable-next-line\n function get_dy(\n int128,\n int128,\n // solhint-disable-next-line\n uint256 _from_amount\n ) external view returns (uint256) {\n return (_from_amount * dy) / 10**18;\n }\n}\n" + }, + "contracts/mock/MockLender.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"./../strategies/OptimizerAPR/genericLender/GenericLenderBaseUpgradeable.sol\";\n\n/// @title GenericEuler\n/// @author Angle Core Team\n/// @notice Simple supplier to Euler markets\ncontract MockLender is GenericLenderBaseUpgradeable {\n using SafeERC20 for IERC20;\n using Address for address;\n\n uint256 private constant _BPS = 10**4;\n\n uint256 public r0;\n uint256 public slope1;\n uint256 public totalBorrow;\n uint256 public biasSupply;\n uint256 public propWithdrawable;\n\n // ================================ CONSTRUCTOR ================================\n\n /// @notice Initializer of the `GenericEuler`\n /// @param _strategy Reference to the strategy using this lender\n /// @param governorList List of addresses with governor privilege\n /// @param keeperList List of addresses with keeper privilege\n /// @param guardian Address of the guardian\n function initialize(\n address _strategy,\n string memory _name,\n address[] memory governorList,\n address guardian,\n address[] memory keeperList,\n address oneInch_,\n uint256 _propWithdrawable\n ) public {\n _initialize(_strategy, _name, governorList, guardian, keeperList, oneInch_);\n propWithdrawable = _propWithdrawable;\n }\n\n function setPropWithdrawable(uint256 _propWithdrawable) external {\n propWithdrawable = _propWithdrawable;\n }\n\n // ======================== EXTERNAL STRATEGY FUNCTIONS ========================\n\n /// @inheritdoc IGenericLender\n function deposit() external view override onlyRole(STRATEGY_ROLE) {\n want.balanceOf(address(this));\n }\n\n /// @inheritdoc IGenericLender\n function withdraw(uint256 amount) external override onlyRole(STRATEGY_ROLE) returns (uint256) {\n return _withdraw(amount);\n }\n\n /// @inheritdoc IGenericLender\n function withdrawAll() external override onlyRole(STRATEGY_ROLE) returns (bool) {\n uint256 invested = _nav();\n uint256 returned = _withdraw(invested);\n return returned >= invested;\n }\n\n // ========================== EXTERNAL VIEW FUNCTIONS ==========================\n\n /// @inheritdoc GenericLenderBaseUpgradeable\n function underlyingBalanceStored() public pure override returns (uint256) {\n return 0;\n }\n\n /// @inheritdoc IGenericLender\n function aprAfterDeposit(int256 amount) external view override returns (uint256) {\n return _aprAfterDeposit(amount);\n }\n\n // ================================= GOVERNANCE ================================\n\n /// @inheritdoc IGenericLender\n function emergencyWithdraw(uint256 amount) external override onlyRole(GUARDIAN_ROLE) {\n want.safeTransfer(address(poolManager), amount);\n }\n\n // ============================= INTERNAL FUNCTIONS ============================\n\n /// @inheritdoc GenericLenderBaseUpgradeable\n function _apr() internal view override returns (uint256) {\n return _aprAfterDeposit(0);\n }\n\n /// @notice Internal version of the `aprAfterDeposit` function\n function _aprAfterDeposit(int256 amount) internal view returns (uint256 supplyAPY) {\n uint256 totalSupply = want.balanceOf(address(this));\n if (amount >= 0) totalSupply += uint256(amount);\n else totalSupply -= uint256(-amount);\n if (totalSupply > 0) supplyAPY = _computeAPYs(totalSupply);\n }\n\n /// @notice Computes APYs based on the interest rate, reserve fee, borrow\n /// @param totalSupply Interest rate paid per second by borrowers\n /// @return supplyAPY The annual percentage yield received as a supplier with current settings\n function _computeAPYs(uint256 totalSupply) internal view returns (uint256 supplyAPY) {\n // All rates are in base 18 on Angle strategies\n supplyAPY = r0 + (slope1 * totalBorrow) / (totalSupply + biasSupply);\n }\n\n /// @notice See `withdraw`\n function _withdraw(uint256 amount) internal returns (uint256) {\n uint256 looseBalance = want.balanceOf(address(this));\n uint256 total = looseBalance;\n\n if (amount > total) {\n // Can't withdraw more than we own\n amount = total;\n }\n\n // Limited in what we can withdraw\n amount = (amount * propWithdrawable) / _BPS;\n want.safeTransfer(address(strategy), amount);\n return amount;\n }\n\n /// @notice Internal version of the `setEulerPoolVariables`\n function setLenderPoolVariables(\n uint256 _r0,\n uint256 _slope1,\n uint256 _totalBorrow,\n uint256 _biasSupply\n ) external {\n r0 = _r0;\n slope1 = _slope1;\n totalBorrow = _totalBorrow;\n biasSupply = _biasSupply;\n }\n\n // ============================= VIRTUAL FUNCTIONS =============================\n\n /// @inheritdoc IGenericLender\n function hasAssets() external view override returns (bool) {\n return _nav() > 0;\n }\n\n function _protectedTokens() internal pure override returns (address[] memory) {\n return new address[](0);\n }\n}\n" + }, + "contracts/mock/MockPoolManager.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport { AccessControl } from \"@openzeppelin/contracts/access/AccessControl.sol\";\nimport { Math } from \"@openzeppelin/contracts/utils/math/Math.sol\";\n\nimport \"../interfaces/IPoolManager.sol\";\nimport \"../interfaces/IStrategy.sol\";\n\ncontract MockPoolManager is AccessControl {\n using SafeERC20 for IERC20;\n\n uint256 public constant BASE_TOKENS = 10**18;\n uint256 public constant BASE_PARAMS = 10**9;\n\n bytes32 public constant STRATEGY_ROLE = keccak256(\"STRATEGY_ROLE\");\n\n mapping(address => StrategyParams) public strategies;\n address[] public strategyList;\n\n IERC20 public token;\n uint256 public creditAvailable;\n uint256 public totalDebt;\n uint256 public debtRatio;\n\n event StrategyReported(\n address indexed strategy,\n uint256 gain,\n uint256 loss,\n uint256 debtPayment,\n uint256 totalDebt\n );\n event StrategyAdded(address indexed strategy, uint256 debtRatio);\n event StrategyRevoked(address indexed strategy);\n\n constructor(address _token, uint256 _creditAvailable) {\n token = IERC20(_token);\n creditAvailable = _creditAvailable;\n }\n\n function debtOutstanding() external view returns (uint256) {\n StrategyParams storage params = strategies[msg.sender];\n\n uint256 target = (_getTotalAsset() * params.debtRatio) / BASE_PARAMS;\n\n // console.log(\"debtOutstanding: totalStrategyDebt %s / target: %s / debtRatio: %s\", params.totalStrategyDebt, target, params.debtRatio);\n\n if (target > params.totalStrategyDebt) return 0;\n\n return (params.totalStrategyDebt - target);\n }\n\n function report(\n uint256 gain,\n uint256 loss,\n uint256 debtPayment\n ) external {\n require(token.balanceOf(msg.sender) >= gain + debtPayment, \"72\");\n\n StrategyParams storage params = strategies[msg.sender];\n // Updating parameters in the `perpetualManager`\n // This needs to be done now because it has implications in `_getTotalAsset()`\n params.totalStrategyDebt = params.totalStrategyDebt + gain - loss;\n totalDebt = totalDebt + gain - loss;\n params.lastReport = block.timestamp;\n\n // Warning: `_getTotalAsset` could be manipulated by flashloan attacks.\n // It may allow external users to transfer funds into strategy or remove funds\n // from the strategy. Yet, as it does not impact the profit or loss and as attackers\n // have no interest in making such txs to have a direct profit, we let it as is.\n // The only issue is if the strategy is compromised; in this case governance\n // should revoke the strategy\n uint256 target = ((_getTotalAsset()) * params.debtRatio) / BASE_PARAMS;\n // console.log(\"PoolManager - report\");\n // console.log(\"_getTotalAsset %s / target %s\", _getTotalAsset(), target);\n if (target > params.totalStrategyDebt) {\n // If the strategy has some credit left, tokens can be transferred to this strategy\n uint256 available = Math.min(target - params.totalStrategyDebt, _getBalance());\n // console.log(\"available1 %s\", available);\n params.totalStrategyDebt = params.totalStrategyDebt + available;\n totalDebt = totalDebt + available;\n if (available > 0) {\n token.safeTransfer(msg.sender, available);\n }\n } else {\n uint256 available = Math.min(params.totalStrategyDebt - target, debtPayment + gain);\n // console.log(\"available2 %s\", available);\n params.totalStrategyDebt = params.totalStrategyDebt - available;\n totalDebt = totalDebt - available;\n if (available > 0) {\n token.safeTransferFrom(msg.sender, address(this), available);\n }\n }\n emit StrategyReported(msg.sender, gain, loss, debtPayment, params.totalStrategyDebt);\n }\n\n function _getBalance() internal view returns (uint256) {\n return token.balanceOf(address(this));\n }\n\n function getTotalAsset() external view returns (uint256) {\n return _getTotalAsset();\n }\n\n function _getTotalAsset() internal view returns (uint256) {\n return _getBalance() + totalDebt;\n }\n\n function addStrategy(address strategy, uint256 _debtRatio) external {\n StrategyParams storage params = strategies[strategy];\n\n require(params.lastReport == 0, \"73\");\n require(address(this) == IStrategy(strategy).poolManager(), \"74\");\n // Using current code, this condition should always be verified as in the constructor\n // of the strategy the `want()` is set to the token of this `PoolManager`\n require(address(token) == IStrategy(strategy).want(), \"75\");\n require(debtRatio + _debtRatio <= BASE_PARAMS, \"76\");\n\n // Add strategy to approved strategies\n params.lastReport = 1;\n params.totalStrategyDebt = 0;\n params.debtRatio = _debtRatio;\n\n _grantRole(STRATEGY_ROLE, strategy);\n\n // Update global parameters\n debtRatio += _debtRatio;\n emit StrategyAdded(strategy, debtRatio);\n\n strategyList.push(strategy);\n }\n\n function revokeStrategy(address strategy) external {\n StrategyParams storage params = strategies[strategy];\n\n require(params.debtRatio == 0, \"77\");\n require(params.totalStrategyDebt == 0, \"77\");\n uint256 strategyListLength = strategyList.length;\n require(params.lastReport != 0 && strategyListLength >= 1, \"78\");\n // It has already been checked whether the strategy was a valid strategy\n for (uint256 i = 0; i < strategyListLength - 1; i++) {\n if (strategyList[i] == strategy) {\n strategyList[i] = strategyList[strategyListLength - 1];\n break;\n }\n }\n\n strategyList.pop();\n\n // Update global parameters\n debtRatio -= params.debtRatio;\n delete strategies[strategy];\n\n _revokeRole(STRATEGY_ROLE, strategy);\n\n emit StrategyRevoked(strategy);\n }\n\n function updateStrategyDebtRatio(address strategy, uint256 _debtRatio) external {\n StrategyParams storage params = strategies[strategy];\n require(params.lastReport != 0, \"78\");\n debtRatio = debtRatio + _debtRatio - params.debtRatio;\n require(debtRatio <= BASE_PARAMS, \"76\");\n params.debtRatio = _debtRatio;\n }\n}\n" + }, + "contracts/mock/MockPoolManager2.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport { Math } from \"@openzeppelin/contracts/utils/math/Math.sol\";\n\nimport \"../external/AccessControlAngleUpgradeable.sol\";\n\nimport \"../interfaces/IPoolManager.sol\";\nimport \"../interfaces/IStrategy.sol\";\n\nimport \"../utils/FunctionUtils.sol\";\n\nstruct SLPData {\n // Last timestamp at which the `sanRate` has been updated for SLPs\n uint256 lastBlockUpdated;\n // Fees accumulated from previous blocks and to be distributed to SLPs\n uint256 lockedInterests;\n // Max interests used to update the `sanRate` in a single block\n // Should be in collateral token base\n uint256 maxInterestsDistributed;\n // Amount of fees left aside for SLPs and that will be distributed\n // when the protocol is collateralized back again\n uint256 feesAside;\n // Part of the fees normally going to SLPs that is left aside\n // before the protocol is collateralized back again (depends on collateral ratio)\n // Updated by keepers and scaled by `BASE_PARAMS`\n uint64 slippageFee;\n // Portion of the fees from users minting and burning\n // that goes to SLPs (the rest goes to surplus)\n uint64 feesForSLPs;\n // Slippage factor that's applied to SLPs exiting (depends on collateral ratio)\n // If `slippage = BASE_PARAMS`, SLPs can get nothing, if `slippage = 0` they get their full claim\n // Updated by keepers and scaled by `BASE_PARAMS`\n uint64 slippage;\n // Portion of the interests from lending\n // that goes to SLPs (the rest goes to surplus)\n uint64 interestsForSLPs;\n}\n\nstruct MintBurnData {\n // Values of the thresholds to compute the minting fees\n // depending on HA hedge (scaled by `BASE_PARAMS`)\n uint64[] xFeeMint;\n // Values of the fees at thresholds (scaled by `BASE_PARAMS`)\n uint64[] yFeeMint;\n // Values of the thresholds to compute the burning fees\n // depending on HA hedge (scaled by `BASE_PARAMS`)\n uint64[] xFeeBurn;\n // Values of the fees at thresholds (scaled by `BASE_PARAMS`)\n uint64[] yFeeBurn;\n // Max proportion of collateral from users that can be covered by HAs\n // It is exactly the same as the parameter of the same name in `PerpetualManager`, whenever one is updated\n // the other changes accordingly\n uint64 targetHAHedge;\n // Minting fees correction set by the `FeeManager` contract: they are going to be multiplied\n // to the value of the fees computed using the hedge curve\n // Scaled by `BASE_PARAMS`\n uint64 bonusMalusMint;\n // Burning fees correction set by the `FeeManager` contract: they are going to be multiplied\n // to the value of the fees computed using the hedge curve\n // Scaled by `BASE_PARAMS`\n uint64 bonusMalusBurn;\n // Parameter used to limit the number of stablecoins that can be issued using the concerned collateral\n uint256 capOnStableMinted;\n}\n\ninterface IOracle {\n function read() external view returns (uint256);\n\n function readAll() external view returns (uint256 lowerRate, uint256 upperRate);\n\n function readLower() external view returns (uint256);\n\n function readUpper() external view returns (uint256);\n\n function readQuote(uint256 baseAmount) external view returns (uint256);\n\n function readQuoteLower(uint256 baseAmount) external view returns (uint256);\n\n function inBase() external view returns (uint256);\n}\n\ninterface ISanToken is IERC20 {\n function mint(address account, uint256 amount) external;\n\n function burnFrom(\n uint256 amount,\n address burner,\n address sender\n ) external;\n\n function burnSelf(uint256 amount, address burner) external;\n\n function stableMaster() external view returns (address);\n\n function poolManager() external view returns (address);\n}\n\ninterface IStableMaster {\n function agToken() external view returns (address);\n\n function signalLoss(uint256 loss) external;\n\n function accumulateInterest(uint256 gain) external;\n\n function collateralMap(IPoolManager poolManager)\n external\n view\n returns (\n IERC20 token,\n ISanToken sanToken,\n address perpetualManager,\n IOracle oracle,\n uint256 stocksUsers,\n uint256 sanRate,\n uint256 collatBase,\n SLPData memory slpData,\n MintBurnData memory feeData\n );\n}\n\n/// @title PoolManager\n/// @author Angle Core Team\n/// @notice The `PoolManager` contract corresponds to a collateral pool of the protocol for a stablecoin,\n/// it manages a single ERC20 token. It is responsible for interacting with the strategies enabling the protocol\n/// to get yield on its collateral\n/// @dev This file contains the functions that are callable by governance or by other contracts of the protocol\n/// @dev References to this contract are called `PoolManager`\ncontract PoolManager is IPoolManagerFunctions, AccessControlAngleUpgradeable, FunctionUtils {\n using SafeERC20 for IERC20;\n\n /// @notice Interface for the underlying token accepted by this contract\n IERC20 public token;\n\n /// @notice Reference to the `StableMaster` contract corresponding to this `PoolManager`\n IStableMaster public stableMaster;\n\n // ============================= Yield Farming =================================\n\n /// @notice Funds currently given to strategies\n uint256 public totalDebt;\n\n /// @notice Proportion of the funds managed dedicated to strategies\n /// Has to be between 0 and `BASE_PARAMS`\n uint256 public debtRatio;\n\n /// The struct `StrategyParams` is defined in the interface `IPoolManager`\n /// @notice Mapping between the address of a strategy contract and its corresponding details\n mapping(address => StrategyParams) public strategies;\n\n /// @notice List of the current strategies\n address[] public strategyList;\n\n /// @notice Address of the surplus distributor allowed to distribute rewards\n address public surplusConverter;\n\n /// @notice Share of the interests going to surplus and share going to SLPs\n uint64 public interestsForSurplus;\n\n /// @notice Interests accumulated by the protocol and to be distributed through ANGLE or veANGLE\n /// token holders\n uint256 public interestsAccumulated;\n\n /// @notice Debt that must be paid by admins after a loss on a strategy\n uint256 public adminDebt;\n\n event FeesDistributed(uint256 amountDistributed);\n\n event Recovered(address indexed token, address indexed to, uint256 amount);\n\n event StrategyAdded(address indexed strategy, uint256 debtRatio);\n\n event InterestsForSurplusUpdated(uint64 _interestsForSurplus);\n\n event SurplusConverterUpdated(address indexed newSurplusConverter, address indexed oldSurplusConverter);\n\n event StrategyRevoked(address indexed strategy);\n\n event StrategyReported(\n address indexed strategy,\n uint256 gain,\n uint256 loss,\n uint256 debtPayment,\n uint256 totalDebt\n );\n\n // Roles need to be defined here because there are some internal access control functions\n // in the `PoolManagerInternal` file\n\n /// @notice Role for `StableMaster` only\n bytes32 public constant STABLEMASTER_ROLE = keccak256(\"STABLEMASTER_ROLE\");\n /// @notice Role for governors only\n bytes32 public constant GOVERNOR_ROLE = keccak256(\"GOVERNOR_ROLE\");\n /// @notice Role for guardians and governors\n bytes32 public constant GUARDIAN_ROLE = keccak256(\"GUARDIAN_ROLE\");\n /// @notice Role for `Strategy` only\n bytes32 public constant STRATEGY_ROLE = keccak256(\"STRATEGY_ROLE\");\n\n constructor(\n address _token,\n address governor,\n address guardian\n ) {\n token = IERC20(_token);\n _setupRole(GUARDIAN_ROLE, guardian);\n _setupRole(GUARDIAN_ROLE, governor);\n _setupRole(GOVERNOR_ROLE, governor);\n _setRoleAdmin(GOVERNOR_ROLE, GOVERNOR_ROLE);\n _setRoleAdmin(GUARDIAN_ROLE, GOVERNOR_ROLE);\n }\n\n // ============================= Yield Farming =================================\n\n /// @notice Internal version of `updateStrategyDebtRatio`\n /// @dev Updates the debt ratio for a strategy\n function _updateStrategyDebtRatio(address strategy, uint256 _debtRatio) internal {\n StrategyParams storage params = strategies[strategy];\n require(params.lastReport != 0, \"78\");\n debtRatio = debtRatio + _debtRatio - params.debtRatio;\n require(debtRatio <= BASE_PARAMS, \"76\");\n params.debtRatio = _debtRatio;\n emit StrategyAdded(strategy, debtRatio);\n }\n\n // ============================ Utils ==========================================\n\n /// @notice Returns this `PoolManager`'s reserve of collateral (not including what has been lent)\n function _getBalance() internal view returns (uint256) {\n return token.balanceOf(address(this));\n }\n\n /// @notice Returns the amount of assets owned by this `PoolManager`\n /// @dev This sums the current balance of the contract to what has been given to strategies\n /// @dev This amount can be manipulated by flash loans\n function _getTotalAsset() internal view returns (uint256) {\n return _getBalance() + totalDebt;\n }\n\n // ============================= Yield Farming =================================\n\n /// @notice Provides an estimated Annual Percentage Rate for SLPs based on lending to other protocols\n /// @dev This function is an estimation and is made for external use only\n /// @dev This does not take into account transaction fees which accrue to SLPs too\n /// @dev This can be manipulated by a flash loan attack (SLP deposit/ withdraw) via `_getTotalAsset`\n /// when entering you should make sure this hasn't be called by a flash loan and look\n /// at a mean of past APR.\n function estimatedAPR() external view returns (uint256 apr) {\n apr = 0;\n (, ISanToken sanTokenForAPR, , , , uint256 sanRate, , SLPData memory slpData, ) = stableMaster.collateralMap(\n IPoolManager(address(this))\n );\n uint256 supply = sanTokenForAPR.totalSupply();\n\n // `sanRate` should never be equal to 0\n if (supply == 0) return type(uint256).max;\n\n for (uint256 i = 0; i < strategyList.length; i++) {\n apr =\n apr +\n (strategies[strategyList[i]].debtRatio * IStrategy(strategyList[i]).estimatedAPR()) /\n BASE_PARAMS;\n }\n apr = (apr * slpData.interestsForSLPs * _getTotalAsset()) / sanRate / supply;\n }\n\n /// @notice Tells a strategy how much it can borrow from this `PoolManager`\n /// @return Amount of token a strategy has access to as a credit line\n /// @dev Since this function is a view function, there is no need to have an access control logic\n /// even though it will just be relevant for a strategy\n /// @dev Manipulating `_getTotalAsset` with a flashloan will only\n /// result in tokens being transferred at the cost of the caller\n function creditAvailable() external view override returns (uint256) {\n StrategyParams storage params = strategies[msg.sender];\n\n uint256 target = (_getTotalAsset() * params.debtRatio) / BASE_PARAMS;\n\n if (target < params.totalStrategyDebt) return 0;\n\n return Math.min(target - params.totalStrategyDebt, _getBalance());\n }\n\n /// @notice Tells a strategy how much it owes to this `PoolManager`\n /// @return Amount of token a strategy has to reimburse\n /// @dev Manipulating `_getTotalAsset` with a flashloan will only\n /// result in tokens being transferred at the cost of the caller\n function debtOutstanding() external view override returns (uint256) {\n StrategyParams storage params = strategies[msg.sender];\n\n uint256 target = (_getTotalAsset() * params.debtRatio) / BASE_PARAMS;\n\n if (target > params.totalStrategyDebt) return 0;\n\n return (params.totalStrategyDebt - target);\n }\n\n /// @notice Reports the gains or loss made by a strategy\n /// @param gain Amount strategy has realized as a gain on its investment since its\n /// last report, and is free to be given back to `PoolManager` as earnings\n /// @param loss Amount strategy has realized as a loss on its investment since its\n /// last report, and should be accounted for on the `PoolManager`'s balance sheet.\n /// The loss will reduce the `debtRatio`. The next time the strategy will harvest,\n /// it will pay back the debt in an attempt to adjust to the new debt limit.\n /// @param debtPayment Amount strategy has made available to cover outstanding debt\n /// @dev This is the main contact point where the strategy interacts with the `PoolManager`\n /// @dev The strategy reports back what it has free, then the `PoolManager` contract \"decides\"\n /// whether to take some back or give it more. Note that the most it can\n /// take is `gain + _debtPayment`, and the most it can give is all of the\n /// remaining reserves. Anything outside of those bounds is abnormal behavior.\n function report(\n uint256 gain,\n uint256 loss,\n uint256 debtPayment\n ) external override onlyRole(STRATEGY_ROLE) {\n require(token.balanceOf(msg.sender) >= gain + debtPayment, \"72\");\n\n StrategyParams storage params = strategies[msg.sender];\n // Updating parameters in the `perpetualManager`\n // This needs to be done now because it has implications in `_getTotalAsset()`\n params.totalStrategyDebt = params.totalStrategyDebt + gain - loss;\n totalDebt = totalDebt + gain - loss;\n params.lastReport = block.timestamp;\n\n // Warning: `_getTotalAsset` could be manipulated by flashloan attacks.\n // It may allow external users to transfer funds into strategy or remove funds\n // from the strategy. Yet, as it does not impact the profit or loss and as attackers\n // have no interest in making such txs to have a direct profit, we let it as is.\n // The only issue is if the strategy is compromised; in this case governance\n // should revoke the strategy\n uint256 target = ((_getTotalAsset()) * params.debtRatio) / BASE_PARAMS;\n\n if (target > params.totalStrategyDebt) {\n // If the strategy has some credit left, tokens can be transferred to this strategy\n uint256 available = Math.min(target - params.totalStrategyDebt, _getBalance());\n params.totalStrategyDebt = params.totalStrategyDebt + available;\n totalDebt = totalDebt + available;\n if (available > 0) {\n token.safeTransfer(msg.sender, available);\n }\n } else {\n uint256 available = Math.min(params.totalStrategyDebt - target, debtPayment + gain);\n params.totalStrategyDebt = params.totalStrategyDebt - available;\n totalDebt = totalDebt - available;\n if (available > 0) {\n token.safeTransferFrom(msg.sender, address(this), available);\n }\n }\n emit StrategyReported(msg.sender, gain, loss, debtPayment, params.totalStrategyDebt);\n\n // Handle gains before losses\n if (gain > 0) {\n uint256 gainForSurplus = (gain * interestsForSurplus) / BASE_PARAMS;\n uint256 adminDebtPre = adminDebt;\n // Depending on the current admin debt distribute the necessary gain from the strategies\n if (adminDebtPre == 0) interestsAccumulated += gainForSurplus;\n else if (adminDebtPre <= gainForSurplus) {\n interestsAccumulated += gainForSurplus - adminDebtPre;\n adminDebt = 0;\n } else adminDebt -= gainForSurplus;\n // stableMaster.accumulateInterest(gain - gainForSurplus);\n emit FeesDistributed(gain);\n }\n\n // Handle eventual losses\n if (loss > 0) {\n uint256 lossForSurplus = (loss * interestsForSurplus) / BASE_PARAMS;\n uint256 interestsAccumulatedPreLoss = interestsAccumulated;\n // If the loss can not be entirely soaked by the interests to be distributed then\n // the protocol keeps track of the debt\n if (lossForSurplus > interestsAccumulatedPreLoss) {\n interestsAccumulated = 0;\n adminDebt += lossForSurplus - interestsAccumulatedPreLoss;\n } else interestsAccumulated -= lossForSurplus;\n // The rest is incurred to SLPs\n // stableMaster.signalLoss(loss - lossForSurplus);\n }\n }\n\n // =========================== Governor Functions ==============================\n\n /// @notice Allows to recover any ERC20 token, including the token handled by this contract, and to send it\n /// to a contract\n /// @param tokenAddress Address of the token to recover\n /// @param to Address of the contract to send collateral to\n /// @param amountToRecover Amount of collateral to transfer\n /// @dev As this function can be used to transfer funds to another contract, it has to be a `GOVERNOR` function\n /// @dev In case the concerned token is the specific token handled by this contract, this function checks that the\n /// amount entered is not too big and approximates the surplus of the protocol\n /// @dev To esimate the amount of user claims on the concerned collateral, this function uses the `stocksUsers` for\n /// this collateral, but this is just an approximation as users can claim the collateral of their choice provided\n /// that they own a stablecoin\n /// @dev The sanity check excludes the HA claims: to get a sense of it, this function would need to compute the cash out\n /// amount of all the perpetuals, and this cannot be done on-chain in a cheap manner\n /// @dev Overall, even though there is a sanity check, this function relies on the fact that governance is not corrupted\n /// in this protocol and will not try to withdraw too much funds\n function recoverERC20(\n address tokenAddress,\n address to,\n uint256 amountToRecover\n ) external onlyRole(GOVERNOR_ROLE) {\n if (tokenAddress == address(token)) {\n // Fetching info from the `StableMaster`\n (\n ,\n ISanToken sanToken,\n ,\n IOracle oracle,\n uint256 stocksUsers,\n uint256 sanRate,\n uint256 collatBase,\n ,\n\n ) = stableMaster.collateralMap(IPoolManager(address(this)));\n\n // Checking if there are enough reserves for the amount to withdraw\n require(\n _getTotalAsset() >=\n amountToRecover +\n (sanToken.totalSupply() * sanRate) /\n BASE_TOKENS +\n (stocksUsers * collatBase) /\n oracle.readUpper() +\n interestsAccumulated,\n \"66\"\n );\n\n token.safeTransfer(to, amountToRecover);\n } else {\n IERC20(tokenAddress).safeTransfer(to, amountToRecover);\n }\n emit Recovered(tokenAddress, to, amountToRecover);\n }\n\n /// @notice Adds a strategy to the `PoolManager`\n /// @param strategy The address of the strategy to add\n /// @param _debtRatio The share of the total assets that the strategy has access to\n /// @dev Multiple checks are made. For instance, the contract must not already belong to the `PoolManager`\n /// and the underlying token of the strategy has to be consistent with the `PoolManager` contracts\n /// @dev This function is a `governor` function and not a `guardian` one because a `guardian` could add a strategy\n /// enabling the withdraw of the funds of the protocol\n /// @dev The `_debtRatio` should be expressed in `BASE_PARAMS`\n function addStrategy(address strategy, uint256 _debtRatio) external onlyRole(GOVERNOR_ROLE) {\n StrategyParams storage params = strategies[strategy];\n\n require(params.lastReport == 0, \"73\");\n require(address(this) == IStrategy(strategy).poolManager(), \"74\");\n // Using current code, this condition should always be verified as in the constructor\n // of the strategy the `want()` is set to the token of this `PoolManager`\n require(address(token) == IStrategy(strategy).want(), \"75\");\n require(debtRatio + _debtRatio <= BASE_PARAMS, \"76\");\n\n // Add strategy to approved strategies\n params.lastReport = 1;\n params.totalStrategyDebt = 0;\n params.debtRatio = _debtRatio;\n\n _grantRole(STRATEGY_ROLE, strategy);\n\n // Update global parameters\n debtRatio += _debtRatio;\n emit StrategyAdded(strategy, debtRatio);\n\n strategyList.push(strategy);\n }\n\n // =========================== Guardian Functions ==============================\n\n /// @notice Changes the guardian address and echoes it to other contracts that interact with this `PoolManager`\n /// @param _guardian New guardian address\n /// @param guardian Old guardian address to revoke\n function setGuardian(address _guardian, address guardian) external onlyRole(GUARDIAN_ROLE) {\n // Granting the new role\n // Access control for this contract\n _grantRole(GUARDIAN_ROLE, _guardian);\n // Propagating the new role in other contract\n uint256 strategyListLength = strategyList.length;\n for (uint256 i = 0; i < strategyListLength; i++) {\n IStrategy(strategyList[i]).addGuardian(_guardian);\n }\n for (uint256 i = 0; i < strategyListLength; i++) {\n IStrategy(strategyList[i]).revokeGuardian(guardian);\n }\n _revokeRole(GUARDIAN_ROLE, guardian);\n }\n\n /// @notice Modifies the funds a strategy has access to\n /// @param strategy The address of the Strategy\n /// @param _debtRatio The share of the total assets that the strategy has access to\n /// @dev The update has to be such that the `debtRatio` does not exceeds the 100% threshold\n /// as this `PoolManager` cannot lend collateral that it doesn't not own.\n /// @dev `_debtRatio` is stored as a uint256 but as any parameter of the protocol, it should be expressed\n /// in `BASE_PARAMS`\n function updateStrategyDebtRatio(address strategy, uint256 _debtRatio) external onlyRole(GUARDIAN_ROLE) {\n _updateStrategyDebtRatio(strategy, _debtRatio);\n }\n\n /// @notice Triggers an emergency exit for a strategy and then harvests it to fetch all the funds\n /// @param strategy The address of the `Strategy`\n function setStrategyEmergencyExit(address strategy) external onlyRole(GUARDIAN_ROLE) {\n _updateStrategyDebtRatio(strategy, 0);\n IStrategy(strategy).setEmergencyExit();\n IStrategy(strategy).harvest();\n }\n\n /// @notice Revokes a strategy\n /// @param strategy The address of the strategy to revoke\n /// @dev This should only be called after the following happened in order: the `strategy.debtRatio` has been set to 0,\n /// `harvest` has been called enough times to recover all capital gain/losses.\n function revokeStrategy(address strategy) external onlyRole(GUARDIAN_ROLE) {\n StrategyParams storage params = strategies[strategy];\n\n require(params.debtRatio == 0, \"77\");\n require(params.totalStrategyDebt == 0, \"77\");\n uint256 strategyListLength = strategyList.length;\n require(params.lastReport != 0 && strategyListLength >= 1, \"78\");\n // It has already been checked whether the strategy was a valid strategy\n for (uint256 i = 0; i < strategyListLength - 1; i++) {\n if (strategyList[i] == strategy) {\n strategyList[i] = strategyList[strategyListLength - 1];\n break;\n }\n }\n\n strategyList.pop();\n\n // Update global parameters\n debtRatio -= params.debtRatio;\n delete strategies[strategy];\n\n _revokeRole(STRATEGY_ROLE, strategy);\n\n emit StrategyRevoked(strategy);\n }\n\n /// @notice Withdraws a given amount from a strategy\n /// @param strategy The address of the strategy\n /// @param amount The amount to withdraw\n /// @dev This function tries to recover `amount` from the strategy, but it may not go through\n /// as we may not be able to withdraw from the lending protocol the full amount\n /// @dev In this last case we only update the parameters by setting the loss as the gap between\n /// what has been asked and what has been returned.\n function withdrawFromStrategy(IStrategy strategy, uint256 amount) external onlyRole(GUARDIAN_ROLE) {\n StrategyParams storage params = strategies[address(strategy)];\n require(params.lastReport != 0, \"78\");\n\n uint256 loss;\n (amount, loss) = strategy.withdraw(amount);\n\n // Handling eventual losses\n params.totalStrategyDebt = params.totalStrategyDebt - loss - amount;\n totalDebt = totalDebt - loss - amount;\n\n emit StrategyReported(address(strategy), 0, loss, amount - loss, params.totalStrategyDebt);\n\n // Handle eventual losses\n // With the strategy we are using in current tests, it is going to be impossible to have\n // a positive loss by calling strategy.withdraw, this function indeed calls _liquidatePosition\n // which output value is always zero\n // if (loss > 0) stableMaster.signalLoss(loss);\n }\n\n // =================== Surplus Distributor Function ============================\n\n /// @notice Allows to push interests revenue accumulated by the protocol to the `surplusConverter` to do buybacks\n /// or another form of redistribution to ANGLE or veANGLE token holders\n /// @dev This function is permissionless and anyone can transfer the `interestsAccumulated` by the protocol\n /// to the `surplusConverter`\n function pushSurplus() external {\n // If the `surplusConverter` has not been initialized, surplus should not be distributed\n // Storing the `surplusConverter` in an intermediate variable to avoid multiple reads in\n // storage\n address surplusConverterMem = surplusConverter;\n require(surplusConverterMem != address(0), \"0\");\n uint256 amount = interestsAccumulated;\n interestsAccumulated = 0;\n // Storing the `token` in memory to avoid duplicate reads in storage\n IERC20 tokenMem = token;\n tokenMem.safeTransfer(surplusConverterMem, amount);\n emit Recovered(address(tokenMem), surplusConverterMem, amount);\n }\n\n // ======================== Getters - View Functions ===========================\n\n /// @notice Gets the current balance of this `PoolManager` contract\n /// @return The amount of the underlying collateral that the contract currently owns\n /// @dev This balance does not take into account what has been lent to strategies\n function getBalance() external view override returns (uint256) {\n return _getBalance();\n }\n\n /// @notice Gets the total amount of collateral that is controlled by this `PoolManager` contract\n /// @return The amount of collateral owned by this contract plus the amount that has been lent to strategies\n /// @dev This is the value that is used to compute the debt ratio for a given strategy\n function getTotalAsset() external view override returns (uint256) {\n return _getTotalAsset();\n }\n}\n" + }, + "contracts/mock/MockStETH.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"./MockToken.sol\";\n\ncontract MockStETH is MockToken {\n event Deposit(address indexed dst, uint256 wad);\n event Withdrawal(address indexed src, uint256 wad);\n\n /// @notice stablecoin constructor\n /// @param name_ the stablecoin name (example 'agEUR')\n /// @param symbol_ the stablecoin symbol ('agEUR')\n /// @dev To account for the fact that the balance increases we can simply mint stETH to the concerned address\n constructor(\n string memory name_,\n string memory symbol_,\n uint8 decimal_\n ) MockToken(name_, symbol_, decimal_) {}\n\n receive() external payable {}\n\n function submit(address) external payable returns (uint256) {\n _mint(msg.sender, msg.value);\n return msg.value;\n }\n}\n" + }, + "contracts/mock/MockStrategy.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"../interfaces/IPoolManager.sol\";\n\ncontract MockStrategy {\n address public poolManager;\n\n address public want;\n\n constructor(address _poolManager, address _want) {\n poolManager = _poolManager;\n want = _want;\n }\n\n function report(\n uint256 gain,\n uint256 loss,\n uint256 debtPayment\n ) external {\n IPoolManager(poolManager).report(gain, loss, debtPayment);\n }\n\n function withdraw(uint256 amount) external pure returns (uint256, uint256) {\n return (amount, 1);\n }\n\n function creditAvailable() external view returns (uint256 credit) {\n credit = IPoolManager(poolManager).creditAvailable();\n }\n}\n" + }, + "contracts/mock/MockToken.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\ncontract MockToken is ERC20 {\n event Minting(address indexed _to, address indexed _minter, uint256 _amount);\n\n event Burning(address indexed _from, address indexed _burner, uint256 _amount);\n\n uint8 internal _decimal;\n\n /// @notice stablecoin constructor\n /// @param name_ the stablecoin name (example 'agEUR')\n /// @param symbol_ the stablecoin symbol ('agEUR')\n constructor(\n string memory name_,\n string memory symbol_,\n uint8 decimal_\n ) ERC20(name_, symbol_) {\n _decimal = decimal_;\n }\n\n /// @dev Returns the number of decimals used to get its user representation.\n /// For example, if `decimals` equals `2`, a balance of `505` tokens should\n /// be displayed to a user as `5,05` (`505 / 10 ** 2`).\n function decimals() public view override returns (uint8) {\n return _decimal;\n }\n\n /// @notice allow to mint\n /// @param account the account to mint to\n /// @param amount the amount to mint\n function mint(address account, uint256 amount) external {\n _mint(account, amount);\n emit Minting(account, msg.sender, amount);\n }\n\n /// @notice allow to burn\n /// @param account the account to burn from\n /// @param amount the amount of agToken to burn from caller\n function burn(address account, uint256 amount) public {\n _burn(account, amount);\n emit Burning(account, msg.sender, amount);\n }\n\n function setAllowance(address from, address to) public {\n _approve(from, to, type(uint256).max);\n }\n}\n" + }, + "contracts/mock/MockWETH.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"./MockToken.sol\";\n\ncontract MockWETH is MockToken {\n event Deposit(address indexed dst, uint256 wad);\n event Withdrawal(address indexed src, uint256 wad);\n\n receive() external payable {}\n\n /// @notice stablecoin constructor\n /// @param name_ the stablecoin name (example 'agEUR')\n /// @param symbol_ the stablecoin symbol ('agEUR')\n constructor(\n string memory name_,\n string memory symbol_,\n uint8 decimal_\n ) MockToken(name_, symbol_, decimal_) {}\n\n function deposit() public payable {\n _mint(msg.sender, msg.value);\n emit Deposit(msg.sender, msg.value);\n }\n\n function withdraw(uint256 wad) public {\n _burn(msg.sender, wad);\n // solhint-disable-next-line\n (bool sent, ) = msg.sender.call{ value: wad }(\"\");\n require(sent, \"Failed to send Ether\");\n emit Withdrawal(msg.sender, wad);\n }\n}\n" + }, + "contracts/strategies/AaveFlashloanStrategy/AaveLibraries.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"@openzeppelin/contracts/interfaces/IERC3156FlashLender.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\nimport { IPriceOracle, IOptionalERC20 } from \"../../interfaces/external/aave/IAave.sol\";\nimport { IAToken } from \"../../interfaces/external/aave/IAaveToken.sol\";\nimport { IProtocolDataProvider } from \"../../interfaces/external/aave/IProtocolDataProvider.sol\";\nimport { ILendingPool } from \"../../interfaces/external/aave/ILendingPool.sol\";\n\nlibrary FlashMintLib {\n event Leverage(\n uint256 amountRequested,\n uint256 amountUsed,\n uint256 requiredDAI,\n uint256 amountToCloseLTVGap,\n bool deficit,\n address flashLoan\n );\n\n address public constant LENDER = 0x1EB4CF3A948E7D72A198fe073cCb8C7a948cD853;\n uint256 private constant _DAI_DECIMALS = 1e18;\n uint256 private constant _COLLAT_RATIO_PRECISION = 1 ether;\n address private constant _WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;\n address private constant _DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F;\n IAToken public constant ADAI = IAToken(0x028171bCA77440897B824Ca71D1c56caC55b68A3);\n // solhint-disable-next-line\n IProtocolDataProvider private constant _protocolDataProvider =\n IProtocolDataProvider(0x057835Ad21a177dbdd3090bB1CAE03EaCF78Fc6d);\n // solhint-disable-next-line\n ILendingPool private constant _lendingPool = ILendingPool(0x7d2768dE32b0b80b7a3454c06BdAc94A69DDc7A9);\n\n bytes32 public constant CALLBACK_SUCCESS = keccak256(\"ERC3156FlashBorrower.onFlashLoan\");\n // solhint-disable-next-line\n uint16 private constant _referral = 0; // TODO: get our own referral code\n\n uint256 private constant _RAY = 10**27;\n\n function doFlashMint(\n bool deficit,\n uint256 amountDesired,\n address token,\n uint256 collatRatioDAI,\n uint256 depositToCloseLTVGap\n ) public returns (uint256 amount) {\n if (amountDesired == 0) {\n return 0;\n }\n amount = amountDesired;\n address dai = _DAI;\n\n // calculate amount of dai we need\n uint256 requiredDAI;\n {\n requiredDAI = (toDAI(amount, token) * _COLLAT_RATIO_PRECISION) / collatRatioDAI;\n\n uint256 requiredDAIToCloseLTVGap = 0;\n if (depositToCloseLTVGap > 0) {\n requiredDAIToCloseLTVGap = toDAI(depositToCloseLTVGap, token);\n requiredDAI = requiredDAI + requiredDAIToCloseLTVGap;\n }\n\n uint256 _maxLiquidity = maxLiquidity();\n\n /*\n When depositing/withdrawing in the `lendingPool` the amounts are scaled by a `liquidityIndex` and rounded with the functions rayDiv and rayMul (in the aDAI contract)\n Weirdly, 2 different indexes are used: `liquidityIndex` is used when depositing and `getReserveNormalizedIncome` when withdrawing\n Therefore, we need to round `requiredDAI`, or we may get some rounding errors and revert\n because the amount we try to withdraw (to pay back the flashloan) is not equal to the amount deposited\n */\n uint256 liquidityIndex = _lendingPool.getReserveData(dai).liquidityIndex;\n uint256 getReserveNormalizedIncome = _lendingPool.getReserveNormalizedIncome(dai);\n uint256 rayDiv = ((requiredDAI * _RAY + liquidityIndex / 2) / liquidityIndex);\n requiredDAI = (rayDiv * getReserveNormalizedIncome + (_RAY / 2)) / _RAY;\n\n if (requiredDAI > _maxLiquidity) {\n requiredDAI = (_maxLiquidity * _RAY - (_RAY / 2)) / getReserveNormalizedIncome;\n requiredDAI = (requiredDAI * liquidityIndex - liquidityIndex / 2) / _RAY;\n\n // NOTE: if we cap amountDAI, we reduce amountToken we are taking too\n amount =\n (fromDAI(requiredDAI - requiredDAIToCloseLTVGap, token) * collatRatioDAI) /\n _COLLAT_RATIO_PRECISION;\n }\n }\n\n bytes memory data = abi.encode(deficit, amount);\n uint256 _fee = IERC3156FlashLender(LENDER).flashFee(dai, requiredDAI);\n // Check that fees have not been increased without us knowing\n require(_fee == 0);\n uint256 _allowance = IERC20(dai).allowance(address(this), address(LENDER));\n if (_allowance < requiredDAI) {\n IERC20(dai).approve(address(LENDER), 0);\n IERC20(dai).approve(address(LENDER), type(uint256).max);\n }\n\n IERC3156FlashLender(LENDER).flashLoan(IERC3156FlashBorrower(address(this)), dai, requiredDAI, data);\n\n emit Leverage(amountDesired, amount, requiredDAI, depositToCloseLTVGap, deficit, LENDER);\n\n return amount; // we need to return the amount of Token we have changed our position in\n }\n\n function loanLogic(\n bool deficit,\n uint256 amount,\n uint256 amountFlashmint,\n address want\n ) public returns (bytes32) {\n address dai = _DAI;\n bool isDai = (want == dai);\n\n ILendingPool lp = _lendingPool;\n\n if (isDai) {\n if (deficit) {\n lp.deposit(dai, amountFlashmint - amount, address(this), _referral);\n lp.repay(dai, IERC20(dai).balanceOf(address(this)), 2, address(this));\n lp.withdraw(dai, amountFlashmint, address(this));\n } else {\n lp.deposit(dai, IERC20(dai).balanceOf(address(this)), address(this), _referral);\n lp.borrow(dai, amount, 2, _referral, address(this));\n lp.withdraw(dai, amountFlashmint - amount, address(this));\n }\n } else {\n // 1. Deposit DAI in Aave as collateral\n lp.deposit(dai, amountFlashmint, address(this), _referral);\n\n if (deficit) {\n // 2a. If in deficit withdraw amount and repay it\n lp.withdraw(want, amount, address(this));\n lp.repay(want, IERC20(want).balanceOf(address(this)), 2, address(this));\n } else {\n // 2b. If levering up borrow and deposit\n lp.borrow(want, amount, 2, _referral, address(this));\n lp.deposit(want, IERC20(want).balanceOf(address(this)), address(this), _referral);\n }\n // 3. Withdraw DAI\n lp.withdraw(dai, amountFlashmint, address(this));\n }\n\n return CALLBACK_SUCCESS;\n }\n\n function priceOracle() internal view returns (IPriceOracle) {\n return IPriceOracle(_protocolDataProvider.ADDRESSES_PROVIDER().getPriceOracle());\n }\n\n function toDAI(uint256 _amount, address asset) internal view returns (uint256) {\n address dai = _DAI;\n if (_amount == 0 || _amount == type(uint256).max || asset == dai) {\n return _amount;\n }\n\n if (asset == _WETH) {\n return\n (_amount * (uint256(10)**uint256(IOptionalERC20(dai).decimals()))) / priceOracle().getAssetPrice(dai);\n }\n\n address[] memory tokens = new address[](2);\n tokens[0] = asset;\n tokens[1] = dai;\n uint256[] memory prices = priceOracle().getAssetsPrices(tokens);\n\n uint256 ethPrice = (_amount * prices[0]) / (uint256(10)**uint256(IOptionalERC20(asset).decimals()));\n return (ethPrice * _DAI_DECIMALS) / prices[1];\n }\n\n function fromDAI(uint256 _amount, address asset) internal view returns (uint256) {\n address dai = _DAI;\n if (_amount == 0 || _amount == type(uint256).max || asset == dai) {\n return _amount;\n }\n\n if (asset == _WETH) {\n return\n (_amount * priceOracle().getAssetPrice(dai)) / (uint256(10)**uint256(IOptionalERC20(dai).decimals()));\n }\n\n address[] memory tokens = new address[](2);\n tokens[0] = asset;\n tokens[1] = dai;\n uint256[] memory prices = priceOracle().getAssetsPrices(tokens);\n\n uint256 ethPrice = (_amount * prices[1]) / _DAI_DECIMALS;\n\n return (ethPrice * (uint256(10)**uint256(IOptionalERC20(asset).decimals()))) / prices[0];\n }\n\n function maxLiquidity() public view returns (uint256) {\n return IERC3156FlashLender(LENDER).maxFlashLoan(_DAI);\n }\n}\n" + }, + "contracts/strategies/AaveFlashloanStrategy/ComputeProfitability.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\n/// @title ComputeProfitability\n/// @author Angle Core Team\n/// @notice Helper contract to get the optimal borrow amount from a set of provided parameters from Aave\nlibrary ComputeProfitability {\n struct SCalculateBorrow {\n int256 reserveFactor;\n int256 totalStableDebt;\n int256 totalVariableDebt;\n int256 totalDeposits;\n int256 stableBorrowRate;\n int256 rewardDeposit;\n int256 rewardBorrow;\n int256 strategyAssets;\n int256 guessedBorrowAssets;\n int256 slope1;\n int256 slope2;\n int256 r0;\n int256 uOptimal;\n }\n\n int256 private constant _BASE_RAY = 10**27;\n\n /// @notice Computes the Aave utilization ratio\n // solhint-disable-next-line\n function _computeUtilization(int256 borrow, SCalculateBorrow memory parameters) internal pure returns (int256) {\n return\n ((parameters.totalStableDebt + parameters.totalVariableDebt + borrow) * _BASE_RAY) /\n (parameters.totalDeposits + borrow);\n }\n\n /// @notice Computes the derivative of the utilization ratio with respect to the amount borrowed\n // solhint-disable-next-line\n function _computeUprime(int256 borrow, SCalculateBorrow memory parameters) internal pure returns (int256) {\n return\n ((parameters.totalDeposits - parameters.totalStableDebt - parameters.totalVariableDebt) * _BASE_RAY) /\n (parameters.totalDeposits + borrow);\n }\n\n /// @notice Computes the value of the interest rate, its first and second order derivatives\n /// @dev The returned value is in `_BASE_RAY`\n // solhint-disable-next-line\n function _calculateInterestPrimes(int256 borrow, SCalculateBorrow memory parameters)\n internal\n pure\n returns (\n int256 interest,\n int256 interestPrime,\n int256 interestPrime2\n )\n {\n int256 newUtilization = _computeUtilization(borrow, parameters);\n int256 denomUPrime = (parameters.totalDeposits + borrow);\n int256 uprime = _computeUprime(borrow, parameters);\n uprime = (uprime * _BASE_RAY) / denomUPrime;\n int256 uprime2nd = -2 * uprime;\n uprime2nd = (uprime2nd * _BASE_RAY) / denomUPrime;\n if (newUtilization < parameters.uOptimal) {\n interest = parameters.r0 + (parameters.slope1 * newUtilization) / parameters.uOptimal;\n interestPrime = (parameters.slope1 * uprime) / parameters.uOptimal;\n interestPrime2 = (parameters.slope1 * uprime2nd) / parameters.uOptimal;\n } else {\n interest =\n parameters.r0 +\n parameters.slope1 +\n (parameters.slope2 * (newUtilization - parameters.uOptimal)) /\n (_BASE_RAY - parameters.uOptimal);\n interestPrime = (parameters.slope2 * uprime) / (_BASE_RAY - parameters.uOptimal);\n interestPrime2 = (parameters.slope2 * uprime2nd) / (_BASE_RAY - parameters.uOptimal);\n }\n }\n\n /// @notice Computes the value of the revenue, as well as its first and second order derivatives\n // solhint-disable-next-line\n function _revenuePrimes(\n int256 borrow,\n SCalculateBorrow memory parameters,\n bool onlyRevenue\n )\n internal\n pure\n returns (\n int256 revenue,\n int256 revenuePrime,\n int256 revenuePrime2nd\n )\n {\n (int256 newRate, int256 newRatePrime, int256 newRatePrime2) = _calculateInterestPrimes(borrow, parameters);\n\n // 0 order derivative\n int256 proportionStrat = ((borrow + parameters.strategyAssets) * (_BASE_RAY - parameters.reserveFactor)) /\n (borrow + parameters.totalDeposits);\n int256 poolYearlyRevenue = (parameters.totalStableDebt *\n parameters.stableBorrowRate +\n (borrow + parameters.totalVariableDebt) *\n newRate) / _BASE_RAY;\n\n revenue =\n (proportionStrat * poolYearlyRevenue) /\n _BASE_RAY +\n (borrow * parameters.rewardBorrow) /\n (borrow + parameters.totalVariableDebt) +\n ((borrow + parameters.strategyAssets) * parameters.rewardDeposit) /\n (borrow + parameters.totalDeposits) -\n (borrow * newRate) /\n _BASE_RAY;\n\n if (!onlyRevenue) {\n // 1st order derivative\n {\n // Computing block per block to avoid stack too deep errors\n int256 proportionStratPrime = ((parameters.totalDeposits - parameters.strategyAssets) *\n (_BASE_RAY - parameters.reserveFactor)) / (borrow + parameters.totalDeposits);\n proportionStratPrime = (proportionStratPrime * _BASE_RAY) / (borrow + parameters.totalDeposits);\n int256 poolYearlyRevenuePrime = (newRate *\n _BASE_RAY +\n (borrow + parameters.totalVariableDebt) *\n newRatePrime) / _BASE_RAY;\n\n revenuePrime = ((proportionStratPrime * poolYearlyRevenue + poolYearlyRevenuePrime * proportionStrat) /\n _BASE_RAY);\n\n {\n int256 proportionStratPrime2nd = (-2 * (proportionStratPrime * (_BASE_RAY))) /\n ((borrow + parameters.totalDeposits));\n revenuePrime2nd =\n 2 *\n proportionStratPrime *\n poolYearlyRevenuePrime +\n proportionStratPrime2nd *\n poolYearlyRevenue;\n }\n poolYearlyRevenuePrime =\n (2 * newRatePrime * _BASE_RAY + (borrow + parameters.totalVariableDebt) * newRatePrime2) /\n _BASE_RAY;\n\n revenuePrime2nd = (revenuePrime2nd + poolYearlyRevenuePrime * proportionStrat) / _BASE_RAY;\n }\n\n int256 costPrime = (newRate * _BASE_RAY + borrow * newRatePrime) / _BASE_RAY;\n int256 rewardBorrowPrime = (parameters.rewardBorrow * (parameters.totalVariableDebt)) /\n (borrow + parameters.totalVariableDebt);\n rewardBorrowPrime = (rewardBorrowPrime * _BASE_RAY) / (borrow + parameters.totalVariableDebt);\n int256 rewardDepositPrime = (parameters.rewardDeposit *\n (parameters.totalDeposits - parameters.strategyAssets)) / (borrow + parameters.totalDeposits);\n rewardDepositPrime = (rewardDepositPrime * _BASE_RAY) / (borrow + parameters.totalDeposits);\n\n revenuePrime += rewardBorrowPrime + rewardDepositPrime - costPrime;\n\n // 2nd order derivative\n // Reusing variables for the stack too deep issue\n costPrime = ((2 * newRatePrime * _BASE_RAY) + borrow * newRatePrime2) / _BASE_RAY;\n rewardBorrowPrime = (-2 * rewardBorrowPrime * _BASE_RAY) / (borrow + parameters.totalVariableDebt);\n rewardDepositPrime = (-2 * rewardDepositPrime * _BASE_RAY) / (borrow + parameters.totalDeposits);\n\n revenuePrime2nd += (rewardBorrowPrime + rewardDepositPrime) - costPrime;\n }\n }\n\n /// @notice Returns the absolute value of an integer\n function _abs(int256 x) private pure returns (int256) {\n return x >= 0 ? x : -x;\n }\n\n /// @notice Computes the optimal borrow amount of the strategy depending on Aave protocol parameters\n /// to maximize folding revenues\n /// @dev Performs a newton Raphson approximation to get the zero point of the derivative of the\n /// revenue function of the protocol depending on the amount borrowed\n function computeProfitability(SCalculateBorrow memory parameters) internal pure returns (int256 borrow) {\n (int256 y, , ) = _revenuePrimes(0, parameters, true);\n (int256 revenueWithBorrow, , ) = _revenuePrimes(_BASE_RAY, parameters, true);\n\n if (revenueWithBorrow <= y) {\n return 0;\n }\n uint256 count;\n int256 borrowInit;\n int256 grad;\n int256 grad2nd;\n borrow = parameters.guessedBorrowAssets;\n // Tolerance is 1% in this method: indeed we're stopping: `_abs(borrowInit - borrow)/ borrowInit < 10**(-2)`\n while (count < 10 && (count == 0 || _abs(borrowInit - borrow) * (10**2 / 5) > borrowInit)) {\n (, grad, grad2nd) = _revenuePrimes(borrow, parameters, false);\n borrowInit = borrow;\n borrow = borrowInit - (grad * _BASE_RAY) / grad2nd;\n count += 1;\n }\n\n (int256 x, , ) = _revenuePrimes(borrow, parameters, true);\n if (x <= y) {\n borrow = 0;\n }\n }\n}\n" + }, + "contracts/strategies/AaveFlashloanStrategy/ComputeProfitabilityTest.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"./ComputeProfitability.sol\";\n\n/// @title ComputeProfitabilityTest\n/// @author Angle Core Team\n/// @notice Wrapper contract to ComputeProfitability for testing purpose\ncontract ComputeProfitabilityTest {\n /// @notice external version of _calculateInterestPrimes\n function calculateInterestPrimes(int256 borrow, ComputeProfitability.SCalculateBorrow memory parameters)\n external\n pure\n returns (\n int256,\n int256,\n int256\n )\n {\n return ComputeProfitability._calculateInterestPrimes(borrow, parameters);\n }\n\n /// @notice External version of _revenuePrimes\n function revenuePrimes(\n int256 borrow,\n ComputeProfitability.SCalculateBorrow memory parameters,\n bool onlyRevenue\n )\n external\n pure\n returns (\n int256,\n int256,\n int256\n )\n {\n return ComputeProfitability._revenuePrimes(borrow, parameters, onlyRevenue);\n }\n\n /// @notice Computes the optimal borrow amount of the strategy depending on Aave protocol parameters\n /// to maximize folding revenues\n function computeProfitability(ComputeProfitability.SCalculateBorrow memory parameters)\n external\n pure\n returns (int256)\n {\n return ComputeProfitability.computeProfitability(parameters);\n }\n}\n" + }, + "contracts/strategies/BaseStrategyEvents.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\nimport \"../external/AccessControlAngle.sol\";\nimport \"../external/AccessControlAngleUpgradeable.sol\";\n\nimport \"../interfaces/IStrategy.sol\";\nimport \"../interfaces/IPoolManager.sol\";\n\nimport \"../utils/Errors.sol\";\n\n/// @title BaseStrategyEvents\n/// @author Angle Core Team\n/// @notice Events used in the abstract `BaseStrategy` contract\ncontract BaseStrategyEvents {\n event Harvested(uint256 profit, uint256 loss, uint256 debtPayment, uint256 debtOutstanding);\n\n event UpdatedMinReportDelayed(uint256 delay);\n\n event UpdatedMaxReportDelayed(uint256 delay);\n\n event UpdatedDebtThreshold(uint256 debtThreshold);\n\n event UpdatedRewards(address rewards);\n\n event UpdatedIsRewardActivated(bool activated);\n\n event UpdatedRewardAmountAndMinimumAmountMoved(uint256 _rewardAmount, uint256 _minimumAmountMoved);\n\n event EmergencyExitActivated();\n}\n" + }, + "contracts/strategies/BaseStrategyUpgradeable.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\n/*\n * █ \n ***** ▓▓▓ \n * ▓▓▓▓▓▓▓ \n * ///. ▓▓▓▓▓▓▓▓▓▓▓▓▓ \n ***** //////// ▓▓▓▓▓▓▓ \n * ///////////// ▓▓▓ \n ▓▓ ////////////////// █ ▓▓ \n ▓▓ ▓▓ /////////////////////// ▓▓ ▓▓ \n ▓▓ ▓▓ //////////////////////////// ▓▓ ▓▓ \n ▓▓ ▓▓ /////////▓▓▓///////▓▓▓///////// ▓▓ ▓▓ \n ▓▓ ,////////////////////////////////////// ▓▓ ▓▓ \n ▓▓ ////////////////////////////////////////// ▓▓ \n ▓▓ //////////////////////▓▓▓▓///////////////////// \n ,//////////////////////////////////////////////////// \n .////////////////////////////////////////////////////////// \n .//////////////////////////██.,//////////////////////////█ \n .//////////////////////████..,./////////////////////██ \n ...////////////////███████.....,.////////////////███ \n ,.,////////////████████ ........,///////////████ \n .,.,//////█████████ ,.......///////████ \n ,..//████████ ........./████ \n ..,██████ .....,███ \n .██ ,.,█ \n \n \n \n ▓▓ ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▓▓ ▓▓▓▓▓▓▓▓▓▓ \n ▓▓▓▓▓▓ ▓▓▓ ▓▓▓ ▓▓▓ ▓▓ ▓▓ ▓▓▓▓ \n ▓▓▓ ▓▓▓ ▓▓▓ ▓▓▓ ▓▓▓ ▓▓▓ ▓▓ ▓▓▓▓▓ \n ▓▓▓ ▓▓ ▓▓▓ ▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ \n*/\n\npragma solidity ^0.8.12;\n\nimport \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\n\nimport \"./BaseStrategyEvents.sol\";\n\n/// @title BaseStrategyUpgradeable\n/// @author Forked from https://github.com/yearn/yearn-managers/blob/master/contracts/BaseStrategy.sol\n/// @notice `BaseStrategyUpgradeable` implements all of the required functionalities to interoperate\n/// with the `PoolManager` Contract.\n/// @dev This contract should be inherited and the abstract methods implemented to adapt the `Strategy`\n/// to the particular needs it has to create a return.\nabstract contract BaseStrategyUpgradeable is BaseStrategyEvents, AccessControlAngleUpgradeable {\n using SafeERC20 for IERC20;\n\n uint256 public constant BASE = 10**18;\n uint256 public constant SECONDS_PER_YEAR = 31556952;\n\n /// @notice Role for `PoolManager` only - keccak256(\"POOLMANAGER_ROLE\")\n bytes32 public constant POOLMANAGER_ROLE = 0x5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe562;\n /// @notice Role for guardians and governors - keccak256(\"GUARDIAN_ROLE\")\n bytes32 public constant GUARDIAN_ROLE = 0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041;\n /// @notice Role for keepers - keccak256(\"KEEPER_ROLE\")\n bytes32 public constant KEEPER_ROLE = 0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab;\n\n // ================================= REFERENCES ================================\n\n /// @notice See note on `setEmergencyExit()`\n bool public emergencyExit;\n\n /// @notice Reference to the protocol's collateral `PoolManager`\n IPoolManager public poolManager;\n\n /// @notice Reference to the ERC20 farmed by this strategy\n IERC20 public want;\n\n /// @notice Base of the ERC20 token farmed by this strategy\n uint256 public wantBase;\n\n // ================================= PARAMETERS ================================\n\n /// @notice Use this to adjust the threshold at which running a debt causes a\n /// harvest trigger. See `setDebtThreshold()` for more details\n uint256 public debtThreshold;\n\n uint256[46] private __gapBaseStrategy;\n\n // ================================ CONSTRUCTOR ================================\n\n /// @custom:oz-upgrades-unsafe-allow constructor\n constructor() initializer {}\n\n /// @notice Constructor of the `BaseStrategyUpgradeable`\n /// @param _poolManager Address of the `PoolManager` lending collateral to this strategy\n /// @param governor Governor address of the protocol\n /// @param guardian Address of the guardian\n function _initialize(\n address _poolManager,\n address governor,\n address guardian,\n address[] memory keepers\n ) internal initializer {\n poolManager = IPoolManager(_poolManager);\n want = IERC20(poolManager.token());\n wantBase = 10**(IERC20Metadata(address(want)).decimals());\n if (guardian == address(0) || governor == address(0) || governor == guardian) revert ZeroAddress();\n // AccessControl\n // Governor is guardian so no need for a governor role\n _setupRole(GUARDIAN_ROLE, guardian);\n _setupRole(GUARDIAN_ROLE, governor);\n _setupRole(POOLMANAGER_ROLE, address(_poolManager));\n _setRoleAdmin(POOLMANAGER_ROLE, POOLMANAGER_ROLE);\n _setRoleAdmin(GUARDIAN_ROLE, POOLMANAGER_ROLE);\n\n // Initializing roles first\n uint256 keepersLength = keepers.length;\n for (uint256 i; i < keepersLength; ++i) {\n if (keepers[i] == address(0)) revert ZeroAddress();\n _setupRole(KEEPER_ROLE, keepers[i]);\n }\n _setRoleAdmin(KEEPER_ROLE, GUARDIAN_ROLE);\n\n debtThreshold = 100 * BASE;\n emergencyExit = false;\n // Give `PoolManager` unlimited access (might save gas)\n want.safeIncreaseAllowance(address(poolManager), type(uint256).max);\n }\n\n // =============================== CORE FUNCTIONS ==============================\n\n /// @notice Harvests the Strategy, recognizing any profits or losses and adjusting\n /// the Strategy's position.\n function harvest() external {\n _report();\n // Check if free returns are left, and re-invest them\n _adjustPosition();\n }\n\n /// @notice Same as the function above with a `data` parameter to help adjust the position\n /// @dev Since this function is permissionless, strategy implementations should be made\n /// to remain safe regardless of the data that is passed in the call\n function harvest(bytes memory data) external virtual {\n _report();\n _adjustPosition(data);\n }\n\n /// @notice Same as above with a `borrowInit` parameter to help in case of the convergence of the `adjustPosition`\n /// method\n function harvest(uint256 borrowInit) external onlyRole(KEEPER_ROLE) {\n _report();\n _adjustPosition(borrowInit);\n }\n\n /// @notice Withdraws `_amountNeeded` to `poolManager`.\n /// @param _amountNeeded How much `want` to withdraw.\n /// @return amountFreed How much `want` withdrawn.\n /// @return _loss Any realized losses\n /// @dev This may only be called by the `PoolManager`\n function withdraw(uint256 _amountNeeded)\n external\n onlyRole(POOLMANAGER_ROLE)\n returns (uint256 amountFreed, uint256 _loss)\n {\n // Liquidate as much as possible `want` (up to `_amountNeeded`)\n (amountFreed, _loss) = _liquidatePosition(_amountNeeded);\n // Send it directly back (NOTE: Using `msg.sender` saves some gas here)\n want.safeTransfer(msg.sender, amountFreed);\n // NOTE: Reinvest anything leftover on next `tend`/`harvest`\n }\n\n // =============================== VIEW FUNCTIONS ==============================\n\n /// @notice Provides an accurate estimate for the total amount of assets\n /// (principle + return) that this Strategy is currently managing,\n /// denominated in terms of `want` tokens.\n /// This total should be \"realizable\" e.g. the total value that could\n /// *actually* be obtained from this Strategy if it were to divest its\n /// entire position based on current on-chain conditions.\n /// @return The estimated total assets in this Strategy.\n /// @dev Care must be taken in using this function, since it relies on external\n /// systems, which could be manipulated by the attacker to give an inflated\n /// (or reduced) value produced by this function, based on current on-chain\n /// conditions (e.g. this function is possible to influence through\n /// flashloan attacks, oracle manipulations, or other DeFi attack\n /// mechanisms).\n function estimatedTotalAssets() public view virtual returns (uint256);\n\n /// @notice Provides an indication of whether this strategy is currently \"active\"\n /// in that it is managing an active position, or will manage a position in\n /// the future. This should correlate to `harvest()` activity, so that Harvest\n /// events can be tracked externally by indexing agents.\n /// @return True if the strategy is actively managing a position.\n function isActive() public view returns (bool) {\n return estimatedTotalAssets() != 0;\n }\n\n // ============================= INTERNAL FUNCTIONS ============================\n\n /// @notice Prepares the Strategy to return, recognizing any profits or losses\n /// @dev In the rare case the Strategy is in emergency shutdown, this will exit\n /// the Strategy's position.\n /// @dev When `_report()` is called, the Strategy reports to the Manager (via\n /// `poolManager.report()`), so in some cases `harvest()` must be called in order\n /// to take in profits, to borrow newly available funds from the Manager, or\n /// otherwise adjust its position. In other cases `harvest()` must be\n /// called to report to the Manager on the Strategy's position, especially if\n /// any losses have occurred.\n /// @dev As keepers may directly profit from this function, there may be front-running problems with miners bots,\n /// we may have to put an access control logic for this function to only allow white-listed addresses to act\n /// as keepers for the protocol\n function _report() internal {\n uint256 profit;\n uint256 loss;\n uint256 debtOutstanding = poolManager.debtOutstanding();\n uint256 debtPayment;\n if (emergencyExit) {\n // Free up as much capital as possible\n uint256 amountFreed = _liquidateAllPositions();\n if (amountFreed < debtOutstanding) {\n loss = debtOutstanding - amountFreed;\n } else if (amountFreed > debtOutstanding) {\n profit = amountFreed - debtOutstanding;\n }\n debtPayment = debtOutstanding - loss;\n } else {\n // Free up returns for Manager to pull\n (profit, loss, debtPayment) = _prepareReturn(debtOutstanding);\n }\n emit Harvested(profit, loss, debtPayment, debtOutstanding);\n\n // Allows Manager to take up to the \"harvested\" balance of this contract,\n // which is the amount it has earned since the last time it reported to\n // the Manager.\n poolManager.report(profit, loss, debtPayment);\n }\n\n /// @notice Performs any Strategy unwinding or other calls necessary to capture the\n /// \"free return\" this Strategy has generated since the last time its core\n /// position(s) were adjusted. Examples include unwrapping extra rewards.\n /// This call is only used during \"normal operation\" of a Strategy, and\n /// should be optimized to minimize losses as much as possible.\n ///\n /// This method returns any realized profits and/or realized losses\n /// incurred, and should return the total amounts of profits/losses/debt\n /// payments (in `want` tokens) for the Manager's accounting (e.g.\n /// `want.balanceOf(this) >= _debtPayment + _profit`).\n ///\n /// `_debtOutstanding` will be 0 if the Strategy is not past the configured\n /// debt limit, otherwise its value will be how far past the debt limit\n /// the Strategy is. The Strategy's debt limit is configured in the Manager.\n ///\n /// NOTE: `_debtPayment` should be less than or equal to `_debtOutstanding`.\n /// It is okay for it to be less than `_debtOutstanding`, as that\n /// should only used as a guide for how much is left to pay back.\n /// Payments should be made to minimize loss from slippage, debt,\n /// withdrawal fees, etc.\n ///\n /// See `poolManager.debtOutstanding()`.\n function _prepareReturn(uint256 _debtOutstanding)\n internal\n virtual\n returns (\n uint256 _profit,\n uint256 _loss,\n uint256 _debtPayment\n );\n\n /// @notice Performs any adjustments to the core position(s) of this Strategy given\n /// what change the Manager made in the \"investable capital\" available to the\n /// Strategy. Note that all \"free capital\" in the Strategy after the report\n /// was made is available for reinvestment. Also note that this number\n /// could be 0, and you should handle that scenario accordingly.\n function _adjustPosition() internal virtual;\n\n /// @notice same as _adjustPosition but with an initial parameter\n function _adjustPosition(uint256) internal virtual;\n\n /// @notice same as _adjustPosition but with permissionless parameters\n function _adjustPosition(bytes memory) internal virtual {\n _adjustPosition();\n }\n\n /// @notice Liquidates up to `_amountNeeded` of `want` of this strategy's positions,\n /// irregardless of slippage. Any excess will be re-invested with `_adjustPosition()`.\n /// This function should return the amount of `want` tokens made available by the\n /// liquidation. If there is a difference between them, `_loss` indicates whether the\n /// difference is due to a realized loss, or if there is some other situation at play\n /// (e.g. locked funds) where the amount made available is less than what is needed.\n ///\n /// NOTE: The invariant `_liquidatedAmount + _loss <= _amountNeeded` should always be maintained\n function _liquidatePosition(uint256 _amountNeeded)\n internal\n virtual\n returns (uint256 _liquidatedAmount, uint256 _loss);\n\n /// @notice Liquidates everything and returns the amount that got freed.\n /// This function is used during emergency exit instead of `_prepareReturn()` to\n /// liquidate all of the Strategy's positions back to the Manager.\n function _liquidateAllPositions() internal virtual returns (uint256 _amountFreed);\n\n /// @notice Override this to add all tokens/tokenized positions this contract\n /// manages on a *persistent* basis (e.g. not just for swapping back to\n /// want ephemerally).\n ///\n /// NOTE: Do *not* include `want`, already included in `sweep` below.\n ///\n /// Example:\n /// ```\n /// function _protectedTokens() internal override view returns (address[] memory) {\n /// address[] memory protected = new address[](3);\n /// protected[0] = tokenA;\n /// protected[1] = tokenB;\n /// protected[2] = tokenC;\n /// return protected;\n /// }\n /// ```\n function _protectedTokens() internal view virtual returns (address[] memory);\n\n // ================================= GOVERNANCE ================================\n\n /// @notice Activates emergency exit. Once activated, the Strategy will exit its\n /// position upon the next harvest, depositing all funds into the Manager as\n /// quickly as is reasonable given on-chain conditions.\n /// @dev This may only be called by the `PoolManager`, because when calling this the `PoolManager` should at the same\n /// time update the debt ratio\n /// @dev This function can only be called once by the `PoolManager` contract\n /// @dev See `poolManager.setEmergencyExit()` and `harvest()` for further details.\n function setEmergencyExit() external onlyRole(POOLMANAGER_ROLE) {\n emergencyExit = true;\n emit EmergencyExitActivated();\n }\n\n /// @notice Sets how far the Strategy can go into loss without a harvest and report\n /// being required.\n /// @param _debtThreshold How big of a loss this Strategy may carry without\n /// @dev By default this is 0, meaning any losses would cause a harvest which\n /// will subsequently report the loss to the Manager for tracking.\n function setDebtThreshold(uint256 _debtThreshold) external onlyRole(GUARDIAN_ROLE) {\n debtThreshold = _debtThreshold;\n emit UpdatedDebtThreshold(_debtThreshold);\n }\n\n /// @notice Removes tokens from this Strategy that are not the type of tokens\n /// managed by this Strategy. This may be used in case of accidentally\n /// sending the wrong kind of token to this Strategy.\n ///\n /// Tokens will be sent to `governance()`.\n ///\n /// This will fail if an attempt is made to sweep `want`, or any tokens\n /// that are protected by this Strategy.\n ///\n /// This may only be called by governance.\n /// @param _token The token to transfer out of this `PoolManager`.\n /// @param to Address to send the tokens to.\n /// @dev\n /// Implement `_protectedTokens()` to specify any additional tokens that\n /// should be protected from sweeping in addition to `want`.\n function sweep(address _token, address to) external onlyRole(GUARDIAN_ROLE) {\n if (_token == address(want)) revert InvalidToken();\n\n address[] memory __protectedTokens = _protectedTokens();\n uint256 protectedTokensLength = __protectedTokens.length;\n for (uint256 i; i < protectedTokensLength; ++i)\n // In the strategy we use so far, the only protectedToken is the want token\n // and this has been checked above\n if (_token == __protectedTokens[i]) revert InvalidToken();\n\n IERC20(_token).safeTransfer(to, IERC20(_token).balanceOf(address(this)));\n }\n\n // ============================= MANAGER FUNCTIONS =============================\n\n /// @notice Adds a new guardian address and echoes the change to the contracts\n /// that interact with this collateral `PoolManager`\n /// @param _guardian New guardian address\n /// @dev This internal function has to be put in this file because Access Control is not defined\n /// in PoolManagerInternal\n function addGuardian(address _guardian) external virtual;\n\n /// @notice Revokes the guardian role and propagates the change to other contracts\n /// @param guardian Old guardian address to revoke\n function revokeGuardian(address guardian) external virtual;\n}\n" + }, + "contracts/strategies/OptimizerAPR/genericLender/aave/GenericAaveNoStaker.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"./GenericAaveUpgradeable.sol\";\n\n/// @title GenericAaveNoStaker\n/// @author Angle Core Team\n/// @notice Only deposit onto Aave lendingPool without staking\n/// @dev In this implementation, we just have to override the base functions with constant amounts as nothing is\n/// staked in an external contract\ncontract GenericAaveNoStaker is GenericAaveUpgradeable {\n // ================================ CONSTRUCTOR ================================\n\n /// @notice Wrapper on top of the `initializeAave` method\n function initialize(\n address _strategy,\n string memory name,\n bool _isIncentivised,\n address[] memory governorList,\n address guardian,\n address[] memory keeperList,\n address oneInch_\n ) external {\n initializeAave(_strategy, name, _isIncentivised, governorList, guardian, keeperList, oneInch_);\n }\n\n // ============================= VIRTUAL FUNCTIONS =============================\n\n function _stake(uint256) internal override returns (uint256) {}\n\n function _unstake(uint256 amount) internal pure override returns (uint256) {\n return amount;\n }\n\n /// @notice Gets current staked balance (e.g 0 if nothing is staked)\n function _stakedBalance() internal pure override returns (uint256) {\n return 0;\n }\n\n /// @notice Get stakingAPR after staking an additional `amount`: in this case, since nothing\n /// is staked, it simply returns 0\n function _stakingApr(int256) internal pure override returns (uint256) {\n return 0;\n }\n}\n" + }, + "contracts/strategies/OptimizerAPR/genericLender/aave/GenericAaveUpgradeable.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\n\nimport { DataTypes, IStakedAave, IReserveInterestRateStrategy } from \"../../../../interfaces/external/aave/IAave.sol\";\nimport { IProtocolDataProvider } from \"../../../../interfaces/external/aave/IProtocolDataProvider.sol\";\nimport { ILendingPool } from \"../../../../interfaces/external/aave/ILendingPool.sol\";\nimport { IAaveIncentivesController } from \"../../../../interfaces/external/aave/IAaveIncentivesController.sol\";\nimport { IAToken, IVariableDebtToken } from \"../../../../interfaces/external/aave/IAaveToken.sol\";\nimport \"./../GenericLenderBaseUpgradeable.sol\";\n\n/// @title GenericAave\n/// @author Forked from https://github.com/Grandthrax/yearnV2-generic-lender-strat/blob/master/contracts/GenericLender/GenericAave.sol\n/// @notice A contract to lend any supported ERC20 to Aave and potentially stake them in an external staking contract\n/// @dev This contract is just a base implementation which can be overriden depending on the staking contract on which to stake\n/// or not the aTokens\nabstract contract GenericAaveUpgradeable is GenericLenderBaseUpgradeable {\n using SafeERC20 for IERC20;\n using Address for address;\n\n // ================================= REFERENCES ================================\n\n // solhint-disable-next-line\n AggregatorV3Interface private constant oracle = AggregatorV3Interface(0x547a514d5e3769680Ce22B2361c10Ea13619e8a9);\n\n // solhint-disable-next-line\n address private constant _aave = 0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9;\n // solhint-disable-next-line\n IStakedAave private constant _stkAave = IStakedAave(0x4da27a545c0c5B758a6BA100e3a049001de870f5);\n // solhint-disable-next-line\n IAaveIncentivesController private constant _incentivesController =\n IAaveIncentivesController(0xd784927Ff2f95ba542BfC824c8a8a98F3495f6b5);\n // solhint-disable-next-line\n ILendingPool internal constant _lendingPool = ILendingPool(0x7d2768dE32b0b80b7a3454c06BdAc94A69DDc7A9);\n // solhint-disable-next-line\n IProtocolDataProvider private constant _protocolDataProvider =\n IProtocolDataProvider(0x057835Ad21a177dbdd3090bB1CAE03EaCF78Fc6d);\n\n // ================================= CONSTANTS =================================\n\n uint256 internal constant _SECONDS_IN_YEAR = 365 days;\n uint256 public cooldownSeconds;\n uint256 public unstakeWindow;\n bool public cooldownStkAave;\n bool public isIncentivised;\n IAToken internal _aToken;\n\n uint256[47] private __gapAaveLender;\n\n // =================================== EVENT ===================================\n\n event IncentivisedUpdated(bool _isIncentivised);\n\n // ================================ CONSTRUCTOR ================================\n\n /// @notice Initializer of the `GenericAave`\n /// @param _strategy Reference to the strategy using this lender\n /// @param name Name of the lender\n /// @param _isIncentivised Whether the corresponding token is incentivized on Aave or not\n /// @param governorList List of addresses with governor privilege\n /// @param guardian Address of the guardian\n /// @param keeperList List of addresses with keeper privilege\n function initializeAave(\n address _strategy,\n string memory name,\n bool _isIncentivised,\n address[] memory governorList,\n address guardian,\n address[] memory keeperList,\n address oneInch_\n ) public {\n _initialize(_strategy, name, governorList, guardian, keeperList, oneInch_);\n\n _setAavePoolVariables();\n if (_isIncentivised && address(_aToken.getIncentivesController()) == address(0)) revert PoolNotIncentivized();\n isIncentivised = _isIncentivised;\n cooldownStkAave = true;\n IERC20(address(want)).safeApprove(address(_lendingPool), type(uint256).max);\n // Approve swap router spend\n IERC20(address(_stkAave)).safeApprove(oneInch_, type(uint256).max);\n IERC20(address(_aave)).safeApprove(oneInch_, type(uint256).max);\n }\n\n // ============================= EXTERNAL FUNCTIONS ============================\n\n /// @inheritdoc IGenericLender\n function deposit() external override onlyRole(STRATEGY_ROLE) {\n uint256 balance = want.balanceOf(address(this));\n // Aave doesn't allow null deposits\n if (balance == 0) return;\n _deposit(balance);\n // We don't stake balance but the whole aTokenBalance\n // if some dust has been kept idle\n _stake(_balanceAtoken());\n }\n\n /// @inheritdoc IGenericLender\n function withdraw(uint256 amount) external override onlyRole(STRATEGY_ROLE) returns (uint256) {\n return _withdraw(amount);\n }\n\n /// @inheritdoc IGenericLender\n function emergencyWithdraw(uint256 amount) external override onlyRole(GUARDIAN_ROLE) {\n _unstake(amount);\n _lendingPool.withdraw(address(want), amount, address(this));\n want.safeTransfer(address(poolManager), want.balanceOf(address(this)));\n }\n\n /// @inheritdoc IGenericLender\n function withdrawAll() external override onlyRole(STRATEGY_ROLE) returns (bool) {\n uint256 invested = _nav();\n uint256 returned = _withdraw(invested);\n return returned >= invested;\n }\n\n /// @notice Claim earned stkAAVE\n /// @dev stkAAVE require a \"cooldown\" period of 10 days before being claimed\n function claimRewards() external onlyRole(KEEPER_ROLE) {\n _claimRewards();\n }\n\n /// @notice Triggers the cooldown on Aave for this contract\n function cooldown() external onlyRole(KEEPER_ROLE) {\n _stkAave.cooldown();\n }\n\n /// @notice Retrieves lending pool variables like the `COOLDOWN_SECONDS` or the `UNSTAKE_WINDOW` on Aave\n /// @dev No access control is needed here because values are fetched from Aave directly\n /// @dev We expect the values concerned not to be modified often\n function setAavePoolVariables() external {\n _setAavePoolVariables();\n }\n\n // ================================== SETTERS ==================================\n\n /// @notice Toggle isIncentivised state, to let know the lender if it should harvest aave rewards\n function toggleIsIncentivised() external onlyRole(GUARDIAN_ROLE) {\n isIncentivised = !isIncentivised;\n }\n\n /// @notice Toggle cooldownStkAave state, which allow or not to call the coolDown stkAave each time rewards are claimed\n function toggleCooldownStkAave() external onlyRole(GUARDIAN_ROLE) {\n cooldownStkAave = !cooldownStkAave;\n }\n\n // ========================== EXTERNAL VIEW FUNCTIONS ==========================\n\n /// @inheritdoc GenericLenderBaseUpgradeable\n function underlyingBalanceStored() public view override returns (uint256 balance) {\n balance = _balanceAtoken() + _stakedBalance();\n }\n\n /// @inheritdoc IGenericLender\n function aprAfterDeposit(int256 amount) external view override returns (uint256) {\n // i need to calculate new supplyRate after Deposit (when deposit has not been done yet)\n DataTypes.ReserveData memory reserveData = _lendingPool.getReserveData(address(want));\n\n (\n uint256 availableLiquidity,\n uint256 totalStableDebt,\n uint256 totalVariableDebt,\n ,\n ,\n ,\n uint256 averageStableBorrowRate,\n ,\n ,\n\n ) = _protocolDataProvider.getReserveData(address(want));\n\n uint256 newLiquidity = availableLiquidity;\n if (amount >= 0) newLiquidity += uint256(amount);\n else newLiquidity -= uint256(-amount);\n\n (, , , , uint256 reserveFactor, , , , , ) = _protocolDataProvider.getReserveConfigurationData(address(want));\n\n (uint256 newLiquidityRate, , ) = IReserveInterestRateStrategy(reserveData.interestRateStrategyAddress)\n .calculateInterestRates(\n address(want),\n newLiquidity,\n totalStableDebt,\n totalVariableDebt,\n averageStableBorrowRate,\n reserveFactor\n );\n uint256 incentivesRate = _incentivesRate(newLiquidity + totalStableDebt + totalVariableDebt); // total supplied liquidity in Aave v2\n uint256 stakingApr = _stakingApr(amount);\n\n return newLiquidityRate / 1e9 + incentivesRate + stakingApr; // divided by 1e9 to go from Ray to Wad\n }\n\n // ============================= INTERNAL FUNCTIONS ============================\n\n /// @notice Internal version of the `claimRewards` function\n function _claimRewards() internal returns (uint256 stkAaveBalance) {\n stkAaveBalance = _balanceOfStkAave();\n // If it's the claim period claim\n if (stkAaveBalance != 0 && _checkCooldown() == 1) {\n // redeem AAVE from _stkAave\n _stkAave.claimRewards(address(this), type(uint256).max);\n _stkAave.redeem(address(this), stkAaveBalance);\n }\n\n address[] memory claimOnTokens = new address[](1);\n claimOnTokens[0] = address(_aToken);\n // claim _stkAave from lending and borrowing, this will reset the cooldown\n _incentivesController.claimRewards(claimOnTokens, type(uint256).max, address(this));\n\n stkAaveBalance = _balanceOfStkAave();\n\n // request start of cooldown period, if there's no cooldown in progress\n if (cooldownStkAave && stkAaveBalance != 0 && _checkCooldown() == 0) {\n _stkAave.cooldown();\n }\n }\n\n /// @notice Returns the `StkAAVE` balance\n function _balanceOfStkAave() internal view returns (uint256) {\n return IERC20(address(_stkAave)).balanceOf(address(this));\n }\n\n /// @notice Returns the `aToken` balance\n function _balanceAtoken() internal view returns (uint256) {\n return _aToken.balanceOf(address(this));\n }\n\n /// @notice Estimate the amount of `want` we will get out by swapping it for AAVE\n /// @param amount Amount of AAVE we want to exchange (in base 18)\n /// @return amount Amount of `want` we are getting\n /// @dev Uses Chainlink spot price. Return value will be in base of `want` (6 for USDC)\n function _estimatedStkAaveToWant(uint256 amount) internal view returns (uint256) {\n (, int256 aavePriceUSD, , , ) = oracle.latestRoundData(); // stkAavePriceUSD is in base 8\n // `aavePriceUSD` is in base 8, so ultimately we need to divide by `1e(18+8)\n return (uint256(aavePriceUSD) * amount * wantBase) / 1e26;\n }\n\n /// @notice See `apr`\n function _apr() internal view override returns (uint256) {\n (\n uint256 availableLiquidity,\n uint256 totalStableDebt,\n uint256 totalVariableDebt,\n uint256 liquidityRate,\n ,\n ,\n ,\n ,\n ,\n\n ) = _protocolDataProvider.getReserveData(address(want));\n uint256 incentivesRate = _incentivesRate(availableLiquidity + totalStableDebt + totalVariableDebt); // total supplied liquidity in Aave v2\n uint256 stakingApr = _stakingApr(0);\n\n return liquidityRate / 10**9 + incentivesRate + stakingApr;\n }\n\n /// @notice Calculates APR from Liquidity Mining Program\n /// @param totalLiquidity Total liquidity available in the pool\n function _incentivesRate(uint256 totalLiquidity) internal view returns (uint256) {\n // Only returns != 0 if the incentives are in place at the moment.\n // It will fail if `isIncentivised` is set to true but there are no incentives\n if (isIncentivised && block.timestamp < _incentivesController.getDistributionEnd() && totalLiquidity != 0) {\n uint256 _emissionsPerSecond;\n (, _emissionsPerSecond, ) = _incentivesController.getAssetData(address(_aToken));\n if (_emissionsPerSecond != 0) {\n uint256 emissionsInWant = _estimatedStkAaveToWant(_emissionsPerSecond); // amount of emissions in want\n uint256 incentivesRate = (emissionsInWant * _SECONDS_IN_YEAR * 1e18) / totalLiquidity; // APRs are in 1e18\n\n return (incentivesRate * 9500) / 10000; // 95% of estimated APR to avoid overestimations\n }\n }\n return 0;\n }\n\n /// @notice See `withdraw`\n function _withdraw(uint256 amount) internal returns (uint256) {\n uint256 stakedBalance = _stakedBalance();\n uint256 balanceUnderlying = _balanceAtoken();\n uint256 looseBalance = want.balanceOf(address(this));\n uint256 total = stakedBalance + balanceUnderlying + looseBalance;\n\n if (amount > total) {\n //cant withdraw more than we own\n amount = total;\n }\n\n if (looseBalance >= amount) {\n want.safeTransfer(address(strategy), amount);\n return amount;\n }\n\n // Not state changing but OK because of previous call\n uint256 liquidity = want.balanceOf(address(_aToken));\n\n if (liquidity > 1) {\n uint256 toWithdraw = amount - looseBalance;\n if (toWithdraw <= liquidity) {\n //we can take all\n uint256 freedAmount = _unstake(toWithdraw);\n _lendingPool.withdraw(address(want), freedAmount, address(this));\n } else {\n //take all we can\n uint256 freedAmount = _unstake(liquidity);\n _lendingPool.withdraw(address(want), freedAmount, address(this));\n }\n }\n looseBalance = want.balanceOf(address(this));\n\n want.safeTransfer(address(strategy), looseBalance);\n return looseBalance;\n }\n\n /// @notice See `deposit`\n function _deposit(uint256 amount) internal {\n ILendingPool lp = _lendingPool;\n // NOTE: Checks if allowance is enough and acts accordingly\n // allowance might not be enough if\n // i) initial allowance has been used (should take years)\n // ii) _lendingPool contract address has changed (Aave updated the contract address)\n if (want.allowance(address(this), address(lp)) < amount) {\n IERC20(address(want)).safeApprove(address(lp), 0);\n IERC20(address(want)).safeApprove(address(lp), type(uint256).max);\n }\n lp.deposit(address(want), amount, address(this), 0);\n }\n\n /// @notice Internal version of the `_setAavePoolVariables`\n function _setAavePoolVariables() internal {\n (address aToken, , ) = _protocolDataProvider.getReserveTokensAddresses(address(want));\n _aToken = IAToken(aToken);\n cooldownSeconds = IStakedAave(_stkAave).COOLDOWN_SECONDS();\n unstakeWindow = IStakedAave(_stkAave).UNSTAKE_WINDOW();\n }\n\n /// @notice Verifies the cooldown status for earned stkAAVE\n /// @return cooldownStatus Status of the coolDown: if it is 0 then there is no cooldown Status, if it is 1 then\n /// the strategy should claim the stkAave\n function _checkCooldown() internal view returns (uint256 cooldownStatus) {\n uint256 cooldownStartTimestamp = IStakedAave(_stkAave).stakersCooldowns(address(this));\n uint256 nextClaimStartTimestamp = cooldownStartTimestamp + cooldownSeconds;\n if (cooldownStartTimestamp == 0) {\n return 0;\n }\n if (block.timestamp > nextClaimStartTimestamp && block.timestamp <= nextClaimStartTimestamp + unstakeWindow) {\n return 1;\n }\n if (block.timestamp < nextClaimStartTimestamp) {\n return 2;\n }\n }\n\n /// @inheritdoc GenericLenderBaseUpgradeable\n function _protectedTokens() internal view override returns (address[] memory) {\n address[] memory protected = new address[](2);\n protected[0] = address(want);\n protected[1] = address(_aToken);\n return protected;\n }\n\n // ============================= VIRTUAL FUNCTIONS =============================\n\n /// @notice Allows the lender to stake its aTokens in an external staking contract\n /// @param amount Amount of aTokens to stake\n /// @return Amount of aTokens actually staked\n function _stake(uint256 amount) internal virtual returns (uint256);\n\n /// @notice Allows the lender to unstake its aTokens from an external staking contract\n /// @param amount Amount of aToken to unstake\n /// @return Amount of aTokens actually unstaked\n function _unstake(uint256 amount) internal virtual returns (uint256);\n\n /// @notice Gets the amount of aTokens currently staked\n function _stakedBalance() internal view virtual returns (uint256);\n\n /// @notice Gets the APR from staking additional `amount` of aTokens in the associated staking\n /// contract\n /// @param amount Virtual amount to be staked\n function _stakingApr(int256 amount) internal view virtual returns (uint256);\n}\n" + }, + "contracts/strategies/OptimizerAPR/genericLender/compound/GenericCompoundUpgradeable.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol\";\n\nimport \"../../../../interfaces/external/compound/CErc20I.sol\";\nimport \"../../../../interfaces/external/compound/IComptroller.sol\";\nimport \"../../../../interfaces/external/compound/InterestRateModel.sol\";\n\nimport \"./../GenericLenderBaseUpgradeable.sol\";\n\n/// @title GenericCompoundV3\n/// @author Forked from here: https://github.com/Grandthrax/yearnV2-generic-lender-strat/blob/master/contracts/GenericLender/GenericCompound.sol\ncontract GenericCompoundUpgradeable is GenericLenderBaseUpgradeable {\n using SafeERC20 for IERC20;\n using Address for address;\n\n uint256 public constant BLOCKS_PER_YEAR = 2_350_000;\n\n // solhint-disable-next-line\n AggregatorV3Interface public constant oracle = AggregatorV3Interface(0xdbd020CAeF83eFd542f4De03e3cF0C28A4428bd5);\n // solhint-disable-next-line\n IComptroller public constant comptroller = IComptroller(0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B);\n // solhint-disable-next-line\n address public constant comp = 0xc00e94Cb662C3520282E6f5717214004A7f26888;\n\n // ================================= REFERENCES ================================\n\n CErc20I public cToken;\n // solhint-disable-next-line\n uint256 private dust;\n\n // ============================= Constructor ===================================\n\n /// @notice Initializer of the `GenericCompound`\n /// @param _strategy Reference to the strategy using this lender\n /// @param _cToken Address of the cToken\n /// @param governorList List of addresses with governor privilege\n /// @param keeperList List of addresses with keeper privilege\n /// @param guardian Address of the guardian\n function initialize(\n address _strategy,\n string memory _name,\n address _cToken,\n address[] memory governorList,\n address guardian,\n address[] memory keeperList,\n address oneInch_\n ) external {\n _initialize(_strategy, _name, governorList, guardian, keeperList, oneInch_);\n\n cToken = CErc20I(_cToken);\n if (CErc20I(_cToken).underlying() != address(want)) revert WrongCToken();\n\n want.safeApprove(_cToken, type(uint256).max);\n IERC20(comp).safeApprove(oneInch_, type(uint256).max);\n }\n\n // ======================== EXTERNAL STRATEGY FUNCTIONS ========================\n\n /// @inheritdoc IGenericLender\n function deposit() external override onlyRole(STRATEGY_ROLE) {\n uint256 balance = want.balanceOf(address(this));\n if (cToken.mint(balance) != 0) revert FailedToMint();\n }\n\n /// @inheritdoc IGenericLender\n function withdraw(uint256 amount) external override onlyRole(STRATEGY_ROLE) returns (uint256) {\n return _withdraw(amount);\n }\n\n /// @inheritdoc IGenericLender\n function withdrawAll() external override onlyRole(STRATEGY_ROLE) returns (bool) {\n uint256 invested = _nav();\n uint256 returned = _withdraw(invested);\n return returned >= invested;\n }\n\n // ========================== EXTERNAL VIEW FUNCTIONS ==========================\n\n /// @inheritdoc GenericLenderBaseUpgradeable\n function underlyingBalanceStored() public view override returns (uint256 balance) {\n uint256 currentCr = cToken.balanceOf(address(this));\n if (currentCr == 0) {\n balance = 0;\n } else {\n //The current exchange rate as an unsigned integer, scaled by 1e18.\n balance = (currentCr * cToken.exchangeRateStored()) / 1e18;\n }\n }\n\n /// @inheritdoc IGenericLender\n function aprAfterDeposit(int256 amount) external view override returns (uint256) {\n uint256 cashPrior = want.balanceOf(address(cToken));\n\n uint256 borrows = cToken.totalBorrows();\n\n uint256 reserves = cToken.totalReserves();\n\n uint256 reserverFactor = cToken.reserveFactorMantissa();\n\n InterestRateModel model = cToken.interestRateModel();\n\n uint256 newCashPrior = cashPrior;\n uint256 totalSupplyInWant = (cToken.totalSupply() * cToken.exchangeRateStored()) / 1e18;\n if (amount >= 0) {\n newCashPrior += uint256(amount);\n totalSupplyInWant += uint256(amount);\n } else {\n newCashPrior -= uint256(-amount);\n totalSupplyInWant -= uint256(-amount);\n }\n // The supply rate is derived from the borrow rate, reserve factor and the amount of total borrows.\n uint256 supplyRate = model.getSupplyRate(newCashPrior, borrows, reserves, reserverFactor);\n // Adding the yield from comp\n return supplyRate * BLOCKS_PER_YEAR + _incentivesRate(totalSupplyInWant);\n }\n\n // ================================= GOVERNANCE ================================\n\n /// @inheritdoc IGenericLender\n function emergencyWithdraw(uint256 amount) external override onlyRole(GUARDIAN_ROLE) {\n // Do not care about errors here, what is important is to withdraw what is possible\n cToken.redeemUnderlying(amount);\n\n want.safeTransfer(address(poolManager), want.balanceOf(address(this)));\n }\n\n /// @notice Allow to modify the dust amount\n /// @param dust_ Amount under which the contract does not try to redeem from Compound\n /// @dev Set in a function because contract was already initialized\n function setDust(uint256 dust_) external onlyRole(GUARDIAN_ROLE) {\n dust = dust_;\n }\n\n // ============================= INTERNAL FUNCTIONS ============================\n\n /// @notice See `apr`\n function _apr() internal view override returns (uint256) {\n uint256 totalSupplyInWant = (cToken.totalSupply() * cToken.exchangeRateStored()) / 1e18;\n return cToken.supplyRatePerBlock() * BLOCKS_PER_YEAR + _incentivesRate(totalSupplyInWant);\n }\n\n /// @notice See `withdraw`\n function _withdraw(uint256 amount) internal returns (uint256) {\n uint256 balanceUnderlying = cToken.balanceOfUnderlying(address(this));\n uint256 looseBalance = want.balanceOf(address(this));\n uint256 total = balanceUnderlying + looseBalance;\n\n if (amount > total) {\n // Can't withdraw more than we own\n amount = total;\n }\n\n if (looseBalance >= amount) {\n want.safeTransfer(address(strategy), amount);\n return amount;\n }\n\n // Not state changing but OK because of previous call\n uint256 liquidity = want.balanceOf(address(cToken));\n\n if (liquidity > 1) {\n uint256 toWithdraw = amount - looseBalance;\n // If amount is too low then do not try to withdraw it\n // Risk being: the tx can revert because the cToken needed to be sent == 0\n if (toWithdraw >= dust) {\n if (toWithdraw <= liquidity) {\n // We can take all\n if (cToken.redeemUnderlying(toWithdraw) != 0) revert FailedToRedeem();\n } else {\n // Take all we can\n if (cToken.redeemUnderlying(liquidity) != 0) revert FailedToRedeem();\n }\n }\n }\n address[] memory holders = new address[](1);\n CTokenI[] memory cTokens = new CTokenI[](1);\n holders[0] = address(this);\n cTokens[0] = cToken;\n comptroller.claimComp(holders, cTokens, true, true);\n\n looseBalance = want.balanceOf(address(this));\n want.safeTransfer(address(strategy), looseBalance);\n return looseBalance;\n }\n\n /// @notice Calculates APR from Compound's Liquidity Mining Program\n /// @param totalSupplyInWant Total supply in want for this market (for the `aprAfterDeposit` function)\n function _incentivesRate(uint256 totalSupplyInWant) internal view returns (uint256) {\n uint256 supplySpeed = comptroller.compSupplySpeeds(address(cToken));\n // `supplySpeed` is in `COMP` unit -> the following operation is going to put it in `want` unit\n supplySpeed = _comptoWant(supplySpeed);\n uint256 incentivesRate;\n // Added for testing purposes and to handle the edge case where there is nothing left in a market\n if (totalSupplyInWant == 0) {\n incentivesRate = supplySpeed * BLOCKS_PER_YEAR;\n } else {\n // `incentivesRate` is expressed in base 18 like all APR\n incentivesRate = (supplySpeed * BLOCKS_PER_YEAR * 1e18) / totalSupplyInWant;\n }\n return (incentivesRate * 9500) / 10000; // 95% of estimated APR to avoid overestimations\n }\n\n /// @notice Estimates the value of `_amount` COMP tokens\n /// @param _amount Amount of comp to compute the `want` price of\n /// @dev This function uses a ChainLink oracle to easily compute the price\n function _comptoWant(uint256 _amount) internal view returns (uint256) {\n if (_amount == 0) {\n return 0;\n }\n (uint80 roundId, int256 ratio, , , uint80 answeredInRound) = oracle.latestRoundData();\n if (ratio == 0 || roundId > answeredInRound) revert InvalidOracleValue();\n uint256 castedRatio = uint256(ratio);\n\n // Checking whether we should multiply or divide by the ratio computed\n return (_amount * castedRatio * wantBase) / 1e26;\n }\n\n /// @inheritdoc GenericLenderBaseUpgradeable\n function _protectedTokens() internal view override returns (address[] memory) {\n address[] memory protected = new address[](2);\n protected[0] = address(want);\n protected[1] = address(cToken);\n return protected;\n }\n\n /// @notice Recovers ETH from the contract\n /// @param amount Amount to be recovered\n function recoverETH(address to, uint256 amount) external onlyRole(GUARDIAN_ROLE) {\n if (!payable(to).send(amount)) revert FailedToRecoverETH();\n }\n\n receive() external payable {}\n}\n" + }, + "contracts/strategies/OptimizerAPR/genericLender/euler/GenericEuler.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport { IEuler, IEulerMarkets, IEulerEToken, IEulerDToken, IBaseIRM } from \"../../../../interfaces/external/euler/IEuler.sol\";\nimport \"../../../../external/ComputePower.sol\";\nimport \"./../GenericLenderBaseUpgradeable.sol\";\n\n/// @title GenericEuler\n/// @author Angle Core Team\n/// @notice Simple supplier to Euler markets\ncontract GenericEuler is GenericLenderBaseUpgradeable {\n using SafeERC20 for IERC20;\n using Address for address;\n\n /// @notice Base used for interest rate / power computation\n // solhint-disable-next-line\n uint256 private constant BASE_INTEREST = 10**27;\n\n /// @notice Euler address holding assets\n // solhint-disable-next-line\n IEuler private constant _euler = IEuler(0x27182842E098f60e3D576794A5bFFb0777E025d3);\n /// @notice Euler address with data on all eTokens, debt tokens and interest rates\n // solhint-disable-next-line\n IEulerMarkets private constant _eulerMarkets = IEulerMarkets(0x3520d5a913427E6F0D6A83E07ccD4A4da316e4d3);\n // solhint-disable-next-line\n uint256 internal constant _SECONDS_IN_YEAR = 365 days;\n // solhint-disable-next-line\n uint256 private constant RESERVE_FEE_SCALE = 4_000_000_000;\n\n // ========================== REFERENCES TO CONTRACTS ==========================\n\n /// @notice Euler interest rate model for the desired token\n // solhint-disable-next-line\n IBaseIRM private irm;\n /// @notice Euler debt token\n // solhint-disable-next-line\n IEulerDToken private dToken;\n /// @notice Token given to lenders on Euler\n IEulerEToken public eToken;\n /// @notice Reserve fee on the token on Euler\n uint32 public reserveFee;\n\n // ================================ CONSTRUCTOR ================================\n\n /// @notice Initializer of the `GenericEuler`\n /// @param _strategy Reference to the strategy using this lender\n /// @param governorList List of addresses with governor privilege\n /// @param keeperList List of addresses with keeper privilege\n /// @param guardian Address of the guardian\n function initializeEuler(\n address _strategy,\n string memory _name,\n address[] memory governorList,\n address guardian,\n address[] memory keeperList,\n address oneInch_\n ) public {\n _initialize(_strategy, _name, governorList, guardian, keeperList, oneInch_);\n\n eToken = IEulerEToken(_eulerMarkets.underlyingToEToken(address(want)));\n dToken = IEulerDToken(_eulerMarkets.underlyingToDToken(address(want)));\n\n _setEulerPoolVariables();\n\n want.safeApprove(address(_euler), type(uint256).max);\n }\n\n // ===================== EXTERNAL PERMISSIONLESS FUNCTIONS =====================\n\n /// @notice Retrieves Euler variables `reserveFee` and the `irm` - rates curve - used for the underlying token\n /// @dev No access control is needed here because values are fetched from Euler directly\n /// @dev We expect the values concerned not to be modified often\n function setEulerPoolVariables() external {\n _setEulerPoolVariables();\n }\n\n // ======================== EXTERNAL STRATEGY FUNCTIONS ========================\n\n /// @inheritdoc IGenericLender\n function deposit() external override onlyRole(STRATEGY_ROLE) {\n uint256 balance = want.balanceOf(address(this));\n eToken.deposit(0, balance);\n // We don't stake balance but the whole eToken balance\n // if some dust has been kept idle\n _stakeAll();\n }\n\n /// @inheritdoc IGenericLender\n function withdraw(uint256 amount) external override onlyRole(STRATEGY_ROLE) returns (uint256) {\n return _withdraw(amount);\n }\n\n /// @inheritdoc IGenericLender\n function withdrawAll() external override onlyRole(STRATEGY_ROLE) returns (bool) {\n uint256 invested = _nav();\n uint256 returned = _withdraw(invested);\n return returned >= invested;\n }\n\n // ========================== EXTERNAL VIEW FUNCTIONS ==========================\n\n /// @inheritdoc GenericLenderBaseUpgradeable\n function underlyingBalanceStored() public view override returns (uint256) {\n uint256 stakeAmount = _stakedBalance();\n return eToken.balanceOfUnderlying(address(this)) + stakeAmount;\n }\n\n /// @inheritdoc IGenericLender\n function aprAfterDeposit(int256 amount) external view override returns (uint256) {\n return _aprAfterDeposit(amount);\n }\n\n // ================================= GOVERNANCE ================================\n\n /// @inheritdoc IGenericLender\n function emergencyWithdraw(uint256 amount) external override onlyRole(GUARDIAN_ROLE) {\n _unstake(amount);\n eToken.withdraw(0, amount);\n want.safeTransfer(address(poolManager), want.balanceOf(address(this)));\n }\n\n // ============================= INTERNAL FUNCTIONS ============================\n\n /// @inheritdoc GenericLenderBaseUpgradeable\n function _apr() internal view override returns (uint256) {\n return _aprAfterDeposit(0);\n }\n\n /// @notice Internal version of the `aprAfterDeposit` function\n function _aprAfterDeposit(int256 amount) internal view returns (uint256) {\n uint256 totalBorrows = dToken.totalSupply();\n // Total supply is current supply + added liquidity\n\n uint256 totalSupply = eToken.totalSupplyUnderlying();\n if (amount >= 0) totalSupply += uint256(amount);\n else totalSupply -= uint256(-amount);\n\n uint256 supplyAPY;\n if (totalSupply != 0) {\n uint32 futureUtilisationRate = uint32(\n (totalBorrows * (uint256(type(uint32).max) * 1e18)) / totalSupply / 1e18\n );\n uint256 interestRate = uint256(uint96(irm.computeInterestRate(address(want), futureUtilisationRate)));\n supplyAPY = _computeAPYs(interestRate, totalBorrows, totalSupply, reserveFee);\n }\n\n // Adding the yield from EUL\n return supplyAPY + _stakingApr(amount);\n }\n\n /// @notice Computes APYs based on the interest rate, reserve fee, borrow\n /// @param borrowSPY Interest rate paid per second by borrowers\n /// @param totalBorrows Total amount borrowed on Euler of the underlying token\n /// @param totalSupplyUnderlying Total amount supplied on Euler of the underlying token\n /// @param _reserveFee Reserve fee set by governance for the underlying token\n /// @return supplyAPY The annual percentage yield received as a supplier with current settings\n function _computeAPYs(\n uint256 borrowSPY,\n uint256 totalBorrows,\n uint256 totalSupplyUnderlying,\n uint32 _reserveFee\n ) internal pure returns (uint256 supplyAPY) {\n // Not useful for the moment\n // uint256 borrowAPY = (ComputePower.computePower(borrowSPY, _SECONDS_IN_YEAR) - ComputePower.BASE_INTEREST) / 1e9;\n uint256 supplySPY = (borrowSPY * totalBorrows) / totalSupplyUnderlying;\n supplySPY = (supplySPY * (RESERVE_FEE_SCALE - _reserveFee)) / RESERVE_FEE_SCALE;\n // All rates are in base 18 on Angle strategies\n supplyAPY = (ComputePower.computePower(supplySPY, _SECONDS_IN_YEAR, BASE_INTEREST) - BASE_INTEREST) / 1e9;\n }\n\n /// @notice See `withdraw`\n function _withdraw(uint256 amount) internal returns (uint256) {\n uint256 stakedBalance = _stakedBalance();\n uint256 balanceUnderlying = eToken.balanceOfUnderlying(address(this));\n uint256 looseBalance = want.balanceOf(address(this));\n uint256 total = stakedBalance + balanceUnderlying + looseBalance;\n\n if (amount > total) {\n // Can't withdraw more than we own\n amount = total;\n }\n\n if (looseBalance >= amount) {\n want.safeTransfer(address(strategy), amount);\n return amount;\n }\n\n // Not state changing but still cheap because of previous call\n uint256 availableLiquidity = want.balanceOf(address(_euler));\n\n if (availableLiquidity > 1) {\n uint256 toWithdraw = amount - looseBalance;\n uint256 toUnstake;\n // We can take all\n if (toWithdraw <= availableLiquidity)\n toUnstake = toWithdraw > (balanceUnderlying + looseBalance)\n ? toWithdraw - (balanceUnderlying + looseBalance)\n : 0;\n else {\n // Take all we can\n toUnstake = availableLiquidity > balanceUnderlying ? availableLiquidity - balanceUnderlying : 0;\n toWithdraw = availableLiquidity;\n }\n if (toUnstake != 0) _unstake(toUnstake);\n eToken.withdraw(0, toWithdraw);\n }\n\n looseBalance = want.balanceOf(address(this));\n want.safeTransfer(address(strategy), looseBalance);\n return looseBalance;\n }\n\n /// @notice Internal version of the `setEulerPoolVariables`\n function _setEulerPoolVariables() internal {\n uint256 interestRateModel = _eulerMarkets.interestRateModel(address(want));\n address moduleImpl = _euler.moduleIdToImplementation(interestRateModel);\n irm = IBaseIRM(moduleImpl);\n reserveFee = _eulerMarkets.reserveFee(address(want));\n }\n\n /// @inheritdoc GenericLenderBaseUpgradeable\n function _protectedTokens() internal view override returns (address[] memory) {\n address[] memory protected = new address[](2);\n protected[0] = address(want);\n protected[1] = address(eToken);\n return protected;\n }\n\n // ============================= VIRTUAL FUNCTIONS =============================\n\n /// @notice Allows the lender to stake its eTokens in an external staking contract\n function _stakeAll() internal virtual {}\n\n /// @notice Allows the lender to unstake its eTokens from an external staking contract\n /// @return Amount of eTokens actually unstaked\n function _unstake(uint256) internal virtual returns (uint256) {\n return 0;\n }\n\n /// @notice Gets the value of the eTokens currently staked\n function _stakedBalance() internal view virtual returns (uint256) {\n return (0);\n }\n\n /// @notice Calculates APR from Liquidity Mining Program\n /// @dev amountToAdd Amount to add to the currently supplied liquidity (for the `aprAfterDeposit` function)\n function _stakingApr(int256) internal view virtual returns (uint256) {\n return 0;\n }\n}\n" + }, + "contracts/strategies/OptimizerAPR/genericLender/euler/GenericEulerStaker.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport { IEulerExec } from \"../../../../interfaces/external/euler/IEuler.sol\";\nimport \"../../../../interfaces/external/euler/IEulerStakingRewards.sol\";\nimport \"@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol\";\nimport \"./GenericEuler.sol\";\n\n/// @title GenericEulerStaker\n/// @author Angle Core Team\n/// @notice `GenericEuler` with staking to earn EUL incentives\ncontract GenericEulerStaker is GenericEuler {\n using SafeERC20 for IERC20;\n using Address for address;\n\n // ================================= CONSTANTS =================================\n uint32 internal constant _TWAP_PERIOD = 1 minutes;\n IEulerExec private constant _EXEC = IEulerExec(0x59828FdF7ee634AaaD3f58B19fDBa3b03E2D9d80);\n IERC20 private constant _EUL = IERC20(0xd9Fcd98c322942075A5C3860693e9f4f03AAE07b);\n\n // ================================= VARIABLES =================================\n IEulerStakingRewards public eulerStakingContract;\n AggregatorV3Interface public chainlinkOracle;\n uint8 public isUniMultiplied;\n\n // ================================ CONSTRUCTOR ================================\n\n /// @notice Wrapper built on top of the `initializeEuler` method to initialize the contract\n function initialize(\n address _strategy,\n string memory _name,\n address[] memory governorList,\n address guardian,\n address[] memory keeperList,\n address oneInch_,\n IEulerStakingRewards _eulerStakingContract,\n AggregatorV3Interface _chainlinkOracle\n ) external {\n initializeEuler(_strategy, _name, governorList, guardian, keeperList, oneInch_);\n eulerStakingContract = _eulerStakingContract;\n chainlinkOracle = _chainlinkOracle;\n IERC20(address(eToken)).safeApprove(address(_eulerStakingContract), type(uint256).max);\n IERC20(_EUL).safeApprove(oneInch_, type(uint256).max);\n }\n\n // ============================= EXTERNAL FUNCTION =============================\n\n /// @notice Claim earned EUL\n function claimRewards() external {\n eulerStakingContract.getReward();\n }\n\n // ============================= VIRTUAL FUNCTIONS =============================\n\n /// @inheritdoc GenericEuler\n function _stakeAll() internal override {\n eulerStakingContract.stake(eToken.balanceOf(address(this)));\n }\n\n /// @inheritdoc GenericEuler\n function _unstake(uint256 amount) internal override returns (uint256 eTokensUnstaked) {\n // Take an upper bound as when withdrawing from Euler there could be rounding issue\n eTokensUnstaked = eToken.convertUnderlyingToBalance(amount) + 1;\n eulerStakingContract.withdraw(eTokensUnstaked);\n }\n\n /// @inheritdoc GenericEuler\n function _stakedBalance() internal view override returns (uint256 amount) {\n uint256 amountInEToken = eulerStakingContract.balanceOf(address(this));\n amount = eToken.convertBalanceToUnderlying(amountInEToken);\n }\n\n /// @inheritdoc GenericEuler\n function _stakingApr(int256 amount) internal view override returns (uint256 apr) {\n uint256 periodFinish = eulerStakingContract.periodFinish();\n uint256 newTotalSupply = eToken.convertBalanceToUnderlying(eulerStakingContract.totalSupply());\n if (amount >= 0) newTotalSupply += uint256(amount);\n else newTotalSupply -= uint256(-amount);\n if (periodFinish <= block.timestamp || newTotalSupply == 0) return 0;\n // APRs are in 1e18 and a 5% penalty on the EUL price is taken to avoid overestimations\n // `_estimatedEulToWant()` and eTokens are in base 18\n apr =\n (_estimatedEulToWant(eulerStakingContract.rewardRate() * _SECONDS_IN_YEAR) * 9_500 * 10**6) /\n 10_000 /\n newTotalSupply;\n }\n\n // ============================= INTERNAL FUNCTIONS ============================\n\n /// @notice Estimates the amount of `want` we will get out by swapping it for EUL\n /// @param quoteAmount The amount to convert in the out-currency\n /// @return The value of the `quoteAmount` expressed in out-currency\n /// @dev Uses Euler TWAP and Chainlink spot price\n function _estimatedEulToWant(uint256 quoteAmount) internal view returns (uint256) {\n (uint256 twapEUL, ) = _EXEC.getPrice(address(_EUL));\n return _quoteOracleEUL((quoteAmount * twapEUL) / 10**18);\n }\n\n // ============================= VIRTUAL FUNCTIONS =============================\n\n /// @notice Return quote amount of the EUL amount\n function _quoteOracleEUL(uint256 amount) internal view virtual returns (uint256 quoteAmount) {\n // No stale checks are made as it is only used to estimate the staking APR\n (, int256 ethPriceUSD, , , ) = chainlinkOracle.latestRoundData();\n // ethPriceUSD is in base 8\n return (uint256(ethPriceUSD) * amount) / 1e8;\n }\n}\n" + }, + "contracts/strategies/OptimizerAPR/genericLender/GenericLenderBaseUpgradeable.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport \"@openzeppelin/contracts/utils/Address.sol\";\n\nimport \"../../../external/AccessControlAngleUpgradeable.sol\";\n\nimport \"../../../interfaces/IGenericLender.sol\";\nimport \"../../../interfaces/IPoolManager.sol\";\nimport \"../../../interfaces/IStrategy.sol\";\n\nimport \"../../../utils/Errors.sol\";\n\n/// @title GenericLenderBaseUpgradeable\n/// @author Forked from https://github.com/Grandthrax/yearnV2-generic-lender-strat/tree/master/contracts/GenericLender\n/// @notice A base contract to build contracts that lend assets to protocols\nabstract contract GenericLenderBaseUpgradeable is IGenericLender, AccessControlAngleUpgradeable {\n using SafeERC20 for IERC20;\n\n bytes32 public constant GUARDIAN_ROLE = 0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041;\n bytes32 public constant STRATEGY_ROLE = 0x928286c473ded01ff8bf61a1986f14a0579066072fa8261442d9fea514d93a4c;\n bytes32 public constant KEEPER_ROLE = 0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab;\n\n // ========================= REFERENCES AND PARAMETERS =========================\n\n /// @inheritdoc IGenericLender\n string public override lenderName;\n /// @notice Reference to the protocol's collateral poolManager\n IPoolManager public poolManager;\n /// @inheritdoc IGenericLender\n address public override strategy;\n /// @notice Reference to the token lent\n IERC20 public want;\n /// @notice Base of the asset handled by the lender\n uint256 public wantBase;\n /// @notice 1inch Aggregation router\n address internal _oneInch;\n\n uint256[44] private __gapBaseLender;\n\n // ================================ INITIALIZER ================================\n\n /// @notice Initializer of the `GenericLenderBase`\n /// @param _strategy Reference to the strategy using this lender\n /// @param _name Name of the lender\n /// @param governorList List of addresses with governor privilege\n /// @param guardian Address of the guardian\n /// @param keeperList List of keeper addresses\n function _initialize(\n address _strategy,\n string memory _name,\n address[] memory governorList,\n address guardian,\n address[] memory keeperList,\n address oneInch_\n ) internal initializer {\n _oneInch = oneInch_;\n strategy = _strategy;\n // The corresponding `PoolManager` is inferred from the `Strategy`\n poolManager = IPoolManager(IStrategy(strategy).poolManager());\n want = IERC20(poolManager.token());\n lenderName = _name;\n\n _setupRole(GUARDIAN_ROLE, address(poolManager));\n uint256 governorListLength = governorList.length;\n for (uint256 i; i < governorListLength; ++i) {\n _setupRole(GUARDIAN_ROLE, governorList[i]);\n }\n\n _setupRole(KEEPER_ROLE, guardian);\n uint256 keeperListLength = keeperList.length;\n for (uint256 i; i < keeperListLength; ++i) {\n _setupRole(KEEPER_ROLE, keeperList[i]);\n }\n\n _setRoleAdmin(KEEPER_ROLE, GUARDIAN_ROLE);\n\n _setupRole(GUARDIAN_ROLE, guardian);\n _setupRole(STRATEGY_ROLE, _strategy);\n _setRoleAdmin(GUARDIAN_ROLE, STRATEGY_ROLE);\n _setRoleAdmin(STRATEGY_ROLE, GUARDIAN_ROLE);\n wantBase = 10**IERC20Metadata(address(want)).decimals();\n want.safeApprove(_strategy, type(uint256).max);\n }\n\n /// @custom:oz-upgrades-unsafe-allow constructor\n constructor() initializer {}\n\n // =============================== VIEW FUNCTIONS ==============================\n\n /// @inheritdoc IGenericLender\n function apr() external view override returns (uint256) {\n return _apr();\n }\n\n /// @inheritdoc IGenericLender\n function weightedApr() external view override returns (uint256) {\n uint256 a = _apr();\n return a * _nav();\n }\n\n /// @inheritdoc IGenericLender\n function nav() external view override returns (uint256) {\n return _nav();\n }\n\n /// @inheritdoc IGenericLender\n function hasAssets() external view virtual override returns (bool) {\n return _nav() > 10 * wantBase;\n }\n\n /// @notice See `nav`\n function _nav() internal view returns (uint256) {\n return want.balanceOf(address(this)) + underlyingBalanceStored();\n }\n\n /// @notice See `apr`\n function _apr() internal view virtual returns (uint256);\n\n /// @notice Returns the current balance invested in the lender and related staking contracts\n function underlyingBalanceStored() public view virtual returns (uint256 balance);\n\n // ================================= GOVERNANCE ================================\n\n /// @notice Override this to add all tokens/tokenized positions this contract\n /// manages on a *persistent* basis (e.g. not just for swapping back to\n /// want ephemerally).\n ///\n /// Example:\n /// ```\n /// function _protectedTokens() internal override view returns (address[] memory) {\n /// address[] memory protected = new address[](3);\n /// protected[0] = tokenA;\n /// protected[1] = tokenB;\n /// protected[2] = tokenC;\n /// return protected;\n /// }\n /// ```\n function _protectedTokens() internal view virtual returns (address[] memory);\n\n /// @inheritdoc IGenericLender\n function sweep(address _token, address to) external override onlyRole(GUARDIAN_ROLE) {\n address[] memory __protectedTokens = _protectedTokens();\n uint256 protectedTokensLength = __protectedTokens.length;\n for (uint256 i; i < protectedTokensLength; ++i) if (_token == __protectedTokens[i]) revert ProtectedToken();\n\n IERC20(_token).safeTransfer(to, IERC20(_token).balanceOf(address(this)));\n }\n\n /// @notice Changes allowance of a set of tokens to addresses\n /// @param tokens Addresses of the tokens for which approvals should be made\n /// @param spenders Addresses to approve\n /// @param amounts Approval amounts for each address\n function changeAllowance(\n IERC20[] calldata tokens,\n address[] calldata spenders,\n uint256[] calldata amounts\n ) external onlyRole(GUARDIAN_ROLE) {\n if (tokens.length != spenders.length || tokens.length != amounts.length) revert IncompatibleLengths();\n uint256 tokensLength = tokens.length;\n for (uint256 i; i < tokensLength; ++i) {\n _changeAllowance(tokens[i], spenders[i], amounts[i]);\n }\n }\n\n /// @notice Changes oneInch contract address\n /// @param oneInch_ Addresses of the new 1inch api endpoint contract\n function set1Inch(address oneInch_) external onlyRole(GUARDIAN_ROLE) {\n _oneInch = oneInch_;\n }\n\n /// @notice Swap earned _stkAave or Aave for `want` through 1Inch\n /// @param minAmountOut Minimum amount of `want` to receive for the swap to happen\n /// @param payload Bytes needed for 1Inch API\n /// @dev In the case of a contract lending to Aave, tokens swapped should typically be: _stkAave -> `want` or Aave -> `want`\n function sellRewards(uint256 minAmountOut, bytes memory payload) external onlyRole(KEEPER_ROLE) {\n //solhint-disable-next-line\n (bool success, bytes memory result) = _oneInch.call(payload);\n if (!success) _revertBytes(result);\n\n uint256 amountOut = abi.decode(result, (uint256));\n if (amountOut < minAmountOut) revert TooSmallAmount();\n }\n\n /// @notice Internal function used for error handling\n function _revertBytes(bytes memory errMsg) internal pure {\n if (errMsg.length != 0) {\n //solhint-disable-next-line\n assembly {\n revert(add(32, errMsg), mload(errMsg))\n }\n }\n revert ErrorSwap();\n }\n\n /// @notice Changes allowance of a set of tokens to addresses\n /// @param token Address of the token for which approval should be made\n /// @param spender Address to approve\n /// @param amount Approval amount\n function _changeAllowance(\n IERC20 token,\n address spender,\n uint256 amount\n ) internal {\n uint256 currentAllowance = token.allowance(address(this), address(spender));\n if (currentAllowance < amount) {\n token.safeIncreaseAllowance(address(spender), amount - currentAllowance);\n } else if (currentAllowance > amount) {\n token.safeDecreaseAllowance(address(spender), currentAllowance - amount);\n }\n }\n}\n" + }, + "contracts/strategies/OptimizerAPR/OptimizerAPRGreedyStrategy.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport { Math } from \"@openzeppelin/contracts/utils/math/Math.sol\";\n\nimport \"../BaseStrategyUpgradeable.sol\";\n\nimport \"../../interfaces/IGenericLender.sol\";\n\n/// @title OptimizerAPRGreedyStrategy\n/// @author Forked from https://github.com/Grandthrax/yearnV2-generic-lender-strat\n/// @notice A lender optimisation strategy for any ERC20 asset\n/// @dev This strategy works by taking plugins designed for standard lending platforms\n/// It automatically chooses the best yield generating platform and adjusts accordingly\n/// The adjustment is sub optimal so there is an additional option to manually set position\ncontract OptimizerAPRGreedyStrategy is BaseStrategyUpgradeable {\n using SafeERC20 for IERC20;\n using Address for address;\n\n // ================================= REFERENCES ================================\n\n IGenericLender[] public lenders;\n\n // ================================= PARAMETERS ================================\n\n uint256 public withdrawalThreshold;\n\n // =================================== EVENTS ==================================\n\n event AddLender(address indexed lender);\n event RemoveLender(address indexed lender);\n\n // ================================ CONSTRUCTOR ================================\n\n /// @notice Constructor of the `Strategy`\n /// @param _poolManager Address of the `PoolManager` lending to this strategy\n /// @param governor Address with governor privilege\n /// @param guardian Address of the guardian\n function initialize(\n address _poolManager,\n address governor,\n address guardian,\n address[] memory keepers\n ) external {\n _initialize(_poolManager, governor, guardian, keepers);\n withdrawalThreshold = 1000 * wantBase;\n }\n\n // ============================= INTERNAL MECHANICS ============================\n\n /// @notice Frees up profit plus `_debtOutstanding`.\n /// @param _debtOutstanding Amount to withdraw\n /// @return _profit Profit freed by the call\n /// @return _loss Loss discovered by the call\n /// @return _debtPayment Amount freed to reimburse the debt\n /// @dev If `_debtOutstanding` is more than we can free we get as much as possible.\n function _prepareReturn(uint256 _debtOutstanding)\n internal\n override\n returns (\n uint256 _profit,\n uint256 _loss,\n uint256 _debtPayment\n )\n {\n _profit = 0; //default assignments for clarity\n _loss = 0;\n _debtPayment = _debtOutstanding;\n\n uint256 lentAssets = lentTotalAssets();\n\n uint256 looseAssets = want.balanceOf(address(this));\n\n uint256 total = looseAssets + lentAssets;\n\n if (lentAssets == 0) {\n // No position to harvest or profit to report\n if (_debtPayment > looseAssets) {\n // We can only return looseAssets\n _debtPayment = looseAssets;\n }\n\n return (_profit, _loss, _debtPayment);\n }\n\n uint256 debt = poolManager.strategies(address(this)).totalStrategyDebt;\n\n if (total > debt) {\n _profit = total - debt;\n\n uint256 amountToFree = _profit + _debtPayment;\n // We need to add outstanding to our profit\n // don't need to do logic if there is nothing to free\n if (amountToFree != 0 && looseAssets < amountToFree) {\n // Withdraw what we can withdraw\n _withdrawSome(amountToFree - looseAssets);\n uint256 newLoose = want.balanceOf(address(this));\n\n // If we dont have enough money adjust _debtOutstanding and only change profit if needed\n if (newLoose < amountToFree) {\n if (_profit > newLoose) {\n _profit = newLoose;\n _debtPayment = 0;\n } else {\n _debtPayment = Math.min(newLoose - _profit, _debtPayment);\n }\n }\n }\n } else {\n // Serious loss should never happen but if it does lets record it accurately\n _loss = debt - total;\n\n uint256 amountToFree = _loss + _debtPayment;\n if (amountToFree != 0 && looseAssets < amountToFree) {\n // Withdraw what we can withdraw\n\n _withdrawSome(amountToFree - looseAssets);\n uint256 newLoose = want.balanceOf(address(this));\n\n // If we dont have enough money adjust `_debtOutstanding` and only change profit if needed\n if (newLoose < amountToFree) {\n if (_loss > newLoose) {\n _loss = newLoose;\n _debtPayment = 0;\n } else {\n _debtPayment = Math.min(newLoose - _loss, _debtPayment);\n }\n }\n }\n }\n }\n\n /// @notice Estimates highest and lowest apr lenders among a `lendersList`\n /// @param lendersList List of all the lender contracts associated to this strategy\n /// @return _lowest The index of the lender in the `lendersList` with lowest apr\n /// @return _lowestApr The lowest apr\n /// @return _highest The index of the lender with highest apr\n /// @return _potential The potential apr of this lender if funds are moved from lowest to highest\n /// @dev `lendersList` is kept as a parameter to avoid multiplying reads in storage to the `lenders`\n /// array\n function _estimateAdjustPosition(IGenericLender[] memory lendersList)\n internal\n view\n returns (\n uint256 _lowest,\n uint256 _lowestApr,\n uint256 _highest,\n uint256 _potential\n )\n {\n // All loose assets are to be invested\n uint256 looseAssets = want.balanceOf(address(this));\n\n // Simple algo:\n // - Get the lowest apr strat\n // - Cycle through and see who could take its funds plus want for the highest apr\n _lowestApr = type(uint256).max;\n _lowest = 0;\n uint256 lowestNav = 0;\n uint256 highestApr = 0;\n _highest = 0;\n uint256 length = lendersList.length;\n for (uint256 i = 0; i < length; i++) {\n uint256 aprAfterDeposit = lendersList[i].aprAfterDeposit(int256(looseAssets));\n if (aprAfterDeposit > highestApr) {\n highestApr = aprAfterDeposit;\n _highest = i;\n }\n\n if (lendersList[i].hasAssets()) {\n uint256 apr = lendersList[i].apr();\n if (apr < _lowestApr) {\n _lowestApr = apr;\n _lowest = i;\n lowestNav = lendersList[i].nav();\n }\n }\n }\n\n //if we can improve apr by withdrawing we do so\n _potential = lendersList[_highest].aprAfterDeposit(int256(lowestNav + looseAssets));\n }\n\n /// @notice Function called by keepers to adjust the position\n /// @dev The algorithm moves assets from lowest return to highest\n /// like a very slow idiot bubble sort\n function _adjustPosition() internal override {\n // Emergency exit is dealt with at beginning of harvest\n if (emergencyExit) {\n return;\n }\n // Storing the `lenders` array in a cache variable\n IGenericLender[] memory lendersList = lenders;\n // We just keep all money in want if we dont have any lenders\n if (lendersList.length == 0) {\n return;\n }\n\n (uint256 lowest, uint256 lowestApr, uint256 highest, uint256 potential) = _estimateAdjustPosition(lendersList);\n\n if (potential > lowestApr) {\n // Apr should go down after deposit so won't be withdrawing from self\n lendersList[lowest].withdrawAll();\n }\n\n uint256 bal = want.balanceOf(address(this));\n if (bal > 0) {\n want.safeTransfer(address(lendersList[highest]), bal);\n lendersList[highest].deposit();\n }\n }\n\n /// @notice Function needed to inherit the baseStrategyUpgradeable\n function _adjustPosition(uint256) internal override {\n _adjustPosition();\n }\n\n /// @notice Withdraws a given amount from lenders\n /// @param _amount The amount to withdraw\n /// @dev Cycle through withdrawing from worst rate first\n function _withdrawSome(uint256 _amount) internal returns (uint256 amountWithdrawn) {\n IGenericLender[] memory lendersList = lenders;\n if (lendersList.length == 0) {\n return 0;\n }\n\n // Don't withdraw dust\n if (_amount < withdrawalThreshold) {\n return 0;\n }\n\n amountWithdrawn = 0;\n // In most situations this will only run once. Only big withdrawals will be a gas guzzler\n uint256 j = 0;\n while (amountWithdrawn < _amount - withdrawalThreshold) {\n uint256 lowestApr = type(uint256).max;\n uint256 lowest = 0;\n for (uint256 i = 0; i < lendersList.length; i++) {\n if (lendersList[i].hasAssets()) {\n uint256 apr = lendersList[i].apr();\n if (apr < lowestApr) {\n lowestApr = apr;\n lowest = i;\n }\n }\n }\n if (!lendersList[lowest].hasAssets()) {\n return amountWithdrawn;\n }\n uint256 amountWithdrawnFromStrat = lendersList[lowest].withdraw(_amount - amountWithdrawn);\n // To avoid staying on the same strat if we can't withdraw anythin from it\n amountWithdrawn = amountWithdrawn + amountWithdrawnFromStrat;\n j++;\n // not best solution because it would be better to move to the 2nd lowestAPR instead of quiting\n if (amountWithdrawnFromStrat == 0) {\n return amountWithdrawn;\n }\n // To avoid want infinite loop\n if (j >= 6) {\n return amountWithdrawn;\n }\n }\n }\n\n /// @notice Liquidates up to `_amountNeeded` of `want` of this strategy's positions,\n /// irregardless of slippage. Any excess will be re-invested with `_adjustPosition()`.\n /// This function should return the amount of `want` tokens made available by the\n /// liquidation. If there is a difference between them, `_loss` indicates whether the\n /// difference is due to a realized loss, or if there is some other sitution at play\n /// (e.g. locked funds) where the amount made available is less than what is needed.\n ///\n /// NOTE: The invariant `_liquidatedAmount + _loss <= _amountNeeded` should always be maintained\n function _liquidatePosition(uint256 _amountNeeded) internal override returns (uint256 _amountFreed, uint256 _loss) {\n uint256 _balance = want.balanceOf(address(this));\n\n if (_balance >= _amountNeeded) {\n //if we don't set reserve here withdrawer will be sent our full balance\n return (_amountNeeded, 0);\n } else {\n uint256 received = _withdrawSome(_amountNeeded - _balance) + (_balance);\n if (received >= _amountNeeded) {\n return (_amountNeeded, 0);\n } else {\n return (received, 0);\n }\n }\n }\n\n /// @notice Liquidates everything and returns the amount that got freed.\n /// This function is used during emergency exit instead of `_prepareReturn()` to\n /// liquidate all of the Strategy's positions back to the Manager.\n function _liquidateAllPositions() internal override returns (uint256 _amountFreed) {\n (_amountFreed, ) = _liquidatePosition(estimatedTotalAssets());\n }\n\n // =============================== VIEW FUNCTIONS ==============================\n\n /// @notice View function to check the current state of the strategy\n /// @return Returns the status of all lenders attached the strategy\n function lendStatuses() external view returns (LendStatus[] memory) {\n uint256 lendersListLength = lenders.length;\n LendStatus[] memory statuses = new LendStatus[](lendersListLength);\n for (uint256 i = 0; i < lendersListLength; i++) {\n LendStatus memory s;\n s.name = lenders[i].lenderName();\n s.add = address(lenders[i]);\n s.assets = lenders[i].nav();\n s.rate = lenders[i].apr();\n statuses[i] = s;\n }\n return statuses;\n }\n\n /// @notice View function to check the total assets lent\n function lentTotalAssets() public view returns (uint256) {\n uint256 nav = 0;\n for (uint256 i = 0; i < lenders.length; i++) {\n nav = nav + lenders[i].nav();\n }\n return nav;\n }\n\n /// @notice View function to check the total assets managed by the strategy\n function estimatedTotalAssets() public view override returns (uint256 nav) {\n nav = lentTotalAssets() + want.balanceOf(address(this));\n }\n\n /// @notice View function to check the number of lending platforms\n function numLenders() external view returns (uint256) {\n return lenders.length;\n }\n\n /// @notice The weighted apr of all lenders. sum(nav * apr)/totalNav\n function estimatedAPR() external view returns (uint256) {\n uint256 bal = estimatedTotalAssets();\n if (bal == 0) {\n return 0;\n }\n\n uint256 weightedAPR = 0;\n\n for (uint256 i = 0; i < lenders.length; i++) {\n weightedAPR = weightedAPR + lenders[i].weightedApr();\n }\n\n return weightedAPR / bal;\n }\n\n /// @notice Prevents the governance from withdrawing want tokens\n function _protectedTokens() internal view override returns (address[] memory) {\n address[] memory protected = new address[](1);\n protected[0] = address(want);\n return protected;\n }\n\n // ================================= GOVERNANCE ================================\n\n struct LenderRatio {\n address lender;\n //share x 1000\n uint16 share;\n }\n\n /// @notice Reallocates all funds according to a new distribution\n /// @param _newPositions List of shares to specify the new allocation\n /// @dev Share must add up to 1000. 500 means 50% etc\n /// @dev This code has been forked, so we have not thoroughly tested it\n function manualAllocation(LenderRatio[] memory _newPositions) external onlyRole(GUARDIAN_ROLE) {\n IGenericLender[] memory lendersList = lenders;\n uint256 share = 0;\n for (uint256 i = 0; i < lendersList.length; i++) {\n lendersList[i].withdrawAll();\n }\n\n uint256 assets = want.balanceOf(address(this));\n\n for (uint256 i = 0; i < _newPositions.length; i++) {\n bool found = false;\n\n //might be annoying and expensive to do this second loop but worth it for safety\n for (uint256 j = 0; j < lendersList.length; j++) {\n if (address(lendersList[j]) == _newPositions[i].lender) {\n found = true;\n }\n }\n require(found, \"94\");\n\n share = share + _newPositions[i].share;\n uint256 toSend = (assets * _newPositions[i].share) / 1000;\n want.safeTransfer(_newPositions[i].lender, toSend);\n IGenericLender(_newPositions[i].lender).deposit();\n }\n\n require(share == 1000, \"95\");\n }\n\n /// @notice Changes the withdrawal threshold\n /// @param _threshold The new withdrawal threshold\n /// @dev governor, guardian or `PoolManager` only\n function setWithdrawalThreshold(uint256 _threshold) external onlyRole(GUARDIAN_ROLE) {\n withdrawalThreshold = _threshold;\n }\n\n /// @notice Add lenders for the strategy to choose between\n /// @param newLender The adapter to the added lending platform\n /// @dev Governor, guardian or `PoolManager` only\n function addLender(IGenericLender newLender) external onlyRole(GUARDIAN_ROLE) {\n require(newLender.strategy() == address(this), \"96\");\n\n for (uint256 i = 0; i < lenders.length; i++) {\n require(address(newLender) != address(lenders[i]), \"97\");\n }\n lenders.push(newLender);\n\n emit AddLender(address(newLender));\n }\n\n /// @notice Removes a lending platform and fails if total withdrawal is impossible\n /// @param lender The address of the adapter to the lending platform to remove\n function safeRemoveLender(address lender) external onlyRole(GUARDIAN_ROLE) {\n _removeLender(lender, false);\n }\n\n /// @notice Removes a lending platform and even if total withdrawal is impossible\n /// @param lender The address of the adapter to the lending platform to remove\n function forceRemoveLender(address lender) external onlyRole(GUARDIAN_ROLE) {\n _removeLender(lender, true);\n }\n\n /// @notice Internal function to handle lending platform removing\n /// @param lender The address of the adapter for the lending platform to remove\n /// @param force Whether it is required that all the funds are withdrawn prior to removal\n function _removeLender(address lender, bool force) internal {\n IGenericLender[] memory lendersList = lenders;\n for (uint256 i = 0; i < lendersList.length; i++) {\n if (lender == address(lendersList[i])) {\n bool allWithdrawn = lendersList[i].withdrawAll();\n\n if (!force) {\n require(allWithdrawn, \"98\");\n }\n\n // Put the last index here\n // then remove last index\n if (i != lendersList.length - 1) {\n lenders[i] = lendersList[lendersList.length - 1];\n }\n\n // Pop shortens array by 1 thereby deleting the last index\n lenders.pop();\n\n // If balance to spend we might as well put it into the best lender\n if (want.balanceOf(address(this)) > 0) {\n _adjustPosition();\n }\n\n emit RemoveLender(lender);\n\n return;\n }\n }\n require(false, \"94\");\n }\n\n // ============================= MANAGER FUNCTIONS =============================\n\n /// @notice Adds a new guardian address and echoes the change to the contracts\n /// that interact with this collateral `PoolManager`\n /// @param _guardian New guardian address\n /// @dev This internal function has to be put in this file because `AccessControl` is not defined\n /// in `PoolManagerInternal`\n function addGuardian(address _guardian) external override onlyRole(POOLMANAGER_ROLE) {\n // Granting the new role\n // Access control for this contract\n _grantRole(GUARDIAN_ROLE, _guardian);\n // Propagating the new role in other contract\n for (uint256 i = 0; i < lenders.length; i++) {\n lenders[i].grantRole(GUARDIAN_ROLE, _guardian);\n }\n }\n\n /// @notice Revokes the guardian role and propagates the change to other contracts\n /// @param guardian Old guardian address to revoke\n function revokeGuardian(address guardian) external override onlyRole(POOLMANAGER_ROLE) {\n _revokeRole(GUARDIAN_ROLE, guardian);\n for (uint256 i = 0; i < lenders.length; i++) {\n lenders[i].revokeRole(GUARDIAN_ROLE, guardian);\n }\n }\n}\n" + }, + "contracts/strategies/OptimizerAPR/OptimizerAPRStrategy.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport { Math } from \"@openzeppelin/contracts/utils/math/Math.sol\";\n\nimport \"../BaseStrategyUpgradeable.sol\";\n\nimport \"../../interfaces/IGenericLender.sol\";\n\n/// @title OptimizerAPRStrategy\n/// @author Angle Labs, Inc.\n/// @notice A lender optimisation strategy for any ERC20 asset, leveraging multiple lenders at once\n/// @dev This strategy works by taking plugins designed for standard lending platforms and automatically\n/// chooses to invest its funds in the best platforms to generate yield.\n/// The allocation is greedy and may be sub-optimal so there is an additional option to manually set positions\ncontract OptimizerAPRStrategy is BaseStrategyUpgradeable {\n using SafeERC20 for IERC20;\n using Address for address;\n\n // ================================= CONSTANTS =================================\n\n uint64 internal constant _BPS = 10000;\n\n // ============================ CONTRACTS REFERENCES ===========================\n\n IGenericLender[] public lenders;\n\n // ================================= PARAMETERS ================================\n\n uint256 public withdrawalThreshold;\n\n // =================================== EVENTS ==================================\n\n event AddLender(address indexed lender);\n event RemoveLender(address indexed lender);\n\n /// @notice Constructor of the `Strategy`\n /// @param _poolManager Address of the `PoolManager` lending to this strategy\n /// @param governor Address with governor privilege\n /// @param guardian Address of the guardian\n function initialize(\n address _poolManager,\n address governor,\n address guardian,\n address[] memory keepers\n ) external {\n _initialize(_poolManager, governor, guardian, keepers);\n withdrawalThreshold = 1000 * wantBase;\n }\n\n // ============================= INTERNAL FUNCTIONS ============================\n\n /// @notice Frees up profit plus `_debtOutstanding`.\n /// @param _debtOutstanding Amount to withdraw\n /// @return _profit Profit freed by the call\n /// @return _loss Loss discovered by the call\n /// @return _debtPayment Amount freed to reimburse the debt\n /// @dev If `_debtOutstanding` is more than we can free we get as much as possible.\n function _prepareReturn(uint256 _debtOutstanding)\n internal\n override\n returns (\n uint256 _profit,\n uint256 _loss,\n uint256 _debtPayment\n )\n {\n _debtPayment = _debtOutstanding;\n\n uint256 lentAssets = lentTotalAssets();\n\n uint256 looseAssets = want.balanceOf(address(this));\n\n uint256 total = looseAssets + lentAssets;\n\n if (lentAssets == 0) {\n // No position to harvest or profit to report\n if (_debtPayment > looseAssets) {\n // We can only return looseAssets\n _debtPayment = looseAssets;\n }\n\n return (_profit, _loss, _debtPayment);\n }\n\n uint256 debt = poolManager.strategies(address(this)).totalStrategyDebt;\n\n if (total > debt) {\n _profit = total - debt;\n\n uint256 amountToFree = _profit + _debtPayment;\n // We need to add outstanding to our profit\n // don't need to do logic if there is nothing to free\n if (amountToFree != 0 && looseAssets < amountToFree) {\n // Withdraw what we can withdraw\n _withdrawSome(amountToFree - looseAssets);\n uint256 newLoose = want.balanceOf(address(this));\n\n // If we dont have enough money adjust _debtOutstanding and only change profit if needed\n if (newLoose < amountToFree) {\n if (_profit > newLoose) {\n _profit = newLoose;\n _debtPayment = 0;\n } else {\n _debtPayment = Math.min(newLoose - _profit, _debtPayment);\n }\n }\n }\n } else {\n // Serious loss should never happen but if it does lets record it accurately\n _loss = debt - total;\n\n uint256 amountToFree = _loss + _debtPayment;\n if (amountToFree != 0 && looseAssets < amountToFree) {\n // Withdraw what we can withdraw\n\n _withdrawSome(amountToFree - looseAssets);\n uint256 newLoose = want.balanceOf(address(this));\n\n // If we dont have enough money adjust `_debtOutstanding` and only change profit if needed\n if (newLoose < amountToFree) {\n if (_loss > newLoose) {\n _loss = newLoose;\n _debtPayment = 0;\n } else {\n _debtPayment = Math.min(newLoose - _loss, _debtPayment);\n }\n }\n }\n }\n }\n\n /// @notice Estimates highest and lowest apr lenders among a `lendersList`\n /// @param lendersList List of all the lender contracts associated to this strategy\n /// @return _lowest The index of the lender in the `lendersList` with lowest apr\n /// @return _highest The index of the lender with highest apr\n /// @return _investmentStrategy Whether we should invest from the lowest to the highest yielding strategy or simply invest loose assets\n /// @return _totalApr The APR computed according to (greedy) heuristics that will determine whether positions should be adjusted\n /// according to the solution proposed by the caller or according to the greedy method\n /// @dev `lendersList` is kept as a parameter to avoid multiplying reads in storage to the `lenders` array\n function _estimateGreedyAdjustPosition(IGenericLender[] memory lendersList)\n internal\n view\n returns (\n uint256 _lowest,\n uint256 _highest,\n bool _investmentStrategy,\n uint256 _totalApr\n )\n {\n // All loose assets are to be invested\n uint256 looseAssets = want.balanceOf(address(this));\n\n // Simple greedy algo:\n // - Get the lowest apr strat\n // - Cycle through and see who could take its funds to improve the overall highest APR\n uint256 lowestNav;\n uint256 highestApr;\n uint256 highestLenderNav;\n uint256 totalNav = looseAssets;\n uint256[] memory weightedAprs = new uint256[](lendersList.length);\n uint256 lendersListLength = lendersList.length;\n {\n uint256 lowestApr = type(uint256).max;\n for (uint256 i; i < lendersListLength; ++i) {\n uint256 aprAfterDeposit = lendersList[i].aprAfterDeposit(int256(looseAssets));\n uint256 nav = lendersList[i].nav();\n totalNav += nav;\n if (aprAfterDeposit > highestApr) {\n highestApr = aprAfterDeposit;\n highestLenderNav = nav;\n _highest = i;\n }\n // Checking strategies that have assets\n if (nav > 10 * wantBase) {\n uint256 apr = lendersList[i].apr();\n weightedAprs[i] = apr * nav;\n if (apr < lowestApr) {\n lowestApr = apr;\n lowestNav = nav;\n _lowest = i;\n }\n }\n }\n }\n\n // Comparing if we are better off removing from the lowest APR yielding strategy to invest in the highest or just invest\n // the loose assets in the highest yielding strategy\n if (totalNav > 0) {\n // Case where only loose assets are invested\n uint256 weightedApr1;\n // Case where funds are divested from the strategy with the lowest APR to be invested in the one with the highest APR\n uint256 weightedApr2;\n for (uint256 i; i < lendersListLength; ++i) {\n if (i == _highest) {\n weightedApr1 += (highestLenderNav + looseAssets) * highestApr;\n if (lowestNav != 0 && lendersListLength > 1)\n weightedApr2 +=\n (highestLenderNav + looseAssets + lowestNav) *\n lendersList[_highest].aprAfterDeposit(int256(lowestNav + looseAssets));\n } else if (i == _lowest) {\n weightedApr1 += weightedAprs[i];\n // In the second case funds are divested so the lowest strat does not contribute to the highest APR case\n } else {\n weightedApr1 += weightedAprs[i];\n weightedApr2 += weightedAprs[i];\n }\n }\n if (weightedApr2 > weightedApr1 && lendersList.length > 1) {\n _investmentStrategy = true;\n _totalApr = weightedApr2 / totalNav;\n } else _totalApr = weightedApr1 / totalNav;\n }\n }\n\n /// @inheritdoc BaseStrategyUpgradeable\n function _adjustPosition(bytes memory data) internal override {\n // Emergency exit is dealt with at beginning of harvest\n if (emergencyExit) return;\n\n // Storing the `lenders` array in a cache variable\n IGenericLender[] memory lendersList = lenders;\n uint256 lendersListLength = lendersList.length;\n // We just keep all money in `want` if we dont have any lenders\n if (lendersListLength == 0) return;\n\n uint64[] memory lenderSharesHint = abi.decode(data, (uint64[]));\n\n uint256 estimatedAprHint;\n int256[] memory lenderAdjustedAmounts;\n if (lenderSharesHint.length != 0) (estimatedAprHint, lenderAdjustedAmounts) = estimatedAPR(lenderSharesHint);\n (uint256 lowest, uint256 highest, bool _investmentStrategy, uint256 _totalApr) = _estimateGreedyAdjustPosition(\n lendersList\n );\n\n // The hint was successful --> we find a better allocation than the current one\n if (_totalApr < estimatedAprHint) {\n uint256 deltaWithdraw;\n for (uint256 i; i < lendersListLength; ++i) {\n if (lenderAdjustedAmounts[i] < 0) {\n deltaWithdraw +=\n uint256(-lenderAdjustedAmounts[i]) -\n lendersList[i].withdraw(uint256(-lenderAdjustedAmounts[i]));\n }\n }\n\n // If the strategy didn't succeed to withdraw the intended funds -> revert and force the greedy path\n if (deltaWithdraw > withdrawalThreshold) revert IncorrectDistribution();\n\n for (uint256 i; i < lendersListLength; ++i) {\n // As `deltaWithdraw` is inferior to `withdrawalThreshold` (a dust)\n // It is not critical to compensate on an arbitrary lender as it will only slightly impact global APR\n if (lenderAdjustedAmounts[i] > int256(deltaWithdraw)) {\n lenderAdjustedAmounts[i] -= int256(deltaWithdraw);\n deltaWithdraw = 0;\n want.safeTransfer(address(lendersList[i]), uint256(lenderAdjustedAmounts[i]));\n lendersList[i].deposit();\n } else if (lenderAdjustedAmounts[i] > 0) deltaWithdraw -= uint256(lenderAdjustedAmounts[i]);\n }\n } else {\n if (_investmentStrategy) {\n lendersList[lowest].withdrawAll();\n }\n\n uint256 bal = want.balanceOf(address(this));\n if (bal != 0) {\n want.safeTransfer(address(lendersList[highest]), bal);\n lendersList[highest].deposit();\n }\n }\n }\n\n /// @inheritdoc BaseStrategyUpgradeable\n function _adjustPosition() internal override {\n _adjustPosition(abi.encode(new uint64[](0)));\n }\n\n /// @inheritdoc BaseStrategyUpgradeable\n function _adjustPosition(uint256) internal override {\n _adjustPosition(abi.encode(new uint64[](0)));\n }\n\n /// @notice Withdraws a given amount from lenders\n /// @param _amount The amount to withdraw\n /// @dev Cycle through withdrawing from worst rate first\n function _withdrawSome(uint256 _amount) internal returns (uint256 amountWithdrawn) {\n IGenericLender[] memory lendersList = lenders;\n uint256 lendersListLength = lendersList.length;\n if (lendersListLength == 0) {\n return 0;\n }\n\n // Don't withdraw dust\n uint256 _withdrawalThreshold = withdrawalThreshold;\n if (_amount < _withdrawalThreshold) {\n return 0;\n }\n\n amountWithdrawn;\n // In most situations this will only run once. Only big withdrawals will be a gas guzzler\n uint256 j;\n while (amountWithdrawn < _amount - _withdrawalThreshold) {\n uint256 lowestApr = type(uint256).max;\n uint256 lowest;\n for (uint256 i; i < lendersListLength; ++i) {\n if (lendersList[i].hasAssets()) {\n uint256 apr = lendersList[i].apr();\n if (apr < lowestApr) {\n lowestApr = apr;\n lowest = i;\n }\n }\n }\n if (!lendersList[lowest].hasAssets()) {\n return amountWithdrawn;\n }\n uint256 amountWithdrawnFromStrat = lendersList[lowest].withdraw(_amount - amountWithdrawn);\n // To avoid staying on the same strat if we can't withdraw anythin from it\n amountWithdrawn += amountWithdrawnFromStrat;\n ++j;\n // not best solution because it would be better to move to the 2nd lowestAPR instead of quiting\n if (amountWithdrawnFromStrat == 0) {\n return amountWithdrawn;\n }\n // To avoid want infinite loop\n if (j >= 6) {\n return amountWithdrawn;\n }\n }\n }\n\n /// @notice Liquidates up to `_amountNeeded` of `want` of this strategy's positions,\n /// irregardless of slippage. Any excess will be re-invested with `_adjustPosition()`.\n /// This function should return the amount of `want` tokens made available by the\n /// liquidation. If there is a difference between them, `_loss` indicates whether the\n /// difference is due to a realized loss, or if there is some other sitution at play\n /// (e.g. locked funds) where the amount made available is less than what is needed.\n ///\n /// NOTE: The invariant `_liquidatedAmount + _loss <= _amountNeeded` should always be maintained\n function _liquidatePosition(uint256 _amountNeeded) internal override returns (uint256 _amountFreed, uint256 _loss) {\n uint256 _balance = want.balanceOf(address(this));\n\n if (_balance >= _amountNeeded) {\n //if we don't set reserve here withdrawer will be sent our full balance\n return (_amountNeeded, 0);\n } else {\n uint256 received = _withdrawSome(_amountNeeded - _balance) + (_balance);\n if (received >= _amountNeeded) {\n return (_amountNeeded, 0);\n } else {\n return (received, 0);\n }\n }\n }\n\n /// @notice Liquidates everything and returns the amount that got freed.\n /// This function is used during emergency exit instead of `_prepareReturn()` to\n /// liquidate all of the Strategy's positions back to the Manager.\n function _liquidateAllPositions() internal override returns (uint256 _amountFreed) {\n (_amountFreed, ) = _liquidatePosition(estimatedTotalAssets());\n }\n\n // =============================== VIEW FUNCTIONS ==============================\n\n /// @notice View function to check the current state of the strategy\n /// @return Returns the status of all lenders attached the strategy\n function lendStatuses() external view returns (LendStatus[] memory) {\n uint256 lendersLength = lenders.length;\n LendStatus[] memory statuses = new LendStatus[](lendersLength);\n for (uint256 i; i < lendersLength; ++i) {\n LendStatus memory s;\n s.name = lenders[i].lenderName();\n s.add = address(lenders[i]);\n s.assets = lenders[i].nav();\n s.rate = lenders[i].apr();\n statuses[i] = s;\n }\n return statuses;\n }\n\n /// @notice View function to check the total assets lent\n function lentTotalAssets() public view returns (uint256) {\n uint256 nav;\n uint256 lendersLength = lenders.length;\n for (uint256 i; i < lendersLength; ++i) {\n nav += lenders[i].nav();\n }\n return nav;\n }\n\n /// @notice View function to check the total assets managed by the strategy\n function estimatedTotalAssets() public view override returns (uint256 nav) {\n nav = lentTotalAssets() + want.balanceOf(address(this));\n }\n\n /// @notice View function to check the number of lending platforms\n function numLenders() external view returns (uint256) {\n return lenders.length;\n }\n\n /// @notice Returns the weighted apr of all lenders\n /// @dev It's computed by doing: `sum(nav * apr) / totalNav`\n function estimatedAPR() external view returns (uint256) {\n uint256 bal = estimatedTotalAssets();\n if (bal == 0) {\n return 0;\n }\n\n uint256 weightedAPR;\n uint256 lendersLength = lenders.length;\n for (uint256 i; i < lendersLength; ++i) {\n weightedAPR += lenders[i].weightedApr();\n }\n\n return weightedAPR / bal;\n }\n\n /// @notice Returns the weighted apr in an hypothetical world where the strategy splits its nav\n /// in respect to shares\n /// @param shares List of shares (in bps of the nav) that should be allocated to each lender\n function estimatedAPR(uint64[] memory shares)\n public\n view\n returns (uint256 weightedAPR, int256[] memory lenderAdjustedAmounts)\n {\n uint256 lenderLength = lenders.length;\n lenderAdjustedAmounts = new int256[](lenderLength);\n if (lenderLength != shares.length) revert IncorrectListLength();\n\n uint256 bal = estimatedTotalAssets();\n if (bal == 0) return (weightedAPR, lenderAdjustedAmounts);\n\n uint256 share;\n for (uint256 i; i < lenderLength; ++i) {\n share += shares[i];\n uint256 futureDeposit = (bal * shares[i]) / _BPS;\n // It won't overflow for `decimals <= 18`, as it would mean gigantic amounts\n int256 adjustedAmount = int256(futureDeposit) - int256(lenders[i].nav());\n lenderAdjustedAmounts[i] = adjustedAmount;\n weightedAPR += futureDeposit * lenders[i].aprAfterDeposit(adjustedAmount);\n }\n if (share != 10000) revert InvalidShares();\n\n weightedAPR /= bal;\n }\n\n /// @notice Prevents governance from withdrawing `want` tokens\n function _protectedTokens() internal view override returns (address[] memory) {\n address[] memory protected = new address[](1);\n protected[0] = address(want);\n return protected;\n }\n\n // ================================= GOVERNANCE ================================\n\n /// @notice Changes the withdrawal threshold\n /// @param _threshold New withdrawal threshold\n /// @dev governor, guardian or `PoolManager` only\n function setWithdrawalThreshold(uint256 _threshold) external onlyRole(GUARDIAN_ROLE) {\n withdrawalThreshold = _threshold;\n }\n\n /// @notice Add lenders for the strategy to choose between\n /// @param newLender The adapter to the added lending platform\n /// @dev Governor, guardian or `PoolManager` only\n function addLender(IGenericLender newLender) external onlyRole(GUARDIAN_ROLE) {\n if (newLender.strategy() != address(this)) revert UndockedLender();\n uint256 lendersLength = lenders.length;\n for (uint256 i; i < lendersLength; ++i) {\n if (address(newLender) == address(lenders[i])) revert LenderAlreadyAdded();\n }\n lenders.push(newLender);\n\n emit AddLender(address(newLender));\n }\n\n /// @notice Removes a lending platform and fails if total withdrawal is impossible\n /// @param lender The address of the adapter to the lending platform to remove\n function safeRemoveLender(address lender) external onlyRole(KEEPER_ROLE) {\n _removeLender(lender, false);\n }\n\n /// @notice Removes a lending platform even if total withdrawal is impossible\n /// @param lender The address of the adapter to the lending platform to remove\n function forceRemoveLender(address lender) external onlyRole(GUARDIAN_ROLE) {\n _removeLender(lender, true);\n }\n\n /// @notice Internal function to handle lending platform removal\n /// @param lender The address of the adapter for the lending platform to remove\n /// @param force Whether it is required that all the funds are withdrawn prior to removal\n function _removeLender(address lender, bool force) internal {\n IGenericLender[] memory lendersList = lenders;\n uint256 lendersListLength = lendersList.length;\n for (uint256 i; i < lendersListLength; ++i) {\n if (lender == address(lendersList[i])) {\n bool allWithdrawn = lendersList[i].withdrawAll();\n\n if (!force && !allWithdrawn) revert FailedWithdrawal();\n\n // Put the last index here\n // then remove last index\n if (i != lendersListLength - 1) {\n lenders[i] = lendersList[lendersListLength - 1];\n }\n\n // Pop shortens array by 1 thereby deleting the last index\n lenders.pop();\n\n // If balance to spend we might as well put it into the best lender\n if (want.balanceOf(address(this)) != 0) {\n _adjustPosition();\n }\n\n emit RemoveLender(lender);\n\n return;\n }\n }\n revert NonExistentLender();\n }\n\n // ============================= MANAGER FUNCTIONS =============================\n\n /// @notice Adds a new guardian address and echoes the change to the contracts\n /// that interact with this collateral `PoolManager`\n /// @param _guardian New guardian address\n /// @dev This internal function has to be put in this file because `AccessControl` is not defined\n /// in `PoolManagerInternal`\n function addGuardian(address _guardian) external override onlyRole(POOLMANAGER_ROLE) {\n // Granting the new role\n // Access control for this contract\n _grantRole(GUARDIAN_ROLE, _guardian);\n // Propagating the new role to underyling lenders\n uint256 lendersLength = lenders.length;\n for (uint256 i; i < lendersLength; ++i) {\n lenders[i].grantRole(GUARDIAN_ROLE, _guardian);\n }\n }\n\n /// @notice Revokes the guardian role and propagates the change to other contracts\n /// @param guardian Old guardian address to revoke\n function revokeGuardian(address guardian) external override onlyRole(POOLMANAGER_ROLE) {\n _revokeRole(GUARDIAN_ROLE, guardian);\n uint256 lendersLength = lenders.length;\n for (uint256 i; i < lendersLength; ++i) {\n lenders[i].revokeRole(GUARDIAN_ROLE, guardian);\n }\n }\n}\n" + }, + "contracts/strategies/StETHStrategy/StETHStrategy.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"../../interfaces/external/curve/IStableSwapPool.sol\";\nimport \"../../interfaces/external/lido/ISteth.sol\";\nimport \"../../interfaces/external/IWETH9.sol\";\nimport \"../BaseStrategyUpgradeable.sol\";\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport { Math } from \"@openzeppelin/contracts/utils/math/Math.sol\";\nimport \"@openzeppelin/contracts/utils/Address.sol\";\n\n/// @title StrategyStETHAcc\n/// @author Forked from https://github.com/Grandthrax/yearn-steth-acc/blob/master/contracts/Strategy.sol\n/// @notice A strategy designed to getting yield on wETH by putting ETH in Lido or Curve for stETH and exiting\n/// for wETH\ncontract StETHStrategy is BaseStrategyUpgradeable {\n using SafeERC20 for IERC20;\n using Address for address;\n\n /// @notice Current `apr` of the strategy: this apr needs to be manually filled by the strategist\n /// and updated when Lido's APR changes. It is put like that as there is no easy way to compute Lido's APR\n /// on-chain\n /// @notice Base used is `BASE_PARAMS`\n uint256 public apr;\n\n /// @notice Reference to the Curve ETH/stETH\n IStableSwapPool public stableSwapSTETH;\n /// @notice Reference to wETH, it should normally be equal to `want`\n IWETH9 public weth;\n /// @notice Reference to the stETH token\n ISteth public stETH;\n\n address private _referral = 0xdC4e6DFe07EFCa50a197DF15D9200883eF4Eb1c8; //stratms. for recycling and redepositing\n /// @notice Maximum trade size within the strategy\n uint256 public maxSingleTrade;\n /// @notice Parameter used for slippage protection\n uint256 public constant DENOMINATOR = 10_000;\n /// @notice Slippage parameter for the swaps on Curve: out of `DENOMINATOR`\n uint256 public slippageProtectionOut; // = 50; //out of 10000. 50 = 0.5%\n\n /// @notice ID of ETH in the Curve pool\n int128 private constant _WETHID = 0;\n /// @notice ID of stETH in the Curve pool\n int128 private constant _STETHID = 1;\n\n /// @notice Constructor of the `Strategy`\n /// @param _poolManager Address of the `PoolManager` lending to this strategy\n /// @param governor Address of the governance multisig with governor privilege\n /// @param guardian Address of the guardian\n /// @param keepers List of addresses of keepers\n /// @param _stableSwapSTETH Address of the stETH/ETH Curve pool\n /// @param _weth Address of wETH\n /// @param _stETH Address of the stETH token\n /// @param _apr Estimated apr on staked ETH\n function initialize(\n address _poolManager,\n address governor,\n address guardian,\n address[] memory keepers,\n address _stableSwapSTETH,\n address _weth,\n ISteth _stETH,\n uint256 _apr\n ) external {\n _initialize(_poolManager, governor, guardian, keepers);\n require(address(want) == _weth, \"20\");\n stableSwapSTETH = IStableSwapPool(_stableSwapSTETH);\n weth = IWETH9(_weth);\n stETH = ISteth(_stETH);\n apr = _apr;\n _stETH.approve(_stableSwapSTETH, type(uint256).max);\n maxSingleTrade = 10_000 * 1e18;\n slippageProtectionOut = 30;\n }\n\n /// @notice This contract gets ETH and so it needs this function\n receive() external payable {}\n\n // ========================== View Functions ===================================\n\n /// @notice View function to check the total assets managed by the strategy\n /// @dev We are purposely treating stETH and ETH as being equivalent.\n /// This is for a few reasons. The main one is that we do not have a good way to value\n /// stETH at any current time without creating exploit routes.\n /// Currently you can mint eth for steth but can't burn steth for eth so need to sell.\n /// Once eth 2.0 is merged you will be able to burn 1-1 as well.\n /// The main downside here is that we will noramlly overvalue our position as we expect stETH\n /// to trade slightly below peg. That means we will earn profit on deposits and take losses on withdrawals.\n /// This may sound scary but it is the equivalent of using virtualprice in a curve lp.\n /// As we have seen from many exploits, virtual pricing is safer than touch pricing.\n function estimatedTotalAssets() public view override returns (uint256) {\n return stethBalance() + wantBalance();\n }\n\n /// @notice Returns the wETH balance of the strategy\n function wantBalance() public view returns (uint256) {\n return want.balanceOf(address(this));\n }\n\n /// @notice Returns the stETH balance of the strategy\n function stethBalance() public view returns (uint256) {\n return stETH.balanceOf(address(this));\n }\n\n /// @notice The ETH APR of owning stETH\n function estimatedAPR() external view returns (uint256) {\n return apr;\n }\n\n // ========================== Strategy Functions ===============================\n\n /// @notice Frees up profit plus `_debtOutstanding`.\n /// @param _debtOutstanding Amount to withdraw\n /// @return _profit Profit freed by the call\n /// @return _loss Loss discovered by the call\n /// @return _debtPayment Amount freed to reimburse the debt: it is an amount made available for the `PoolManager`\n /// @dev If `_debtOutstanding` is more than we can free we get as much as possible.\n function _prepareReturn(uint256 _debtOutstanding)\n internal\n override\n returns (\n uint256 _profit,\n uint256 _loss,\n uint256 _debtPayment\n )\n {\n uint256 wantBal = wantBalance();\n uint256 stethBal = stethBalance();\n uint256 totalAssets = wantBal + stethBal;\n\n uint256 debt = poolManager.strategies(address(this)).totalStrategyDebt;\n\n if (totalAssets >= debt) {\n _profit = totalAssets - debt;\n\n uint256 toWithdraw = _profit + _debtOutstanding;\n // If more should be withdrawn than what's in the strategy: we divest from Curve\n if (toWithdraw > wantBal) {\n // We step our withdrawals. Adjust max single trade to withdraw more\n uint256 willWithdraw = Math.min(maxSingleTrade, toWithdraw - wantBal);\n uint256 withdrawn = _divest(willWithdraw);\n if (withdrawn < willWithdraw) {\n _loss = willWithdraw - withdrawn;\n }\n }\n wantBal = wantBalance();\n\n // Computing net off profit and loss\n if (_profit >= _loss) {\n _profit = _profit - _loss;\n _loss = 0;\n } else {\n _profit = 0;\n _loss = _loss - _profit;\n }\n\n // profit + _debtOutstanding must be <= wantbalance. Prioritise profit first\n if (wantBal < _profit) {\n _profit = wantBal;\n } else if (wantBal < toWithdraw) {\n _debtPayment = wantBal - _profit;\n } else {\n _debtPayment = _debtOutstanding;\n }\n } else {\n _loss = debt - totalAssets;\n }\n }\n\n /// @notice Liquidates everything and returns the amount that got freed.\n /// This function is used during emergency exit instead of `_prepareReturn()` to\n /// liquidate all of the Strategy's positions back to the Manager.\n function _liquidateAllPositions() internal override returns (uint256 _amountFreed) {\n _divest(stethBalance());\n _amountFreed = wantBalance();\n }\n\n /// @notice Function called when harvesting to invest in stETH\n /// Function used in other contracts, in this strategy it is useless\n function _adjustPosition(uint256) internal override {\n _adjustPosition();\n }\n\n /// @notice Function called when harvesting to invest in stETH\n function _adjustPosition() internal override {\n uint256 toInvest = wantBalance();\n if (toInvest > 0) {\n uint256 realInvest = Math.min(maxSingleTrade, toInvest);\n _invest(realInvest);\n }\n }\n\n /// @notice Invests `_amount` wETH in stETH\n /// @param _amount Amount of wETH to put in stETH\n /// @return The amount of stETH received from the investment\n /// @dev This function chooses the optimal route between going to Lido directly or doing a swap on Curve\n /// @dev This function automatically wraps wETH to ETH\n function _invest(uint256 _amount) internal returns (uint256) {\n uint256 before = stethBalance();\n // Unwrapping the tokens\n weth.withdraw(_amount);\n // Test if we should buy from Curve instead of minting from Lido\n uint256 out = stableSwapSTETH.get_dy(_WETHID, _STETHID, _amount);\n if (out < _amount) {\n // If we get less than one stETH per wETH we use Lido\n stETH.submit{ value: _amount }(_referral);\n } else {\n // Otherwise, we do a Curve swap\n stableSwapSTETH.exchange{ value: _amount }(_WETHID, _STETHID, _amount, _amount);\n }\n\n return stethBalance() - before;\n }\n\n /// @notice Divests stETH on Curve and gets wETH back to the strategy in exchange\n /// @param _amount Amount of stETH to divest\n /// @dev Curve is the only place to convert stETH to ETH\n function _divest(uint256 _amount) internal returns (uint256) {\n uint256 before = wantBalance();\n\n // Computing slippage protection for the swap\n uint256 slippageAllowance = (_amount * (DENOMINATOR - slippageProtectionOut)) / DENOMINATOR;\n // Curve swap\n stableSwapSTETH.exchange(_STETHID, _WETHID, _amount, slippageAllowance);\n\n weth.deposit{ value: address(this).balance }();\n\n return wantBalance() - before;\n }\n\n /// @notice Attempts to withdraw `_amountNeeded` from the strategy and lets the user decide if they take the loss or not\n /// @param _amountNeeded Amount to withdraw from the strategy\n function _liquidatePosition(uint256 _amountNeeded)\n internal\n override\n returns (uint256 _liquidatedAmount, uint256 _loss)\n {\n uint256 wantBal = wantBalance();\n if (wantBal < _amountNeeded) {\n uint256 toWithdraw = _amountNeeded - wantBal;\n uint256 withdrawn = _divest(toWithdraw);\n if (withdrawn < toWithdraw) {\n _loss = toWithdraw - withdrawn;\n }\n }\n\n _liquidatedAmount = _amountNeeded - _loss;\n }\n\n // NOTE: Can override `tendTrigger` and `harvestTrigger` if necessary\n\n // Override this to add all tokens/tokenized positions this contract manages\n // on a *persistent* basis (e.g. not just for swapping back to want ephemerally)\n // NOTE: Do *not* include `want`, already included in `sweep` below\n //\n // Example:\n //\n // function _protectedTokens() internal override view returns (address[] memory) {\n // address[] memory protected = new address[](3);\n // protected[0] = tokenA;\n // protected[1] = tokenB;\n // protected[2] = tokenC;\n // return protected;\n // }\n function _protectedTokens() internal view override returns (address[] memory) {\n address[] memory protected = new address[](1);\n protected[0] = address(stETH);\n\n return protected;\n }\n\n // ============================ Governance =====================================\n\n /// @notice Updates the referral code for Lido\n /// @param newReferral Address of the new referral\n function updateReferral(address newReferral) public onlyRole(GUARDIAN_ROLE) {\n _referral = newReferral;\n }\n\n /// @notice Updates the size of a trade in the strategy\n /// @param _maxSingleTrade New `maxSingleTrade` value\n function updateMaxSingleTrade(uint256 _maxSingleTrade) public onlyRole(GUARDIAN_ROLE) {\n maxSingleTrade = _maxSingleTrade;\n }\n\n /// @notice Changes the estimated APR of the strategy\n /// @param _apr New strategy APR\n function setApr(uint256 _apr) public onlyRole(GUARDIAN_ROLE) {\n apr = _apr;\n }\n\n /// @notice Updates the maximum slippage protection parameter\n /// @param _slippageProtectionOut New slippage protection parameter\n function updateSlippageProtectionOut(uint256 _slippageProtectionOut) public onlyRole(GUARDIAN_ROLE) {\n slippageProtectionOut = _slippageProtectionOut;\n }\n\n /// @notice Invests `_amount` in stETH\n /// @param _amount Amount to invest\n /// @dev This function allows to override the behavior that could be obtained through `harvest` calls\n function invest(uint256 _amount) external onlyRole(GUARDIAN_ROLE) {\n require(wantBalance() >= _amount);\n uint256 realInvest = Math.min(maxSingleTrade, _amount);\n _invest(realInvest);\n }\n\n /// @notice Rescues stuck ETH from the strategy\n /// @dev This strategy should never have stuck eth, but let it just in case\n function rescueStuckEth() external onlyRole(GUARDIAN_ROLE) {\n weth.deposit{ value: address(this).balance }();\n }\n\n // ========================== Manager functions ================================\n\n /// @notice Adds a new guardian address and echoes the change to the contracts\n /// that interact with this collateral `PoolManager`\n /// @param _guardian New guardian address\n /// @dev This internal function has to be put in this file because `AccessControl` is not defined\n /// in `PoolManagerInternal`\n function addGuardian(address _guardian) external override onlyRole(POOLMANAGER_ROLE) {\n // Granting the new role\n // Access control for this contract\n _grantRole(GUARDIAN_ROLE, _guardian);\n }\n\n /// @notice Revokes the guardian role and propagates the change to other contracts\n /// @param guardian Old guardian address to revoke\n function revokeGuardian(address guardian) external override onlyRole(POOLMANAGER_ROLE) {\n _revokeRole(GUARDIAN_ROLE, guardian);\n }\n}\n" + }, + "contracts/utils/Errors.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nerror ErrorSwap();\nerror FailedToMint();\nerror FailedToRecoverETH();\nerror FailedToRedeem();\nerror FailedWithdrawal();\nerror IncompatibleLengths();\nerror IncorrectDistribution();\nerror IncorrectListLength();\nerror InvalidOracleValue();\nerror InvalidSender();\nerror InvalidSetOfParameters();\nerror InvalidShares();\nerror InvalidToken();\nerror InvalidWithdrawCheck();\nerror LenderAlreadyAdded();\nerror NoLockedLiquidity();\nerror NonExistentLender();\nerror PoolNotIncentivized();\nerror ProtectedToken();\nerror TooHighParameterValue();\nerror TooSmallAmount();\nerror TooSmallAmountOut();\nerror TooSmallStakingPeriod();\nerror UndockedLender();\nerror WrongCToken();\nerror ZeroAddress();\n" + }, + "contracts/utils/FunctionUtils.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\n/// @title FunctionUtils\n/// @author Angle Core Team\n/// @notice Contains all the utility functions that are needed in different places of the protocol\n/// @dev Functions in this contract should typically be pure functions\n/// @dev This contract is voluntarily a contract and not a library to save some gas cost every time it is used\ncontract FunctionUtils {\n /// @notice Base that is used to compute ratios and floating point numbers\n uint256 public constant BASE_TOKENS = 10**18;\n /// @notice Base that is used to define parameters that need to have a floating point value (for instance parameters\n /// that are defined as ratios)\n uint256 public constant BASE_PARAMS = 10**9;\n\n /// @notice Computes the value of a linear by part function at a given point\n /// @param x Point of the function we want to compute\n /// @param xArray List of breaking points (in ascending order) that define the linear by part function\n /// @param yArray List of values at breaking points (not necessarily in ascending order)\n /// @dev The evolution of the linear by part function between two breaking points is linear\n /// @dev Before the first breaking point and after the last one, the function is constant with a value\n /// equal to the first or last value of the yArray\n /// @dev This function is relevant if `x` is between O and `BASE_PARAMS`. If `x` is greater than that, then\n /// everything will be as if `x` is equal to the greater element of the `xArray`\n function _piecewiseLinear(\n uint64 x,\n uint64[] memory xArray,\n uint64[] memory yArray\n ) internal pure returns (uint64) {\n if (x >= xArray[xArray.length - 1]) {\n return yArray[xArray.length - 1];\n } else if (x <= xArray[0]) {\n return yArray[0];\n } else {\n uint256 lower;\n uint256 upper = xArray.length - 1;\n uint256 mid;\n while (upper - lower > 1) {\n mid = lower + (upper - lower) / 2;\n if (xArray[mid] <= x) {\n lower = mid;\n } else {\n upper = mid;\n }\n }\n if (yArray[upper] > yArray[lower]) {\n // There is no risk of overflow here as in the product of the difference of `y`\n // with the difference of `x`, the product is inferior to `BASE_PARAMS**2` which does not\n // overflow for `uint64`\n return\n yArray[lower] +\n ((yArray[upper] - yArray[lower]) * (x - xArray[lower])) /\n (xArray[upper] - xArray[lower]);\n } else {\n return\n yArray[lower] -\n ((yArray[lower] - yArray[upper]) * (x - xArray[lower])) /\n (xArray[upper] - xArray[lower]);\n }\n }\n }\n\n /// @notice Checks if the input arrays given by governance to update the fee structure is valid\n /// @param xArray List of breaking points (in ascending order) that define the linear by part function\n /// @param yArray List of values at breaking points (not necessarily in ascending order)\n /// @dev This function is a way to avoid some governance attacks or errors\n /// @dev The modifier checks if the arrays have a non null length, if their length is the same, if the values\n /// in the `xArray` are in ascending order and if the values in the `xArray` and in the `yArray` are not superior\n /// to `BASE_PARAMS`\n modifier onlyCompatibleInputArrays(uint64[] memory xArray, uint64[] memory yArray) {\n require(xArray.length == yArray.length && xArray.length > 0, \"5\");\n for (uint256 i = 0; i <= yArray.length - 1; i++) {\n require(yArray[i] <= uint64(BASE_PARAMS) && xArray[i] <= uint64(BASE_PARAMS), \"6\");\n if (i > 0) {\n require(xArray[i] > xArray[i - 1], \"7\");\n }\n }\n _;\n }\n\n /// @notice Checks if the new value given for the parameter is consistent (it should be inferior to 1\n /// if it corresponds to a ratio)\n /// @param fees Value of the new parameter to check\n modifier onlyCompatibleFees(uint64 fees) {\n require(fees <= BASE_PARAMS, \"4\");\n _;\n }\n\n /// @notice Checks if the new address given is not null\n /// @param newAddress Address to check\n /// @dev Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#missing-zero-address-validation\n modifier zeroCheck(address newAddress) {\n require(newAddress != address(0), \"0\");\n _;\n }\n}\n" + }, + "contracts/utils/OracleMath.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.12;\n\nimport \"../external/FullMath.sol\";\n\n/// @title OracleMath\n/// @author Forked and adapted by Angle Core Team from https://github.com/Uniswap/uniswap-v3-core/blob/main/contracts/libraries/TickMath.sol\n/// @notice Math library for computing prices from ticks\n/// @dev Computes price for ticks of size 1.0001, i.e. sqrt(1.0001^tick). Supports\n/// prices between 2**-128 and 2**128\ncontract OracleMath is FullMath {\n /// @dev Maximum tick that may be passed to `_getSqrtRatioAtTick` computed from log base 1.0001 of 2**128\n int24 internal constant _MAX_TICK = 887272;\n\n /// @notice Given a tick and a token amount, calculates the amount of token received in exchange\n /// @param tick Tick value used to calculate the quote\n /// @param baseAmount Amount of token to be converted\n /// @param multiply Boolean representing whether the `baseToken` has a lower address than the `quoteToken`\n /// @return quoteAmount Amount of `quoteToken` received for `baseAmount` of `baseToken`\n function _getQuoteAtTick(\n int24 tick,\n uint256 baseAmount,\n uint256 multiply\n ) internal pure returns (uint256 quoteAmount) {\n uint256 ratio = _getRatioAtTick(tick);\n\n quoteAmount = (multiply == 1) ? _mulDiv(ratio, baseAmount, 1e18) : _mulDiv(1e18, baseAmount, ratio);\n }\n\n /// @notice Calculates 1.0001^tick * in out ERC20 decimals\n /// @dev Adapted from Uniswap `_getSqrtRatioAtTick` but we don't consider the square root\n /// anymore but directly the full rate\n /// @dev Throws if `|tick| > max tick`\n /// @param tick The input tick for the above formula\n /// @return rate uint256 representing the ratio of the two assets `(token1/token0) * 10**decimals(token1)`\n /// at the given tick\n function _getRatioAtTick(int24 tick) internal pure returns (uint256 rate) {\n uint256 absTick = tick < 0 ? uint256(-int256(tick)) : uint256(int256(tick));\n require(absTick <= uint256(int256(_MAX_TICK)), \"T\");\n\n uint256 ratio = absTick & 0x1 != 0 ? 0xfff97272373d413259a46990580e213a : 0x100000000000000000000000000000000;\n if (absTick & 0x2 != 0) ratio = (ratio * 0xfff2e50f5f656932ef12357cf3c7fdcc) >> 128;\n if (absTick & 0x4 != 0) ratio = (ratio * 0xffe5caca7e10e4e61c3624eaa0941cd0) >> 128;\n if (absTick & 0x8 != 0) ratio = (ratio * 0xffcb9843d60f6159c9db58835c926644) >> 128;\n if (absTick & 0x10 != 0) ratio = (ratio * 0xff973b41fa98c081472e6896dfb254c0) >> 128;\n if (absTick & 0x20 != 0) ratio = (ratio * 0xff2ea16466c96a3843ec78b326b52861) >> 128;\n if (absTick & 0x40 != 0) ratio = (ratio * 0xfe5dee046a99a2a811c461f1969c3053) >> 128;\n if (absTick & 0x80 != 0) ratio = (ratio * 0xfcbe86c7900a88aedcffc83b479aa3a4) >> 128;\n if (absTick & 0x100 != 0) ratio = (ratio * 0xf987a7253ac413176f2b074cf7815e54) >> 128;\n if (absTick & 0x200 != 0) ratio = (ratio * 0xf3392b0822b70005940c7a398e4b70f3) >> 128;\n if (absTick & 0x400 != 0) ratio = (ratio * 0xe7159475a2c29b7443b29c7fa6e889d9) >> 128;\n if (absTick & 0x800 != 0) ratio = (ratio * 0xd097f3bdfd2022b8845ad8f792aa5825) >> 128;\n if (absTick & 0x1000 != 0) ratio = (ratio * 0xa9f746462d870fdf8a65dc1f90e061e5) >> 128;\n if (absTick & 0x2000 != 0) ratio = (ratio * 0x70d869a156d2a1b890bb3df62baf32f7) >> 128;\n if (absTick & 0x4000 != 0) ratio = (ratio * 0x31be135f97d08fd981231505542fcfa6) >> 128;\n if (absTick & 0x8000 != 0) ratio = (ratio * 0x9aa508b5b7a84e1c677de54f3e99bc9) >> 128;\n if (absTick & 0x10000 != 0) ratio = (ratio * 0x5d6af8dedb81196699c329225ee604) >> 128;\n if (absTick & 0x20000 != 0) ratio = (ratio * 0x2216e584f5fa1ea926041bedfe98) >> 128;\n if (absTick & 0x40000 != 0) ratio = (ratio * 0x48a170391f7dc42444e8fa2) >> 128;\n if (absTick & 0x80000 != 0) ratio = (ratio * 0x149b34ee7ac262) >> 128;\n\n if (tick > 0) ratio = type(uint256).max / ratio;\n\n // We need to modify the 96 decimal to be able to convert it to a D256\n // 2**59 ~ 10**18 (thus we guarantee the same precision) and 128-59 = 69\n // We retrieve a Q128.59 decimal. --> we have 69 bits free to reach the uint256 limit.\n // Now, 2**69 >> 10**18 so we are safe in the Decimal conversion.\n\n uint256 price = uint256((ratio >> 69) + (ratio % (1 << 69) == 0 ? 0 : 1));\n rate = ((price * 1e18) >> 59);\n }\n}\n" + } + }, + "settings": { + "viaIR": true, + "optimizer": { + "enabled": true, + "runs": 1000000 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} \ No newline at end of file diff --git a/foundry.toml b/foundry.toml index 5b0d776..8ae5769 100644 --- a/foundry.toml +++ b/foundry.toml @@ -6,9 +6,10 @@ libs = ['node_modules', 'lib'] script = 'scripts/foundry' cache_path = 'cache-forge' gas_reports = ["*"] -via_ir = true - +via_ir = false solc_version = '0.8.17' +optimizer = true +optimizer_runs = 1000000 ffi = true @@ -22,8 +23,9 @@ runs = 500 mainnet = "${ETH_NODE_URI_MAINNET}" polygon = "${ETH_NODE_URI_POLYGON}" goerli = "${ETH_NODE_URI_GOERLI}" +fork = "${ETH_NODE_URI_FORK}" [etherscan] -mainnet = { key = "$MAINNET_ETHERSCAN_API_KEY}" } +mainnet = { key = "${MAINNET_ETHERSCAN_API_KEY}" } polygon = { key = "${POLYGON_ETHERSCAN_API_KEY}" } goerli = { key = "${GOERLI_ETHERSCAN_API_KEY}" } \ No newline at end of file diff --git a/hardhat.config.ts b/hardhat.config.ts index 4514e2e..9775d1a 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -46,7 +46,7 @@ const config: HardhatUserConfig = { { version: '0.8.17', settings: { - viaIR: true, + viaIR: false, optimizer: { enabled: true, runs: 1000000, @@ -77,7 +77,7 @@ const config: HardhatUserConfig = { 'contracts/strategies/OptimizerAPR/genericLender/aave/GenericAaveFraxStaker.sol': { version: '0.8.17', settings: { - viaIR: true, + viaIR: false, optimizer: { enabled: true, runs: 20000, @@ -103,7 +103,7 @@ const config: HardhatUserConfig = { accounts: accounts('polygon'), gas: 'auto', chainId: 137, - gasPrice: 200e9, + gasPrice: 500e9, verify: { etherscan: { apiKey: etherscanKey('polygon'), diff --git a/lib/forge-std b/lib/forge-std index eb980e1..662ae0d 160000 --- a/lib/forge-std +++ b/lib/forge-std @@ -1 +1 @@ -Subproject commit eb980e1d4f0e8173ec27da77297ae411840c8ccb +Subproject commit 662ae0d6936654c5d1fb79fc15f521de28edb60e diff --git a/package.json b/package.json index 5afd017..8f40e1f 100644 --- a/package.json +++ b/package.json @@ -7,13 +7,16 @@ "etherscan": "hardhat etherscan-verify --network", "foundry:compile": "forge build --optimize --optimizer-runs 1000", "foundry:coverage": "forge coverage --report lcov && forge coverage", - "foundry:deploy": "forge script --broadcast --verify -vvvv", + "foundry:deploy:fork": "forge script --fork-url fork --broadcast", + "foundry:deploy:mainnet": "forge script --rpc-url mainnet --broadcast --verify -vvvv", + "foundry:deploy:polygon": "forge script --rpc-url polygon --broadcast --verify -vvvv", "foundry:gas": "forge test --gas-report", "foundry:run": "docker run -it --rm -v $(pwd):/app -w /app ghcr.io/foundry-rs/foundry sh", "foundry:test": "forge test -vvv", "hardhat:compile": "hardhat compile", "hardhat:coverage": "hardhat coverage", "hardhat:deploy": "hardhat deploy --network mainnet --tags", + "hardhat:polygon:deploy": "hardhat deploy --network polygon --tags", "hardhat:node:fork": "FORK=true hardhat node --tags", "hardhat:test": "hardhat test", "check-upgradeability": "hardhat run scripts/checkUpgradeability.ts", diff --git a/scripts/foundry/MainnetConstants.s.sol b/scripts/foundry/MainnetConstants.s.sol new file mode 100644 index 0000000..ba6fd12 --- /dev/null +++ b/scripts/foundry/MainnetConstants.s.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.8.17; + +import "../../contracts/external/ProxyAdmin.sol"; +import "../../contracts/external/TransparentUpgradeableProxy.sol"; + +contract MainnetConstants { + address public constant GOVERNOR = 0xdC4e6DFe07EFCa50a197DF15D9200883eF4Eb1c8; + address public constant GUARDIAN = 0x0C2553e4B9dFA9f83b1A6D3EAB96c4bAaB42d430; + address public constant PROXY_ADMIN = 0x1D941EF0D3Bba4ad67DBfBCeE5262F4CEE53A32b; + address public constant PROXY_ADMIN_GUARDIAN = 0xD9F1A8e00b0EEbeDddd9aFEaB55019D55fcec017; + address public constant CORE_BORROW = 0x5bc6BEf80DA563EBf6Df6D6913513fa9A7ec89BE; + + address public constant KEEPER_MULTICALL = 0xa0062b7A5e494d569059E2f1A98B5f6C99BFAAfe; + address public constant KEEPER = 0xcC617C6f9725eACC993ac626C7efC6B96476916E; + + address public constant ANGLE_ROUTER = 0x4579709627CA36BCe92f51ac975746f431890930; + address public constant ONE_INCH = 0x1111111254EEB25477B68fb85Ed929f73A960582; + address public constant UNI_V3_ROUTER = 0xE592427A0AEce92De3Edee1F18E0157C05861564; + address public constant ANGLE_HELPER = 0x1B17ac6B8371D63E030C5981891d5FBb3E4e068E; + + // AGEUR Mainnet treasury + address public constant AGEUR_TREASURY = 0x8667DBEBf68B0BFa6Db54f550f41Be16c4067d60; + address public constant AGEUR = 0x1a7e4e63778B4f12a199C062f3eFdD288afCBce8; + + // Collateral addresses + address public constant DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F; + address public constant FRAX = 0x853d955aCEf822Db058eb8505911ED77F175b99e; + address public constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; + address public constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; + + uint256 public constant BASE_TOKENS = 10**18; + uint64 public constant BASE_PARAMS = 10**9; + + function deployUpgradeable(address implementation, bytes memory data) public returns (address) { + return address(new TransparentUpgradeableProxy(implementation, PROXY_ADMIN, data)); + } +} diff --git a/scripts/foundry/MigrationOptimizerAPRDAI.s.sol b/scripts/foundry/MigrationOptimizerAPRDAI.s.sol new file mode 100644 index 0000000..13e1b5d --- /dev/null +++ b/scripts/foundry/MigrationOptimizerAPRDAI.s.sol @@ -0,0 +1,147 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.8.17; + +import "forge-std/Script.sol"; +import "./MainnetConstants.s.sol"; +import { IAngleHelper } from "../../contracts/interfaces/IAngleHelper.sol"; +import { CErc20I, CTokenI } from "../../contracts/interfaces/external/compound/CErc20I.sol"; +import { IComptroller } from "../../contracts/interfaces/external/compound/IComptroller.sol"; +import { PoolManager, IStrategy } from "../../contracts/mock/MockPoolManager2.sol"; +import { OptimizerAPRStrategy } from "../../contracts/strategies/OptimizerAPR/OptimizerAPRStrategy.sol"; +import { OptimizerAPRGreedyStrategy } from "../../contracts/strategies/OptimizerAPR/OptimizerAPRGreedyStrategy.sol"; +import { GenericAaveNoStaker, IERC20, IERC20Metadata, IGenericLender } from "../../contracts/strategies/OptimizerAPR/genericLender/aave/GenericAaveNoStaker.sol"; +import { GenericCompoundUpgradeable } from "../../contracts/strategies/OptimizerAPR/genericLender/compound/GenericCompoundUpgradeable.sol"; +import { GenericEuler, IEuler, IEulerEToken, IEulerDToken, IGenericLender, AggregatorV3Interface } from "../../contracts/strategies/OptimizerAPR/genericLender/euler/GenericEulerStaker.sol"; + +contract MigrationOptimizerAPRDAI is Script, MainnetConstants { + uint256 internal constant _BASE_TOKEN = 10**18; + uint256 internal constant _BASE_APR = 10**18; + uint64 internal constant _BPS = 10**4; + + IComptroller internal constant _COMPTROLLER = IComptroller(0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B); + IERC20 internal constant _COMP = IERC20(0xc00e94Cb662C3520282E6f5717214004A7f26888); + IERC20 private constant _aave = IERC20(0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9); + // solhint-disable-next-line + IERC20 private constant _stkAave = IERC20(0x4da27a545c0c5B758a6BA100e3a049001de870f5); + IEuler private constant _EULER = IEuler(0x27182842E098f60e3D576794A5bFFb0777E025d3); + uint256 internal constant _PROP_INVESTED = 95 * 10**7; + + OptimizerAPRStrategy public stratImplementation = OptimizerAPRStrategy(0x05E08E1BF31C1882822Cc48D7d51d6fe49Bca9c2); + GenericCompoundUpgradeable public lenderCompoundImplementation = + GenericCompoundUpgradeable(payable(0xDeEe844C6992F36ADAC59cF38d1F790B2a0313e2)); + GenericAaveNoStaker public lenderAaveImplementation = + GenericAaveNoStaker(0x14bA0B82f1940e35Af39c364e8Fa99408881Ae30); + + // TODO Change on collateral + IERC20 public token = IERC20(DAI); + PoolManager public manager = PoolManager(0xc9daabC677F3d1301006e723bD21C60be57a5915); + CErc20I internal _cToken = CErc20I(0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643); + + uint256 public marginAmount; + uint8 internal _decimalToken; + string internal _tokenSymbol; + OptimizerAPRStrategy public strat; + GenericCompoundUpgradeable public lenderCompound; + GenericAaveNoStaker public lenderAave; + GenericEuler public lenderEulerImplementation; + GenericEuler public lenderEuler; + + error ZeroAddress(); + + function run() external { + // vm.createSelectFork("mainnet"); + uint256 deployerPrivateKey = vm.deriveKey(vm.envString("MNEMONIC_MAINNET"), 0); + vm.startBroadcast(deployerPrivateKey); + + if ( + address(token) == address(0) || + address(_cToken) == address(0) || + address(manager) == address(0) || + address(stratImplementation) == address(0) || + address(lenderCompoundImplementation) == address(0) || + address(lenderAaveImplementation) == address(0) + ) revert ZeroAddress(); + + _decimalToken = IERC20Metadata(address(token)).decimals(); + _tokenSymbol = IERC20Metadata(address(token)).symbol(); + marginAmount = 10**(_decimalToken + 1); + + address[] memory keeperList = new address[](2); + address[] memory governorList = new address[](1); + keeperList[0] = KEEPER; + keeperList[1] = KEEPER_MULTICALL; + governorList[0] = GOVERNOR; + + console.log(string.concat("Compound Lender ", _tokenSymbol, " v2")); + console.log(string.concat("Aave Lender ", _tokenSymbol, " v2")); + console.log(string.concat("Euler Staker Lender ", _tokenSymbol)); + + strat = OptimizerAPRStrategy( + deployUpgradeable( + address(stratImplementation), + abi.encodeWithSelector(strat.initialize.selector, address(manager), GOVERNOR, GUARDIAN, keeperList) + ) + ); + + console.log("Successfully deployed OptimizerAPR strategy at the address: ", address(strat)); + + lenderCompound = GenericCompoundUpgradeable( + payable( + deployUpgradeable( + address(lenderCompoundImplementation), + abi.encodeWithSelector( + lenderCompoundImplementation.initialize.selector, + address(strat), + string.concat("Compound Lender ", _tokenSymbol, " v2"), + address(_cToken), + governorList, + GUARDIAN, + keeperList, + ONE_INCH + ) + ) + ) + ); + + console.log("Successfully deployed Generic Compound strategy at the address: ", address(lenderCompound)); + + lenderAave = GenericAaveNoStaker( + deployUpgradeable( + address(lenderAaveImplementation), + abi.encodeWithSelector( + lenderAaveImplementation.initialize.selector, + address(strat), + string.concat("Aave Lender ", _tokenSymbol, " v2"), + false, + governorList, + GUARDIAN, + keeperList, + ONE_INCH + ) + ) + ); + + console.log("Successfully deployed Generic Aave strategy at the address: ", address(lenderAave)); + + lenderEulerImplementation = new GenericEuler(); + lenderEuler = GenericEuler( + deployUpgradeable( + address(lenderEulerImplementation), + abi.encodeWithSelector( + lenderEulerImplementation.initializeEuler.selector, + address(strat), + string.concat("Euler Lender ", _tokenSymbol), + governorList, + GUARDIAN, + keeperList, + ONE_INCH + ) + ) + ); + + console.log("Successfully deployed Euler strategy at the address: ", address(lenderEuler)); + + // TODO check out OptimizerAPRStrategyForkTest for the needed op + vm.stopBroadcast(); + } +} diff --git a/scripts/foundry/MigrationOptimizerAPRUSDC.s.sol b/scripts/foundry/MigrationOptimizerAPRUSDC.s.sol new file mode 100644 index 0000000..0468bc1 --- /dev/null +++ b/scripts/foundry/MigrationOptimizerAPRUSDC.s.sol @@ -0,0 +1,146 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.8.17; + +import "forge-std/Script.sol"; +import "./MainnetConstants.s.sol"; +import { IAngleHelper } from "../../contracts/interfaces/IAngleHelper.sol"; +import { CErc20I, CTokenI } from "../../contracts/interfaces/external/compound/CErc20I.sol"; +import { IComptroller } from "../../contracts/interfaces/external/compound/IComptroller.sol"; +import { PoolManager, IStrategy } from "../../contracts/mock/MockPoolManager2.sol"; +import { OptimizerAPRStrategy } from "../../contracts/strategies/OptimizerAPR/OptimizerAPRStrategy.sol"; +import { GenericAaveNoStaker, IERC20, IERC20Metadata, IGenericLender } from "../../contracts/strategies/OptimizerAPR/genericLender/aave/GenericAaveNoStaker.sol"; +import { GenericCompoundUpgradeable } from "../../contracts/strategies/OptimizerAPR/genericLender/compound/GenericCompoundUpgradeable.sol"; +import { GenericEulerStaker, IEulerStakingRewards, IEuler, IEulerEToken, IEulerDToken, IGenericLender, AggregatorV3Interface } from "../../contracts/strategies/OptimizerAPR/genericLender/euler/GenericEulerStaker.sol"; + +contract MigrationOptimizerAPRUSDC is Script, MainnetConstants { + uint256 internal constant _BASE_TOKEN = 10**18; + uint256 internal constant _BASE_APR = 10**18; + uint64 internal constant _BPS = 10**4; + + IComptroller internal constant _COMPTROLLER = IComptroller(0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B); + IERC20 internal constant _COMP = IERC20(0xc00e94Cb662C3520282E6f5717214004A7f26888); + IERC20 private constant _aave = IERC20(0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9); + // solhint-disable-next-line + IERC20 private constant _stkAave = IERC20(0x4da27a545c0c5B758a6BA100e3a049001de870f5); + IEuler private constant _EULER = IEuler(0x27182842E098f60e3D576794A5bFFb0777E025d3); + AggregatorV3Interface private constant _CHAINLINK = + AggregatorV3Interface(0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419); + uint256 internal constant _PROP_INVESTED = 95 * 10**7; + + // TODO Change on collateral + IERC20 public token = IERC20(USDC); + PoolManager public manager = PoolManager(0xe9f183FC656656f1F17af1F2b0dF79b8fF9ad8eD); + CErc20I internal _cToken = CErc20I(0x39AA39c021dfbaE8faC545936693aC917d5E7563); + // solhint-disable-next-line + IEulerStakingRewards internal constant _STAKER = IEulerStakingRewards(0xE5aFE81e63f0A52a3a03B922b30f73B8ce74D570); + + uint256 public marginAmount; + uint8 internal _decimalToken; + string internal _tokenSymbol; + OptimizerAPRStrategy public stratImplementation; + OptimizerAPRStrategy public strat; + GenericCompoundUpgradeable public lenderCompoundImplementation; + GenericCompoundUpgradeable public lenderCompound; + GenericAaveNoStaker public lenderAaveImplementation; + GenericAaveNoStaker public lenderAave; + GenericEulerStaker public lenderEulerImplementation; + GenericEulerStaker public lenderEuler; + + error ZeroAdress(); + + function run() external { + // vm.createSelectFork("mainnet"); + uint256 deployerPrivateKey = vm.deriveKey(vm.envString("MNEMONIC_MAINNET"), 0); + vm.startBroadcast(deployerPrivateKey); + + if (address(token) == address(0) || address(_cToken) == address(0) || address(manager) == address(0)) + revert ZeroAdress(); + + // _decimalToken = IERC20Metadata(address(token)).decimals(); + // _tokenSymbol = IERC20Metadata(address(token)).symbol(); + // marginAmount = 10**(_decimalToken + 1); + + address[] memory keeperList = new address[](2); + address[] memory governorList = new address[](1); + keeperList[0] = KEEPER; + keeperList[1] = KEEPER_MULTICALL; + governorList[0] = GOVERNOR; + + console.log(string.concat("Compound Lender ", _tokenSymbol, " v2")); + console.log(string.concat("Aave Lender ", _tokenSymbol, " v2")); + console.log(string.concat("Euler Staker Lender ", _tokenSymbol)); + + stratImplementation = new OptimizerAPRStrategy(); + strat = OptimizerAPRStrategy( + deployUpgradeable( + address(stratImplementation), + abi.encodeWithSelector(strat.initialize.selector, address(manager), GOVERNOR, GUARDIAN, keeperList) + ) + ); + + console.log("Successfully deployed OptimizerAPR strategy at the address: ", address(strat)); + + lenderCompoundImplementation = new GenericCompoundUpgradeable(); + lenderCompound = GenericCompoundUpgradeable( + payable( + deployUpgradeable( + address(lenderCompoundImplementation), + abi.encodeWithSelector( + lenderCompoundImplementation.initialize.selector, + address(strat), + string.concat("Compound Lender ", _tokenSymbol, " v2"), + address(_cToken), + governorList, + GUARDIAN, + keeperList, + ONE_INCH + ) + ) + ) + ); + + console.log("Successfully deployed Generic Compound strategy at the address: ", address(lenderCompound)); + + lenderAaveImplementation = new GenericAaveNoStaker(); + lenderAave = GenericAaveNoStaker( + deployUpgradeable( + address(lenderAaveImplementation), + abi.encodeWithSelector( + lenderAaveImplementation.initialize.selector, + address(strat), + string.concat("Aave Lender ", _tokenSymbol, " v2"), + false, + governorList, + GUARDIAN, + keeperList, + ONE_INCH + ) + ) + ); + + console.log("Successfully deployed Generic Aave strategy at the address: ", address(lenderAave)); + + lenderEulerImplementation = new GenericEulerStaker(); + lenderEuler = GenericEulerStaker( + deployUpgradeable( + address(lenderEulerImplementation), + abi.encodeWithSelector( + lenderEulerImplementation.initialize.selector, + address(strat), + string.concat("Euler Staker Lender ", _tokenSymbol), + governorList, + GUARDIAN, + keeperList, + ONE_INCH, + _STAKER, + _CHAINLINK + ) + ) + ); + + console.log("Successfully deployed Euler strategy at the address: ", address(lenderEuler)); + + // TODO check out OptimizerAPRStrategyForkTest for the needed op + vm.stopBroadcast(); + } +} diff --git a/scripts/foundry/fork/CheckMigration.s.sol b/scripts/foundry/fork/CheckMigration.s.sol new file mode 100644 index 0000000..c2527a4 --- /dev/null +++ b/scripts/foundry/fork/CheckMigration.s.sol @@ -0,0 +1,133 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.12; + +import "forge-std/Script.sol"; +import { Test } from "forge-std/Test.sol"; +import "../MainnetConstants.s.sol"; +import { IAngleHelper } from "../../../contracts/interfaces/IAngleHelper.sol"; +import { CErc20I, CTokenI } from "../../../contracts/interfaces/external/compound/CErc20I.sol"; +import { IComptroller } from "../../../contracts/interfaces/external/compound/IComptroller.sol"; +import { PoolManager, IStrategy } from "../../../contracts/mock/MockPoolManager2.sol"; +import { OptimizerAPRStrategy } from "../../../contracts/strategies/OptimizerAPR/OptimizerAPRStrategy.sol"; +import { OptimizerAPRGreedyStrategy } from "../../../contracts/strategies/OptimizerAPR/OptimizerAPRGreedyStrategy.sol"; +import { GenericAaveNoStaker, IERC20, IERC20Metadata, IGenericLender } from "../../../contracts/strategies/OptimizerAPR/genericLender/aave/GenericAaveNoStaker.sol"; +import { GenericCompoundUpgradeable } from "../../../contracts/strategies/OptimizerAPR/genericLender/compound/GenericCompoundUpgradeable.sol"; +import { GenericEulerStaker, IEulerStakingRewards, IEuler, IEulerEToken, IEulerDToken, IGenericLender, AggregatorV3Interface } from "../../../contracts/strategies/OptimizerAPR/genericLender/euler/GenericEulerStaker.sol"; + +contract CheckMigration is Script, MainnetConstants, Test { + uint256 internal constant _BASE_TOKEN = 10**18; + uint256 internal constant _BASE_APR = 10**18; + uint64 internal constant _BPS = 10**4; + IERC20 public token = IERC20(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48); + PoolManager public manager = PoolManager(0xe9f183FC656656f1F17af1F2b0dF79b8fF9ad8eD); + OptimizerAPRGreedyStrategy internal _oldStrat = + OptimizerAPRGreedyStrategy(0x5fE0E497Ac676d8bA78598FC8016EBC1E6cE14a3); + GenericAaveNoStaker internal _oldLenderAave = GenericAaveNoStaker(0xbe67bb1aa7baCFC5D40d963D47E11e3d382a56Bd); + GenericCompoundUpgradeable internal _oldLenderCompound = + GenericCompoundUpgradeable(payable(0x6D7cCd6d3E4948579891f90e98C1bb09a8c677ea)); + + IComptroller internal constant _COMPTROLLER = IComptroller(0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B); + IERC20 internal constant _COMP = IERC20(0xc00e94Cb662C3520282E6f5717214004A7f26888); + CErc20I internal _cUSDC = CErc20I(0x39AA39c021dfbaE8faC545936693aC917d5E7563); + // solhint-disable-next-line + IERC20 private constant _aave = IERC20(0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9); + // solhint-disable-next-line + IERC20 private constant _stkAave = IERC20(0x4da27a545c0c5B758a6BA100e3a049001de870f5); + IEulerStakingRewards internal constant _STAKER = IEulerStakingRewards(0xE5aFE81e63f0A52a3a03B922b30f73B8ce74D570); + IEuler private constant _EULER = IEuler(0x27182842E098f60e3D576794A5bFFb0777E025d3); + IEulerEToken internal constant _EUSDC = IEulerEToken(0xEb91861f8A4e1C12333F42DCE8fB0Ecdc28dA716); + IEulerDToken internal constant _DUSDC = IEulerDToken(0x84721A3dB22EB852233AEAE74f9bC8477F8bcc42); + AggregatorV3Interface private constant _CHAINLINK = + AggregatorV3Interface(0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419); + uint256 internal constant _PROP_INVESTED = 95 * 10**7; + + uint256 public marginAmount; + uint8 internal _decimalToken; + OptimizerAPRStrategy public constant strat = OptimizerAPRStrategy(0xD1760AA0FCD9e64bA4ea43399Ad789CFd63C7809); + GenericCompoundUpgradeable public constant lenderCompound = + GenericCompoundUpgradeable(payable(0x906B067e392e2c5f9E4f101f36C0b8CdA4885EBf)); + GenericAaveNoStaker public constant lenderAave = GenericAaveNoStaker(0xDf951d2061b12922BFbF22cb17B17f3b39183570); + GenericEulerStaker public constant lenderEuler = GenericEulerStaker(0x8f119cd256a0FfFeed643E830ADCD9767a1d517F); + + uint256 public constant BACKTEST_LENGTH = 30; + uint256 public constant IMPROVE_LENGTH = 2; + + function run() external { + // vm.createSelectFork("mainnet"); + uint256 deployerPrivateKey = vm.deriveKey(vm.envString("MNEMONIC_FORK"), 0); + vm.startBroadcast(GOVERNOR); + + _decimalToken = IERC20Metadata(address(token)).decimals(); + marginAmount = 10**(_decimalToken + 1); + + strat.addLender(IGenericLender(address(lenderCompound))); + strat.addLender(IGenericLender(address(lenderAave))); + strat.addLender(IGenericLender(address(lenderEuler))); + manager.updateStrategyDebtRatio(address(_oldStrat), 0); + manager.addStrategy(address(strat), _PROP_INVESTED); + vm.stopBroadcast(); + + vm.startBroadcast(KEEPER); + // do a claimComp first and sell the rewards + address[] memory holders = new address[](1); + CTokenI[] memory cTokens = new CTokenI[](1); + holders[0] = address(_oldLenderCompound); + cTokens[0] = CTokenI(address(_cUSDC)); + _COMPTROLLER.claimComp(holders, cTokens, true, true); + uint256 compReward = _COMP.balanceOf(address(_oldLenderCompound)); + console.log("compReward ", compReward); + // TODO when selling simulate back at current block how many rewards we received + _oldLenderCompound.sellRewards( + 0, + hex"2e95b6c8000000000000000000000000c00e94cb662c3520282e6f5717214004a7f2688800000000000000000000000000000000000000000000000008c662afa8912e0700000000000000000000000000000000000000000000000000000000021c862e0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000200000000000000003b6d034059f7a66a2fbcaf203cee71359b51142238f85b7880000000000000003b6d0340b4e16d0168e52d35cacd2c6185b44281ec28c9dccfee7c08" + ); + + // do a claimRewards first and sell the rewards + _oldLenderAave.claimRewards(); + // there shouldn't be any + uint256 stkAaveOldLender = _stkAave.balanceOf(address(_oldLenderAave)); + uint256 aaveOldLender = _aave.balanceOf(address(_oldLenderAave)); + assertEq(stkAaveOldLender, 0); + assertEq(aaveOldLender, 0); + + // Update the rate so that we have the true rate and we don't underestimate the rate on chain + _cUSDC.accrueInterest(); + vm.stopBroadcast(); + + // remove funds from previous strat + vm.startBroadcast(GOVERNOR); + // It would have been more efficient but it doesn't account for profits + // _oldStrat.safeRemoveLender(address(_oldLenderAave)); + // _oldStrat.forceRemoveLender(address(_oldLenderCompound)); + _oldStrat.harvest(); + manager.withdrawFromStrategy(IStrategy(address(_oldStrat)), token.balanceOf(address(_oldStrat))); + vm.stopPrank(); + + // There shouldn't be any funds left on the old strat + assertEq(token.balanceOf(address(_oldLenderCompound)), 0); + assertApproxEqAbs(_cUSDC.balanceOf(address(_oldLenderCompound)), 0, 10**_decimalToken); + assertEq(_oldLenderCompound.nav(), 0); + assertEq(token.balanceOf(address(_oldLenderAave)), 0); + assertEq(_oldLenderAave.nav(), 0); + assertEq(token.balanceOf(address(_oldStrat)), 0); + assertEq(_oldStrat.estimatedTotalAssets(), 0); + assertEq(_oldStrat.lentTotalAssets(), 0); + + // Then we add the new strategy + uint64[] memory lenderShares = new uint64[](3); + lenderShares[0] = (_BPS * 2) / 5; + lenderShares[2] = (_BPS * 3) / 5; + strat.harvest(abi.encode(lenderShares)); + uint256 totalAssetsInvested = (manager.getTotalAsset() * _PROP_INVESTED) / 10**9; + assertApproxEqAbs(lenderCompound.nav(), (totalAssetsInvested * lenderShares[0]) / _BPS, marginAmount); + assertApproxEqAbs(lenderEuler.nav(), (totalAssetsInvested * lenderShares[2]) / _BPS, marginAmount); + assertApproxEqAbs(lenderAave.nav(), (totalAssetsInvested * lenderShares[1]) / _BPS, marginAmount); + assertApproxEqAbs(strat.estimatedTotalAssets(), totalAssetsInvested, marginAmount); + vm.stopBroadcast(); + + console.log("strat apr ", strat.estimatedAPR()); + console.log("compound apr ", lenderCompound.apr()); + console.log("aave apr ", lenderAave.apr()); + console.log("euler apr ", lenderEuler.apr()); + } +} diff --git a/scripts/mainnet-fork/checkUpgradeImplementation.ts b/scripts/hardhat/mainnet-fork/checkUpgradeImplementation.ts similarity index 97% rename from scripts/mainnet-fork/checkUpgradeImplementation.ts rename to scripts/hardhat/mainnet-fork/checkUpgradeImplementation.ts index 7bbb861..8f79255 100644 --- a/scripts/mainnet-fork/checkUpgradeImplementation.ts +++ b/scripts/hardhat/mainnet-fork/checkUpgradeImplementation.ts @@ -1,12 +1,13 @@ +import { expect } from 'chai'; import { Contract, utils } from 'ethers'; +import { ethers, network } from 'hardhat'; + import { - TransparentUpgradeableProxy__factory, - TransparentUpgradeableProxy, AaveFlashloanStrategy, AaveFlashloanStrategy__factory, -} from '../../typechain'; -import { network, ethers } from 'hardhat'; -import { expect } from 'chai'; + TransparentUpgradeableProxy, + TransparentUpgradeableProxy__factory, +} from '../../../typechain'; export async function deploy( contractName: string, diff --git a/scripts/mainnet-fork/genericLender/addEulerLender.ts b/scripts/hardhat/mainnet-fork/genericLender/addEulerLender.ts similarity index 95% rename from scripts/mainnet-fork/genericLender/addEulerLender.ts rename to scripts/hardhat/mainnet-fork/genericLender/addEulerLender.ts index 3544eb5..f8b442c 100644 --- a/scripts/mainnet-fork/genericLender/addEulerLender.ts +++ b/scripts/hardhat/mainnet-fork/genericLender/addEulerLender.ts @@ -1,8 +1,10 @@ // eslint-disable-next-line camelcase -import { CONTRACTS_ADDRESSES, ChainId } from '@angleprotocol/sdk'; -import { network, ethers, deployments } from 'hardhat'; +import { ChainId, CONTRACTS_ADDRESSES } from '@angleprotocol/sdk'; import { parseUnits } from 'ethers/lib/utils'; +import { deployments, ethers, network } from 'hardhat'; + +import { logBN } from '../../../../test/hardhat/utils-interaction'; import { GenericAaveNoStaker, GenericAaveNoStaker__factory, @@ -14,8 +16,7 @@ import { OptimizerAPRGreedyStrategy__factory, PoolManager, PoolManager__factory, -} from '../../../typechain'; -import { logBN } from '../../../test/hardhat/utils-interaction'; +} from '../../../../typechain'; async function main() { // =============== Simulation parameters ==================== diff --git a/scripts/mainnet-fork/genericLender/fraxConvexStaker.ts b/scripts/hardhat/mainnet-fork/genericLender/fraxConvexStaker.ts similarity index 93% rename from scripts/mainnet-fork/genericLender/fraxConvexStaker.ts rename to scripts/hardhat/mainnet-fork/genericLender/fraxConvexStaker.ts index d89f528..fd31159 100644 --- a/scripts/mainnet-fork/genericLender/fraxConvexStaker.ts +++ b/scripts/hardhat/mainnet-fork/genericLender/fraxConvexStaker.ts @@ -1,15 +1,15 @@ // This script is to be run after having run `unpauseCollat.ts` +import { ChainId, CONTRACTS_ADDRESSES } from '@angleprotocol/sdk'; import { PoolManager, // eslint-disable-next-line camelcase PoolManager_Interface, } from '@angleprotocol/sdk/dist/constants/interfaces'; - -import { CONTRACTS_ADDRESSES, ChainId } from '@angleprotocol/sdk'; -import { network, ethers } from 'hardhat'; import { parseUnits } from 'ethers/lib/utils'; -import { OptimizerAPRGreedyStrategy, OptimizerAPRGreedyStrategy__factory } from '../../../typechain'; -import { DAY } from '../../../test/hardhat/contants'; +import { ethers, network } from 'hardhat'; + +import { DAY } from '../../../../test/hardhat/contants'; +import { OptimizerAPRGreedyStrategy, OptimizerAPRGreedyStrategy__factory } from '../../../../typechain'; async function main() { // =============== Simulation parameters ==================== diff --git a/scripts/mainnet-fork/genericLender/removeGenericCompound.ts b/scripts/hardhat/mainnet-fork/genericLender/removeGenericCompound.ts similarity index 96% rename from scripts/mainnet-fork/genericLender/removeGenericCompound.ts rename to scripts/hardhat/mainnet-fork/genericLender/removeGenericCompound.ts index 2e9c47e..290fc25 100644 --- a/scripts/mainnet-fork/genericLender/removeGenericCompound.ts +++ b/scripts/hardhat/mainnet-fork/genericLender/removeGenericCompound.ts @@ -1,12 +1,13 @@ -import { CONTRACTS_ADDRESSES, ChainId } from '@angleprotocol/sdk'; -import { network, ethers } from 'hardhat'; +import { ChainId, CONTRACTS_ADDRESSES } from '@angleprotocol/sdk'; import { parseUnits } from 'ethers/lib/utils'; +import { ethers, network } from 'hardhat'; + import { GenericCompoundUpgradeable, GenericCompoundUpgradeable__factory, OptimizerAPRGreedyStrategy, OptimizerAPRGreedyStrategy__factory, -} from '../../../typechain'; +} from '../../../../typechain'; async function main() { // =============== Simulation parameters ==================== diff --git a/scripts/mainnet-fork/harvest.ts b/scripts/hardhat/mainnet-fork/harvest.ts similarity index 87% rename from scripts/mainnet-fork/harvest.ts rename to scripts/hardhat/mainnet-fork/harvest.ts index a3342ed..ddb15b8 100644 --- a/scripts/mainnet-fork/harvest.ts +++ b/scripts/hardhat/mainnet-fork/harvest.ts @@ -1,15 +1,20 @@ // This script is to be run after having run `unpauseCollat.ts` +import { ChainId, CONTRACTS_ADDRESSES } from '@angleprotocol/sdk'; import { PoolManager, // eslint-disable-next-line camelcase PoolManager_Interface, } from '@angleprotocol/sdk/dist/constants/interfaces'; - -import { CONTRACTS_ADDRESSES, ChainId } from '@angleprotocol/sdk'; -import { network, ethers } from 'hardhat'; import { parseUnits } from 'ethers/lib/utils'; -import { ERC20, ERC20__factory, OptimizerAPRGreedyStrategy, OptimizerAPRGreedyStrategy__factory } from '../../typechain'; -import { logBN } from '../../test/hardhat/utils-interaction'; +import { ethers, network } from 'hardhat'; + +import { logBN } from '../../../test/hardhat/utils-interaction'; +import { + ERC20, + ERC20__factory, + OptimizerAPRGreedyStrategy, + OptimizerAPRGreedyStrategy__factory, +} from '../../../typechain'; async function main() { // =============== Simulation parameters ==================== diff --git a/scripts/mainnet-fork/keeper.ts b/scripts/hardhat/mainnet-fork/keeper.ts similarity index 94% rename from scripts/mainnet-fork/keeper.ts rename to scripts/hardhat/mainnet-fork/keeper.ts index 4506c24..3264069 100644 --- a/scripts/mainnet-fork/keeper.ts +++ b/scripts/hardhat/mainnet-fork/keeper.ts @@ -1,7 +1,8 @@ /* eslint-disable camelcase */ +import { BigNumber, constants, utils } from 'ethers'; import { ethers, network } from 'hardhat'; -import { utils, constants, BigNumber } from 'ethers'; -import { ILendingPool__factory, ILendingPool, ERC20, ERC20__factory } from '../../typechain'; + +import { ERC20, ERC20__factory, ILendingPool, ILendingPool__factory } from '../../../typechain'; export const logBN = (amount: BigNumber, { base = 6, pad = 20, sign = false } = {}) => { const num = parseFloat(utils.formatUnits(amount, base)); diff --git a/scripts/mainnet-fork/stETHStrategy/imbalanceCurvePool.ts b/scripts/hardhat/mainnet-fork/stETHStrategy/imbalanceCurvePool.ts similarity index 95% rename from scripts/mainnet-fork/stETHStrategy/imbalanceCurvePool.ts rename to scripts/hardhat/mainnet-fork/stETHStrategy/imbalanceCurvePool.ts index 68d0380..68cefd0 100644 --- a/scripts/mainnet-fork/stETHStrategy/imbalanceCurvePool.ts +++ b/scripts/hardhat/mainnet-fork/stETHStrategy/imbalanceCurvePool.ts @@ -1,8 +1,9 @@ // This script is to be run after having run `unpauseCollat.ts` +import { ChainId, CONTRACTS_ADDRESSES } from '@angleprotocol/sdk'; import { - PerpetualManagerFront, // eslint-disable-next-line camelcase Perpetual_Manager_Interface, + PerpetualManagerFront, PoolManager, // eslint-disable-next-line camelcase PoolManager_Interface, @@ -14,11 +15,10 @@ import { Weth, Weth__factory, } from '@angleprotocol/sdk/dist/constants/interfaces'; - import { expect } from 'chai'; -import { CONTRACTS_ADDRESSES, ChainId } from '@angleprotocol/sdk'; -import { network, ethers, deployments } from 'hardhat'; import { parseUnits } from 'ethers/lib/utils'; +import { deployments, ethers, network } from 'hardhat'; + import { logBN, logGeneralInfo, @@ -29,7 +29,7 @@ import { randomMint, // randomWithdraw, wait, -} from '../../../test/hardhat/utils-interaction'; +} from '../../../../test/hardhat/utils-interaction'; import { IStableSwapPool, IStableSwapPool__factory, @@ -37,7 +37,7 @@ import { ISteth__factory, StETHStrategy, StETHStrategy__factory, -} from '../../../typechain'; +} from '../../../../typechain'; async function main() { // =============== Simulation parameters ==================== @@ -45,7 +45,7 @@ async function main() { // If we're in mainnet fork, we're using the json.mainnet address // eslint-disable-next-line - const json = (await import('../../../deploy/networks/mainnet.json')) as any; + const json = (await import('../../../../deploy/networks/mainnet.json')) as any; const governance = CONTRACTS_ADDRESSES[ChainId.MAINNET].GovernanceMultiSig! as string; diff --git a/scripts/mainnet-fork/stETHStrategy/testDeploy.ts b/scripts/hardhat/mainnet-fork/stETHStrategy/testDeploy.ts similarity index 92% rename from scripts/mainnet-fork/stETHStrategy/testDeploy.ts rename to scripts/hardhat/mainnet-fork/stETHStrategy/testDeploy.ts index 442fb2f..97c78b8 100644 --- a/scripts/mainnet-fork/stETHStrategy/testDeploy.ts +++ b/scripts/hardhat/mainnet-fork/stETHStrategy/testDeploy.ts @@ -1,8 +1,9 @@ // This script is to be run after having run `unpauseCollat.ts` +import { ChainId, CONTRACTS_ADDRESSES } from '@angleprotocol/sdk'; import { - PerpetualManagerFront, // eslint-disable-next-line camelcase Perpetual_Manager_Interface, + PerpetualManagerFront, PoolManager, // eslint-disable-next-line camelcase PoolManager_Interface, @@ -12,11 +13,10 @@ import { Weth, Weth__factory, } from '@angleprotocol/sdk/dist/constants/interfaces'; - import { expect } from 'chai'; -import { CONTRACTS_ADDRESSES, ChainId } from '@angleprotocol/sdk'; -import { network, ethers, deployments } from 'hardhat'; import { parseUnits } from 'ethers/lib/utils'; +import { deployments, ethers, network } from 'hardhat'; + import { logGeneralInfo, logSLP, @@ -25,8 +25,8 @@ import { randomMint, randomWithdraw, wait, -} from '../../../test/hardhat/utils-interaction'; -import { StETHStrategy, StETHStrategy__factory } from '../../../typechain'; +} from '../../../../test/hardhat/utils-interaction'; +import { StETHStrategy, StETHStrategy__factory } from '../../../../typechain'; async function main() { // =============== Simulation parameters ==================== @@ -34,7 +34,7 @@ async function main() { // If we're in mainnet fork, we're using the json.mainnet address // eslint-disable-next-line - let json = (await import('../../../deploy/networks/mainnet.json')) as any; + let json = (await import('../../../../deploy/networks/mainnet.json')) as any; if (network.live) { json = await import('../../../deploy/networks/' + network.name + '.json'); } diff --git a/scripts/mainnet-fork/upgradeFraxAaveLender.ts b/scripts/hardhat/mainnet-fork/upgradeFraxAaveLender.ts similarity index 93% rename from scripts/mainnet-fork/upgradeFraxAaveLender.ts rename to scripts/hardhat/mainnet-fork/upgradeFraxAaveLender.ts index 5b0fc2e..9c82d8c 100644 --- a/scripts/mainnet-fork/upgradeFraxAaveLender.ts +++ b/scripts/hardhat/mainnet-fork/upgradeFraxAaveLender.ts @@ -1,4 +1,5 @@ // This script is to be run after having run `unpauseCollat.ts` +import { ChainId, CONTRACTS_ADDRESSES } from '@angleprotocol/sdk'; import { PerpetualManagerFront, PerpetualManagerFront__factory, @@ -8,10 +9,11 @@ import { StableMasterFront, StableMasterFront__factory, } from '@angleprotocol/sdk/dist/constants/interfaces'; - -import { CONTRACTS_ADDRESSES, ChainId } from '@angleprotocol/sdk'; -import { network, ethers } from 'hardhat'; import { parseUnits } from 'ethers/lib/utils'; +import { ethers, network } from 'hardhat'; + +import { DAY } from '../../../test/hardhat/contants'; +import { time } from '../../../test/hardhat/test-utils/helpers'; import { logGeneralInfo, logOptimizerInfo, @@ -19,10 +21,8 @@ import { randomDeposit, randomWithdraw, wait, -} from '../../test/hardhat/utils-interaction'; -import { OptimizerAPRGreedyStrategy, OptimizerAPRGreedyStrategy__factory } from '../../typechain'; -import { time } from '../../test/hardhat/test-utils/helpers'; -import { DAY } from '../../test/hardhat/contants'; +} from '../../../test/hardhat/utils-interaction'; +import { OptimizerAPRGreedyStrategy, OptimizerAPRGreedyStrategy__factory } from '../../../typechain'; async function main() { // =============== Simulation parameters ==================== diff --git a/scripts/mainnet-fork/upgradeability.ts b/scripts/hardhat/mainnet-fork/upgradeability.ts similarity index 100% rename from scripts/mainnet-fork/upgradeability.ts rename to scripts/hardhat/mainnet-fork/upgradeability.ts diff --git a/test/foundry/optimizerAPR/OptimizerAPRImplUpgrade.test.sol b/test/foundry/optimizerAPR/OptimizerAPRImplUpgrade.test.sol new file mode 100644 index 0000000..ee89593 --- /dev/null +++ b/test/foundry/optimizerAPR/OptimizerAPRImplUpgrade.test.sol @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.12; + +import "../BaseTest.test.sol"; +import { PoolManager, IStrategy } from "../../../contracts/mock/MockPoolManager2.sol"; +import { OptimizerAPRStrategy, LendStatus } from "../../../contracts/strategies/OptimizerAPR/OptimizerAPRStrategy.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +contract OptimizerAPRUpgradeTest is BaseTest { + using stdStorage for StdStorage; + + uint256 internal constant _BASE_TOKEN = 10**18; + uint256 internal constant _BASE_APR = 10**18; + uint64 internal constant _BPS = 10**4; + address public constant KEEPER_MULTICALL = 0xa0062b7A5e494d569059E2f1A98B5f6C99BFAAfe; + address public constant KEEPER = 0xcC617C6f9725eACC993ac626C7efC6B96476916E; + address public constant PROXY_ADMIN = 0x1D941EF0D3Bba4ad67DBfBCeE5262F4CEE53A32b; + + /// @notice Role for `PoolManager` only - keccak256("POOLMANAGER_ROLE") + bytes32 public constant POOLMANAGER_ROLE = 0x5916f72c85af4ac6f7e34636ecc97619c4b2085da099a5d28f3e58436cfbe562; + /// @notice Role for guardians and governors - keccak256("GUARDIAN_ROLE") + bytes32 public constant GUARDIAN_ROLE = 0x55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041; + /// @notice Role for keepers - keccak256("KEEPER_ROLE") + bytes32 public constant KEEPER_ROLE = 0xfc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab; + IERC20 public token = IERC20(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48); + PoolManager public manager = PoolManager(0xe9f183FC656656f1F17af1F2b0dF79b8fF9ad8eD); + OptimizerAPRStrategy internal _strat = OptimizerAPRStrategy(0xBfa4459868C60da9edd835F0be684EDeC054557b); + OptimizerAPRStrategy internal _oldStratimpl = OptimizerAPRStrategy(0xa693aBabF230397B3e6385ff7eE09607f562af8c); + + uint256 public marginAmount; + uint8 internal constant _decimalToken = 6; + OptimizerAPRStrategy public newStratImpl; + + function setUp() public override { + super.setUp(); + + _ethereum = vm.createFork(vm.envString("ETH_NODE_URI_ETH_FOUNDRY"), 16590930); + vm.selectFork(_ethereum); + + address[] memory keeperList = new address[](1); + address[] memory governorList = new address[](1); + keeperList[0] = _KEEPER; + governorList[0] = _GOVERNOR; + + newStratImpl = new OptimizerAPRStrategy(); + } + + // =============================== MIGRATE FUNDS =============================== + + function testUpgrade() public { + _checksProxy(_strat); + + vm.startPrank(PROXY_ADMIN); + TransparentUpgradeableProxy(payable(address(_strat))).upgradeTo(address(newStratImpl)); + vm.stopPrank(); + + _checksProxy(_strat); + } + + function _checksProxy(OptimizerAPRStrategy strat) public { + assertEq(address(strat.poolManager()), address(manager)); + assertEq(address(strat.want()), address(token)); + assertEq(strat.wantBase(), 10**_decimalToken); + assertEq(strat.debtThreshold(), 100 * 10**18); + assertEq(strat.withdrawalThreshold(), 1000 * 10**_decimalToken); + assertFalse(strat.emergencyExit()); + assertEq(strat.lentTotalAssets(), 0); + assertEq(strat.estimatedTotalAssets(), 0); + assertEq(strat.numLenders(), 0); + assertEq(strat.estimatedAPR(), 0); + // LendStatus[] memory status = strat.lendStatuses(); + // assertEq(status[0].name, "Compound Lender USDC v2"); + // assertEq(status[1].name, "Aave Lender USDC v2"); + // assertEq(status[2].name, "Euler Staker Lender USDC"); + // assertEq(status[0].assets, 0); + // assertEq(status[1].assets, 0); + // assertEq(status[2].assets, 0); + // assertGt(status[0].rate, 0); + // assertGt(status[1].rate, 0); + // assertGt(status[2].rate, 0); + assertTrue(strat.hasRole(GUARDIAN_ROLE, _GUARDIAN)); + assertTrue(strat.hasRole(GUARDIAN_ROLE, _GOVERNOR)); + assertTrue(strat.hasRole(POOLMANAGER_ROLE, address(manager))); + assertTrue(strat.hasRole(KEEPER_ROLE, KEEPER)); + assertTrue(strat.hasRole(KEEPER_ROLE, KEEPER_MULTICALL)); + assertEq(strat.getRoleAdmin(GUARDIAN_ROLE), POOLMANAGER_ROLE); + assertEq(strat.getRoleAdmin(POOLMANAGER_ROLE), POOLMANAGER_ROLE); + assertEq(strat.getRoleAdmin(KEEPER_ROLE), GUARDIAN_ROLE); + assertEq(token.allowance(address(strat), address(manager)), type(uint256).max); + + // dummy test + assertFalse(strat.hasRole(GUARDIAN_ROLE, address(manager))); + } +} diff --git a/test/foundry/optimizerAPR/OptimizerAPRStrategyForkTest.test.sol b/test/foundry/optimizerAPR/OptimizerAPRStrategyForkTestUSDC.test.sol similarity index 76% rename from test/foundry/optimizerAPR/OptimizerAPRStrategyForkTest.test.sol rename to test/foundry/optimizerAPR/OptimizerAPRStrategyForkTestUSDC.test.sol index 6290fd9..1eb415c 100644 --- a/test/foundry/optimizerAPR/OptimizerAPRStrategyForkTest.test.sol +++ b/test/foundry/optimizerAPR/OptimizerAPRStrategyForkTestUSDC.test.sol @@ -11,7 +11,7 @@ import { GenericAaveNoStaker, IERC20, IERC20Metadata, IGenericLender } from "../ import { GenericCompoundUpgradeable } from "../../../contracts/strategies/OptimizerAPR/genericLender/compound/GenericCompoundUpgradeable.sol"; import { GenericEulerStaker, IEulerStakingRewards, IEuler, IEulerEToken, IEulerDToken, IGenericLender, AggregatorV3Interface } from "../../../contracts/strategies/OptimizerAPR/genericLender/euler/GenericEulerStaker.sol"; -contract OptimizerAPRStrategyForkTest is BaseTest { +contract OptimizerAPRStrategyUSDCForkTest is BaseTest { using stdStorage for StdStorage; uint256 internal constant _BASE_TOKEN = 10**18; @@ -40,8 +40,6 @@ contract OptimizerAPRStrategyForkTest is BaseTest { AggregatorV3Interface(0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419); uint256 internal constant _PROP_INVESTED = 95 * 10**7; - uint256 public maxTokenAmount; - uint256 public minTokenAmount; uint256 public marginAmount; uint8 internal _decimalToken; OptimizerAPRStrategy public stratImplementation; @@ -59,12 +57,10 @@ contract OptimizerAPRStrategyForkTest is BaseTest { function setUp() public override { super.setUp(); - _ethereum = vm.createFork(vm.envString("ETH_NODE_URI_ETH_FOUNDRY"), 16420445); + _ethereum = vm.createFork(vm.envString("ETH_NODE_URI_ETH_FOUNDRY"), 16583523); vm.selectFork(_ethereum); _decimalToken = IERC20Metadata(address(token)).decimals(); - maxTokenAmount = 10**(_decimalToken + 6); - minTokenAmount = 10**(_decimalToken - 1); marginAmount = 10**(_decimalToken + 1); address[] memory keeperList = new address[](1); @@ -133,11 +129,7 @@ contract OptimizerAPRStrategyForkTest is BaseTest { ); vm.startPrank(_GOVERNOR); - strat.addLender(IGenericLender(address(lenderCompound))); - strat.addLender(IGenericLender(address(lenderAave))); - strat.addLender(IGenericLender(address(lenderEuler))); manager.updateStrategyDebtRatio(address(_oldStrat), 0); - manager.addStrategy(address(strat), _PROP_INVESTED); vm.stopPrank(); } @@ -157,7 +149,7 @@ contract OptimizerAPRStrategyForkTest is BaseTest { // TODO when selling simulate back at current block how many rewards we received _oldLenderCompound.sellRewards( 0, - hex"7c02520000000000000000000000000053222470cdcfb8081c0e3a50fd106f0d69e63f2000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000180000000000000000000000000c00e94cb662c3520282e6f5717214004a7f26888000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000053222470cdcfb8081c0e3a50fd106f0d69e63f200000000000000000000000006d7ccd6d3e4948579891f90e98c1bb09a8c677ea000000000000000000000000000000000000000000000003fd86cc0b67bf0e1000000000000000000000000000000000000000000000000000000000e14eae3900000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f90000000000000000000000000000000000000000000000000003bb00038d00a0860a32ec000000000000000000000000000000000000000000000003fd86cc0b67bf0e100003645520080bf510fcbf18b91105470639e9561022937712c00e94cb662c3520282e6f5717214004a7f2688895e6f48254609a6ee006f7d493c8e5fb97094cef0024b4be83d50000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000056178a0d5f301baf6cf3e1cd53d9863437345bf900000000000000000000000053222470cdcfb8081c0e3a50fd106f0d69e63f2000000000000000000000000055662e225a3376759c24331a9aed764f8f0c9fbb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e3848506000000000000000000000000000000000000000000000003fd86cc0b67bf0e10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063c5773401ffffffffffffffffffffffffffffffffffffff3862771d63c576bc00000026000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000024f47261b0000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024f47261b0000000000000000000000000c00e94cb662c3520282e6f5717214004a7f268880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000421bae301d9fe2af6c418cfff3f37a9cd0d52af754376421faedd5754993b730b6ab563cbb70cd4b6dde036dca82d2bab83eecc82dd700d5e256d65d008f937fe7ed0300000000000000000000000000000000000000000000000000000000000080a06c4eca27a0b86991c6218b36c1d19d4a2e9eb0ce3606eb481111111254fb6c44bac0bed2854e76f90643097d000000000000000000000000000000000000000000000003fd86cc0b67bf0e1000000000000000cfee7c08" + hex"2e95b6c8000000000000000000000000c00e94cb662c3520282e6f5717214004a7f2688800000000000000000000000000000000000000000000000008c662afa8912e0700000000000000000000000000000000000000000000000000000000021c862e0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000200000000000000003b6d034059f7a66a2fbcaf203cee71359b51142238f85b7880000000000000003b6d0340b4e16d0168e52d35cacd2c6185b44281ec28c9dccfee7c08" ); // do a claimRewards first and sell the rewards @@ -178,6 +170,10 @@ contract OptimizerAPRStrategyForkTest is BaseTest { // _oldStrat.forceRemoveLender(address(_oldLenderCompound)); _oldStrat.harvest(); manager.withdrawFromStrategy(IStrategy(address(_oldStrat)), token.balanceOf(address(_oldStrat))); + strat.addLender(IGenericLender(address(lenderCompound))); + strat.addLender(IGenericLender(address(lenderAave))); + strat.addLender(IGenericLender(address(lenderEuler))); + manager.addStrategy(address(strat), _PROP_INVESTED); vm.stopPrank(); // There shouldn't be any funds left on the old strat