diff --git a/broadcast/Deploy.s.sol/1/run-1774795877952.json b/broadcast/Deploy.s.sol/1/run-1774795877952.json new file mode 100644 index 0000000..a5da9f8 --- /dev/null +++ b/broadcast/Deploy.s.sol/1/run-1774795877952.json @@ -0,0 +1,75 @@ +{ + "transactions": [ + { + "hash": "0xf52f6a73815495053346d5d0f0879fac17404b92cd3ab80913ca5eb37685e937", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", + "function": "deployCreate2(bytes32,bytes)", + "arguments": [ + "0xbefc77c3af16a9a70855401f32680620b146807237940aaf8e9d194f97233c0a", + "0x6103ba610011610000396103ba610000f35f3560e01c60026003820660011b6103b401601e395f51565b63f4f2557581186103ac576044361034176103b0576004358060a01c6103b0576040526040516383d8cfc0608052602060806004609c845afa61005d573d5f5f3e3d5ffd5b3d602081183d60201002188060800160a0116103b0576080518060a01c6103b05760c0525060c0905051606052604051631d7650cf60a052602060a0600460bc845afa6100ac573d5f5f3e3d5ffd5b3d602081183d60201002188060a00160c0116103b05760a0518060a01c6103b05760e0525060e090505160805260405163b8c50436610100526080602435610120527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61014052306101605280610180526040606060c05e604060a05260a08161012001606082825e8051806020830101601f825f03163682375050601f19601f825160200101169050905081015050602061010060e461011c5f855af1610176573d5f5f3e3d5ffd5b60203d106103b05761010050506060516370a0823160c0523060e052602060c0602460dc845afa6101a9573d5f5f3e3d5ffd5b60203d106103b05760c090505160a05260a051156102395760605163a9059cbb60c0523360e05260a05161010052602060c0604460dc5f855af16101ef573d5f5f3e3d5ffd5b3d61020657803b156103b05760016101205261022d565b3d602081183d60201002188060c00160e0116103b05760c0518060011c6103b05761012052505b610120905051156103b0575b005b63c92632b581186103ac5760a4361034176103b0576024358060a01c6103b0576040526084356004018035620186a081116103b0575060208135018082606037505060403662018720376040606051186103b05760605160800160c0116103b0576080518060a01c6103b057620187605260a0518060a01c6103b057620187805262018760805162018720526020810151620187405250620187405163ba0876526201876052604435620187805230620187a05230620187c05260206201876060646201877c5f855af1610311573d5f5f3e3d5ffd5b60203d106103b057620187605050620187205163095ea7b36201876052336201878052606435620187a05260206201876060446201877c5f855af1610358573d5f5f3e3d5ffd5b3d61037057803b156103b0576001620187c05261039e565b3d602081183d602010021880620187600162018780116103b05762018760518060011c6103b057620187c052505b620187c0905051156103b057005b5f5ffd5b5f80fd03ac0018023b85582044497807ac4bb883ce45ef4579cd6f2cfa2128d988bfc5e85ab7c7295eb431751903ba810600a1657679706572830004030036" + ], + "transaction": { + "from": "0x000005281a2b04a182085d37cc9e6dd552795caa", + "to": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", + "gas": "0xb63e3", + "value": "0x0", + "input": "0x26307668befc77c3af16a9a70855401f32680620b146807237940aaf8e9d194f97233c0a000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000004016103ba610011610000396103ba610000f35f3560e01c60026003820660011b6103b401601e395f51565b63f4f2557581186103ac576044361034176103b0576004358060a01c6103b0576040526040516383d8cfc0608052602060806004609c845afa61005d573d5f5f3e3d5ffd5b3d602081183d60201002188060800160a0116103b0576080518060a01c6103b05760c0525060c0905051606052604051631d7650cf60a052602060a0600460bc845afa6100ac573d5f5f3e3d5ffd5b3d602081183d60201002188060a00160c0116103b05760a0518060a01c6103b05760e0525060e090505160805260405163b8c50436610100526080602435610120527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61014052306101605280610180526040606060c05e604060a05260a08161012001606082825e8051806020830101601f825f03163682375050601f19601f825160200101169050905081015050602061010060e461011c5f855af1610176573d5f5f3e3d5ffd5b60203d106103b05761010050506060516370a0823160c0523060e052602060c0602460dc845afa6101a9573d5f5f3e3d5ffd5b60203d106103b05760c090505160a05260a051156102395760605163a9059cbb60c0523360e05260a05161010052602060c0604460dc5f855af16101ef573d5f5f3e3d5ffd5b3d61020657803b156103b05760016101205261022d565b3d602081183d60201002188060c00160e0116103b05760c0518060011c6103b05761012052505b610120905051156103b0575b005b63c92632b581186103ac5760a4361034176103b0576024358060a01c6103b0576040526084356004018035620186a081116103b0575060208135018082606037505060403662018720376040606051186103b05760605160800160c0116103b0576080518060a01c6103b057620187605260a0518060a01c6103b057620187805262018760805162018720526020810151620187405250620187405163ba0876526201876052604435620187805230620187a05230620187c05260206201876060646201877c5f855af1610311573d5f5f3e3d5ffd5b60203d106103b057620187605050620187205163095ea7b36201876052336201878052606435620187a05260206201876060446201877c5f855af1610358573d5f5f3e3d5ffd5b3d61037057803b156103b0576001620187c05261039e565b3d602081183d602010021880620187600162018780116103b05762018760518060011c6103b057620187c052505b620187c0905051156103b057005b5f5ffd5b5f80fd03ac0018023b85582044497807ac4bb883ce45ef4579cd6f2cfa2128d988bfc5e85ab7c7295eb431751903ba810600a165767970657283000403003600000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x29", + "chainId": "0x1" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "contractName": "yv_auction_taker", + "address": "0x2447680186067b6ef959df69d4b1dc55ce543a9f", + "initCode": "0x6103ba610011610000396103ba610000f35f3560e01c60026003820660011b6103b401601e395f51565b63f4f2557581186103ac576044361034176103b0576004358060a01c6103b0576040526040516383d8cfc0608052602060806004609c845afa61005d573d5f5f3e3d5ffd5b3d602081183d60201002188060800160a0116103b0576080518060a01c6103b05760c0525060c0905051606052604051631d7650cf60a052602060a0600460bc845afa6100ac573d5f5f3e3d5ffd5b3d602081183d60201002188060a00160c0116103b05760a0518060a01c6103b05760e0525060e090505160805260405163b8c50436610100526080602435610120527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61014052306101605280610180526040606060c05e604060a05260a08161012001606082825e8051806020830101601f825f03163682375050601f19601f825160200101169050905081015050602061010060e461011c5f855af1610176573d5f5f3e3d5ffd5b60203d106103b05761010050506060516370a0823160c0523060e052602060c0602460dc845afa6101a9573d5f5f3e3d5ffd5b60203d106103b05760c090505160a05260a051156102395760605163a9059cbb60c0523360e05260a05161010052602060c0604460dc5f855af16101ef573d5f5f3e3d5ffd5b3d61020657803b156103b05760016101205261022d565b3d602081183d60201002188060c00160e0116103b05760c0518060011c6103b05761012052505b610120905051156103b0575b005b63c92632b581186103ac5760a4361034176103b0576024358060a01c6103b0576040526084356004018035620186a081116103b0575060208135018082606037505060403662018720376040606051186103b05760605160800160c0116103b0576080518060a01c6103b057620187605260a0518060a01c6103b057620187805262018760805162018720526020810151620187405250620187405163ba0876526201876052604435620187805230620187a05230620187c05260206201876060646201877c5f855af1610311573d5f5f3e3d5ffd5b60203d106103b057620187605050620187205163095ea7b36201876052336201878052606435620187a05260206201876060446201877c5f855af1610358573d5f5f3e3d5ffd5b3d61037057803b156103b0576001620187c05261039e565b3d602081183d602010021880620187600162018780116103b05762018760518060011c6103b057620187c052505b620187c0905051156103b057005b5f5ffd5b5f80fd03ac0018023b85582044497807ac4bb883ce45ef4579cd6f2cfa2128d988bfc5e85ab7c7295eb431751903ba810600a1657679706572830004030036" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "type": "0x2", + "status": "0x1", + "cumulativeGasUsed": "0x31f015f", + "logs": [ + { + "address": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", + "topics": [ + "0xb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f7", + "0x0000000000000000000000002447680186067b6ef959df69d4b1dc55ce543a9f", + "0xdce91b2f1d6c279f1fe8d67fcfa6989149da1a0e91c5c1b5e32f0a0394dcf9ee" + ], + "data": "0x", + "blockHash": "0xa75992a87b07e68100dbe67908d908034d97dc7f2cfea08576bea8e382399f7a", + "blockNumber": "0x179de31", + "blockTimestamp": "0x69c93c5f", + "transactionHash": "0xf52f6a73815495053346d5d0f0879fac17404b92cd3ab80913ca5eb37685e937", + "transactionIndex": "0x20a", + "logIndex": "0x547", + "removed": false + } + ], + "logsBloom": "0x00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000020000000000000000000000000000000000000000000000000000000000000100000000000000400000000000000000000000080010000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000002000000000000000000000000000000000000040000000000000080000000000000000000000000000000000", + "transactionHash": "0xf52f6a73815495053346d5d0f0879fac17404b92cd3ab80913ca5eb37685e937", + "transactionIndex": "0x20a", + "blockHash": "0xa75992a87b07e68100dbe67908d908034d97dc7f2cfea08576bea8e382399f7a", + "blockNumber": "0x179de31", + "gasUsed": "0x40cc3", + "effectiveGasPrice": "0x572c1a2", + "blobGasUsed": "0x0", + "from": "0x000005281a2b04a182085d37cc9e6dd552795caa", + "to": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1774795877952, + "chain": 1, + "commit": "8192814" +} \ No newline at end of file diff --git a/broadcast/Deploy.s.sol/1/run-latest.json b/broadcast/Deploy.s.sol/1/run-latest.json index 02a63b3..a5da9f8 100644 --- a/broadcast/Deploy.s.sol/1/run-latest.json +++ b/broadcast/Deploy.s.sol/1/run-latest.json @@ -1,320 +1,30 @@ { "transactions": [ { - "hash": "0xba99a5eeddbc8c04fa66f77c8ecdd2a8c84eac2d5e7f7d8f0a19151eaaeee0eb", + "hash": "0xf52f6a73815495053346d5d0f0879fac17404b92cd3ab80913ca5eb37685e937", "transactionType": "CALL", "contractName": null, "contractAddress": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", "function": "deployCreate2(bytes32,bytes)", "arguments": [ - "0x7190d946d0e179aeb9937b82478d661fbdb02ba6dfe94b12a42b89876cae6a24", - "0x611bd061001161000039611bd0610000f35f3560e01c60026014820660011b611ba801601e395f51565b633aa4b4d781186102125760c436103417611ba4576004358060a01c611ba4576040526024358060a01c611ba4576060526044358060a01c611ba4576080526060606460a0375f5c600114611ba45760015f5d5f54156100ea5760208061016052600b610100527f696e697469616c697a6564000000000000000000000000000000000000000000610120526101008161016001602b82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610140528060040161015cfd5b6040515f5560605163313ce567610120526020610120600461013c845afa610114573d5f5f3e3d5ffd5b3d602081183d6020100218806101200161014011611ba457610120518060081c611ba45761016052506101609050516101005260605160015561010051604d8111611ba45780600a0a90508015611ba45780670de0b6b3a764000004905060025560805163313ce567610140526020610140600461015c845afa61019a573d5f5f3e3d5ffd5b3d602081183d6020100218806101400161016011611ba457610140518060081c611ba45761018052506101809050516101205260805160035561012051604d8111611ba45780600a0a90508015611ba45780670de0b6b3a764000004905060045560a05160055560c05160065560e0516007555f5f5d005b6359eb8b2781186102c257602436103417611ba4575f5c600114611ba45760086004356020525f5260405f2080546104c05260018101546104e05260028101546105005260038101546105205260048101546105405260058101546105605260068101546105805260078101546105a05260088101546105c052506101206104c06103805e6102a26105e0611afd565b6105e051156102ba575f6106005260206106006102c0565b60206105005bf35b6375cd224781186117e657602436103417611ba4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610540524261056052610443565b63c5faa9af81186103b557602436103417611ba4575f5c600114611ba45760086004356020525f5260405f2080546104c05260018101546104e05260028101546105005260038101546105205260048101546105405260058101546105605260068101546105805260078101546105a05260088101546105c052506101206104c06103805e6103966105e0611afd565b6105e0516103ad575f6106005260206106006103b3565b60206105005bf35b631fcd5aaf81186117e65734611ba4575f5c600114611ba45760045460405260206040f35b6301456a52811861040057604436103417611ba457602435610540524261056052610443565b63face81b281186117e65734611ba4575f5c600114611ba45760055460405260206040f35b63097cb5e281186117e657606436103417611ba45760406024610540375b5f5c600114611ba45760086004356020525f5260405f2080546105805260018101546105a05260028101546105c05260038101546105e052600481015461060052600581015461062052600681015461064052600781015461066052600881015461068052506105c05161054051808281188284100218905090506106a05260206101206105806103805e6106a0516104a052610560516104c0526104e96106c0611b22565b6106c0f35b63d93580ff81186117e657602436103417611ba457426103805261052a565b639ea982cb81186117e657604436103417611ba457602435610380525b5f5c600114611ba45760086004356020525f5260405f2080546103a05260018101546103c05260028101546103e05260038101546104005260048101546104205260058101546104405260068101546104605260078101546104805260088101546104a0525060206101206103a06101405e61038051610260526105af6104c061192e565b6104c0f35b637aaa33c581186117e657602436103417611ba4575f5c600114611ba45760086004356020525f5260405f2080546104c05260018101546104e05260028101546105005260038101546105205260048101546105405260058101546105605260068101546105805260078101546105a05260088101546105c0525060206101206104c06103805e6106466105e0611afd565b6105e0f35b633bd8c8dc8118610b895760e436103417611ba45760a4358060a01c611ba4576104c05260c4358060a01c611ba4576104e0525f5c600114611ba45760015f5d5f5433181561070c57602080610560526005610500527f2170617069000000000000000000000000000000000000000000000000000000610520526105008161056001602582825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610540528060040161055cfd5b60243561078b5760208061056052600c610500527f216b69636b5f616d6f756e740000000000000000000000000000000000000000610520526105008161056001602c82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610540528060040161055cfd5b60643561080a5760208061056052600f610500527f217374617274696e675f70726963650000000000000000000000000000000000610520526105008161056001602f82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610540528060040161055cfd5b6084356108895760208061056052600e610500527f216d696e696d756d5f7072696365000000000000000000000000000000000000610520526105008161056001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610540528060040161055cfd5b6104c05161090957602080610560526009610500527f2172656365697665720000000000000000000000000000000000000000000000610520526105008161056001602982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610540528060040161055cfd5b6104e05161098957602080610560526011610500527f21737572706c75735f7265636569766572000000000000000000000000000000610520526105008161056001603182825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610540528060040161055cfd5b60086004356020525f5260405f2080546105005260018101546105205260028101546105405260038101546105605260048101546105805260058101546105a05260068101546105c05260078101546105e052600881015461060052506101206105006103805e6109fb610620611afd565b6106205115610a7c576020806106a0526006610640527f616374697665000000000000000000000000000000000000000000000000000061066052610640816106a001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610680528060040161069cfd5b60086004356020525f5260405f204281556024356001820155602435600282015560443560038201555f6004820155606435600582015560843560068201556104c05160078201556104e0516008820155506003546323b872dd610620525f54610640523061066052602435610680526020610620606461063c5f855af1610b06573d5f5f3e3d5ffd5b3d610b1d57803b15611ba45760016106a052610b47565b3d602081183d6020100218806106200161064011611ba457610620518060011c611ba4576106a052505b6106a090505115611ba4575f6004357f0617b7d1025dcb79895511800028509eff7b9531012457c418e9a0c0f8564637602435610620526020610620a35f5f5d005b63b4ee031881186117e657606436103417611ba457602435610540526044358060a01c611ba457610560525f610580526110d6565b636b268ef181186117e657606436103417611ba4575f5c600114611ba45760015f5d5f54331815610c61576020806105205260056104c0527f21706170690000000000000000000000000000000000000000000000000000006104e0526104c08161052001602582825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610500528060040161051cfd5b602435610ce05760208061052052600f6104c0527f217374617274696e675f707269636500000000000000000000000000000000006104e0526104c08161052001602f82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610500528060040161051cfd5b604435610d5f5760208061052052600e6104c0527f216d696e696d756d5f70726963650000000000000000000000000000000000006104e0526104c08161052001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610500528060040161051cfd5b60086004356020525f5260405f2080546104c05260018101546104e05260028101546105005260038101546105205260048101546105405260058101546105605260068101546105805260078101546105a05260088101546105c052506101206104c06103805e610dd16105e0611afd565b6105e05115610e5257602080610660526006610600527f6163746976650000000000000000000000000000000000000000000000000000610620526106008161066001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610640528060040161065cfd5b61050051610ed25760208061064052600f6105e0527f2163757272656e745f616d6f756e740000000000000000000000000000000000610600526105e08161064001602f82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610620528060040161063cfd5b426104c052604060246105603760086004356020525f5260405f206104c05181556104e05160018201556105005160028201556105205160038201556105405160048201556105605160058201556105805160068201556105a05160078201556105c05160088201555060016004357f0617b7d1025dcb79895511800028509eff7b9531012457c418e9a0c0f8564637610500516105e05260206105e0a35f5f5d005b634fd9efc48118610fbe57602436103417611ba4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6105405233610560525f610580526110d6565b6383d8cfc08118610fe35734611ba4575f5c600114611ba45760015460405260206040f35b63571a26a081186117e657602436103417611ba4575f5c600114611ba45760086004356020525f5260405f20805460405260018101546060526002810154608052600381015460a052600481015460c052600581015460e052600681015461010052600781015461012052600881015461014052506101206040f35b63978b7c0281186117e657604436103417611ba4576024356105405233610560525f610580526110d6565b63b8c5043681186117e657608436103417611ba457602435610540526044358060a01c611ba457610560526064356004018035620186a08111611ba45750602081350180826105803750505b5f5c600114611ba45760015f5d60086004356020525f5260405f20805462018c4052600181015462018c6052600281015462018c8052600381015462018ca052600481015462018cc052600581015462018ce052600681015462018d0052600781015462018d2052600881015462018d40525061012062018c406103805e61116062018d60611afd565b62018d60516111e85760208062018de052600762018d80527f216163746976650000000000000000000000000000000000000000000000000062018da05262018d808162018de001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a062018dc0528060040162018ddcfd5b62018c8051610540518082811882841002189050905062018d605261012062018c406103805e62018d60516104a052426104c05261122862018da0611b22565b62018da05162018d805262018d80516112ba5760208062018e0052600e62018da0527f216e65656465645f616d6f756e7400000000000000000000000000000000000062018dc05262018da08162018e0001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a062018de0528060040162018dfcfd5b62018c805162018d6051808203828111611ba4579050905062018da05262018da05162018c805262018da0516112f1575f62018c40525b60035463a9059cbb62018dc0526105605162018de05262018d605162018e0052602062018dc0604462018ddc5f855af161132d573d5f5f3e3d5ffd5b3d61134557803b15611ba457600162018e2052611373565b3d602081183d60201002188062018dc00162018de011611ba45762018dc0518060011c611ba45762018e2052505b62018e2090505115611ba4576105805115611416576105605163c92632b562018dc05260a060043562018de0523362018e0052604062018d6062018e205e8062018e60528062018de0016020610580510180610580835e508051806020830101601f825f03163682375050601f19601f82516020010116905081015050803b15611ba4575f62018dc06201876462018ddc5f855af1611414573d5f5f3e3d5ffd5b505b60015462018dc05262018ca05162018cc051808203828111611ba4579050905062018de05262018de05162018d805111156115b05762018de051156114f75762018ca05162018cc05262018dc0516323b872dd62018e00523362018e205262018d205162018e405262018de05162018e6052602062018e00606462018e1c5f855af16114a4573d5f5f3e3d5ffd5b3d6114bc57803b15611ba457600162018e80526114ea565b3d602081183d60201002188062018e000162018e2011611ba45762018e00518060011c611ba45762018e8052505b62018e8090505115611ba4575b62018d805162018de051808203828111611ba4579050905062018e005262018dc0516323b872dd62018e20523362018e405262018d405162018e605262018e005162018e8052602062018e20606462018e3c5f855af1611559573d5f5f3e3d5ffd5b3d61157157803b15611ba457600162018ea05261159f565b3d602081183d60201002188062018e200162018e4011611ba45762018e20518060011c611ba45762018ea052505b62018ea090505115611ba457611665565b62018cc05162018d8051808201828110611ba4579050905062018cc05262018dc0516323b872dd62018e00523362018e205262018d205162018e405262018d805162018e6052602062018e00606462018e1c5f855af1611612573d5f5f3e3d5ffd5b3d61162a57803b15611ba457600162018e8052611658565b3d602081183d60201002188062018e000162018e2011611ba45762018e00518060011c611ba45762018e8052505b62018e8090505115611ba4575b60086004356020525f5260405f2062018c4051815562018c6051600182015562018c8051600282015562018ca051600382015562018cc051600482015562018ce051600582015562018d0051600682015562018d2051600782015562018d40516008820155506004357f191d59a248e27b796e2bfc44962dd12966bfd584b3d29eeb55f8b280a08c5d5f62018d605162018e005262018da05162018e205262018d805162018e40523362018e60526105605162018e805260a062018e00a2602062018d605f5f5df35b63fc75db1d81186117e65734611ba4575f5c600114611ba4575f5460405260206040f35b6374ec871481186117e65734611ba4575f5c600114611ba45760025460405260206040f35b631d7650cf811861179c5734611ba4575f5c600114611ba45760035460405260206040f35b63939e0bf381186117e65734611ba4575f5c600114611ba45760075460405260206040f35b63c632471181186117e65734611ba4575f5c600114611ba45760065460405260206040f35b5f5ffd5b604051606051808202811583838304141715611ba457905090506b019d971e4fe8401e740000008101818110611ba45790506b033b2e3c9fd0803ce800000081049050815250565b60a05161184e576b033b2e3c9fd0803ce80000008152506118df565b6b033b2e3c9fd0803ce800000060c05260805160e0525f610100905b806101005260a051156118d657600160a051600181169050186118a157604060c060405e6118996101206117ea565b6101205160c0525b60e05160405260e0516060526118b86101206117ea565b6101205160e05260a0518060011c905060a05260010181811861186a575b505060c0518152505b565b604051670de0b6b3a7640000810281670de0b6b3a7640000820418611ba45790506060518060011c9050808201828110611ba457905090506060518015611ba45780820490509050815250565b61016051600454808202811583838304141715611ba45790509050610280526102805161195e575f815250611afb565b610140516102605110156119e45760208061030052600a6102a0527f2174696d657374616d70000000000000000000000000000000000000000000006102c0526102a08161030001602a82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06102e052806004016102fcfd5b6102605161014051808203828111611ba457905090506102a0526007546102a0511115611a14575f815250611afb565b6102a0516005548015611ba457808204905090506102c05260065469152d02c7e14af680000081028169152d02c7e14af6800000820418611ba4579050806b033b2e3c9fd0803ce8000000036b033b2e3c9fd0803ce80000008111611ba45790506102e0526102e0516080526102c05160a052611a92610320611832565b61032051610300526101e05160405261028051606052611ab36103406118e1565b61034051610320526103205160405261030051606052611ad46103606117ea565b610360516103405261020051610340511015611af3575f815250611afb565b610340518152505b565b6101206103806101405e4261026052611b176104a061192e565b6104a0511515815250565b6104a051600454808202811583838304141715611ba457905090506104e0526104e0516101206103806101405e6104c05161026052611b6261052061192e565b61052051808202811583838304141715611ba45790509050670de0b6b3a76400008104905061050052610500516002548015611ba45780820490509050815250565b5f80fd064b17c117e604ee17e605b4105f001817e617e60425030617520bbe108a050d0f75172e03da1777855820eade4325ade98f25150375a364d84aa7cfc83a73e0828a6a4ee4914c019cae95191bd081182800a1657679706572830004030037" + "0xbefc77c3af16a9a70855401f32680620b146807237940aaf8e9d194f97233c0a", + "0x6103ba610011610000396103ba610000f35f3560e01c60026003820660011b6103b401601e395f51565b63f4f2557581186103ac576044361034176103b0576004358060a01c6103b0576040526040516383d8cfc0608052602060806004609c845afa61005d573d5f5f3e3d5ffd5b3d602081183d60201002188060800160a0116103b0576080518060a01c6103b05760c0525060c0905051606052604051631d7650cf60a052602060a0600460bc845afa6100ac573d5f5f3e3d5ffd5b3d602081183d60201002188060a00160c0116103b05760a0518060a01c6103b05760e0525060e090505160805260405163b8c50436610100526080602435610120527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61014052306101605280610180526040606060c05e604060a05260a08161012001606082825e8051806020830101601f825f03163682375050601f19601f825160200101169050905081015050602061010060e461011c5f855af1610176573d5f5f3e3d5ffd5b60203d106103b05761010050506060516370a0823160c0523060e052602060c0602460dc845afa6101a9573d5f5f3e3d5ffd5b60203d106103b05760c090505160a05260a051156102395760605163a9059cbb60c0523360e05260a05161010052602060c0604460dc5f855af16101ef573d5f5f3e3d5ffd5b3d61020657803b156103b05760016101205261022d565b3d602081183d60201002188060c00160e0116103b05760c0518060011c6103b05761012052505b610120905051156103b0575b005b63c92632b581186103ac5760a4361034176103b0576024358060a01c6103b0576040526084356004018035620186a081116103b0575060208135018082606037505060403662018720376040606051186103b05760605160800160c0116103b0576080518060a01c6103b057620187605260a0518060a01c6103b057620187805262018760805162018720526020810151620187405250620187405163ba0876526201876052604435620187805230620187a05230620187c05260206201876060646201877c5f855af1610311573d5f5f3e3d5ffd5b60203d106103b057620187605050620187205163095ea7b36201876052336201878052606435620187a05260206201876060446201877c5f855af1610358573d5f5f3e3d5ffd5b3d61037057803b156103b0576001620187c05261039e565b3d602081183d602010021880620187600162018780116103b05762018760518060011c6103b057620187c052505b620187c0905051156103b057005b5f5ffd5b5f80fd03ac0018023b85582044497807ac4bb883ce45ef4579cd6f2cfa2128d988bfc5e85ab7c7295eb431751903ba810600a1657679706572830004030036" ], "transaction": { "from": "0x000005281a2b04a182085d37cc9e6dd552795caa", "to": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "gas": "0x523125", + "gas": "0xb63e3", "value": "0x0", - "input": "0x263076687190d946d0e179aeb9937b82478d661fbdb02ba6dfe94b12a42b89876cae6a2400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000001c18611bd061001161000039611bd0610000f35f3560e01c60026014820660011b611ba801601e395f51565b633aa4b4d781186102125760c436103417611ba4576004358060a01c611ba4576040526024358060a01c611ba4576060526044358060a01c611ba4576080526060606460a0375f5c600114611ba45760015f5d5f54156100ea5760208061016052600b610100527f696e697469616c697a6564000000000000000000000000000000000000000000610120526101008161016001602b82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610140528060040161015cfd5b6040515f5560605163313ce567610120526020610120600461013c845afa610114573d5f5f3e3d5ffd5b3d602081183d6020100218806101200161014011611ba457610120518060081c611ba45761016052506101609050516101005260605160015561010051604d8111611ba45780600a0a90508015611ba45780670de0b6b3a764000004905060025560805163313ce567610140526020610140600461015c845afa61019a573d5f5f3e3d5ffd5b3d602081183d6020100218806101400161016011611ba457610140518060081c611ba45761018052506101809050516101205260805160035561012051604d8111611ba45780600a0a90508015611ba45780670de0b6b3a764000004905060045560a05160055560c05160065560e0516007555f5f5d005b6359eb8b2781186102c257602436103417611ba4575f5c600114611ba45760086004356020525f5260405f2080546104c05260018101546104e05260028101546105005260038101546105205260048101546105405260058101546105605260068101546105805260078101546105a05260088101546105c052506101206104c06103805e6102a26105e0611afd565b6105e051156102ba575f6106005260206106006102c0565b60206105005bf35b6375cd224781186117e657602436103417611ba4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610540524261056052610443565b63c5faa9af81186103b557602436103417611ba4575f5c600114611ba45760086004356020525f5260405f2080546104c05260018101546104e05260028101546105005260038101546105205260048101546105405260058101546105605260068101546105805260078101546105a05260088101546105c052506101206104c06103805e6103966105e0611afd565b6105e0516103ad575f6106005260206106006103b3565b60206105005bf35b631fcd5aaf81186117e65734611ba4575f5c600114611ba45760045460405260206040f35b6301456a52811861040057604436103417611ba457602435610540524261056052610443565b63face81b281186117e65734611ba4575f5c600114611ba45760055460405260206040f35b63097cb5e281186117e657606436103417611ba45760406024610540375b5f5c600114611ba45760086004356020525f5260405f2080546105805260018101546105a05260028101546105c05260038101546105e052600481015461060052600581015461062052600681015461064052600781015461066052600881015461068052506105c05161054051808281188284100218905090506106a05260206101206105806103805e6106a0516104a052610560516104c0526104e96106c0611b22565b6106c0f35b63d93580ff81186117e657602436103417611ba457426103805261052a565b639ea982cb81186117e657604436103417611ba457602435610380525b5f5c600114611ba45760086004356020525f5260405f2080546103a05260018101546103c05260028101546103e05260038101546104005260048101546104205260058101546104405260068101546104605260078101546104805260088101546104a0525060206101206103a06101405e61038051610260526105af6104c061192e565b6104c0f35b637aaa33c581186117e657602436103417611ba4575f5c600114611ba45760086004356020525f5260405f2080546104c05260018101546104e05260028101546105005260038101546105205260048101546105405260058101546105605260068101546105805260078101546105a05260088101546105c0525060206101206104c06103805e6106466105e0611afd565b6105e0f35b633bd8c8dc8118610b895760e436103417611ba45760a4358060a01c611ba4576104c05260c4358060a01c611ba4576104e0525f5c600114611ba45760015f5d5f5433181561070c57602080610560526005610500527f2170617069000000000000000000000000000000000000000000000000000000610520526105008161056001602582825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610540528060040161055cfd5b60243561078b5760208061056052600c610500527f216b69636b5f616d6f756e740000000000000000000000000000000000000000610520526105008161056001602c82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610540528060040161055cfd5b60643561080a5760208061056052600f610500527f217374617274696e675f70726963650000000000000000000000000000000000610520526105008161056001602f82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610540528060040161055cfd5b6084356108895760208061056052600e610500527f216d696e696d756d5f7072696365000000000000000000000000000000000000610520526105008161056001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610540528060040161055cfd5b6104c05161090957602080610560526009610500527f2172656365697665720000000000000000000000000000000000000000000000610520526105008161056001602982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610540528060040161055cfd5b6104e05161098957602080610560526011610500527f21737572706c75735f7265636569766572000000000000000000000000000000610520526105008161056001603182825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610540528060040161055cfd5b60086004356020525f5260405f2080546105005260018101546105205260028101546105405260038101546105605260048101546105805260058101546105a05260068101546105c05260078101546105e052600881015461060052506101206105006103805e6109fb610620611afd565b6106205115610a7c576020806106a0526006610640527f616374697665000000000000000000000000000000000000000000000000000061066052610640816106a001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610680528060040161069cfd5b60086004356020525f5260405f204281556024356001820155602435600282015560443560038201555f6004820155606435600582015560843560068201556104c05160078201556104e0516008820155506003546323b872dd610620525f54610640523061066052602435610680526020610620606461063c5f855af1610b06573d5f5f3e3d5ffd5b3d610b1d57803b15611ba45760016106a052610b47565b3d602081183d6020100218806106200161064011611ba457610620518060011c611ba4576106a052505b6106a090505115611ba4575f6004357f0617b7d1025dcb79895511800028509eff7b9531012457c418e9a0c0f8564637602435610620526020610620a35f5f5d005b63b4ee031881186117e657606436103417611ba457602435610540526044358060a01c611ba457610560525f610580526110d6565b636b268ef181186117e657606436103417611ba4575f5c600114611ba45760015f5d5f54331815610c61576020806105205260056104c0527f21706170690000000000000000000000000000000000000000000000000000006104e0526104c08161052001602582825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610500528060040161051cfd5b602435610ce05760208061052052600f6104c0527f217374617274696e675f707269636500000000000000000000000000000000006104e0526104c08161052001602f82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610500528060040161051cfd5b604435610d5f5760208061052052600e6104c0527f216d696e696d756d5f70726963650000000000000000000000000000000000006104e0526104c08161052001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610500528060040161051cfd5b60086004356020525f5260405f2080546104c05260018101546104e05260028101546105005260038101546105205260048101546105405260058101546105605260068101546105805260078101546105a05260088101546105c052506101206104c06103805e610dd16105e0611afd565b6105e05115610e5257602080610660526006610600527f6163746976650000000000000000000000000000000000000000000000000000610620526106008161066001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610640528060040161065cfd5b61050051610ed25760208061064052600f6105e0527f2163757272656e745f616d6f756e740000000000000000000000000000000000610600526105e08161064001602f82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610620528060040161063cfd5b426104c052604060246105603760086004356020525f5260405f206104c05181556104e05160018201556105005160028201556105205160038201556105405160048201556105605160058201556105805160068201556105a05160078201556105c05160088201555060016004357f0617b7d1025dcb79895511800028509eff7b9531012457c418e9a0c0f8564637610500516105e05260206105e0a35f5f5d005b634fd9efc48118610fbe57602436103417611ba4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6105405233610560525f610580526110d6565b6383d8cfc08118610fe35734611ba4575f5c600114611ba45760015460405260206040f35b63571a26a081186117e657602436103417611ba4575f5c600114611ba45760086004356020525f5260405f20805460405260018101546060526002810154608052600381015460a052600481015460c052600581015460e052600681015461010052600781015461012052600881015461014052506101206040f35b63978b7c0281186117e657604436103417611ba4576024356105405233610560525f610580526110d6565b63b8c5043681186117e657608436103417611ba457602435610540526044358060a01c611ba457610560526064356004018035620186a08111611ba45750602081350180826105803750505b5f5c600114611ba45760015f5d60086004356020525f5260405f20805462018c4052600181015462018c6052600281015462018c8052600381015462018ca052600481015462018cc052600581015462018ce052600681015462018d0052600781015462018d2052600881015462018d40525061012062018c406103805e61116062018d60611afd565b62018d60516111e85760208062018de052600762018d80527f216163746976650000000000000000000000000000000000000000000000000062018da05262018d808162018de001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a062018dc0528060040162018ddcfd5b62018c8051610540518082811882841002189050905062018d605261012062018c406103805e62018d60516104a052426104c05261122862018da0611b22565b62018da05162018d805262018d80516112ba5760208062018e0052600e62018da0527f216e65656465645f616d6f756e7400000000000000000000000000000000000062018dc05262018da08162018e0001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a062018de0528060040162018dfcfd5b62018c805162018d6051808203828111611ba4579050905062018da05262018da05162018c805262018da0516112f1575f62018c40525b60035463a9059cbb62018dc0526105605162018de05262018d605162018e0052602062018dc0604462018ddc5f855af161132d573d5f5f3e3d5ffd5b3d61134557803b15611ba457600162018e2052611373565b3d602081183d60201002188062018dc00162018de011611ba45762018dc0518060011c611ba45762018e2052505b62018e2090505115611ba4576105805115611416576105605163c92632b562018dc05260a060043562018de0523362018e0052604062018d6062018e205e8062018e60528062018de0016020610580510180610580835e508051806020830101601f825f03163682375050601f19601f82516020010116905081015050803b15611ba4575f62018dc06201876462018ddc5f855af1611414573d5f5f3e3d5ffd5b505b60015462018dc05262018ca05162018cc051808203828111611ba4579050905062018de05262018de05162018d805111156115b05762018de051156114f75762018ca05162018cc05262018dc0516323b872dd62018e00523362018e205262018d205162018e405262018de05162018e6052602062018e00606462018e1c5f855af16114a4573d5f5f3e3d5ffd5b3d6114bc57803b15611ba457600162018e80526114ea565b3d602081183d60201002188062018e000162018e2011611ba45762018e00518060011c611ba45762018e8052505b62018e8090505115611ba4575b62018d805162018de051808203828111611ba4579050905062018e005262018dc0516323b872dd62018e20523362018e405262018d405162018e605262018e005162018e8052602062018e20606462018e3c5f855af1611559573d5f5f3e3d5ffd5b3d61157157803b15611ba457600162018ea05261159f565b3d602081183d60201002188062018e200162018e4011611ba45762018e20518060011c611ba45762018ea052505b62018ea090505115611ba457611665565b62018cc05162018d8051808201828110611ba4579050905062018cc05262018dc0516323b872dd62018e00523362018e205262018d205162018e405262018d805162018e6052602062018e00606462018e1c5f855af1611612573d5f5f3e3d5ffd5b3d61162a57803b15611ba457600162018e8052611658565b3d602081183d60201002188062018e000162018e2011611ba45762018e00518060011c611ba45762018e8052505b62018e8090505115611ba4575b60086004356020525f5260405f2062018c4051815562018c6051600182015562018c8051600282015562018ca051600382015562018cc051600482015562018ce051600582015562018d0051600682015562018d2051600782015562018d40516008820155506004357f191d59a248e27b796e2bfc44962dd12966bfd584b3d29eeb55f8b280a08c5d5f62018d605162018e005262018da05162018e205262018d805162018e40523362018e60526105605162018e805260a062018e00a2602062018d605f5f5df35b63fc75db1d81186117e65734611ba4575f5c600114611ba4575f5460405260206040f35b6374ec871481186117e65734611ba4575f5c600114611ba45760025460405260206040f35b631d7650cf811861179c5734611ba4575f5c600114611ba45760035460405260206040f35b63939e0bf381186117e65734611ba4575f5c600114611ba45760075460405260206040f35b63c632471181186117e65734611ba4575f5c600114611ba45760065460405260206040f35b5f5ffd5b604051606051808202811583838304141715611ba457905090506b019d971e4fe8401e740000008101818110611ba45790506b033b2e3c9fd0803ce800000081049050815250565b60a05161184e576b033b2e3c9fd0803ce80000008152506118df565b6b033b2e3c9fd0803ce800000060c05260805160e0525f610100905b806101005260a051156118d657600160a051600181169050186118a157604060c060405e6118996101206117ea565b6101205160c0525b60e05160405260e0516060526118b86101206117ea565b6101205160e05260a0518060011c905060a05260010181811861186a575b505060c0518152505b565b604051670de0b6b3a7640000810281670de0b6b3a7640000820418611ba45790506060518060011c9050808201828110611ba457905090506060518015611ba45780820490509050815250565b61016051600454808202811583838304141715611ba45790509050610280526102805161195e575f815250611afb565b610140516102605110156119e45760208061030052600a6102a0527f2174696d657374616d70000000000000000000000000000000000000000000006102c0526102a08161030001602a82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06102e052806004016102fcfd5b6102605161014051808203828111611ba457905090506102a0526007546102a0511115611a14575f815250611afb565b6102a0516005548015611ba457808204905090506102c05260065469152d02c7e14af680000081028169152d02c7e14af6800000820418611ba4579050806b033b2e3c9fd0803ce8000000036b033b2e3c9fd0803ce80000008111611ba45790506102e0526102e0516080526102c05160a052611a92610320611832565b61032051610300526101e05160405261028051606052611ab36103406118e1565b61034051610320526103205160405261030051606052611ad46103606117ea565b610360516103405261020051610340511015611af3575f815250611afb565b610340518152505b565b6101206103806101405e4261026052611b176104a061192e565b6104a0511515815250565b6104a051600454808202811583838304141715611ba457905090506104e0526104e0516101206103806101405e6104c05161026052611b6261052061192e565b61052051808202811583838304141715611ba45790509050670de0b6b3a76400008104905061050052610500516002548015611ba45780820490509050815250565b5f80fd064b17c117e604ee17e605b4105f001817e617e60425030617520bbe108a050d0f75172e03da1777855820eade4325ade98f25150375a364d84aa7cfc83a73e0828a6a4ee4914c019cae95191bd081182800a16576797065728300040300370000000000000000", - "nonce": "0x18", + "input": "0x26307668befc77c3af16a9a70855401f32680620b146807237940aaf8e9d194f97233c0a000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000004016103ba610011610000396103ba610000f35f3560e01c60026003820660011b6103b401601e395f51565b63f4f2557581186103ac576044361034176103b0576004358060a01c6103b0576040526040516383d8cfc0608052602060806004609c845afa61005d573d5f5f3e3d5ffd5b3d602081183d60201002188060800160a0116103b0576080518060a01c6103b05760c0525060c0905051606052604051631d7650cf60a052602060a0600460bc845afa6100ac573d5f5f3e3d5ffd5b3d602081183d60201002188060a00160c0116103b05760a0518060a01c6103b05760e0525060e090505160805260405163b8c50436610100526080602435610120527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61014052306101605280610180526040606060c05e604060a05260a08161012001606082825e8051806020830101601f825f03163682375050601f19601f825160200101169050905081015050602061010060e461011c5f855af1610176573d5f5f3e3d5ffd5b60203d106103b05761010050506060516370a0823160c0523060e052602060c0602460dc845afa6101a9573d5f5f3e3d5ffd5b60203d106103b05760c090505160a05260a051156102395760605163a9059cbb60c0523360e05260a05161010052602060c0604460dc5f855af16101ef573d5f5f3e3d5ffd5b3d61020657803b156103b05760016101205261022d565b3d602081183d60201002188060c00160e0116103b05760c0518060011c6103b05761012052505b610120905051156103b0575b005b63c92632b581186103ac5760a4361034176103b0576024358060a01c6103b0576040526084356004018035620186a081116103b0575060208135018082606037505060403662018720376040606051186103b05760605160800160c0116103b0576080518060a01c6103b057620187605260a0518060a01c6103b057620187805262018760805162018720526020810151620187405250620187405163ba0876526201876052604435620187805230620187a05230620187c05260206201876060646201877c5f855af1610311573d5f5f3e3d5ffd5b60203d106103b057620187605050620187205163095ea7b36201876052336201878052606435620187a05260206201876060446201877c5f855af1610358573d5f5f3e3d5ffd5b3d61037057803b156103b0576001620187c05261039e565b3d602081183d602010021880620187600162018780116103b05762018760518060011c6103b057620187c052505b620187c0905051156103b057005b5f5ffd5b5f80fd03ac0018023b85582044497807ac4bb883ce45ef4579cd6f2cfa2128d988bfc5e85ab7c7295eb431751903ba810600a165767970657283000403003600000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x29", "chainId": "0x1" }, "additionalContracts": [ { "transactionType": "CREATE2", - "contractName": "auction", - "address": "0x6403a3b5b8f9f972a629c7ad945b642f5eff2d94", - "initCode": "0x611bd061001161000039611bd0610000f35f3560e01c60026014820660011b611ba801601e395f51565b633aa4b4d781186102125760c436103417611ba4576004358060a01c611ba4576040526024358060a01c611ba4576060526044358060a01c611ba4576080526060606460a0375f5c600114611ba45760015f5d5f54156100ea5760208061016052600b610100527f696e697469616c697a6564000000000000000000000000000000000000000000610120526101008161016001602b82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610140528060040161015cfd5b6040515f5560605163313ce567610120526020610120600461013c845afa610114573d5f5f3e3d5ffd5b3d602081183d6020100218806101200161014011611ba457610120518060081c611ba45761016052506101609050516101005260605160015561010051604d8111611ba45780600a0a90508015611ba45780670de0b6b3a764000004905060025560805163313ce567610140526020610140600461015c845afa61019a573d5f5f3e3d5ffd5b3d602081183d6020100218806101400161016011611ba457610140518060081c611ba45761018052506101809050516101205260805160035561012051604d8111611ba45780600a0a90508015611ba45780670de0b6b3a764000004905060045560a05160055560c05160065560e0516007555f5f5d005b6359eb8b2781186102c257602436103417611ba4575f5c600114611ba45760086004356020525f5260405f2080546104c05260018101546104e05260028101546105005260038101546105205260048101546105405260058101546105605260068101546105805260078101546105a05260088101546105c052506101206104c06103805e6102a26105e0611afd565b6105e051156102ba575f6106005260206106006102c0565b60206105005bf35b6375cd224781186117e657602436103417611ba4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610540524261056052610443565b63c5faa9af81186103b557602436103417611ba4575f5c600114611ba45760086004356020525f5260405f2080546104c05260018101546104e05260028101546105005260038101546105205260048101546105405260058101546105605260068101546105805260078101546105a05260088101546105c052506101206104c06103805e6103966105e0611afd565b6105e0516103ad575f6106005260206106006103b3565b60206105005bf35b631fcd5aaf81186117e65734611ba4575f5c600114611ba45760045460405260206040f35b6301456a52811861040057604436103417611ba457602435610540524261056052610443565b63face81b281186117e65734611ba4575f5c600114611ba45760055460405260206040f35b63097cb5e281186117e657606436103417611ba45760406024610540375b5f5c600114611ba45760086004356020525f5260405f2080546105805260018101546105a05260028101546105c05260038101546105e052600481015461060052600581015461062052600681015461064052600781015461066052600881015461068052506105c05161054051808281188284100218905090506106a05260206101206105806103805e6106a0516104a052610560516104c0526104e96106c0611b22565b6106c0f35b63d93580ff81186117e657602436103417611ba457426103805261052a565b639ea982cb81186117e657604436103417611ba457602435610380525b5f5c600114611ba45760086004356020525f5260405f2080546103a05260018101546103c05260028101546103e05260038101546104005260048101546104205260058101546104405260068101546104605260078101546104805260088101546104a0525060206101206103a06101405e61038051610260526105af6104c061192e565b6104c0f35b637aaa33c581186117e657602436103417611ba4575f5c600114611ba45760086004356020525f5260405f2080546104c05260018101546104e05260028101546105005260038101546105205260048101546105405260058101546105605260068101546105805260078101546105a05260088101546105c0525060206101206104c06103805e6106466105e0611afd565b6105e0f35b633bd8c8dc8118610b895760e436103417611ba45760a4358060a01c611ba4576104c05260c4358060a01c611ba4576104e0525f5c600114611ba45760015f5d5f5433181561070c57602080610560526005610500527f2170617069000000000000000000000000000000000000000000000000000000610520526105008161056001602582825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610540528060040161055cfd5b60243561078b5760208061056052600c610500527f216b69636b5f616d6f756e740000000000000000000000000000000000000000610520526105008161056001602c82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610540528060040161055cfd5b60643561080a5760208061056052600f610500527f217374617274696e675f70726963650000000000000000000000000000000000610520526105008161056001602f82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610540528060040161055cfd5b6084356108895760208061056052600e610500527f216d696e696d756d5f7072696365000000000000000000000000000000000000610520526105008161056001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610540528060040161055cfd5b6104c05161090957602080610560526009610500527f2172656365697665720000000000000000000000000000000000000000000000610520526105008161056001602982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610540528060040161055cfd5b6104e05161098957602080610560526011610500527f21737572706c75735f7265636569766572000000000000000000000000000000610520526105008161056001603182825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610540528060040161055cfd5b60086004356020525f5260405f2080546105005260018101546105205260028101546105405260038101546105605260048101546105805260058101546105a05260068101546105c05260078101546105e052600881015461060052506101206105006103805e6109fb610620611afd565b6106205115610a7c576020806106a0526006610640527f616374697665000000000000000000000000000000000000000000000000000061066052610640816106a001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610680528060040161069cfd5b60086004356020525f5260405f204281556024356001820155602435600282015560443560038201555f6004820155606435600582015560843560068201556104c05160078201556104e0516008820155506003546323b872dd610620525f54610640523061066052602435610680526020610620606461063c5f855af1610b06573d5f5f3e3d5ffd5b3d610b1d57803b15611ba45760016106a052610b47565b3d602081183d6020100218806106200161064011611ba457610620518060011c611ba4576106a052505b6106a090505115611ba4575f6004357f0617b7d1025dcb79895511800028509eff7b9531012457c418e9a0c0f8564637602435610620526020610620a35f5f5d005b63b4ee031881186117e657606436103417611ba457602435610540526044358060a01c611ba457610560525f610580526110d6565b636b268ef181186117e657606436103417611ba4575f5c600114611ba45760015f5d5f54331815610c61576020806105205260056104c0527f21706170690000000000000000000000000000000000000000000000000000006104e0526104c08161052001602582825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610500528060040161051cfd5b602435610ce05760208061052052600f6104c0527f217374617274696e675f707269636500000000000000000000000000000000006104e0526104c08161052001602f82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610500528060040161051cfd5b604435610d5f5760208061052052600e6104c0527f216d696e696d756d5f70726963650000000000000000000000000000000000006104e0526104c08161052001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610500528060040161051cfd5b60086004356020525f5260405f2080546104c05260018101546104e05260028101546105005260038101546105205260048101546105405260058101546105605260068101546105805260078101546105a05260088101546105c052506101206104c06103805e610dd16105e0611afd565b6105e05115610e5257602080610660526006610600527f6163746976650000000000000000000000000000000000000000000000000000610620526106008161066001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610640528060040161065cfd5b61050051610ed25760208061064052600f6105e0527f2163757272656e745f616d6f756e740000000000000000000000000000000000610600526105e08161064001602f82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610620528060040161063cfd5b426104c052604060246105603760086004356020525f5260405f206104c05181556104e05160018201556105005160028201556105205160038201556105405160048201556105605160058201556105805160068201556105a05160078201556105c05160088201555060016004357f0617b7d1025dcb79895511800028509eff7b9531012457c418e9a0c0f8564637610500516105e05260206105e0a35f5f5d005b634fd9efc48118610fbe57602436103417611ba4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6105405233610560525f610580526110d6565b6383d8cfc08118610fe35734611ba4575f5c600114611ba45760015460405260206040f35b63571a26a081186117e657602436103417611ba4575f5c600114611ba45760086004356020525f5260405f20805460405260018101546060526002810154608052600381015460a052600481015460c052600581015460e052600681015461010052600781015461012052600881015461014052506101206040f35b63978b7c0281186117e657604436103417611ba4576024356105405233610560525f610580526110d6565b63b8c5043681186117e657608436103417611ba457602435610540526044358060a01c611ba457610560526064356004018035620186a08111611ba45750602081350180826105803750505b5f5c600114611ba45760015f5d60086004356020525f5260405f20805462018c4052600181015462018c6052600281015462018c8052600381015462018ca052600481015462018cc052600581015462018ce052600681015462018d0052600781015462018d2052600881015462018d40525061012062018c406103805e61116062018d60611afd565b62018d60516111e85760208062018de052600762018d80527f216163746976650000000000000000000000000000000000000000000000000062018da05262018d808162018de001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a062018dc0528060040162018ddcfd5b62018c8051610540518082811882841002189050905062018d605261012062018c406103805e62018d60516104a052426104c05261122862018da0611b22565b62018da05162018d805262018d80516112ba5760208062018e0052600e62018da0527f216e65656465645f616d6f756e7400000000000000000000000000000000000062018dc05262018da08162018e0001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a062018de0528060040162018dfcfd5b62018c805162018d6051808203828111611ba4579050905062018da05262018da05162018c805262018da0516112f1575f62018c40525b60035463a9059cbb62018dc0526105605162018de05262018d605162018e0052602062018dc0604462018ddc5f855af161132d573d5f5f3e3d5ffd5b3d61134557803b15611ba457600162018e2052611373565b3d602081183d60201002188062018dc00162018de011611ba45762018dc0518060011c611ba45762018e2052505b62018e2090505115611ba4576105805115611416576105605163c92632b562018dc05260a060043562018de0523362018e0052604062018d6062018e205e8062018e60528062018de0016020610580510180610580835e508051806020830101601f825f03163682375050601f19601f82516020010116905081015050803b15611ba4575f62018dc06201876462018ddc5f855af1611414573d5f5f3e3d5ffd5b505b60015462018dc05262018ca05162018cc051808203828111611ba4579050905062018de05262018de05162018d805111156115b05762018de051156114f75762018ca05162018cc05262018dc0516323b872dd62018e00523362018e205262018d205162018e405262018de05162018e6052602062018e00606462018e1c5f855af16114a4573d5f5f3e3d5ffd5b3d6114bc57803b15611ba457600162018e80526114ea565b3d602081183d60201002188062018e000162018e2011611ba45762018e00518060011c611ba45762018e8052505b62018e8090505115611ba4575b62018d805162018de051808203828111611ba4579050905062018e005262018dc0516323b872dd62018e20523362018e405262018d405162018e605262018e005162018e8052602062018e20606462018e3c5f855af1611559573d5f5f3e3d5ffd5b3d61157157803b15611ba457600162018ea05261159f565b3d602081183d60201002188062018e200162018e4011611ba45762018e20518060011c611ba45762018ea052505b62018ea090505115611ba457611665565b62018cc05162018d8051808201828110611ba4579050905062018cc05262018dc0516323b872dd62018e00523362018e205262018d205162018e405262018d805162018e6052602062018e00606462018e1c5f855af1611612573d5f5f3e3d5ffd5b3d61162a57803b15611ba457600162018e8052611658565b3d602081183d60201002188062018e000162018e2011611ba45762018e00518060011c611ba45762018e8052505b62018e8090505115611ba4575b60086004356020525f5260405f2062018c4051815562018c6051600182015562018c8051600282015562018ca051600382015562018cc051600482015562018ce051600582015562018d0051600682015562018d2051600782015562018d40516008820155506004357f191d59a248e27b796e2bfc44962dd12966bfd584b3d29eeb55f8b280a08c5d5f62018d605162018e005262018da05162018e205262018d805162018e40523362018e60526105605162018e805260a062018e00a2602062018d605f5f5df35b63fc75db1d81186117e65734611ba4575f5c600114611ba4575f5460405260206040f35b6374ec871481186117e65734611ba4575f5c600114611ba45760025460405260206040f35b631d7650cf811861179c5734611ba4575f5c600114611ba45760035460405260206040f35b63939e0bf381186117e65734611ba4575f5c600114611ba45760075460405260206040f35b63c632471181186117e65734611ba4575f5c600114611ba45760065460405260206040f35b5f5ffd5b604051606051808202811583838304141715611ba457905090506b019d971e4fe8401e740000008101818110611ba45790506b033b2e3c9fd0803ce800000081049050815250565b60a05161184e576b033b2e3c9fd0803ce80000008152506118df565b6b033b2e3c9fd0803ce800000060c05260805160e0525f610100905b806101005260a051156118d657600160a051600181169050186118a157604060c060405e6118996101206117ea565b6101205160c0525b60e05160405260e0516060526118b86101206117ea565b6101205160e05260a0518060011c905060a05260010181811861186a575b505060c0518152505b565b604051670de0b6b3a7640000810281670de0b6b3a7640000820418611ba45790506060518060011c9050808201828110611ba457905090506060518015611ba45780820490509050815250565b61016051600454808202811583838304141715611ba45790509050610280526102805161195e575f815250611afb565b610140516102605110156119e45760208061030052600a6102a0527f2174696d657374616d70000000000000000000000000000000000000000000006102c0526102a08161030001602a82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06102e052806004016102fcfd5b6102605161014051808203828111611ba457905090506102a0526007546102a0511115611a14575f815250611afb565b6102a0516005548015611ba457808204905090506102c05260065469152d02c7e14af680000081028169152d02c7e14af6800000820418611ba4579050806b033b2e3c9fd0803ce8000000036b033b2e3c9fd0803ce80000008111611ba45790506102e0526102e0516080526102c05160a052611a92610320611832565b61032051610300526101e05160405261028051606052611ab36103406118e1565b61034051610320526103205160405261030051606052611ad46103606117ea565b610360516103405261020051610340511015611af3575f815250611afb565b610340518152505b565b6101206103806101405e4261026052611b176104a061192e565b6104a0511515815250565b6104a051600454808202811583838304141715611ba457905090506104e0526104e0516101206103806101405e6104c05161026052611b6261052061192e565b61052051808202811583838304141715611ba45790509050670de0b6b3a76400008104905061050052610500516002548015611ba45780820490509050815250565b5f80fd064b17c117e604ee17e605b4105f001817e617e60425030617520bbe108a050d0f75172e03da1777855820eade4325ade98f25150375a364d84aa7cfc83a73e0828a6a4ee4914c019cae95191bd081182800a1657679706572830004030037" - } - ], - "isFixedGasLimit": false - }, - { - "hash": "0xef44f21c268446f7ad3565144ed2f1494ed7b38a202750d306988ced814f246f", - "transactionType": "CALL", - "contractName": null, - "contractAddress": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "function": "deployCreate2(bytes32,bytes)", - "arguments": [ - "0x0a1c961e82f50bb0d3abc0f50d8ddfb13273ac947d1132a3c330add13e6cbc56", - "0x61072f6100116100003961072f610000f35f3560e01c6002600d820660011b61071501601e395f51565b633026b273811861064c5761012436103417610711576004358060a01c610711576040526024358060a01c610711576060526044358060a01c610711576080526064358060a01c6107115760a0526084358060a01c6107115760c05260a4358060a01c6107115760e052606060c4610100375f5415610109576020806101c052600b610160527f696e697469616c697a656400000000000000000000000000000000000000000061018052610160816101c001602b82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06101a052806004016101bcfd5b6040515f5560605160015560805160025560a05160035560e05160045561010051600655610120516007556101405160085560e05163313ce567610180526020610180600461019c845afa610160573d5f5f3e3d5ffd5b3d602081183d602010021880610180016101a01161071157610180518060081c610711576101c052506101c09050516101605261016051604d81116107115780600a0a905060055560e05163095ea7b36101805260a0516101a0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101c0526020610180604461019c5f855af16101fa573d5f5f3e3d5ffd5b3d61021157803b156107115760016101e05261023b565b3d602081183d602010021880610180016101a01161071157610180518060011c610711576101e052505b6101e09050511561071157005b63561b9069811861064c57606436103417610711576044358060a01c6107115760e0525f543318156102ec5760208061016052600e610100527f2174726f76655f6d616e61676572000000000000000000000000000000000000610120526101008161016001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610140528060040161015cfd5b6004351561041a5760403661010037600435604052600754606052610312610140610650565b6101406040816101805e5060406101806101005e6009546101405261014051600181018181106107115790506009556004546323b872dd610160525f5461018052306101a0526004356101c0526020610160606461017c5f855af1610379573d5f5f3e3d5ffd5b3d61039057803b156107115760016101e0526103ba565b3d602081183d602010021880610160016101801161071157610160518060011c610711576101e052505b6101e09050511561071157600354633bd8c8dc610160526101405161018052604060046101a03760406101006101e05e60e0516102205260015461024052803b15610711575f61016060e461017c5f855af1610418573d5f5f3e3d5ffd5b505b005b63db17e145811861064c576024361034176107115760035460e05260e05163571a26a06102205260043561024052610120610220602461023c845afa610464573d5f5f3e3d5ffd5b3d61012081183d610120100218806102200161034011610711578061022001610340116107115760e06102206103605e610300518060a01c6107115761044052610320518060a01c6107115761046052506103609050610120816101005e5060403661022037610140516040526008546060526104e2610260610650565b6102606040816102a05e5060406102a06102205e60e051636b268ef1610260526004356102805260406102206102a05e803b15610711575f610260606461027c5f855af1610532573d5f5f3e3d5ffd5b50005b631d98e607811861064c5734610711575f5460405260206040f35b63bcead63e811861056c57346107115760015460405260206040f35b633f96200a811861064c57346107115760065460405260206040f35b6386fc88d381186105a457346107115760025460405260206040f35b6315bcc4ab811861064c57346107115760055460405260206040f35b637d9f6db5811861064c57346107115760035460405260206040f35b632621db2f811861064c57346107115760045460405260206040f35b634f4f6f1a811861064c57346107115760075460405260206040f35b639ac385ae811861063057346107115760085460405260206040f35b63affed0e0811861064c57346107115760095460405260206040f35b5f5ffd5b600254637015186c60a0525f60c052602060a0602460bc845afa610676573d5f5f3e3d5ffd5b60203d106107115760a090505160805260405160805180820281158383830414171561071157905090506060518082028115838383041417156107115790509050670de0b6b3a7640000810490506005548015610711578082049050905060a0526080516006548082028115838383041417156107115790509050670de0b6b3a76400008104905060c05260a051815260c051602082015250565b5f80fd064c053505f8041c06140550064c0018024805c005dc0588064c8558208016408bd368095498888b16c1e5adda5a9c10a28ee000472faf4be375d721c119072f81181a00a1657679706572830004030037" - ], - "transaction": { - "from": "0x000005281a2b04a182085d37cc9e6dd552795caa", - "to": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "gas": "0x17820f", - "value": "0x0", - "input": "0x263076680a1c961e82f50bb0d3abc0f50d8ddfb13273ac947d1132a3c330add13e6cbc560000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000077761072f6100116100003961072f610000f35f3560e01c6002600d820660011b61071501601e395f51565b633026b273811861064c5761012436103417610711576004358060a01c610711576040526024358060a01c610711576060526044358060a01c610711576080526064358060a01c6107115760a0526084358060a01c6107115760c05260a4358060a01c6107115760e052606060c4610100375f5415610109576020806101c052600b610160527f696e697469616c697a656400000000000000000000000000000000000000000061018052610160816101c001602b82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06101a052806004016101bcfd5b6040515f5560605160015560805160025560a05160035560e05160045561010051600655610120516007556101405160085560e05163313ce567610180526020610180600461019c845afa610160573d5f5f3e3d5ffd5b3d602081183d602010021880610180016101a01161071157610180518060081c610711576101c052506101c09050516101605261016051604d81116107115780600a0a905060055560e05163095ea7b36101805260a0516101a0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101c0526020610180604461019c5f855af16101fa573d5f5f3e3d5ffd5b3d61021157803b156107115760016101e05261023b565b3d602081183d602010021880610180016101a01161071157610180518060011c610711576101e052505b6101e09050511561071157005b63561b9069811861064c57606436103417610711576044358060a01c6107115760e0525f543318156102ec5760208061016052600e610100527f2174726f76655f6d616e61676572000000000000000000000000000000000000610120526101008161016001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610140528060040161015cfd5b6004351561041a5760403661010037600435604052600754606052610312610140610650565b6101406040816101805e5060406101806101005e6009546101405261014051600181018181106107115790506009556004546323b872dd610160525f5461018052306101a0526004356101c0526020610160606461017c5f855af1610379573d5f5f3e3d5ffd5b3d61039057803b156107115760016101e0526103ba565b3d602081183d602010021880610160016101801161071157610160518060011c610711576101e052505b6101e09050511561071157600354633bd8c8dc610160526101405161018052604060046101a03760406101006101e05e60e0516102205260015461024052803b15610711575f61016060e461017c5f855af1610418573d5f5f3e3d5ffd5b505b005b63db17e145811861064c576024361034176107115760035460e05260e05163571a26a06102205260043561024052610120610220602461023c845afa610464573d5f5f3e3d5ffd5b3d61012081183d610120100218806102200161034011610711578061022001610340116107115760e06102206103605e610300518060a01c6107115761044052610320518060a01c6107115761046052506103609050610120816101005e5060403661022037610140516040526008546060526104e2610260610650565b6102606040816102a05e5060406102a06102205e60e051636b268ef1610260526004356102805260406102206102a05e803b15610711575f610260606461027c5f855af1610532573d5f5f3e3d5ffd5b50005b631d98e607811861064c5734610711575f5460405260206040f35b63bcead63e811861056c57346107115760015460405260206040f35b633f96200a811861064c57346107115760065460405260206040f35b6386fc88d381186105a457346107115760025460405260206040f35b6315bcc4ab811861064c57346107115760055460405260206040f35b637d9f6db5811861064c57346107115760035460405260206040f35b632621db2f811861064c57346107115760045460405260206040f35b634f4f6f1a811861064c57346107115760075460405260206040f35b639ac385ae811861063057346107115760085460405260206040f35b63affed0e0811861064c57346107115760095460405260206040f35b5f5ffd5b600254637015186c60a0525f60c052602060a0602460bc845afa610676573d5f5f3e3d5ffd5b60203d106107115760a090505160805260405160805180820281158383830414171561071157905090506060518082028115838383041417156107115790509050670de0b6b3a7640000810490506005548015610711578082049050905060a0526080516006548082028115838383041417156107115790509050670de0b6b3a76400008104905060c05260a051815260c051602082015250565b5f80fd064c053505f8041c06140550064c0018024805c005dc0588064c8558208016408bd368095498888b16c1e5adda5a9c10a28ee000472faf4be375d721c119072f81181a00a1657679706572830004030037000000000000000000", - "nonce": "0x19", - "chainId": "0x1" - }, - "additionalContracts": [ - { - "transactionType": "CREATE2", - "contractName": "dutch_desk", - "address": "0x9ef894c5ddc316a36d17310e8433c39fa78056c3", - "initCode": "0x61072f6100116100003961072f610000f35f3560e01c6002600d820660011b61071501601e395f51565b633026b273811861064c5761012436103417610711576004358060a01c610711576040526024358060a01c610711576060526044358060a01c610711576080526064358060a01c6107115760a0526084358060a01c6107115760c05260a4358060a01c6107115760e052606060c4610100375f5415610109576020806101c052600b610160527f696e697469616c697a656400000000000000000000000000000000000000000061018052610160816101c001602b82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06101a052806004016101bcfd5b6040515f5560605160015560805160025560a05160035560e05160045561010051600655610120516007556101405160085560e05163313ce567610180526020610180600461019c845afa610160573d5f5f3e3d5ffd5b3d602081183d602010021880610180016101a01161071157610180518060081c610711576101c052506101c09050516101605261016051604d81116107115780600a0a905060055560e05163095ea7b36101805260a0516101a0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101c0526020610180604461019c5f855af16101fa573d5f5f3e3d5ffd5b3d61021157803b156107115760016101e05261023b565b3d602081183d602010021880610180016101a01161071157610180518060011c610711576101e052505b6101e09050511561071157005b63561b9069811861064c57606436103417610711576044358060a01c6107115760e0525f543318156102ec5760208061016052600e610100527f2174726f76655f6d616e61676572000000000000000000000000000000000000610120526101008161016001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610140528060040161015cfd5b6004351561041a5760403661010037600435604052600754606052610312610140610650565b6101406040816101805e5060406101806101005e6009546101405261014051600181018181106107115790506009556004546323b872dd610160525f5461018052306101a0526004356101c0526020610160606461017c5f855af1610379573d5f5f3e3d5ffd5b3d61039057803b156107115760016101e0526103ba565b3d602081183d602010021880610160016101801161071157610160518060011c610711576101e052505b6101e09050511561071157600354633bd8c8dc610160526101405161018052604060046101a03760406101006101e05e60e0516102205260015461024052803b15610711575f61016060e461017c5f855af1610418573d5f5f3e3d5ffd5b505b005b63db17e145811861064c576024361034176107115760035460e05260e05163571a26a06102205260043561024052610120610220602461023c845afa610464573d5f5f3e3d5ffd5b3d61012081183d610120100218806102200161034011610711578061022001610340116107115760e06102206103605e610300518060a01c6107115761044052610320518060a01c6107115761046052506103609050610120816101005e5060403661022037610140516040526008546060526104e2610260610650565b6102606040816102a05e5060406102a06102205e60e051636b268ef1610260526004356102805260406102206102a05e803b15610711575f610260606461027c5f855af1610532573d5f5f3e3d5ffd5b50005b631d98e607811861064c5734610711575f5460405260206040f35b63bcead63e811861056c57346107115760015460405260206040f35b633f96200a811861064c57346107115760065460405260206040f35b6386fc88d381186105a457346107115760025460405260206040f35b6315bcc4ab811861064c57346107115760055460405260206040f35b637d9f6db5811861064c57346107115760035460405260206040f35b632621db2f811861064c57346107115760045460405260206040f35b634f4f6f1a811861064c57346107115760075460405260206040f35b639ac385ae811861063057346107115760085460405260206040f35b63affed0e0811861064c57346107115760095460405260206040f35b5f5ffd5b600254637015186c60a0525f60c052602060a0602460bc845afa610676573d5f5f3e3d5ffd5b60203d106107115760a090505160805260405160805180820281158383830414171561071157905090506060518082028115838383041417156107115790509050670de0b6b3a7640000810490506005548015610711578082049050905060a0526080516006548082028115838383041417156107115790509050670de0b6b3a76400008104905060c05260a051815260c051602082015250565b5f80fd064c053505f8041c06140550064c0018024805c005dc0588064c8558208016408bd368095498888b16c1e5adda5a9c10a28ee000472faf4be375d721c119072f81181a00a1657679706572830004030037" - } - ], - "isFixedGasLimit": false - }, - { - "hash": "0x3f16585f0d8ef9f607f3ad52bdd36ae244a28c0051a07882df6f4f8fb18dfe2f", - "transactionType": "CALL", - "contractName": null, - "contractAddress": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "function": "deployCreate2(bytes32,bytes)", - "arguments": [ - "0x92cacf7271bbb90a71b493943edcf87922224fc1137c698ac55d911170328d19", - "0x6110e4610011610000396110e4610000f35f3560e01c6002600e820660011b6110c801601e395f51565b63c4d66de881186100ea576024361034176110c4576004358060a01c6110c4576040525f54156100b35760208060c052600b6060527f696e697469616c697a656400000000000000000000000000000000000000000060805260608160c001602b82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b6040515f556060366060375f6060525f60805260025f6020525f5260405f206060518155608051600182015560a051600282015550005b633df4ddf481186106f657346110c45760025f6020525f5260405f205460405260206040f35b63f2a75fe4811861012d57346110c4576001541560405260206040f35b633567121481186106f6576024361034176110c45760026004356020525f5260405f206001810190505460405260206040f35b63949d225d81186106f657346110c45760015460405260206040f35b6347799da881186106f657346110c45760025f6020525f5260405f206001810190505460405260206040f35b63edd004e581186106f6576024361034176110c45760026004356020525f5260405f205460405260206040f35b63c34052e081186106f6576024361034176110c45760206004356040526101fc60606106fa565b6060f35b63461b774681186106f6576064361034176110c4576020606060046103803761022a6104606107d6565b610460f35b63f659d483811861025e576064361034176110c4576040606060046105e037610259610680610d78565b610680f35b634cc8221581186106f6576024361034176110c4575f543318156102f15760208061012052600e60c0527f2174726f76655f6d616e6167657200000000000000000000000000000000000060e05260c08161012001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610100528060040161011cfd5b60043560405261030160c06106fa565b60c05161037e5760208061014052600760e0527f21657869737473000000000000000000000000000000000000000000000000006101005260e08161014001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610120528060040161013cfd5b60043560405261038c610fde565b60026004356020525f5260405f205f81555f60018201555f600282015550600154600181038181116110c4579050600155005b63843aa0db81186106f6576084361034176110c4575f543318156104555760208061080052600e6107a0527f2174726f76655f6d616e616765720000000000000000000000000000000000006107c0526107a08161080001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06107e052806004016107fcfd5b6004356040526104666107a06106fa565b6107a051156104e7576020806108205260066107c0527f65786973747300000000000000000000000000000000000000000000000000006107e0526107c08161082001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610800528060040161081cfd5b600435610566576020806108005260096107a0527f2174726f76655f696400000000000000000000000000000000000000000000006107c0526107a08161080001602982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06107e052806004016107fcfd5b6080600461068037610576610f7a565b600160026004356020525f5260405f2060028101905055600154600181018181106110c4579050600155005b63d2adfe9381186106f6576084361034176110c4575f543318156106385760208061080052600e6107a0527f2174726f76655f6d616e616765720000000000000000000000000000000000006107c0526107a08161080001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06107e052806004016107fcfd5b6004356040526106496107a06106fa565b6107a0516106c9576020806108205260076107c0527f21657869737473000000000000000000000000000000000000000000000000006107e0526107c08161082001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610800528060040161081cfd5b60806004610680376106d961102e565b005b631d98e60781186106f657346110c4575f5460405260206040f35b5f5ffd5b60026040516020525f5260405f2060028101905054815250565b5f546387553b7e6101605260405161018052610100610160602461017c845afa610740573d5f5f3e3d5ffd5b3d61010081183d6101001002188061016001610260116110c4578061016001610260116110c45760606101606102805e6101c0518060401c6110c4576102e0526101e0518060401c6110c45761030052610200518060a01c6110c45761032052610220518060a01c6110c45761034052610240518060041c6110c457610360525061028090506101008160605e5060a051815250565b6103c05160026103a0516020525f5260405f205418610810576103a05160026103c0516020525f5260405f20600181019050541815610812565b5f5b6103e0526103a051610825576001610842565b610380516103a05160405261083b610420610714565b6104205110155b610400526103c051610855576001610871565b6103c051604052610867610440610714565b6104405161038051115b610420526103e051610883575f610896565b61040051610891575f610896565b610420515b815250565b6103c0516108aa5760016108c6565b6103c0516040526108bc6103e0610714565b6103e05161038051115b610901576103c0516103a05260026103c0516020525f5260405f20546103c0525f81526103a05160208201526103c051604082015250610919565b600181526103a05160208201526103c0516040820152505b565b61042051610440526002610420516020525f5260405f2054610460525f610480525f612710905b806104a0526104005161038052610440516103a052610460516103c05261096a6104c061089b565b6104c06060816105205e5061052051610480526105405161044052610560516104605261048051156109ad57610440518352610460516020840152505050610a31565b6001018181186109425750506020806105005260116104a0527f6e656564206265747465722068696e74730000000000000000000000000000006104c0526104a08161050001603182825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06104e052806004016104fcfd5b565b6103a051610a42576001610a5f565b610380516103a051604052610a586103e0610714565b6103e05110155b610aa0576103a0516103c05260026103a0516020525f5260405f20600181019050546103a0525f81526103a05160208201526103c051604082015250610ab8565b600181526103a05160208201526103c0516040820152505b565b6002610420516020525f5260405f20600181019050546104405261042051610460525f610480525f612710905b806104a0526104005161038052610440516103a052610460516103c052610b0f6104c0610a33565b6104c06060816105205e506105205161048052610540516104405261056051610460526104805115610b5257610440518352610460516020840152505050610bd6565b600101818118610ae75750506020806105005260116104a0527f6e656564206265747465722068696e74730000000000000000000000000000006104c0526104a08161050001603182825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06104e052806004016104fcfd5b565b61042051610460526002610420516020525f5260405f2054610480526002610440516020525f5260405f20600181019050546104a052610440516104c0525f6104e0525f612710905b80610500526104005161038052610460516103a052610480516103c052610c4961052061089b565b6105206060816105805e50610580516104e0526105a051610460526105c051610480526104e05115610c8c57610460518352610480516020840152505050610d76565b61040051610380526104a0516103a0526104c0516103c052610caf610520610a33565b6105206060816105805e50610580516104e0526105a0516104a0526105c0516104c0526104e05115610cf2576104a05183526104c0516020840152505050610d76565b600101818118610c21575050602080610560526011610500527f6e656564206265747465722068696e7473000000000000000000000000000000610520526105008161056001603182825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610540528060040161055cfd5b565b61060051610da7576105e051610400525f61042052610d9861064061091b565b610640604081835e5050610f22565b61060051604052610db96106406106fa565b61064051610dc8576001610de4565b6105e05161060051604052610dde610660610714565b61066051105b15610def575f610600525b61062051610e1e576105e051610400525f61042052610e0f610640610aba565b610640604081835e5050610f22565b61062051604052610e306106406106fa565b61064051610e3f576001610e5c565b61062051604052610e51610660610714565b610660516105e05111155b15610e67575f610620525b61060051610e79576106205115610e7b565b5f5b610eff5761060051610eb1576105e051610400526106205161042052610ea2610640610aba565b610640604081835e5050610f22565b61062051610edc5760406105e06104005e610ecd61064061091b565b610640604081835e5050610f22565b60606105e06104005e610ef0610640610bd8565b610640604081835e5050610f22565b6105e051610400525f61042052610f1761064061091b565b610640604081835e50505b565b60405160026060516020525f5260405f205560605160026040516020525f5260405f206001810190505560805160026040516020525f5260405f205560405160026080516020525f5260405f2060018101905055565b60606106a06103805e610f8e6107006107d6565b61070051610fbf5760606106a06105e05e610faa610720610d78565b6107206040816107605e5060406107606106c05e5b610680516040526106c0516060526106e051608052610fdc610f24565b565b60026040516020525f5260405f2080546060526001810154608052600281015460a0525060605160026080516020525f5260405f205560805160026060516020525f5260405f2060018101905055565b60606106a06103805e6110426107006107d6565b610700516110735760606106a06105e05e61105e610720610d78565b6107206040816107605e5060406107606106c05e5b610680516106e0511461108f57610680516106c0511415611091565b5f5b156110c257610680516040526110a5610fde565b610680516040526106c0516060526106e0516080526110c2610f24565b565b5f80fd01d503bf06f6022f0018016006f606db011001a8017c05a2020006f6855820f608b38a222fbcbadf8b5d5250a0c221d4a92c34ac1b818f6ed494ed956450671910e481181c00a1657679706572830004030037" - ], - "transaction": { - "from": "0x000005281a2b04a182085d37cc9e6dd552795caa", - "to": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "gas": "0x331a79", - "value": "0x0", - "input": "0x2630766892cacf7271bbb90a71b493943edcf87922224fc1137c698ac55d911170328d190000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000112c6110e4610011610000396110e4610000f35f3560e01c6002600e820660011b6110c801601e395f51565b63c4d66de881186100ea576024361034176110c4576004358060a01c6110c4576040525f54156100b35760208060c052600b6060527f696e697469616c697a656400000000000000000000000000000000000000000060805260608160c001602b82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b6040515f556060366060375f6060525f60805260025f6020525f5260405f206060518155608051600182015560a051600282015550005b633df4ddf481186106f657346110c45760025f6020525f5260405f205460405260206040f35b63f2a75fe4811861012d57346110c4576001541560405260206040f35b633567121481186106f6576024361034176110c45760026004356020525f5260405f206001810190505460405260206040f35b63949d225d81186106f657346110c45760015460405260206040f35b6347799da881186106f657346110c45760025f6020525f5260405f206001810190505460405260206040f35b63edd004e581186106f6576024361034176110c45760026004356020525f5260405f205460405260206040f35b63c34052e081186106f6576024361034176110c45760206004356040526101fc60606106fa565b6060f35b63461b774681186106f6576064361034176110c4576020606060046103803761022a6104606107d6565b610460f35b63f659d483811861025e576064361034176110c4576040606060046105e037610259610680610d78565b610680f35b634cc8221581186106f6576024361034176110c4575f543318156102f15760208061012052600e60c0527f2174726f76655f6d616e6167657200000000000000000000000000000000000060e05260c08161012001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610100528060040161011cfd5b60043560405261030160c06106fa565b60c05161037e5760208061014052600760e0527f21657869737473000000000000000000000000000000000000000000000000006101005260e08161014001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610120528060040161013cfd5b60043560405261038c610fde565b60026004356020525f5260405f205f81555f60018201555f600282015550600154600181038181116110c4579050600155005b63843aa0db81186106f6576084361034176110c4575f543318156104555760208061080052600e6107a0527f2174726f76655f6d616e616765720000000000000000000000000000000000006107c0526107a08161080001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06107e052806004016107fcfd5b6004356040526104666107a06106fa565b6107a051156104e7576020806108205260066107c0527f65786973747300000000000000000000000000000000000000000000000000006107e0526107c08161082001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610800528060040161081cfd5b600435610566576020806108005260096107a0527f2174726f76655f696400000000000000000000000000000000000000000000006107c0526107a08161080001602982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06107e052806004016107fcfd5b6080600461068037610576610f7a565b600160026004356020525f5260405f2060028101905055600154600181018181106110c4579050600155005b63d2adfe9381186106f6576084361034176110c4575f543318156106385760208061080052600e6107a0527f2174726f76655f6d616e616765720000000000000000000000000000000000006107c0526107a08161080001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06107e052806004016107fcfd5b6004356040526106496107a06106fa565b6107a0516106c9576020806108205260076107c0527f21657869737473000000000000000000000000000000000000000000000000006107e0526107c08161082001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610800528060040161081cfd5b60806004610680376106d961102e565b005b631d98e60781186106f657346110c4575f5460405260206040f35b5f5ffd5b60026040516020525f5260405f2060028101905054815250565b5f546387553b7e6101605260405161018052610100610160602461017c845afa610740573d5f5f3e3d5ffd5b3d61010081183d6101001002188061016001610260116110c4578061016001610260116110c45760606101606102805e6101c0518060401c6110c4576102e0526101e0518060401c6110c45761030052610200518060a01c6110c45761032052610220518060a01c6110c45761034052610240518060041c6110c457610360525061028090506101008160605e5060a051815250565b6103c05160026103a0516020525f5260405f205418610810576103a05160026103c0516020525f5260405f20600181019050541815610812565b5f5b6103e0526103a051610825576001610842565b610380516103a05160405261083b610420610714565b6104205110155b610400526103c051610855576001610871565b6103c051604052610867610440610714565b6104405161038051115b610420526103e051610883575f610896565b61040051610891575f610896565b610420515b815250565b6103c0516108aa5760016108c6565b6103c0516040526108bc6103e0610714565b6103e05161038051115b610901576103c0516103a05260026103c0516020525f5260405f20546103c0525f81526103a05160208201526103c051604082015250610919565b600181526103a05160208201526103c0516040820152505b565b61042051610440526002610420516020525f5260405f2054610460525f610480525f612710905b806104a0526104005161038052610440516103a052610460516103c05261096a6104c061089b565b6104c06060816105205e5061052051610480526105405161044052610560516104605261048051156109ad57610440518352610460516020840152505050610a31565b6001018181186109425750506020806105005260116104a0527f6e656564206265747465722068696e74730000000000000000000000000000006104c0526104a08161050001603182825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06104e052806004016104fcfd5b565b6103a051610a42576001610a5f565b610380516103a051604052610a586103e0610714565b6103e05110155b610aa0576103a0516103c05260026103a0516020525f5260405f20600181019050546103a0525f81526103a05160208201526103c051604082015250610ab8565b600181526103a05160208201526103c0516040820152505b565b6002610420516020525f5260405f20600181019050546104405261042051610460525f610480525f612710905b806104a0526104005161038052610440516103a052610460516103c052610b0f6104c0610a33565b6104c06060816105205e506105205161048052610540516104405261056051610460526104805115610b5257610440518352610460516020840152505050610bd6565b600101818118610ae75750506020806105005260116104a0527f6e656564206265747465722068696e74730000000000000000000000000000006104c0526104a08161050001603182825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06104e052806004016104fcfd5b565b61042051610460526002610420516020525f5260405f2054610480526002610440516020525f5260405f20600181019050546104a052610440516104c0525f6104e0525f612710905b80610500526104005161038052610460516103a052610480516103c052610c4961052061089b565b6105206060816105805e50610580516104e0526105a051610460526105c051610480526104e05115610c8c57610460518352610480516020840152505050610d76565b61040051610380526104a0516103a0526104c0516103c052610caf610520610a33565b6105206060816105805e50610580516104e0526105a0516104a0526105c0516104c0526104e05115610cf2576104a05183526104c0516020840152505050610d76565b600101818118610c21575050602080610560526011610500527f6e656564206265747465722068696e7473000000000000000000000000000000610520526105008161056001603182825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610540528060040161055cfd5b565b61060051610da7576105e051610400525f61042052610d9861064061091b565b610640604081835e5050610f22565b61060051604052610db96106406106fa565b61064051610dc8576001610de4565b6105e05161060051604052610dde610660610714565b61066051105b15610def575f610600525b61062051610e1e576105e051610400525f61042052610e0f610640610aba565b610640604081835e5050610f22565b61062051604052610e306106406106fa565b61064051610e3f576001610e5c565b61062051604052610e51610660610714565b610660516105e05111155b15610e67575f610620525b61060051610e79576106205115610e7b565b5f5b610eff5761060051610eb1576105e051610400526106205161042052610ea2610640610aba565b610640604081835e5050610f22565b61062051610edc5760406105e06104005e610ecd61064061091b565b610640604081835e5050610f22565b60606105e06104005e610ef0610640610bd8565b610640604081835e5050610f22565b6105e051610400525f61042052610f1761064061091b565b610640604081835e50505b565b60405160026060516020525f5260405f205560605160026040516020525f5260405f206001810190505560805160026040516020525f5260405f205560405160026080516020525f5260405f2060018101905055565b60606106a06103805e610f8e6107006107d6565b61070051610fbf5760606106a06105e05e610faa610720610d78565b6107206040816107605e5060406107606106c05e5b610680516040526106c0516060526106e051608052610fdc610f24565b565b60026040516020525f5260405f2080546060526001810154608052600281015460a0525060605160026080516020525f5260405f205560805160026060516020525f5260405f2060018101905055565b60606106a06103805e6110426107006107d6565b610700516110735760606106a06105e05e61105e610720610d78565b6107206040816107605e5060406107606106c05e5b610680516106e0511461108f57610680516106c0511415611091565b5f5b156110c257610680516040526110a5610fde565b610680516040526106c0516060526106e0516080526110c2610f24565b565b5f80fd01d503bf06f6022f0018016006f606db011001a8017c05a2020006f6855820f608b38a222fbcbadf8b5d5250a0c221d4a92c34ac1b818f6ed494ed956450671910e481181c00a16576797065728300040300370000000000000000000000000000000000000000", - "nonce": "0x1a", - "chainId": "0x1" - }, - "additionalContracts": [ - { - "transactionType": "CREATE2", - "contractName": "sorted_troves", - "address": "0x9926f9e7f53b07047b584efe96800486f929650e", - "initCode": "0x6110e4610011610000396110e4610000f35f3560e01c6002600e820660011b6110c801601e395f51565b63c4d66de881186100ea576024361034176110c4576004358060a01c6110c4576040525f54156100b35760208060c052600b6060527f696e697469616c697a656400000000000000000000000000000000000000000060805260608160c001602b82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b6040515f556060366060375f6060525f60805260025f6020525f5260405f206060518155608051600182015560a051600282015550005b633df4ddf481186106f657346110c45760025f6020525f5260405f205460405260206040f35b63f2a75fe4811861012d57346110c4576001541560405260206040f35b633567121481186106f6576024361034176110c45760026004356020525f5260405f206001810190505460405260206040f35b63949d225d81186106f657346110c45760015460405260206040f35b6347799da881186106f657346110c45760025f6020525f5260405f206001810190505460405260206040f35b63edd004e581186106f6576024361034176110c45760026004356020525f5260405f205460405260206040f35b63c34052e081186106f6576024361034176110c45760206004356040526101fc60606106fa565b6060f35b63461b774681186106f6576064361034176110c4576020606060046103803761022a6104606107d6565b610460f35b63f659d483811861025e576064361034176110c4576040606060046105e037610259610680610d78565b610680f35b634cc8221581186106f6576024361034176110c4575f543318156102f15760208061012052600e60c0527f2174726f76655f6d616e6167657200000000000000000000000000000000000060e05260c08161012001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610100528060040161011cfd5b60043560405261030160c06106fa565b60c05161037e5760208061014052600760e0527f21657869737473000000000000000000000000000000000000000000000000006101005260e08161014001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610120528060040161013cfd5b60043560405261038c610fde565b60026004356020525f5260405f205f81555f60018201555f600282015550600154600181038181116110c4579050600155005b63843aa0db81186106f6576084361034176110c4575f543318156104555760208061080052600e6107a0527f2174726f76655f6d616e616765720000000000000000000000000000000000006107c0526107a08161080001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06107e052806004016107fcfd5b6004356040526104666107a06106fa565b6107a051156104e7576020806108205260066107c0527f65786973747300000000000000000000000000000000000000000000000000006107e0526107c08161082001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610800528060040161081cfd5b600435610566576020806108005260096107a0527f2174726f76655f696400000000000000000000000000000000000000000000006107c0526107a08161080001602982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06107e052806004016107fcfd5b6080600461068037610576610f7a565b600160026004356020525f5260405f2060028101905055600154600181018181106110c4579050600155005b63d2adfe9381186106f6576084361034176110c4575f543318156106385760208061080052600e6107a0527f2174726f76655f6d616e616765720000000000000000000000000000000000006107c0526107a08161080001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06107e052806004016107fcfd5b6004356040526106496107a06106fa565b6107a0516106c9576020806108205260076107c0527f21657869737473000000000000000000000000000000000000000000000000006107e0526107c08161082001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610800528060040161081cfd5b60806004610680376106d961102e565b005b631d98e60781186106f657346110c4575f5460405260206040f35b5f5ffd5b60026040516020525f5260405f2060028101905054815250565b5f546387553b7e6101605260405161018052610100610160602461017c845afa610740573d5f5f3e3d5ffd5b3d61010081183d6101001002188061016001610260116110c4578061016001610260116110c45760606101606102805e6101c0518060401c6110c4576102e0526101e0518060401c6110c45761030052610200518060a01c6110c45761032052610220518060a01c6110c45761034052610240518060041c6110c457610360525061028090506101008160605e5060a051815250565b6103c05160026103a0516020525f5260405f205418610810576103a05160026103c0516020525f5260405f20600181019050541815610812565b5f5b6103e0526103a051610825576001610842565b610380516103a05160405261083b610420610714565b6104205110155b610400526103c051610855576001610871565b6103c051604052610867610440610714565b6104405161038051115b610420526103e051610883575f610896565b61040051610891575f610896565b610420515b815250565b6103c0516108aa5760016108c6565b6103c0516040526108bc6103e0610714565b6103e05161038051115b610901576103c0516103a05260026103c0516020525f5260405f20546103c0525f81526103a05160208201526103c051604082015250610919565b600181526103a05160208201526103c0516040820152505b565b61042051610440526002610420516020525f5260405f2054610460525f610480525f612710905b806104a0526104005161038052610440516103a052610460516103c05261096a6104c061089b565b6104c06060816105205e5061052051610480526105405161044052610560516104605261048051156109ad57610440518352610460516020840152505050610a31565b6001018181186109425750506020806105005260116104a0527f6e656564206265747465722068696e74730000000000000000000000000000006104c0526104a08161050001603182825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06104e052806004016104fcfd5b565b6103a051610a42576001610a5f565b610380516103a051604052610a586103e0610714565b6103e05110155b610aa0576103a0516103c05260026103a0516020525f5260405f20600181019050546103a0525f81526103a05160208201526103c051604082015250610ab8565b600181526103a05160208201526103c0516040820152505b565b6002610420516020525f5260405f20600181019050546104405261042051610460525f610480525f612710905b806104a0526104005161038052610440516103a052610460516103c052610b0f6104c0610a33565b6104c06060816105205e506105205161048052610540516104405261056051610460526104805115610b5257610440518352610460516020840152505050610bd6565b600101818118610ae75750506020806105005260116104a0527f6e656564206265747465722068696e74730000000000000000000000000000006104c0526104a08161050001603182825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06104e052806004016104fcfd5b565b61042051610460526002610420516020525f5260405f2054610480526002610440516020525f5260405f20600181019050546104a052610440516104c0525f6104e0525f612710905b80610500526104005161038052610460516103a052610480516103c052610c4961052061089b565b6105206060816105805e50610580516104e0526105a051610460526105c051610480526104e05115610c8c57610460518352610480516020840152505050610d76565b61040051610380526104a0516103a0526104c0516103c052610caf610520610a33565b6105206060816105805e50610580516104e0526105a0516104a0526105c0516104c0526104e05115610cf2576104a05183526104c0516020840152505050610d76565b600101818118610c21575050602080610560526011610500527f6e656564206265747465722068696e7473000000000000000000000000000000610520526105008161056001603182825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610540528060040161055cfd5b565b61060051610da7576105e051610400525f61042052610d9861064061091b565b610640604081835e5050610f22565b61060051604052610db96106406106fa565b61064051610dc8576001610de4565b6105e05161060051604052610dde610660610714565b61066051105b15610def575f610600525b61062051610e1e576105e051610400525f61042052610e0f610640610aba565b610640604081835e5050610f22565b61062051604052610e306106406106fa565b61064051610e3f576001610e5c565b61062051604052610e51610660610714565b610660516105e05111155b15610e67575f610620525b61060051610e79576106205115610e7b565b5f5b610eff5761060051610eb1576105e051610400526106205161042052610ea2610640610aba565b610640604081835e5050610f22565b61062051610edc5760406105e06104005e610ecd61064061091b565b610640604081835e5050610f22565b60606105e06104005e610ef0610640610bd8565b610640604081835e5050610f22565b6105e051610400525f61042052610f1761064061091b565b610640604081835e50505b565b60405160026060516020525f5260405f205560605160026040516020525f5260405f206001810190505560805160026040516020525f5260405f205560405160026080516020525f5260405f2060018101905055565b60606106a06103805e610f8e6107006107d6565b61070051610fbf5760606106a06105e05e610faa610720610d78565b6107206040816107605e5060406107606106c05e5b610680516040526106c0516060526106e051608052610fdc610f24565b565b60026040516020525f5260405f2080546060526001810154608052600281015460a0525060605160026080516020525f5260405f205560805160026060516020525f5260405f2060018101905055565b60606106a06103805e6110426107006107d6565b610700516110735760606106a06105e05e61105e610720610d78565b6107206040816107605e5060406107606106c05e5b610680516106e0511461108f57610680516106c0511415611091565b5f5b156110c257610680516040526110a5610fde565b610680516040526106c0516060526106e0516080526110c2610f24565b565b5f80fd01d503bf06f6022f0018016006f606db011001a8017c05a2020006f6855820f608b38a222fbcbadf8b5d5250a0c221d4a92c34ac1b818f6ed494ed956450671910e481181c00a1657679706572830004030037" - } - ], - "isFixedGasLimit": false - }, - { - "hash": "0x08d14d88a7ae55553b98c42b5dea4c821112bbe934eb1ee64abd478a6624a0ad", - "transactionType": "CALL", - "contractName": null, - "contractAddress": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "function": "deployCreate2(bytes32,bytes)", - "arguments": [ - "0x503c6f71ecc9475f2171250459aed7f1b36d75614ffab43ae028fbfc46c94125", - "0x61486761001161000039614867610000f35f3560e01c6002602b820660011b61481101601e395f51565b63768ee73c8118610349576101c43610341761480d576004358060a01c61480d576040526024358060a01c61480d576060526044358060a01c61480d576080526064358060a01c61480d5760a0526084358060a01c61480d5760c05260a4358060a01c61480d5760e05261010060c4610100375f541561010a5760208061026052600b610200527f696e697469616c697a6564000000000000000000000000000000000000000000610220526102008161026001602b82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610240528060040161025cfd5b6040515f5560605160015560805160025560a05160035560c05160045560e05160055560c05163313ce567610220526020610220600461023c845afa610152573d5f5f3e3d5ffd5b3d602081183d602010021880610220016102401161480d57610220518060081c61480d576102605250610260905051604d811161480d5780600a0a905061020052610200516064810490506102205261022051606481049050610240526102205160065561020051600755610100516102005180820281158383830414171561480d5790509050600855610120516102205180820281158383830414171561480d5790509050600955610140516102205180820281158383830414171561480d5790509050600a55610160516102205180820281158383830414171561480d5790509050600b55610180516102405180820281158383830414171561480d5790509050600c556101a0516102405180820281158383830414171561480d5790509050600d556101c051600e556101e051600f55610220518060011c90506010556102205160fa81028160fa82041861480d57905060115560e05163095ea7b361026052606051610280527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6102a0526020610260604461027c5f855af16102fb573d5f5f3e3d5ffd5b3d61031257803b1561480d5760016102c05261033c565b3d602081183d602010021880610260016102801161480d57610260518060011c61480d576102c052505b6102c09050511561480d57005b632621db2f8118613c27573461480d5760055460405260206040f35b631deee05281186103b75760443610341761480d576020604060046080377fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60c0526103b2610220613c63565b610220f35b634e530b428118613c27573461480d5760045460405260206040f35b630ff8afc18118613c275760243610341761480d57602060176004356020525f5260405f208054608052600181015460a052600281015460c052600381015460e052600481015461010052600581015461012052600681015461014052600781015461016052506104456101a0613d86565b6101a0f35b63254e97d58118613c27573461480d576020610467610180613e7f565b610180f35b639c756a4b8118613c275760443610341761480d576024358060a01c61480d5760405260176004356020525f5260405f2080546060526001810154608052600281015460a052600381015460c052600481015460e0526005810154610100526006810154610120526007810154610140525033610100511815610561576020806101c0526006610160527f216f776e6572000000000000000000000000000000000000000000000000000061018052610160816101c001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06101a052806004016101bcfd5b6040516101205260176004356020525f5260405f206060518155608051600182015560a051600282015560c051600382015560e051600482015561010051600582015561012051600682015561014051600782015550604051336004357f2f61fe63853c39f6c9618d1aec9774d255ab9ef5a43057db30fc6018c90bd7bd5f610160a4005b632fdba1f68118613c275760243610341761480d5760176004356020525f5260405f20805460405260018101546060526002810154608052600381015460a052600481015460c052600581015460e05260068101546101005260078101546101205250336101005118156106cc576020806101a052600e610140527f2170656e64696e675f6f776e657200000000000000000000000000000000000061016052610140816101a001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610180528060040161019cfd5b60e051610140526101005160e0525f6101005260176004356020525f5260405f2060405181556060516001820155608051600282015560a051600382015560c051600482015560e05160058201556101005160068201556101205160078201555033610140516004357f16b85f49bf01212961345d3016c9a531894accf62eb7680f2045d79185cc0ec05f610160a4005b63f70d8c118118613c27576101243610341761480d576024356107f2576020806108405260126107e0527f21636f6c6c61746572616c5f616d6f756e740000000000000000000000000000610800526107e08161084001603282825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610820528060040161083cfd5b6044356108715760208061084052600c6107e0527f21646562745f616d6f756e740000000000000000000000000000000000000000610800526107e08161084001602c82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610820528060040161083cfd5b60105460a43510156108f5576020806108405260196107e0527f216d696e5f616e6e75616c5f696e7465726573745f7261746500000000000000610800526107e08161084001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610820528060040161083cfd5b60115460a4351115610979576020806108405260196107e0527f216d61785f616e6e75616c5f696e7465726573745f7261746500000000000000610800526107e08161084001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610820528060040161083cfd5b3361082052600435610840526040610800526108008051602082012090506107e05260176107e0516020525f5260405f206007810190505415610a2e57602080610860526006610800527f21656d7074790000000000000000000000000000000000000000000000000000610820526108008161086001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610840528060040161085cfd5b60443560805260a43560a05260c43560c052610a4b610820613c63565b61082051610800526044356108005180820182811061480d5790509050610820526008546108205111610af0576020806108a0526009610840527f216d696e5f64656274000000000000000000000000000000000000000000000061086052610840816108a001602982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610880528060040161089cfd5b6002546311f37ceb610860526020610860600461087c845afa610b15573d5f5f3e3d5ffd5b60203d1061480d5761086090505161084052602435604052604061082060605e610b40610880613f07565b6108805161086052600a54610860511015610bcd576020806108e0526019610880527f216d696e696d756d5f636f6c6c61746572616c5f726174696f000000000000006108a052610880816108e001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06108c052806004016108dcfd5b60176107e0516020525f5260405f20610820518155602435600182015560a4356002820155428060401c61480d576003820155428060401c61480d5760048201553360058201555f6006820155600160078201555061082051610180525f6101a0526108205160a43580820281158383830414171561480d57905090506101c0525f6101e052610c5b613f67565b60165460243580820182811061480d579050905060165560035463843aa0db610880526107e0516108a05260a4356108c0526064356108e05260843561090052803b1561480d575f610880608461089c5f855af1610cbb573d5f5f3e3d5ffd5b506005546323b872dd61088052336108a052306108c0526024356108e0526020610880606461089c5f855af1610cf3573d5f5f3e3d5ffd5b3d610d0a57803b1561480d57600161090052610d34565b3d602081183d602010021880610880016108a01161480d57610880518060011c61480d5761090052505b6109009050511561480d576044356106205260a43561064052604060e461066037610d5d61454c565b336107e0517f48cc6255485654cd31337a688b4a1e06f8a768af7ec431040b7015bbb57d44b76040602461088037610800516108c05260a4356108e0526080610880a360206107e0f35b63650f939c81186110805760443610341761480d57602435610e345760208060a05260126040527f21636f6c6c61746572616c5f616d6f756e74000000000000000000000000000060605260408160a001603282825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060805280600401609cfd5b60176004356020525f5260405f20805460405260018101546060526002810154608052600381015460a052600481015460c052600581015460e052600681015461010052600781015461012052503360e0511815610f04576020806101a0526006610140527f216f776e6572000000000000000000000000000000000000000000000000000061016052610140816101a001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610180528060040161019cfd5b6001610120511815610f88576020806101a0526007610140527f216163746976650000000000000000000000000000000000000000000000000061016052610140816101a001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610180528060040161019cfd5b60176004356020525f5260405f20600181019050805460243580820182811061480d579050905081555060165460243580820182811061480d57905090506016556005546323b872dd61014052336101605230610180526024356101a0526020610140606461015c5f855af1611000573d5f5f3e3d5ffd5b3d61101757803b1561480d5760016101c052611041565b3d602081183d602010021880610140016101601161480d57610140518060011c61480d576101c052505b6101c09050511561480d57336004357fda18d0b037712b628d658e8fb6f6701086c449aab7cefd33b9f7f95e3a3082b8602435610140526020610140a3005b63f12003678118613c27573461480d57600a5460405260206040f35b636a48f8b38118613c275760443610341761480d57602435611130576020806102005260126101a0527f21636f6c6c61746572616c5f616d6f756e7400000000000000000000000000006101c0526101a08161020001603282825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06101e052806004016101fcfd5b60176004356020525f5260405f2080546101a05260018101546101c05260028101546101e0526003810154610200526004810154610220526005810154610240526006810154610260526007810154610280525033610240511815611207576020806103005260066102a0527f216f776e657200000000000000000000000000000000000000000000000000006102c0526102a08161030001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06102e052806004016102fcfd5b600161028051181561128b576020806103005260076102a0527f21616374697665000000000000000000000000000000000000000000000000006102c0526102a08161030001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06102e052806004016102fcfd5b6024356101c0511015611310576020806103005260116102a0527f2174726f76652e636f6c6c61746572616c0000000000000000000000000000006102c0526102a08161030001603182825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06102e052806004016102fcfd5b6101006101a060805e6113246102c0613d86565b6102c0516102a0526002546311f37ceb6102e05260206102e060046102fc845afa611351573d5f5f3e3d5ffd5b60203d1061480d576102e09050516102c0526101c05160243580820382811161480d57905090506102e0526102e0516040526102a0516060526102c05160805261139c610320613f07565b6103205161030052600a5461030051101561142957602080610380526019610320527f216d696e696d756d5f636f6c6c61746572616c5f726174696f00000000000000610340526103208161038001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610360528060040161037cfd5b6102e05160176004356020525f5260405f206001810190505560165460243580820382811161480d579050905060165560055463a9059cbb610320523361034052602435610360526020610320604461033c5f855af161148b573d5f5f3e3d5ffd5b3d6114a257803b1561480d576001610380526114cc565b3d602081183d602010021880610320016103401161480d57610320518060011c61480d5761038052505b6103809050511561480d57336004357fb7464e08add10846d62a84243a08bcd31fb4d0c9bb84591709b39de1fad9ae0e602435610320526020610320a3005b63f8e61b698118613c275760a43610341761480d5760243561159f5760208061084052600c6107e0527f21646562745f616d6f756e740000000000000000000000000000000000000000610800526107e08161084001602c82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610820528060040161083cfd5b60176004356020525f5260405f2080546107e05260018101546108005260028101546108205260038101546108405260048101546108605260058101546108805260068101546108a05260078101546108c0525033610880511815611676576020806109405260066108e0527f216f776e65720000000000000000000000000000000000000000000000000000610900526108e08161094001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610920528060040161093cfd5b60016108c05118156116fa576020806109405260076108e0527f2161637469766500000000000000000000000000000000000000000000000000610900526108e08161094001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610920528060040161093cfd5b6024356080526108205160a05260443560c052611718610900613c63565b610900516108e0526024356108e05180820182811061480d5790509050610900526101006107e060805e61174d610940613d86565b6109405161092052610920516109005180820182811061480d5790509050610940526002546311f37ceb610980526020610980600461099c845afa611794573d5f5f3e3d5ffd5b60203d1061480d57610980905051610960526108005160405261094051606052610960516080526117c66109a0613f07565b6109a05161098052600a5461098051101561185357602080610a005260196109a0527f216d696e696d756d5f636f6c6c61746572616c5f726174696f000000000000006109c0526109a081610a0001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06109e052806004016109fcfd5b6107e0516109a052610940516107e052428060401c61480d576108405260176004356020525f5260405f206107e05181556108005160018201556108205160028201556108405160038201556108605160048201556108805160058201556108a05160068201556108c05160078201555061090051610180525f6101a052610940516108205180820281158383830414171561480d57905090506101c0526109a0516108205180820281158383830414171561480d57905090506101e052611919613f67565b602435610620526108205161064052604060646106603761193861454c565b336004357fbf608caf5cc20aaeea74ecfce286b511362b0ecbaa0e56ded00f76f7e2e39c44610940516109c0526108e0516109e05260406109c0a3005b63d8aed1458118613c275760443610341761480d57602435611a09576020806102a052600c610240527f21646562745f616d6f756e74000000000000000000000000000000000000000061026052610240816102a001602c82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610280528060040161029cfd5b60176004356020525f5260405f2080546102405260018101546102605260028101546102805260038101546102a05260048101546102c05260058101546102e05260068101546103005260078101546103205250336102e0511815611ae0576020806103a0526006610340527f216f776e6572000000000000000000000000000000000000000000000000000061036052610340816103a001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610380528060040161039cfd5b6001610320511815611b64576020806103a0526007610340527f216163746976650000000000000000000000000000000000000000000000000061036052610340816103a001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610380528060040161039cfd5b61010061024060805e611b78610360613d86565b61036051610340526103405160085480820382811161480d579050905061036052602435610360518082811882841002189050905061038052610340516103805180820382811161480d57905090506103a052610240516103c0526103a05161024052428060401c61480d576102a05260176004356020525f5260405f206102405181556102605160018201556102805160028201556102a05160038201556102c05160048201556102e0516005820155610300516006820155610320516007820155505f61018052610380516101a0526103a0516102805180820281158383830414171561480d57905090506101c0526103c0516102805180820281158383830414171561480d57905090506101e052611c91613f67565b6004546323b872dd6103e05233610400525f5461042052610380516104405260206103e060646103fc5f855af1611cca573d5f5f3e3d5ffd5b3d611ce157803b1561480d57600161046052611d0b565b3d602081183d6020100218806103e0016104001161480d576103e0518060011c61480d5761046052505b6104609050511561480d57336004357fc030da26557a891f33dbaee473c007cdfa269acb9628d7d12e744ec6923ed2b3610380516103e05260206103e0a3005b633665ead88118613c275760a43610341761480d576010546024351015611de4576020806102a0526019610240527f216d696e5f616e6e75616c5f696e7465726573745f726174650000000000000061026052610240816102a001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610280528060040161029cfd5b6011546024351115611e68576020806102a0526019610240527f216d61785f616e6e75616c5f696e7465726573745f726174650000000000000061026052610240816102a001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610280528060040161029cfd5b60176004356020525f5260405f2080546102405260018101546102605260028101546102805260038101546102a05260048101546102c05260058101546102e05260068101546103005260078101546103205250336102e0511815611f3f576020806103a0526006610340527f216f776e6572000000000000000000000000000000000000000000000000000061036052610340816103a001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610380528060040161039cfd5b6001610320511815611fc3576020806103a0526007610340527f216163746976650000000000000000000000000000000000000000000000000061036052610340816103a001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610380528060040161039cfd5b6102805160243518612047576020806103a0526019610340527f216e65775f616e6e75616c5f696e7465726573745f726174650000000000000061036052610340816103a001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610380528060040161039cfd5b61010061024060805e61205b610360613d86565b610360516103405261034051610360525f610380526102c051600f5480820182811061480d57905090504210156121b0576103605160805260243560a05260843560c0526120aa6103a0613c63565b6103a05161038052610360516103805180820182811061480d5790509050610360526002546311f37ceb6103c05260206103c060046103dc845afa6120f1573d5f5f3e3d5ffd5b60203d1061480d576103c09050516103a05261026051604052610360516060526103a0516080526121236103e0613f07565b6103e0516103c052600a546103c05110156121b0576020806104405260196103e0527f216d696e696d756d5f636f6c6c61746572616c5f726174696f00000000000000610400526103e08161044001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610420528060040161043cfd5b610240516103a052610280516103c05260243561028052428060401c61480d576102c0526103605161024052428060401c61480d576102a05260176004356020525f5260405f206102405181556102605160018201556102805160028201556102a05160038201556102c05160048201556102e05160058201556103005160068201556103205160078201555061038051610180525f6101a0526103605160243580820281158383830414171561480d57905090506101c0526103a0516103c05180820281158383830414171561480d57905090506101e052612291613f67565b60035463d2adfe936103e0526080600461040037803b1561480d575f6103e060846103fc5f855af16122c5573d5f5f3e3d5ffd5b50336004357fb5e5fe642ee69e311cafb018acb5d9c4f197ba54a1548f743148a6e717e5bf2a6024356103e052610380516104005260406103e0a3005b63aa665baf8118613c275760243610341761480d5760176004356020525f5260405f2080546102405260018101546102605260028101546102805260038101546102a05260048101546102c05260058101546102e05260068101546103005260078101546103205250336102e05118156123ee576020806103a0526006610340527f216f776e6572000000000000000000000000000000000000000000000000000061036052610340816103a001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610380528060040161039cfd5b6001610320511815612472576020806103a0526007610340527f216163746976650000000000000000000000000000000000000000000000000061036052610340816103a001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610380528060040161039cfd5b61010061024060805e612486610360613d86565b61036051610340526002546311f37ceb610380526020610380600461039c845afa6124b3573d5f5f3e3d5ffd5b60203d1061480d57610380905051610360526102605160405261034051606052610360516080526124e56103a0613f07565b6103a05161038052600a54610380511015612572576020806104005260196103a0527f216d696e696d756d5f636f6c6c61746572616c5f726174696f000000000000006103c0526103a08161040001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06103e052806004016103fcfd5b6101006102406103a05e610100366102403760046103205260176004356020525f5260405f206102405181556102605160018201556102805160028201556102a05160038201556102c05160048201556102e0516005820155610300516006820155610320516007820155506016546103c05180820382811161480d57905090506016555f61018052610340516101a0525f6101c0526103a0516103e05180820281158383830414171561480d57905090506101e052612630613f67565b600354634cc822156104a0526004356104c052803b1561480d575f6104a060246104bc5f855af1612663573d5f5f3e3d5ffd5b506004546323b872dd6104a052336104c0525f546104e052610340516105005260206104a060646104bc5f855af161269d573d5f5f3e3d5ffd5b3d6126b457803b1561480d576001610520526126de565b3d602081183d6020100218806104a0016104c01161480d576104a0518060011c61480d5761052052505b6105209050511561480d5760055463a9059cbb6104a052336104c0526103c0516104e05260206104a060446104bc5f855af161271c573d5f5f3e3d5ffd5b3d61273357803b1561480d5760016105005261275d565b3d602081183d6020100218806104a0016104c01161480d576104a0518060011c61480d5761050052505b6105009050511561480d57336004357f964b676865fdc5f2f6264c1031ea231c957ef38127566ceb9f336ce1458c96a96103c0516104a052610340516104c05260406104a0a3005b63824f317f8118612c3c5760243610341761480d5760176004356020525f5260405f2080546102405260018101546102605260028101546102805260038101546102a05260048101546102c05260058101546102e05260068101546103005260078101546103205250336102e0511815612891576020806103a0526006610340527f216f776e6572000000000000000000000000000000000000000000000000000061036052610340816103a001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610380528060040161039cfd5b6002610320511815612915576020806103a0526007610340527f217a6f6d6269650000000000000000000000000000000000000000000000000061036052610340816103a001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610380528060040161039cfd5b5f610340526102405115612a235761010061024060805e612937610360613d86565b61036051610340526002546311f37ceb610380526020610380600461039c845afa612964573d5f5f3e3d5ffd5b60203d1061480d57610380905051610360526102605160405261034051606052610360516080526129966103a0613f07565b6103a05161038052600a54610380511015612a23576020806104005260196103a0527f216d696e696d756d5f636f6c6c61746572616c5f726174696f000000000000006103c0526103a08161040001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06103e052806004016103fcfd5b6101006102406103605e610100366102403760046103205260176004356020525f5260405f206102405181556102605160018201556102805160028201556102a05160038201556102c05160048201556102e05160058201556103005160068201556103205160078201555060043560125418612a9f575f6012555b6016546103805180820382811161480d57905090506016556103605115612b80575f61018052610340516101a0525f6101c052610360516103a05180820281158383830414171561480d57905090506101e052612afa613f67565b6004546323b872dd6104605233610480525f546104a052610340516104c0526020610460606461047c5f855af1612b33573d5f5f3e3d5ffd5b3d612b4a57803b1561480d5760016104e052612b74565b3d602081183d602010021880610460016104801161480d57610460518060011c61480d576104e052505b6104e09050511561480d575b60055463a9059cbb610460523361048052610380516104a0526020610460604461047c5f855af1612bb3573d5f5f3e3d5ffd5b3d612bca57803b1561480d5760016104c052612bf4565b3d602081183d602010021880610460016104801161480d57610460518060011c61480d576104c052505b6104c09050511561480d57336004357ff696fb34f24a534b48e55d5a6b6a0f2145f131a74e1f09038f758f9e878a30e8610380516104605261034051610480526040610460a3005b631b9965ba8118613c27573461480d5760105460405260206040f35b63cdb042408118613c275760243610341761480d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6102405233610260525f61028052612d69565b635d65bb0e8118613c275760443610341761480d576024356102405233610260525f61028052612d69565b63f36f64a88118612d015760643610341761480d57602435610240526044358060a01c61480d57610260525f61028052612d69565b639884ec908118613c27573461480d57600d5460405260206040f35b63959583518118613c275760843610341761480d57602435610240526044358060a01c61480d57610260526064356004018035620186a0811161480d5750602081350180826102803750505b600435612def57602080620189a052600962018940527f2174726f76655f6964000000000000000000000000000000000000000000000062018960526201894081620189a001602982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06201898052806004016201899cfd5b6002546311f37ceb620189605260206201896060046201897c845afa612e17573d5f5f3e3d5ffd5b60203d1061480d5762018960905051620189405260176004356020525f5260405f2080546201896052600181015462018980526002810154620189a0526003810154620189c0526004810154620189e052600581015462018a0052600681015462018a2052600781015462018a405250600162018a40511462018a605262018a6051612eab57600262018a40511815612eae565b60015b612f315760208062018ae052601162018a80527f21616374697665206f72207a6f6d62696500000000000000000000000000000062018aa05262018a808162018ae001603182825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a062018ac0528060040162018adcfd5b6101006201896060805e612f4762018aa0613d86565b62018aa05162018a8052620189805160405262018a80516060526201894051608052612f7562018ac0613f07565b62018ac05162018aa052600a5462018ac05262018ac05162018aa051106130155760208062018b4052601162018ae0527f21636f6c6c61746572616c5f726174696f00000000000000000000000000000062018b005262018ae08162018b4001603182825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a062018b20528060040162018b3cfd5b5f62018ae05262018ac05162018aa05110156130ee57600b5462018aa05111156130e157600c5462018b005262018ac051600b5480820382811161480d579050905062018b205262018ac05162018aa05180820382811161480d579050905062018b4052600d5462018b005180820382811161480d579050905062018b605262018b005162018b605162018b405180820281158383830414171561480d579050905062018b2051801561480d578082049050905080820182811061480d579050905062018ae0526130f7565b600d5462018ae0526130f7565b600c5462018ae0525b60075462018b00526201898051620189405180820281158383830414171561480d57905090506ec097ce7bc90715b34b9f10000000008104905062018b205260095462018b405262018b405162018a805180820281158383830414171561480d579050905062018b205162018b005180820281158383830414171561480d579050905080820382811161480d579050905062018b405162018b005180820382811161480d579050905062018ae05180820382811161480d5790509050801561480d578082049050905062018b605262018a8051610240518082811882841002189050905062018b60518082811882841002189050905062018b805260085462018a805162018b805180820382811161480d5790509050101561321e5762018a805162018b80525b62018b80516ec097ce7bc90715b34b9f10000000008102816ec097ce7bc90715b34b9f100000000082041861480d5790506201894051801561480d578082049050905062018ba05262018ba05162018b005162018ae05180820182811061480d579050905080820281158383830414171561480d579050905062018b0051801561480d578082049050905062018bc05262018bc05162018980518082811882841002189050905062018be05262018a005162018c005262018a805162018b80511462018c205262018c20516134df5762018a805162018b805180820382811161480d579050905062018c4052620189605162018c6052620189805162018be05180820382811161480d579050905062018c805262018c805160405262018c4051606052620189405160805261335562018cc0613f07565b62018cc05162018ca05262018ac05162018ca05110156133ee5760208062018d2052601962018cc0527f216d696e696d756d5f636f6c6c61746572616c5f726174696f0000000000000062018ce05262018cc08162018d2001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a062018d00528060040162018d1cfd5b62018c4051620189605262018c80516201898052428060401c61480d57620189c05260176004356020525f5260405f206201896051815562018980516001820155620189a0516002820155620189c0516003820155620189e051600482015562018a0051600582015562018a2051600682015562018a405160078201555060165462018be05180820382811161480d57905090506016555f6101805262018b80516101a05262018c4051620189a05180820281158383830414171561480d57905090506101c05262018c6051620189a05180820281158383830414171561480d57905090506101e0526136bf613f67565b620189805162018c40526201896051620189a05180820281158383830414171561480d579050905062018c6052610100366201896037600862018a405260176004356020525f5260405f206201896051815562018980516001820155620189a0516002820155620189c0516003820155620189e051600482015562018a0051600582015562018a2051600682015562018a405160078201555060043560125418613588575f6012555b60165462018c405180820382811161480d57905090506016555f6101805262018b80516101a0525f6101c05262018c60516101e0526135c5613f67565b62018a60511561360857600354634cc8221562018c805260043562018ca052803b1561480d575f62018c80602462018c9c5f855af1613606573d5f5f3e3d5ffd5b505b62018c405162018be05180820382811161480d579050905062018c805262018c8051156136bf5760055463a9059cbb62018ca05262018c005162018cc05262018c805162018ce052602062018ca0604462018cbc5f855af161366c573d5f5f3e3d5ffd5b3d61368457803b1561480d57600162018d00526136b2565b3d602081183d60201002188062018ca00162018cc01161480d5762018ca0518060011c61480d5762018d0052505b62018d009050511561480d575b60055463a9059cbb62018c40526102605162018c605262018be05162018c8052602062018c40604462018c5c5f855af16136fb573d5f5f3e3d5ffd5b3d61371357803b1561480d57600162018ca052613741565b3d602081183d60201002188062018c400162018c601161480d5762018c40518060011c61480d5762018ca052505b62018ca09050511561480d5761028051156137ed576102605163c92632b562018c405260a060043562018c60523362018c805262018be05162018ca05262018b805162018cc0528062018ce0528062018c60016020610280510180610280835e508051806020830101601f825f03163682375050601f19601f82516020010116905081015050803b1561480d575f62018c406201876462018c5c5f855af16137eb573d5f5f3e3d5ffd5b505b6004546323b872dd62018c40523362018c60525f5462018c805262018b805162018ca052602062018c40606462018c5c5f855af161382d573d5f5f3e3d5ffd5b3d61384557803b1561480d57600162018cc052613873565b3d602081183d60201002188062018c400162018c601161480d5762018c40518060011c61480d5762018cc052505b62018cc09050511561480d573362018c00516004357fd6e62841f18c721ed3147d9ee5b55f92da1e651ce6f2565d1f7e9915718a20ad62018be05162018c405262018b805162018c605262018c205162018c8052606062018c40a4602062018be0f35b637bde82f28118613c275760443610341761480d576024358060a01c61480d57610620525f5433181561397b576020806106a0526007610640527f216c656e6465720000000000000000000000000000000000000000000000000061066052610640816106a001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610680528060040161069cfd5b600435610240527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6102605261062051610280526139ba610640613ff9565b61064050005b63bcead63e81186139db573461480d575f5460405260206040f35b6382f568418118613c27573461480d5760065460405260206040f35b6399bb33338118613c27573461480d5760015460405260206040f35b6386fc88d38118613a2f573461480d5760025460405260206040f35b631e33dcb38118613c27573461480d57600c5460405260206040f35b63314bee1d8118613a67573461480d5760035460405260206040f35b6331dc3ca88118613c27573461480d5760135460405260206040f35b63b6d1696c8118613a9f573461480d5760075460405260206040f35b63844e5b768118613c27573461480d5760085460405260206040f35b63fb6879d08118613ad7573461480d5760095460405260206040f35b63a67635188118613c27573461480d5760125460405260206040f35b6343933d518118613b0f573461480d57600b5460405260206040f35b6385bc2bed8118613c27573461480d57600f5460405260206040f35b63a0f73e3f8118613c27573461480d57600e5460405260206040f35b63d8585cce8118613c27573461480d5760115460405260206040f35b63fac7aae58118613b7f573461480d5760145460405260206040f35b6310d6f8578118613c27573461480d5760165460405260206040f35b637789dd008114600336111615613c27573461480d5760155460405260206040f35b6387553b7e8118613c275760243610341761480d5760176004356020525f5260405f20805460405260018101546060526002810154608052600381015460a052600481015460c052600581015460e052600681015461010052600781015461012052506101006040f35b5f5ffd5b60405160605180820281158383830414171561480d57905090506301e1338081049050600754801561480d5780820490509050815250565b60135460805180820182811061480d579050905060e05260145460805160a05180820281158383830414171561480d579050905080820182811061480d5790509050610100526101005160e051801561480d5780820490509050610120526080516101205180820281158383830414171561480d5790509050604052600e54606052613cf0610160613c2b565b610160516101405260c051610140511115613d7d576020806101c0526010610160527f216d61785f757066726f6e745f6665650000000000000000000000000000000061018052610160816101c001603082825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06101a052806004016101bcfd5b61014051815250565b60805160805160c05180820281158383830414171561480d57905090506040524260e05180820382811161480d5790509050606052613dc6610180613c2b565b6101805180820182811061480d5790509050815250565b606051613e555760208060e052601f6080527f6d6174683a206365696c5f646976206469766973696f6e206279207a65726f0060a05260808160e001603f82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060c0528060040160dcfd5b604051613e62575f613e7a565b60016060516040516001810381811161480d57905004015b815250565b6014544260155480820382811161480d579050905080820281158383830414171561480d57905090506040526007546301e133808102816301e1338082041861480d579050606052613ed2610160613ddd565b61016051610140526013546101405180820182811061480d579050905061016052610160516013554260155561016051815250565b60405160805180820281158383830414171561480d57905090506ec097ce7bc90715b34b9f10000000008104905060a05260a05160075480820281158383830414171561480d5790509050606051801561480d5780820490509050815250565b613f72610220613e7f565b6102205161020052610200516101805180820182811061480d579050905061020052610200516101a05180820382811161480d5790509050610200526102005160135560145461022052610220516101c05180820182811061480d579050905061022052610220516101e05180820382811161480d57905090506102205261022051601455565b6140046102a0613e7f565b6102a0506002546311f37ceb6102c05260206102c060046102dc845afa61402d573d5f5f3e3d5ffd5b60203d1061480d576102c09050516102a0525f6102c0526012546102e052600354610300526102e051156140665760016102c05261409f565b610300516347799da8610320526020610320600461033c845afa61408c573d5f5f3e3d5ffd5b60203d1061480d576103209050516102e0525b6102405161032052608036610340375f6103e8905b806103c05260176102e0516020525f5260405f2080546103e05260018101546104005260028101546104205260038101546104405260048101546104605260058101546104805260068101546104a05260078101546104c052506102c0516141255761042051610260511115614127565b5f5b61448757610300516335671214610500526102e051610520526020610500602461051c845afa614159573d5f5f3e3d5ffd5b60203d1061480d576105009050516104e05261048051331461417c576001614181565b6102c0515b15614425576101006103e060805e61419a610520613d86565b610520516105005261032051610500518082811882841002189050905061052052610500516105205180820382811161480d579050905061054052600854610540511015614248576102c05161423b5760026104c05261030051634cc82215610560526102e05161058052803b1561480d575f610560602461057c5f855af1614225573d5f5f3e3d5ffd5b506105405115614248576102e051601255614248565b61054051614248575f6012555b610520516ec097ce7bc90715b34b9f10000000008102816ec097ce7bc90715b34b9f100000000082041861480d5790506102a051801561480d578082049050905061056052610400516105605180820382811161480d5790509050610580526103e0516104205180820281158383830414171561480d57905090506105a052610540516104205180820281158383830414171561480d57905090506105c052610540516103e0526105805161040052428060401c61480d576104405260176102e0516020525f5260405f206103e05181556104005160018201556104205160028201556104405160038201556104605160048201556104805160058201556104a05160068201556104c051600782015550610340516105205180820182811061480d579050905061034052610360516105605180820182811061480d5790509050610360526103a0516105a05180820182811061480d57905090506103a052610380516105c05180820182811061480d579050905061038052610320516105205180820382811161480d57905090506103205233610480516102e0517f06ba74d0ebb47a34a11d1eafef80d99a580c6e3644549cab6a04fdb357caf4cf610560516105e052610520516106005260406105e0a46103205115614487575b6102c051614435576104e0614469565b610300516347799da8610500526020610500600461051c845afa61445b573d5f5f3e3d5ffd5b60203d1061480d5761050090505b516102e0526102e05115614487575f6102c0526001018181186140b4575b50505f61018052610340516101a052610380516101c0526103a0516101e0526144ae613f67565b6016546103605180820382811161480d579050905060165560015463561b90696103c052610360516103e05261034051610400526102805161042052803b1561480d575f6103c060646103dc5f855af161450a573d5f5f3e3d5ffd5b50337fe5b754fb1abb7f01b499791d0b820ae3b6af3424ac1c59768edb53f4ec31a929610360516103c052610340516103e05260406103c0a261036051815250565b5f546106a0526004546106c0526106c0516370a08231610700526106a051610720526020610700602461071c845afa614587573d5f5f3e3d5ffd5b60203d1061480d576107009050516106e052610660516106e051101561461f5760208061076052600f610700527f216d696e5f626f72726f775f6f75740000000000000000000000000000000000610720526107008161076001602f82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610740528060040161075cfd5b6106e05161062051116146b9576106c0516323b872dd610700526106a05161072052336107405261062051610760526020610700606461071c5f855af1614668573d5f5f3e3d5ffd5b3d61467f57803b1561480d576001610780526146a9565b3d602081183d602010021880610700016107201161480d57610700518060011c61480d5761078052505b6107809050511561480d5761480b565b6106e0511561474b576106c0516323b872dd610700526106a0516107205233610740526106e051610760526020610700606461071c5f855af16146fe573d5f5f3e3d5ffd5b3d61471557803b1561480d5760016107805261473f565b3d602081183d602010021880610700016107201161480d57610700518060011c61480d5761078052505b6107809050511561480d575b610620516106e05180820382811161480d5790509050610240526106405161026052336102805261477d610720613ff9565b61072051610700526106805161070051101561480b57602080610780526013610720527f216d696e5f636f6c6c61746572616c5f6f757400000000000000000000000000610740526107208161078001603382825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610760528060040161077cfd5b565b5f80fd3c273c273c273c273a133c27075d3c273abb3a8303653af339c0044a3b9b38d62ccc0da73b63150b3a4b1d4b3b473c273c273c27109c03d32c58046c23022ca139f73c273b2b3c2727a505e6197500182d1d3c273bbd85582017c80fa9715a3e4003c6b8d6cd3c6495fc8205a578434e6e32b091dfecc5758319486781185600a1657679706572830004030037" - ], - "transaction": { - "from": "0x000005281a2b04a182085d37cc9e6dd552795caa", - "to": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "gas": "0xc5a22b", - "value": "0x0", - "input": "0x26307668503c6f71ecc9475f2171250459aed7f1b36d75614ffab43ae028fbfc46c94125000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000048af61486761001161000039614867610000f35f3560e01c6002602b820660011b61481101601e395f51565b63768ee73c8118610349576101c43610341761480d576004358060a01c61480d576040526024358060a01c61480d576060526044358060a01c61480d576080526064358060a01c61480d5760a0526084358060a01c61480d5760c05260a4358060a01c61480d5760e05261010060c4610100375f541561010a5760208061026052600b610200527f696e697469616c697a6564000000000000000000000000000000000000000000610220526102008161026001602b82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610240528060040161025cfd5b6040515f5560605160015560805160025560a05160035560c05160045560e05160055560c05163313ce567610220526020610220600461023c845afa610152573d5f5f3e3d5ffd5b3d602081183d602010021880610220016102401161480d57610220518060081c61480d576102605250610260905051604d811161480d5780600a0a905061020052610200516064810490506102205261022051606481049050610240526102205160065561020051600755610100516102005180820281158383830414171561480d5790509050600855610120516102205180820281158383830414171561480d5790509050600955610140516102205180820281158383830414171561480d5790509050600a55610160516102205180820281158383830414171561480d5790509050600b55610180516102405180820281158383830414171561480d5790509050600c556101a0516102405180820281158383830414171561480d5790509050600d556101c051600e556101e051600f55610220518060011c90506010556102205160fa81028160fa82041861480d57905060115560e05163095ea7b361026052606051610280527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6102a0526020610260604461027c5f855af16102fb573d5f5f3e3d5ffd5b3d61031257803b1561480d5760016102c05261033c565b3d602081183d602010021880610260016102801161480d57610260518060011c61480d576102c052505b6102c09050511561480d57005b632621db2f8118613c27573461480d5760055460405260206040f35b631deee05281186103b75760443610341761480d576020604060046080377fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60c0526103b2610220613c63565b610220f35b634e530b428118613c27573461480d5760045460405260206040f35b630ff8afc18118613c275760243610341761480d57602060176004356020525f5260405f208054608052600181015460a052600281015460c052600381015460e052600481015461010052600581015461012052600681015461014052600781015461016052506104456101a0613d86565b6101a0f35b63254e97d58118613c27573461480d576020610467610180613e7f565b610180f35b639c756a4b8118613c275760443610341761480d576024358060a01c61480d5760405260176004356020525f5260405f2080546060526001810154608052600281015460a052600381015460c052600481015460e0526005810154610100526006810154610120526007810154610140525033610100511815610561576020806101c0526006610160527f216f776e6572000000000000000000000000000000000000000000000000000061018052610160816101c001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06101a052806004016101bcfd5b6040516101205260176004356020525f5260405f206060518155608051600182015560a051600282015560c051600382015560e051600482015561010051600582015561012051600682015561014051600782015550604051336004357f2f61fe63853c39f6c9618d1aec9774d255ab9ef5a43057db30fc6018c90bd7bd5f610160a4005b632fdba1f68118613c275760243610341761480d5760176004356020525f5260405f20805460405260018101546060526002810154608052600381015460a052600481015460c052600581015460e05260068101546101005260078101546101205250336101005118156106cc576020806101a052600e610140527f2170656e64696e675f6f776e657200000000000000000000000000000000000061016052610140816101a001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610180528060040161019cfd5b60e051610140526101005160e0525f6101005260176004356020525f5260405f2060405181556060516001820155608051600282015560a051600382015560c051600482015560e05160058201556101005160068201556101205160078201555033610140516004357f16b85f49bf01212961345d3016c9a531894accf62eb7680f2045d79185cc0ec05f610160a4005b63f70d8c118118613c27576101243610341761480d576024356107f2576020806108405260126107e0527f21636f6c6c61746572616c5f616d6f756e740000000000000000000000000000610800526107e08161084001603282825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610820528060040161083cfd5b6044356108715760208061084052600c6107e0527f21646562745f616d6f756e740000000000000000000000000000000000000000610800526107e08161084001602c82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610820528060040161083cfd5b60105460a43510156108f5576020806108405260196107e0527f216d696e5f616e6e75616c5f696e7465726573745f7261746500000000000000610800526107e08161084001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610820528060040161083cfd5b60115460a4351115610979576020806108405260196107e0527f216d61785f616e6e75616c5f696e7465726573745f7261746500000000000000610800526107e08161084001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610820528060040161083cfd5b3361082052600435610840526040610800526108008051602082012090506107e05260176107e0516020525f5260405f206007810190505415610a2e57602080610860526006610800527f21656d7074790000000000000000000000000000000000000000000000000000610820526108008161086001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610840528060040161085cfd5b60443560805260a43560a05260c43560c052610a4b610820613c63565b61082051610800526044356108005180820182811061480d5790509050610820526008546108205111610af0576020806108a0526009610840527f216d696e5f64656274000000000000000000000000000000000000000000000061086052610840816108a001602982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610880528060040161089cfd5b6002546311f37ceb610860526020610860600461087c845afa610b15573d5f5f3e3d5ffd5b60203d1061480d5761086090505161084052602435604052604061082060605e610b40610880613f07565b6108805161086052600a54610860511015610bcd576020806108e0526019610880527f216d696e696d756d5f636f6c6c61746572616c5f726174696f000000000000006108a052610880816108e001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06108c052806004016108dcfd5b60176107e0516020525f5260405f20610820518155602435600182015560a4356002820155428060401c61480d576003820155428060401c61480d5760048201553360058201555f6006820155600160078201555061082051610180525f6101a0526108205160a43580820281158383830414171561480d57905090506101c0525f6101e052610c5b613f67565b60165460243580820182811061480d579050905060165560035463843aa0db610880526107e0516108a05260a4356108c0526064356108e05260843561090052803b1561480d575f610880608461089c5f855af1610cbb573d5f5f3e3d5ffd5b506005546323b872dd61088052336108a052306108c0526024356108e0526020610880606461089c5f855af1610cf3573d5f5f3e3d5ffd5b3d610d0a57803b1561480d57600161090052610d34565b3d602081183d602010021880610880016108a01161480d57610880518060011c61480d5761090052505b6109009050511561480d576044356106205260a43561064052604060e461066037610d5d61454c565b336107e0517f48cc6255485654cd31337a688b4a1e06f8a768af7ec431040b7015bbb57d44b76040602461088037610800516108c05260a4356108e0526080610880a360206107e0f35b63650f939c81186110805760443610341761480d57602435610e345760208060a05260126040527f21636f6c6c61746572616c5f616d6f756e74000000000000000000000000000060605260408160a001603282825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060805280600401609cfd5b60176004356020525f5260405f20805460405260018101546060526002810154608052600381015460a052600481015460c052600581015460e052600681015461010052600781015461012052503360e0511815610f04576020806101a0526006610140527f216f776e6572000000000000000000000000000000000000000000000000000061016052610140816101a001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610180528060040161019cfd5b6001610120511815610f88576020806101a0526007610140527f216163746976650000000000000000000000000000000000000000000000000061016052610140816101a001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610180528060040161019cfd5b60176004356020525f5260405f20600181019050805460243580820182811061480d579050905081555060165460243580820182811061480d57905090506016556005546323b872dd61014052336101605230610180526024356101a0526020610140606461015c5f855af1611000573d5f5f3e3d5ffd5b3d61101757803b1561480d5760016101c052611041565b3d602081183d602010021880610140016101601161480d57610140518060011c61480d576101c052505b6101c09050511561480d57336004357fda18d0b037712b628d658e8fb6f6701086c449aab7cefd33b9f7f95e3a3082b8602435610140526020610140a3005b63f12003678118613c27573461480d57600a5460405260206040f35b636a48f8b38118613c275760443610341761480d57602435611130576020806102005260126101a0527f21636f6c6c61746572616c5f616d6f756e7400000000000000000000000000006101c0526101a08161020001603282825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06101e052806004016101fcfd5b60176004356020525f5260405f2080546101a05260018101546101c05260028101546101e0526003810154610200526004810154610220526005810154610240526006810154610260526007810154610280525033610240511815611207576020806103005260066102a0527f216f776e657200000000000000000000000000000000000000000000000000006102c0526102a08161030001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06102e052806004016102fcfd5b600161028051181561128b576020806103005260076102a0527f21616374697665000000000000000000000000000000000000000000000000006102c0526102a08161030001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06102e052806004016102fcfd5b6024356101c0511015611310576020806103005260116102a0527f2174726f76652e636f6c6c61746572616c0000000000000000000000000000006102c0526102a08161030001603182825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06102e052806004016102fcfd5b6101006101a060805e6113246102c0613d86565b6102c0516102a0526002546311f37ceb6102e05260206102e060046102fc845afa611351573d5f5f3e3d5ffd5b60203d1061480d576102e09050516102c0526101c05160243580820382811161480d57905090506102e0526102e0516040526102a0516060526102c05160805261139c610320613f07565b6103205161030052600a5461030051101561142957602080610380526019610320527f216d696e696d756d5f636f6c6c61746572616c5f726174696f00000000000000610340526103208161038001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610360528060040161037cfd5b6102e05160176004356020525f5260405f206001810190505560165460243580820382811161480d579050905060165560055463a9059cbb610320523361034052602435610360526020610320604461033c5f855af161148b573d5f5f3e3d5ffd5b3d6114a257803b1561480d576001610380526114cc565b3d602081183d602010021880610320016103401161480d57610320518060011c61480d5761038052505b6103809050511561480d57336004357fb7464e08add10846d62a84243a08bcd31fb4d0c9bb84591709b39de1fad9ae0e602435610320526020610320a3005b63f8e61b698118613c275760a43610341761480d5760243561159f5760208061084052600c6107e0527f21646562745f616d6f756e740000000000000000000000000000000000000000610800526107e08161084001602c82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610820528060040161083cfd5b60176004356020525f5260405f2080546107e05260018101546108005260028101546108205260038101546108405260048101546108605260058101546108805260068101546108a05260078101546108c0525033610880511815611676576020806109405260066108e0527f216f776e65720000000000000000000000000000000000000000000000000000610900526108e08161094001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610920528060040161093cfd5b60016108c05118156116fa576020806109405260076108e0527f2161637469766500000000000000000000000000000000000000000000000000610900526108e08161094001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610920528060040161093cfd5b6024356080526108205160a05260443560c052611718610900613c63565b610900516108e0526024356108e05180820182811061480d5790509050610900526101006107e060805e61174d610940613d86565b6109405161092052610920516109005180820182811061480d5790509050610940526002546311f37ceb610980526020610980600461099c845afa611794573d5f5f3e3d5ffd5b60203d1061480d57610980905051610960526108005160405261094051606052610960516080526117c66109a0613f07565b6109a05161098052600a5461098051101561185357602080610a005260196109a0527f216d696e696d756d5f636f6c6c61746572616c5f726174696f000000000000006109c0526109a081610a0001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06109e052806004016109fcfd5b6107e0516109a052610940516107e052428060401c61480d576108405260176004356020525f5260405f206107e05181556108005160018201556108205160028201556108405160038201556108605160048201556108805160058201556108a05160068201556108c05160078201555061090051610180525f6101a052610940516108205180820281158383830414171561480d57905090506101c0526109a0516108205180820281158383830414171561480d57905090506101e052611919613f67565b602435610620526108205161064052604060646106603761193861454c565b336004357fbf608caf5cc20aaeea74ecfce286b511362b0ecbaa0e56ded00f76f7e2e39c44610940516109c0526108e0516109e05260406109c0a3005b63d8aed1458118613c275760443610341761480d57602435611a09576020806102a052600c610240527f21646562745f616d6f756e74000000000000000000000000000000000000000061026052610240816102a001602c82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610280528060040161029cfd5b60176004356020525f5260405f2080546102405260018101546102605260028101546102805260038101546102a05260048101546102c05260058101546102e05260068101546103005260078101546103205250336102e0511815611ae0576020806103a0526006610340527f216f776e6572000000000000000000000000000000000000000000000000000061036052610340816103a001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610380528060040161039cfd5b6001610320511815611b64576020806103a0526007610340527f216163746976650000000000000000000000000000000000000000000000000061036052610340816103a001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610380528060040161039cfd5b61010061024060805e611b78610360613d86565b61036051610340526103405160085480820382811161480d579050905061036052602435610360518082811882841002189050905061038052610340516103805180820382811161480d57905090506103a052610240516103c0526103a05161024052428060401c61480d576102a05260176004356020525f5260405f206102405181556102605160018201556102805160028201556102a05160038201556102c05160048201556102e0516005820155610300516006820155610320516007820155505f61018052610380516101a0526103a0516102805180820281158383830414171561480d57905090506101c0526103c0516102805180820281158383830414171561480d57905090506101e052611c91613f67565b6004546323b872dd6103e05233610400525f5461042052610380516104405260206103e060646103fc5f855af1611cca573d5f5f3e3d5ffd5b3d611ce157803b1561480d57600161046052611d0b565b3d602081183d6020100218806103e0016104001161480d576103e0518060011c61480d5761046052505b6104609050511561480d57336004357fc030da26557a891f33dbaee473c007cdfa269acb9628d7d12e744ec6923ed2b3610380516103e05260206103e0a3005b633665ead88118613c275760a43610341761480d576010546024351015611de4576020806102a0526019610240527f216d696e5f616e6e75616c5f696e7465726573745f726174650000000000000061026052610240816102a001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610280528060040161029cfd5b6011546024351115611e68576020806102a0526019610240527f216d61785f616e6e75616c5f696e7465726573745f726174650000000000000061026052610240816102a001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610280528060040161029cfd5b60176004356020525f5260405f2080546102405260018101546102605260028101546102805260038101546102a05260048101546102c05260058101546102e05260068101546103005260078101546103205250336102e0511815611f3f576020806103a0526006610340527f216f776e6572000000000000000000000000000000000000000000000000000061036052610340816103a001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610380528060040161039cfd5b6001610320511815611fc3576020806103a0526007610340527f216163746976650000000000000000000000000000000000000000000000000061036052610340816103a001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610380528060040161039cfd5b6102805160243518612047576020806103a0526019610340527f216e65775f616e6e75616c5f696e7465726573745f726174650000000000000061036052610340816103a001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610380528060040161039cfd5b61010061024060805e61205b610360613d86565b610360516103405261034051610360525f610380526102c051600f5480820182811061480d57905090504210156121b0576103605160805260243560a05260843560c0526120aa6103a0613c63565b6103a05161038052610360516103805180820182811061480d5790509050610360526002546311f37ceb6103c05260206103c060046103dc845afa6120f1573d5f5f3e3d5ffd5b60203d1061480d576103c09050516103a05261026051604052610360516060526103a0516080526121236103e0613f07565b6103e0516103c052600a546103c05110156121b0576020806104405260196103e0527f216d696e696d756d5f636f6c6c61746572616c5f726174696f00000000000000610400526103e08161044001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610420528060040161043cfd5b610240516103a052610280516103c05260243561028052428060401c61480d576102c0526103605161024052428060401c61480d576102a05260176004356020525f5260405f206102405181556102605160018201556102805160028201556102a05160038201556102c05160048201556102e05160058201556103005160068201556103205160078201555061038051610180525f6101a0526103605160243580820281158383830414171561480d57905090506101c0526103a0516103c05180820281158383830414171561480d57905090506101e052612291613f67565b60035463d2adfe936103e0526080600461040037803b1561480d575f6103e060846103fc5f855af16122c5573d5f5f3e3d5ffd5b50336004357fb5e5fe642ee69e311cafb018acb5d9c4f197ba54a1548f743148a6e717e5bf2a6024356103e052610380516104005260406103e0a3005b63aa665baf8118613c275760243610341761480d5760176004356020525f5260405f2080546102405260018101546102605260028101546102805260038101546102a05260048101546102c05260058101546102e05260068101546103005260078101546103205250336102e05118156123ee576020806103a0526006610340527f216f776e6572000000000000000000000000000000000000000000000000000061036052610340816103a001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610380528060040161039cfd5b6001610320511815612472576020806103a0526007610340527f216163746976650000000000000000000000000000000000000000000000000061036052610340816103a001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610380528060040161039cfd5b61010061024060805e612486610360613d86565b61036051610340526002546311f37ceb610380526020610380600461039c845afa6124b3573d5f5f3e3d5ffd5b60203d1061480d57610380905051610360526102605160405261034051606052610360516080526124e56103a0613f07565b6103a05161038052600a54610380511015612572576020806104005260196103a0527f216d696e696d756d5f636f6c6c61746572616c5f726174696f000000000000006103c0526103a08161040001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06103e052806004016103fcfd5b6101006102406103a05e610100366102403760046103205260176004356020525f5260405f206102405181556102605160018201556102805160028201556102a05160038201556102c05160048201556102e0516005820155610300516006820155610320516007820155506016546103c05180820382811161480d57905090506016555f61018052610340516101a0525f6101c0526103a0516103e05180820281158383830414171561480d57905090506101e052612630613f67565b600354634cc822156104a0526004356104c052803b1561480d575f6104a060246104bc5f855af1612663573d5f5f3e3d5ffd5b506004546323b872dd6104a052336104c0525f546104e052610340516105005260206104a060646104bc5f855af161269d573d5f5f3e3d5ffd5b3d6126b457803b1561480d576001610520526126de565b3d602081183d6020100218806104a0016104c01161480d576104a0518060011c61480d5761052052505b6105209050511561480d5760055463a9059cbb6104a052336104c0526103c0516104e05260206104a060446104bc5f855af161271c573d5f5f3e3d5ffd5b3d61273357803b1561480d5760016105005261275d565b3d602081183d6020100218806104a0016104c01161480d576104a0518060011c61480d5761050052505b6105009050511561480d57336004357f964b676865fdc5f2f6264c1031ea231c957ef38127566ceb9f336ce1458c96a96103c0516104a052610340516104c05260406104a0a3005b63824f317f8118612c3c5760243610341761480d5760176004356020525f5260405f2080546102405260018101546102605260028101546102805260038101546102a05260048101546102c05260058101546102e05260068101546103005260078101546103205250336102e0511815612891576020806103a0526006610340527f216f776e6572000000000000000000000000000000000000000000000000000061036052610340816103a001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610380528060040161039cfd5b6002610320511815612915576020806103a0526007610340527f217a6f6d6269650000000000000000000000000000000000000000000000000061036052610340816103a001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610380528060040161039cfd5b5f610340526102405115612a235761010061024060805e612937610360613d86565b61036051610340526002546311f37ceb610380526020610380600461039c845afa612964573d5f5f3e3d5ffd5b60203d1061480d57610380905051610360526102605160405261034051606052610360516080526129966103a0613f07565b6103a05161038052600a54610380511015612a23576020806104005260196103a0527f216d696e696d756d5f636f6c6c61746572616c5f726174696f000000000000006103c0526103a08161040001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06103e052806004016103fcfd5b6101006102406103605e610100366102403760046103205260176004356020525f5260405f206102405181556102605160018201556102805160028201556102a05160038201556102c05160048201556102e05160058201556103005160068201556103205160078201555060043560125418612a9f575f6012555b6016546103805180820382811161480d57905090506016556103605115612b80575f61018052610340516101a0525f6101c052610360516103a05180820281158383830414171561480d57905090506101e052612afa613f67565b6004546323b872dd6104605233610480525f546104a052610340516104c0526020610460606461047c5f855af1612b33573d5f5f3e3d5ffd5b3d612b4a57803b1561480d5760016104e052612b74565b3d602081183d602010021880610460016104801161480d57610460518060011c61480d576104e052505b6104e09050511561480d575b60055463a9059cbb610460523361048052610380516104a0526020610460604461047c5f855af1612bb3573d5f5f3e3d5ffd5b3d612bca57803b1561480d5760016104c052612bf4565b3d602081183d602010021880610460016104801161480d57610460518060011c61480d576104c052505b6104c09050511561480d57336004357ff696fb34f24a534b48e55d5a6b6a0f2145f131a74e1f09038f758f9e878a30e8610380516104605261034051610480526040610460a3005b631b9965ba8118613c27573461480d5760105460405260206040f35b63cdb042408118613c275760243610341761480d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6102405233610260525f61028052612d69565b635d65bb0e8118613c275760443610341761480d576024356102405233610260525f61028052612d69565b63f36f64a88118612d015760643610341761480d57602435610240526044358060a01c61480d57610260525f61028052612d69565b639884ec908118613c27573461480d57600d5460405260206040f35b63959583518118613c275760843610341761480d57602435610240526044358060a01c61480d57610260526064356004018035620186a0811161480d5750602081350180826102803750505b600435612def57602080620189a052600962018940527f2174726f76655f6964000000000000000000000000000000000000000000000062018960526201894081620189a001602982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06201898052806004016201899cfd5b6002546311f37ceb620189605260206201896060046201897c845afa612e17573d5f5f3e3d5ffd5b60203d1061480d5762018960905051620189405260176004356020525f5260405f2080546201896052600181015462018980526002810154620189a0526003810154620189c0526004810154620189e052600581015462018a0052600681015462018a2052600781015462018a405250600162018a40511462018a605262018a6051612eab57600262018a40511815612eae565b60015b612f315760208062018ae052601162018a80527f21616374697665206f72207a6f6d62696500000000000000000000000000000062018aa05262018a808162018ae001603182825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a062018ac0528060040162018adcfd5b6101006201896060805e612f4762018aa0613d86565b62018aa05162018a8052620189805160405262018a80516060526201894051608052612f7562018ac0613f07565b62018ac05162018aa052600a5462018ac05262018ac05162018aa051106130155760208062018b4052601162018ae0527f21636f6c6c61746572616c5f726174696f00000000000000000000000000000062018b005262018ae08162018b4001603182825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a062018b20528060040162018b3cfd5b5f62018ae05262018ac05162018aa05110156130ee57600b5462018aa05111156130e157600c5462018b005262018ac051600b5480820382811161480d579050905062018b205262018ac05162018aa05180820382811161480d579050905062018b4052600d5462018b005180820382811161480d579050905062018b605262018b005162018b605162018b405180820281158383830414171561480d579050905062018b2051801561480d578082049050905080820182811061480d579050905062018ae0526130f7565b600d5462018ae0526130f7565b600c5462018ae0525b60075462018b00526201898051620189405180820281158383830414171561480d57905090506ec097ce7bc90715b34b9f10000000008104905062018b205260095462018b405262018b405162018a805180820281158383830414171561480d579050905062018b205162018b005180820281158383830414171561480d579050905080820382811161480d579050905062018b405162018b005180820382811161480d579050905062018ae05180820382811161480d5790509050801561480d578082049050905062018b605262018a8051610240518082811882841002189050905062018b60518082811882841002189050905062018b805260085462018a805162018b805180820382811161480d5790509050101561321e5762018a805162018b80525b62018b80516ec097ce7bc90715b34b9f10000000008102816ec097ce7bc90715b34b9f100000000082041861480d5790506201894051801561480d578082049050905062018ba05262018ba05162018b005162018ae05180820182811061480d579050905080820281158383830414171561480d579050905062018b0051801561480d578082049050905062018bc05262018bc05162018980518082811882841002189050905062018be05262018a005162018c005262018a805162018b80511462018c205262018c20516134df5762018a805162018b805180820382811161480d579050905062018c4052620189605162018c6052620189805162018be05180820382811161480d579050905062018c805262018c805160405262018c4051606052620189405160805261335562018cc0613f07565b62018cc05162018ca05262018ac05162018ca05110156133ee5760208062018d2052601962018cc0527f216d696e696d756d5f636f6c6c61746572616c5f726174696f0000000000000062018ce05262018cc08162018d2001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a062018d00528060040162018d1cfd5b62018c4051620189605262018c80516201898052428060401c61480d57620189c05260176004356020525f5260405f206201896051815562018980516001820155620189a0516002820155620189c0516003820155620189e051600482015562018a0051600582015562018a2051600682015562018a405160078201555060165462018be05180820382811161480d57905090506016555f6101805262018b80516101a05262018c4051620189a05180820281158383830414171561480d57905090506101c05262018c6051620189a05180820281158383830414171561480d57905090506101e0526136bf613f67565b620189805162018c40526201896051620189a05180820281158383830414171561480d579050905062018c6052610100366201896037600862018a405260176004356020525f5260405f206201896051815562018980516001820155620189a0516002820155620189c0516003820155620189e051600482015562018a0051600582015562018a2051600682015562018a405160078201555060043560125418613588575f6012555b60165462018c405180820382811161480d57905090506016555f6101805262018b80516101a0525f6101c05262018c60516101e0526135c5613f67565b62018a60511561360857600354634cc8221562018c805260043562018ca052803b1561480d575f62018c80602462018c9c5f855af1613606573d5f5f3e3d5ffd5b505b62018c405162018be05180820382811161480d579050905062018c805262018c8051156136bf5760055463a9059cbb62018ca05262018c005162018cc05262018c805162018ce052602062018ca0604462018cbc5f855af161366c573d5f5f3e3d5ffd5b3d61368457803b1561480d57600162018d00526136b2565b3d602081183d60201002188062018ca00162018cc01161480d5762018ca0518060011c61480d5762018d0052505b62018d009050511561480d575b60055463a9059cbb62018c40526102605162018c605262018be05162018c8052602062018c40604462018c5c5f855af16136fb573d5f5f3e3d5ffd5b3d61371357803b1561480d57600162018ca052613741565b3d602081183d60201002188062018c400162018c601161480d5762018c40518060011c61480d5762018ca052505b62018ca09050511561480d5761028051156137ed576102605163c92632b562018c405260a060043562018c60523362018c805262018be05162018ca05262018b805162018cc0528062018ce0528062018c60016020610280510180610280835e508051806020830101601f825f03163682375050601f19601f82516020010116905081015050803b1561480d575f62018c406201876462018c5c5f855af16137eb573d5f5f3e3d5ffd5b505b6004546323b872dd62018c40523362018c60525f5462018c805262018b805162018ca052602062018c40606462018c5c5f855af161382d573d5f5f3e3d5ffd5b3d61384557803b1561480d57600162018cc052613873565b3d602081183d60201002188062018c400162018c601161480d5762018c40518060011c61480d5762018cc052505b62018cc09050511561480d573362018c00516004357fd6e62841f18c721ed3147d9ee5b55f92da1e651ce6f2565d1f7e9915718a20ad62018be05162018c405262018b805162018c605262018c205162018c8052606062018c40a4602062018be0f35b637bde82f28118613c275760443610341761480d576024358060a01c61480d57610620525f5433181561397b576020806106a0526007610640527f216c656e6465720000000000000000000000000000000000000000000000000061066052610640816106a001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610680528060040161069cfd5b600435610240527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6102605261062051610280526139ba610640613ff9565b61064050005b63bcead63e81186139db573461480d575f5460405260206040f35b6382f568418118613c27573461480d5760065460405260206040f35b6399bb33338118613c27573461480d5760015460405260206040f35b6386fc88d38118613a2f573461480d5760025460405260206040f35b631e33dcb38118613c27573461480d57600c5460405260206040f35b63314bee1d8118613a67573461480d5760035460405260206040f35b6331dc3ca88118613c27573461480d5760135460405260206040f35b63b6d1696c8118613a9f573461480d5760075460405260206040f35b63844e5b768118613c27573461480d5760085460405260206040f35b63fb6879d08118613ad7573461480d5760095460405260206040f35b63a67635188118613c27573461480d5760125460405260206040f35b6343933d518118613b0f573461480d57600b5460405260206040f35b6385bc2bed8118613c27573461480d57600f5460405260206040f35b63a0f73e3f8118613c27573461480d57600e5460405260206040f35b63d8585cce8118613c27573461480d5760115460405260206040f35b63fac7aae58118613b7f573461480d5760145460405260206040f35b6310d6f8578118613c27573461480d5760165460405260206040f35b637789dd008114600336111615613c27573461480d5760155460405260206040f35b6387553b7e8118613c275760243610341761480d5760176004356020525f5260405f20805460405260018101546060526002810154608052600381015460a052600481015460c052600581015460e052600681015461010052600781015461012052506101006040f35b5f5ffd5b60405160605180820281158383830414171561480d57905090506301e1338081049050600754801561480d5780820490509050815250565b60135460805180820182811061480d579050905060e05260145460805160a05180820281158383830414171561480d579050905080820182811061480d5790509050610100526101005160e051801561480d5780820490509050610120526080516101205180820281158383830414171561480d5790509050604052600e54606052613cf0610160613c2b565b610160516101405260c051610140511115613d7d576020806101c0526010610160527f216d61785f757066726f6e745f6665650000000000000000000000000000000061018052610160816101c001603082825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06101a052806004016101bcfd5b61014051815250565b60805160805160c05180820281158383830414171561480d57905090506040524260e05180820382811161480d5790509050606052613dc6610180613c2b565b6101805180820182811061480d5790509050815250565b606051613e555760208060e052601f6080527f6d6174683a206365696c5f646976206469766973696f6e206279207a65726f0060a05260808160e001603f82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060c0528060040160dcfd5b604051613e62575f613e7a565b60016060516040516001810381811161480d57905004015b815250565b6014544260155480820382811161480d579050905080820281158383830414171561480d57905090506040526007546301e133808102816301e1338082041861480d579050606052613ed2610160613ddd565b61016051610140526013546101405180820182811061480d579050905061016052610160516013554260155561016051815250565b60405160805180820281158383830414171561480d57905090506ec097ce7bc90715b34b9f10000000008104905060a05260a05160075480820281158383830414171561480d5790509050606051801561480d5780820490509050815250565b613f72610220613e7f565b6102205161020052610200516101805180820182811061480d579050905061020052610200516101a05180820382811161480d5790509050610200526102005160135560145461022052610220516101c05180820182811061480d579050905061022052610220516101e05180820382811161480d57905090506102205261022051601455565b6140046102a0613e7f565b6102a0506002546311f37ceb6102c05260206102c060046102dc845afa61402d573d5f5f3e3d5ffd5b60203d1061480d576102c09050516102a0525f6102c0526012546102e052600354610300526102e051156140665760016102c05261409f565b610300516347799da8610320526020610320600461033c845afa61408c573d5f5f3e3d5ffd5b60203d1061480d576103209050516102e0525b6102405161032052608036610340375f6103e8905b806103c05260176102e0516020525f5260405f2080546103e05260018101546104005260028101546104205260038101546104405260048101546104605260058101546104805260068101546104a05260078101546104c052506102c0516141255761042051610260511115614127565b5f5b61448757610300516335671214610500526102e051610520526020610500602461051c845afa614159573d5f5f3e3d5ffd5b60203d1061480d576105009050516104e05261048051331461417c576001614181565b6102c0515b15614425576101006103e060805e61419a610520613d86565b610520516105005261032051610500518082811882841002189050905061052052610500516105205180820382811161480d579050905061054052600854610540511015614248576102c05161423b5760026104c05261030051634cc82215610560526102e05161058052803b1561480d575f610560602461057c5f855af1614225573d5f5f3e3d5ffd5b506105405115614248576102e051601255614248565b61054051614248575f6012555b610520516ec097ce7bc90715b34b9f10000000008102816ec097ce7bc90715b34b9f100000000082041861480d5790506102a051801561480d578082049050905061056052610400516105605180820382811161480d5790509050610580526103e0516104205180820281158383830414171561480d57905090506105a052610540516104205180820281158383830414171561480d57905090506105c052610540516103e0526105805161040052428060401c61480d576104405260176102e0516020525f5260405f206103e05181556104005160018201556104205160028201556104405160038201556104605160048201556104805160058201556104a05160068201556104c051600782015550610340516105205180820182811061480d579050905061034052610360516105605180820182811061480d5790509050610360526103a0516105a05180820182811061480d57905090506103a052610380516105c05180820182811061480d579050905061038052610320516105205180820382811161480d57905090506103205233610480516102e0517f06ba74d0ebb47a34a11d1eafef80d99a580c6e3644549cab6a04fdb357caf4cf610560516105e052610520516106005260406105e0a46103205115614487575b6102c051614435576104e0614469565b610300516347799da8610500526020610500600461051c845afa61445b573d5f5f3e3d5ffd5b60203d1061480d5761050090505b516102e0526102e05115614487575f6102c0526001018181186140b4575b50505f61018052610340516101a052610380516101c0526103a0516101e0526144ae613f67565b6016546103605180820382811161480d579050905060165560015463561b90696103c052610360516103e05261034051610400526102805161042052803b1561480d575f6103c060646103dc5f855af161450a573d5f5f3e3d5ffd5b50337fe5b754fb1abb7f01b499791d0b820ae3b6af3424ac1c59768edb53f4ec31a929610360516103c052610340516103e05260406103c0a261036051815250565b5f546106a0526004546106c0526106c0516370a08231610700526106a051610720526020610700602461071c845afa614587573d5f5f3e3d5ffd5b60203d1061480d576107009050516106e052610660516106e051101561461f5760208061076052600f610700527f216d696e5f626f72726f775f6f75740000000000000000000000000000000000610720526107008161076001602f82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610740528060040161075cfd5b6106e05161062051116146b9576106c0516323b872dd610700526106a05161072052336107405261062051610760526020610700606461071c5f855af1614668573d5f5f3e3d5ffd5b3d61467f57803b1561480d576001610780526146a9565b3d602081183d602010021880610700016107201161480d57610700518060011c61480d5761078052505b6107809050511561480d5761480b565b6106e0511561474b576106c0516323b872dd610700526106a0516107205233610740526106e051610760526020610700606461071c5f855af16146fe573d5f5f3e3d5ffd5b3d61471557803b1561480d5760016107805261473f565b3d602081183d602010021880610700016107201161480d57610700518060011c61480d5761078052505b6107809050511561480d575b610620516106e05180820382811161480d5790509050610240526106405161026052336102805261477d610720613ff9565b61072051610700526106805161070051101561480b57602080610780526013610720527f216d696e5f636f6c6c61746572616c5f6f757400000000000000000000000000610740526107208161078001603382825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610760528060040161077cfd5b565b5f80fd3c273c273c273c273a133c27075d3c273abb3a8303653af339c0044a3b9b38d62ccc0da73b63150b3a4b1d4b3b473c273c273c27109c03d32c58046c23022ca139f73c273b2b3c2727a505e6197500182d1d3c273bbd85582017c80fa9715a3e4003c6b8d6cd3c6495fc8205a578434e6e32b091dfecc5758319486781185600a16576797065728300040300370000000000000000000000000000000000", - "nonce": "0x1b", - "chainId": "0x1" - }, - "additionalContracts": [ - { - "transactionType": "CREATE2", - "contractName": "trove_manager", - "address": "0xf87d5d598c08a84a9e1fd32d9d6362eabd2f3e11", - "initCode": "0x61486761001161000039614867610000f35f3560e01c6002602b820660011b61481101601e395f51565b63768ee73c8118610349576101c43610341761480d576004358060a01c61480d576040526024358060a01c61480d576060526044358060a01c61480d576080526064358060a01c61480d5760a0526084358060a01c61480d5760c05260a4358060a01c61480d5760e05261010060c4610100375f541561010a5760208061026052600b610200527f696e697469616c697a6564000000000000000000000000000000000000000000610220526102008161026001602b82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610240528060040161025cfd5b6040515f5560605160015560805160025560a05160035560c05160045560e05160055560c05163313ce567610220526020610220600461023c845afa610152573d5f5f3e3d5ffd5b3d602081183d602010021880610220016102401161480d57610220518060081c61480d576102605250610260905051604d811161480d5780600a0a905061020052610200516064810490506102205261022051606481049050610240526102205160065561020051600755610100516102005180820281158383830414171561480d5790509050600855610120516102205180820281158383830414171561480d5790509050600955610140516102205180820281158383830414171561480d5790509050600a55610160516102205180820281158383830414171561480d5790509050600b55610180516102405180820281158383830414171561480d5790509050600c556101a0516102405180820281158383830414171561480d5790509050600d556101c051600e556101e051600f55610220518060011c90506010556102205160fa81028160fa82041861480d57905060115560e05163095ea7b361026052606051610280527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6102a0526020610260604461027c5f855af16102fb573d5f5f3e3d5ffd5b3d61031257803b1561480d5760016102c05261033c565b3d602081183d602010021880610260016102801161480d57610260518060011c61480d576102c052505b6102c09050511561480d57005b632621db2f8118613c27573461480d5760055460405260206040f35b631deee05281186103b75760443610341761480d576020604060046080377fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60c0526103b2610220613c63565b610220f35b634e530b428118613c27573461480d5760045460405260206040f35b630ff8afc18118613c275760243610341761480d57602060176004356020525f5260405f208054608052600181015460a052600281015460c052600381015460e052600481015461010052600581015461012052600681015461014052600781015461016052506104456101a0613d86565b6101a0f35b63254e97d58118613c27573461480d576020610467610180613e7f565b610180f35b639c756a4b8118613c275760443610341761480d576024358060a01c61480d5760405260176004356020525f5260405f2080546060526001810154608052600281015460a052600381015460c052600481015460e0526005810154610100526006810154610120526007810154610140525033610100511815610561576020806101c0526006610160527f216f776e6572000000000000000000000000000000000000000000000000000061018052610160816101c001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06101a052806004016101bcfd5b6040516101205260176004356020525f5260405f206060518155608051600182015560a051600282015560c051600382015560e051600482015561010051600582015561012051600682015561014051600782015550604051336004357f2f61fe63853c39f6c9618d1aec9774d255ab9ef5a43057db30fc6018c90bd7bd5f610160a4005b632fdba1f68118613c275760243610341761480d5760176004356020525f5260405f20805460405260018101546060526002810154608052600381015460a052600481015460c052600581015460e05260068101546101005260078101546101205250336101005118156106cc576020806101a052600e610140527f2170656e64696e675f6f776e657200000000000000000000000000000000000061016052610140816101a001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610180528060040161019cfd5b60e051610140526101005160e0525f6101005260176004356020525f5260405f2060405181556060516001820155608051600282015560a051600382015560c051600482015560e05160058201556101005160068201556101205160078201555033610140516004357f16b85f49bf01212961345d3016c9a531894accf62eb7680f2045d79185cc0ec05f610160a4005b63f70d8c118118613c27576101243610341761480d576024356107f2576020806108405260126107e0527f21636f6c6c61746572616c5f616d6f756e740000000000000000000000000000610800526107e08161084001603282825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610820528060040161083cfd5b6044356108715760208061084052600c6107e0527f21646562745f616d6f756e740000000000000000000000000000000000000000610800526107e08161084001602c82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610820528060040161083cfd5b60105460a43510156108f5576020806108405260196107e0527f216d696e5f616e6e75616c5f696e7465726573745f7261746500000000000000610800526107e08161084001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610820528060040161083cfd5b60115460a4351115610979576020806108405260196107e0527f216d61785f616e6e75616c5f696e7465726573745f7261746500000000000000610800526107e08161084001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610820528060040161083cfd5b3361082052600435610840526040610800526108008051602082012090506107e05260176107e0516020525f5260405f206007810190505415610a2e57602080610860526006610800527f21656d7074790000000000000000000000000000000000000000000000000000610820526108008161086001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610840528060040161085cfd5b60443560805260a43560a05260c43560c052610a4b610820613c63565b61082051610800526044356108005180820182811061480d5790509050610820526008546108205111610af0576020806108a0526009610840527f216d696e5f64656274000000000000000000000000000000000000000000000061086052610840816108a001602982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610880528060040161089cfd5b6002546311f37ceb610860526020610860600461087c845afa610b15573d5f5f3e3d5ffd5b60203d1061480d5761086090505161084052602435604052604061082060605e610b40610880613f07565b6108805161086052600a54610860511015610bcd576020806108e0526019610880527f216d696e696d756d5f636f6c6c61746572616c5f726174696f000000000000006108a052610880816108e001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06108c052806004016108dcfd5b60176107e0516020525f5260405f20610820518155602435600182015560a4356002820155428060401c61480d576003820155428060401c61480d5760048201553360058201555f6006820155600160078201555061082051610180525f6101a0526108205160a43580820281158383830414171561480d57905090506101c0525f6101e052610c5b613f67565b60165460243580820182811061480d579050905060165560035463843aa0db610880526107e0516108a05260a4356108c0526064356108e05260843561090052803b1561480d575f610880608461089c5f855af1610cbb573d5f5f3e3d5ffd5b506005546323b872dd61088052336108a052306108c0526024356108e0526020610880606461089c5f855af1610cf3573d5f5f3e3d5ffd5b3d610d0a57803b1561480d57600161090052610d34565b3d602081183d602010021880610880016108a01161480d57610880518060011c61480d5761090052505b6109009050511561480d576044356106205260a43561064052604060e461066037610d5d61454c565b336107e0517f48cc6255485654cd31337a688b4a1e06f8a768af7ec431040b7015bbb57d44b76040602461088037610800516108c05260a4356108e0526080610880a360206107e0f35b63650f939c81186110805760443610341761480d57602435610e345760208060a05260126040527f21636f6c6c61746572616c5f616d6f756e74000000000000000000000000000060605260408160a001603282825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060805280600401609cfd5b60176004356020525f5260405f20805460405260018101546060526002810154608052600381015460a052600481015460c052600581015460e052600681015461010052600781015461012052503360e0511815610f04576020806101a0526006610140527f216f776e6572000000000000000000000000000000000000000000000000000061016052610140816101a001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610180528060040161019cfd5b6001610120511815610f88576020806101a0526007610140527f216163746976650000000000000000000000000000000000000000000000000061016052610140816101a001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610180528060040161019cfd5b60176004356020525f5260405f20600181019050805460243580820182811061480d579050905081555060165460243580820182811061480d57905090506016556005546323b872dd61014052336101605230610180526024356101a0526020610140606461015c5f855af1611000573d5f5f3e3d5ffd5b3d61101757803b1561480d5760016101c052611041565b3d602081183d602010021880610140016101601161480d57610140518060011c61480d576101c052505b6101c09050511561480d57336004357fda18d0b037712b628d658e8fb6f6701086c449aab7cefd33b9f7f95e3a3082b8602435610140526020610140a3005b63f12003678118613c27573461480d57600a5460405260206040f35b636a48f8b38118613c275760443610341761480d57602435611130576020806102005260126101a0527f21636f6c6c61746572616c5f616d6f756e7400000000000000000000000000006101c0526101a08161020001603282825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06101e052806004016101fcfd5b60176004356020525f5260405f2080546101a05260018101546101c05260028101546101e0526003810154610200526004810154610220526005810154610240526006810154610260526007810154610280525033610240511815611207576020806103005260066102a0527f216f776e657200000000000000000000000000000000000000000000000000006102c0526102a08161030001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06102e052806004016102fcfd5b600161028051181561128b576020806103005260076102a0527f21616374697665000000000000000000000000000000000000000000000000006102c0526102a08161030001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06102e052806004016102fcfd5b6024356101c0511015611310576020806103005260116102a0527f2174726f76652e636f6c6c61746572616c0000000000000000000000000000006102c0526102a08161030001603182825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06102e052806004016102fcfd5b6101006101a060805e6113246102c0613d86565b6102c0516102a0526002546311f37ceb6102e05260206102e060046102fc845afa611351573d5f5f3e3d5ffd5b60203d1061480d576102e09050516102c0526101c05160243580820382811161480d57905090506102e0526102e0516040526102a0516060526102c05160805261139c610320613f07565b6103205161030052600a5461030051101561142957602080610380526019610320527f216d696e696d756d5f636f6c6c61746572616c5f726174696f00000000000000610340526103208161038001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610360528060040161037cfd5b6102e05160176004356020525f5260405f206001810190505560165460243580820382811161480d579050905060165560055463a9059cbb610320523361034052602435610360526020610320604461033c5f855af161148b573d5f5f3e3d5ffd5b3d6114a257803b1561480d576001610380526114cc565b3d602081183d602010021880610320016103401161480d57610320518060011c61480d5761038052505b6103809050511561480d57336004357fb7464e08add10846d62a84243a08bcd31fb4d0c9bb84591709b39de1fad9ae0e602435610320526020610320a3005b63f8e61b698118613c275760a43610341761480d5760243561159f5760208061084052600c6107e0527f21646562745f616d6f756e740000000000000000000000000000000000000000610800526107e08161084001602c82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610820528060040161083cfd5b60176004356020525f5260405f2080546107e05260018101546108005260028101546108205260038101546108405260048101546108605260058101546108805260068101546108a05260078101546108c0525033610880511815611676576020806109405260066108e0527f216f776e65720000000000000000000000000000000000000000000000000000610900526108e08161094001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610920528060040161093cfd5b60016108c05118156116fa576020806109405260076108e0527f2161637469766500000000000000000000000000000000000000000000000000610900526108e08161094001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610920528060040161093cfd5b6024356080526108205160a05260443560c052611718610900613c63565b610900516108e0526024356108e05180820182811061480d5790509050610900526101006107e060805e61174d610940613d86565b6109405161092052610920516109005180820182811061480d5790509050610940526002546311f37ceb610980526020610980600461099c845afa611794573d5f5f3e3d5ffd5b60203d1061480d57610980905051610960526108005160405261094051606052610960516080526117c66109a0613f07565b6109a05161098052600a5461098051101561185357602080610a005260196109a0527f216d696e696d756d5f636f6c6c61746572616c5f726174696f000000000000006109c0526109a081610a0001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06109e052806004016109fcfd5b6107e0516109a052610940516107e052428060401c61480d576108405260176004356020525f5260405f206107e05181556108005160018201556108205160028201556108405160038201556108605160048201556108805160058201556108a05160068201556108c05160078201555061090051610180525f6101a052610940516108205180820281158383830414171561480d57905090506101c0526109a0516108205180820281158383830414171561480d57905090506101e052611919613f67565b602435610620526108205161064052604060646106603761193861454c565b336004357fbf608caf5cc20aaeea74ecfce286b511362b0ecbaa0e56ded00f76f7e2e39c44610940516109c0526108e0516109e05260406109c0a3005b63d8aed1458118613c275760443610341761480d57602435611a09576020806102a052600c610240527f21646562745f616d6f756e74000000000000000000000000000000000000000061026052610240816102a001602c82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610280528060040161029cfd5b60176004356020525f5260405f2080546102405260018101546102605260028101546102805260038101546102a05260048101546102c05260058101546102e05260068101546103005260078101546103205250336102e0511815611ae0576020806103a0526006610340527f216f776e6572000000000000000000000000000000000000000000000000000061036052610340816103a001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610380528060040161039cfd5b6001610320511815611b64576020806103a0526007610340527f216163746976650000000000000000000000000000000000000000000000000061036052610340816103a001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610380528060040161039cfd5b61010061024060805e611b78610360613d86565b61036051610340526103405160085480820382811161480d579050905061036052602435610360518082811882841002189050905061038052610340516103805180820382811161480d57905090506103a052610240516103c0526103a05161024052428060401c61480d576102a05260176004356020525f5260405f206102405181556102605160018201556102805160028201556102a05160038201556102c05160048201556102e0516005820155610300516006820155610320516007820155505f61018052610380516101a0526103a0516102805180820281158383830414171561480d57905090506101c0526103c0516102805180820281158383830414171561480d57905090506101e052611c91613f67565b6004546323b872dd6103e05233610400525f5461042052610380516104405260206103e060646103fc5f855af1611cca573d5f5f3e3d5ffd5b3d611ce157803b1561480d57600161046052611d0b565b3d602081183d6020100218806103e0016104001161480d576103e0518060011c61480d5761046052505b6104609050511561480d57336004357fc030da26557a891f33dbaee473c007cdfa269acb9628d7d12e744ec6923ed2b3610380516103e05260206103e0a3005b633665ead88118613c275760a43610341761480d576010546024351015611de4576020806102a0526019610240527f216d696e5f616e6e75616c5f696e7465726573745f726174650000000000000061026052610240816102a001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610280528060040161029cfd5b6011546024351115611e68576020806102a0526019610240527f216d61785f616e6e75616c5f696e7465726573745f726174650000000000000061026052610240816102a001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610280528060040161029cfd5b60176004356020525f5260405f2080546102405260018101546102605260028101546102805260038101546102a05260048101546102c05260058101546102e05260068101546103005260078101546103205250336102e0511815611f3f576020806103a0526006610340527f216f776e6572000000000000000000000000000000000000000000000000000061036052610340816103a001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610380528060040161039cfd5b6001610320511815611fc3576020806103a0526007610340527f216163746976650000000000000000000000000000000000000000000000000061036052610340816103a001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610380528060040161039cfd5b6102805160243518612047576020806103a0526019610340527f216e65775f616e6e75616c5f696e7465726573745f726174650000000000000061036052610340816103a001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610380528060040161039cfd5b61010061024060805e61205b610360613d86565b610360516103405261034051610360525f610380526102c051600f5480820182811061480d57905090504210156121b0576103605160805260243560a05260843560c0526120aa6103a0613c63565b6103a05161038052610360516103805180820182811061480d5790509050610360526002546311f37ceb6103c05260206103c060046103dc845afa6120f1573d5f5f3e3d5ffd5b60203d1061480d576103c09050516103a05261026051604052610360516060526103a0516080526121236103e0613f07565b6103e0516103c052600a546103c05110156121b0576020806104405260196103e0527f216d696e696d756d5f636f6c6c61746572616c5f726174696f00000000000000610400526103e08161044001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610420528060040161043cfd5b610240516103a052610280516103c05260243561028052428060401c61480d576102c0526103605161024052428060401c61480d576102a05260176004356020525f5260405f206102405181556102605160018201556102805160028201556102a05160038201556102c05160048201556102e05160058201556103005160068201556103205160078201555061038051610180525f6101a0526103605160243580820281158383830414171561480d57905090506101c0526103a0516103c05180820281158383830414171561480d57905090506101e052612291613f67565b60035463d2adfe936103e0526080600461040037803b1561480d575f6103e060846103fc5f855af16122c5573d5f5f3e3d5ffd5b50336004357fb5e5fe642ee69e311cafb018acb5d9c4f197ba54a1548f743148a6e717e5bf2a6024356103e052610380516104005260406103e0a3005b63aa665baf8118613c275760243610341761480d5760176004356020525f5260405f2080546102405260018101546102605260028101546102805260038101546102a05260048101546102c05260058101546102e05260068101546103005260078101546103205250336102e05118156123ee576020806103a0526006610340527f216f776e6572000000000000000000000000000000000000000000000000000061036052610340816103a001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610380528060040161039cfd5b6001610320511815612472576020806103a0526007610340527f216163746976650000000000000000000000000000000000000000000000000061036052610340816103a001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610380528060040161039cfd5b61010061024060805e612486610360613d86565b61036051610340526002546311f37ceb610380526020610380600461039c845afa6124b3573d5f5f3e3d5ffd5b60203d1061480d57610380905051610360526102605160405261034051606052610360516080526124e56103a0613f07565b6103a05161038052600a54610380511015612572576020806104005260196103a0527f216d696e696d756d5f636f6c6c61746572616c5f726174696f000000000000006103c0526103a08161040001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06103e052806004016103fcfd5b6101006102406103a05e610100366102403760046103205260176004356020525f5260405f206102405181556102605160018201556102805160028201556102a05160038201556102c05160048201556102e0516005820155610300516006820155610320516007820155506016546103c05180820382811161480d57905090506016555f61018052610340516101a0525f6101c0526103a0516103e05180820281158383830414171561480d57905090506101e052612630613f67565b600354634cc822156104a0526004356104c052803b1561480d575f6104a060246104bc5f855af1612663573d5f5f3e3d5ffd5b506004546323b872dd6104a052336104c0525f546104e052610340516105005260206104a060646104bc5f855af161269d573d5f5f3e3d5ffd5b3d6126b457803b1561480d576001610520526126de565b3d602081183d6020100218806104a0016104c01161480d576104a0518060011c61480d5761052052505b6105209050511561480d5760055463a9059cbb6104a052336104c0526103c0516104e05260206104a060446104bc5f855af161271c573d5f5f3e3d5ffd5b3d61273357803b1561480d5760016105005261275d565b3d602081183d6020100218806104a0016104c01161480d576104a0518060011c61480d5761050052505b6105009050511561480d57336004357f964b676865fdc5f2f6264c1031ea231c957ef38127566ceb9f336ce1458c96a96103c0516104a052610340516104c05260406104a0a3005b63824f317f8118612c3c5760243610341761480d5760176004356020525f5260405f2080546102405260018101546102605260028101546102805260038101546102a05260048101546102c05260058101546102e05260068101546103005260078101546103205250336102e0511815612891576020806103a0526006610340527f216f776e6572000000000000000000000000000000000000000000000000000061036052610340816103a001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610380528060040161039cfd5b6002610320511815612915576020806103a0526007610340527f217a6f6d6269650000000000000000000000000000000000000000000000000061036052610340816103a001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610380528060040161039cfd5b5f610340526102405115612a235761010061024060805e612937610360613d86565b61036051610340526002546311f37ceb610380526020610380600461039c845afa612964573d5f5f3e3d5ffd5b60203d1061480d57610380905051610360526102605160405261034051606052610360516080526129966103a0613f07565b6103a05161038052600a54610380511015612a23576020806104005260196103a0527f216d696e696d756d5f636f6c6c61746572616c5f726174696f000000000000006103c0526103a08161040001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06103e052806004016103fcfd5b6101006102406103605e610100366102403760046103205260176004356020525f5260405f206102405181556102605160018201556102805160028201556102a05160038201556102c05160048201556102e05160058201556103005160068201556103205160078201555060043560125418612a9f575f6012555b6016546103805180820382811161480d57905090506016556103605115612b80575f61018052610340516101a0525f6101c052610360516103a05180820281158383830414171561480d57905090506101e052612afa613f67565b6004546323b872dd6104605233610480525f546104a052610340516104c0526020610460606461047c5f855af1612b33573d5f5f3e3d5ffd5b3d612b4a57803b1561480d5760016104e052612b74565b3d602081183d602010021880610460016104801161480d57610460518060011c61480d576104e052505b6104e09050511561480d575b60055463a9059cbb610460523361048052610380516104a0526020610460604461047c5f855af1612bb3573d5f5f3e3d5ffd5b3d612bca57803b1561480d5760016104c052612bf4565b3d602081183d602010021880610460016104801161480d57610460518060011c61480d576104c052505b6104c09050511561480d57336004357ff696fb34f24a534b48e55d5a6b6a0f2145f131a74e1f09038f758f9e878a30e8610380516104605261034051610480526040610460a3005b631b9965ba8118613c27573461480d5760105460405260206040f35b63cdb042408118613c275760243610341761480d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6102405233610260525f61028052612d69565b635d65bb0e8118613c275760443610341761480d576024356102405233610260525f61028052612d69565b63f36f64a88118612d015760643610341761480d57602435610240526044358060a01c61480d57610260525f61028052612d69565b639884ec908118613c27573461480d57600d5460405260206040f35b63959583518118613c275760843610341761480d57602435610240526044358060a01c61480d57610260526064356004018035620186a0811161480d5750602081350180826102803750505b600435612def57602080620189a052600962018940527f2174726f76655f6964000000000000000000000000000000000000000000000062018960526201894081620189a001602982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06201898052806004016201899cfd5b6002546311f37ceb620189605260206201896060046201897c845afa612e17573d5f5f3e3d5ffd5b60203d1061480d5762018960905051620189405260176004356020525f5260405f2080546201896052600181015462018980526002810154620189a0526003810154620189c0526004810154620189e052600581015462018a0052600681015462018a2052600781015462018a405250600162018a40511462018a605262018a6051612eab57600262018a40511815612eae565b60015b612f315760208062018ae052601162018a80527f21616374697665206f72207a6f6d62696500000000000000000000000000000062018aa05262018a808162018ae001603182825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a062018ac0528060040162018adcfd5b6101006201896060805e612f4762018aa0613d86565b62018aa05162018a8052620189805160405262018a80516060526201894051608052612f7562018ac0613f07565b62018ac05162018aa052600a5462018ac05262018ac05162018aa051106130155760208062018b4052601162018ae0527f21636f6c6c61746572616c5f726174696f00000000000000000000000000000062018b005262018ae08162018b4001603182825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a062018b20528060040162018b3cfd5b5f62018ae05262018ac05162018aa05110156130ee57600b5462018aa05111156130e157600c5462018b005262018ac051600b5480820382811161480d579050905062018b205262018ac05162018aa05180820382811161480d579050905062018b4052600d5462018b005180820382811161480d579050905062018b605262018b005162018b605162018b405180820281158383830414171561480d579050905062018b2051801561480d578082049050905080820182811061480d579050905062018ae0526130f7565b600d5462018ae0526130f7565b600c5462018ae0525b60075462018b00526201898051620189405180820281158383830414171561480d57905090506ec097ce7bc90715b34b9f10000000008104905062018b205260095462018b405262018b405162018a805180820281158383830414171561480d579050905062018b205162018b005180820281158383830414171561480d579050905080820382811161480d579050905062018b405162018b005180820382811161480d579050905062018ae05180820382811161480d5790509050801561480d578082049050905062018b605262018a8051610240518082811882841002189050905062018b60518082811882841002189050905062018b805260085462018a805162018b805180820382811161480d5790509050101561321e5762018a805162018b80525b62018b80516ec097ce7bc90715b34b9f10000000008102816ec097ce7bc90715b34b9f100000000082041861480d5790506201894051801561480d578082049050905062018ba05262018ba05162018b005162018ae05180820182811061480d579050905080820281158383830414171561480d579050905062018b0051801561480d578082049050905062018bc05262018bc05162018980518082811882841002189050905062018be05262018a005162018c005262018a805162018b80511462018c205262018c20516134df5762018a805162018b805180820382811161480d579050905062018c4052620189605162018c6052620189805162018be05180820382811161480d579050905062018c805262018c805160405262018c4051606052620189405160805261335562018cc0613f07565b62018cc05162018ca05262018ac05162018ca05110156133ee5760208062018d2052601962018cc0527f216d696e696d756d5f636f6c6c61746572616c5f726174696f0000000000000062018ce05262018cc08162018d2001603982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a062018d00528060040162018d1cfd5b62018c4051620189605262018c80516201898052428060401c61480d57620189c05260176004356020525f5260405f206201896051815562018980516001820155620189a0516002820155620189c0516003820155620189e051600482015562018a0051600582015562018a2051600682015562018a405160078201555060165462018be05180820382811161480d57905090506016555f6101805262018b80516101a05262018c4051620189a05180820281158383830414171561480d57905090506101c05262018c6051620189a05180820281158383830414171561480d57905090506101e0526136bf613f67565b620189805162018c40526201896051620189a05180820281158383830414171561480d579050905062018c6052610100366201896037600862018a405260176004356020525f5260405f206201896051815562018980516001820155620189a0516002820155620189c0516003820155620189e051600482015562018a0051600582015562018a2051600682015562018a405160078201555060043560125418613588575f6012555b60165462018c405180820382811161480d57905090506016555f6101805262018b80516101a0525f6101c05262018c60516101e0526135c5613f67565b62018a60511561360857600354634cc8221562018c805260043562018ca052803b1561480d575f62018c80602462018c9c5f855af1613606573d5f5f3e3d5ffd5b505b62018c405162018be05180820382811161480d579050905062018c805262018c8051156136bf5760055463a9059cbb62018ca05262018c005162018cc05262018c805162018ce052602062018ca0604462018cbc5f855af161366c573d5f5f3e3d5ffd5b3d61368457803b1561480d57600162018d00526136b2565b3d602081183d60201002188062018ca00162018cc01161480d5762018ca0518060011c61480d5762018d0052505b62018d009050511561480d575b60055463a9059cbb62018c40526102605162018c605262018be05162018c8052602062018c40604462018c5c5f855af16136fb573d5f5f3e3d5ffd5b3d61371357803b1561480d57600162018ca052613741565b3d602081183d60201002188062018c400162018c601161480d5762018c40518060011c61480d5762018ca052505b62018ca09050511561480d5761028051156137ed576102605163c92632b562018c405260a060043562018c60523362018c805262018be05162018ca05262018b805162018cc0528062018ce0528062018c60016020610280510180610280835e508051806020830101601f825f03163682375050601f19601f82516020010116905081015050803b1561480d575f62018c406201876462018c5c5f855af16137eb573d5f5f3e3d5ffd5b505b6004546323b872dd62018c40523362018c60525f5462018c805262018b805162018ca052602062018c40606462018c5c5f855af161382d573d5f5f3e3d5ffd5b3d61384557803b1561480d57600162018cc052613873565b3d602081183d60201002188062018c400162018c601161480d5762018c40518060011c61480d5762018cc052505b62018cc09050511561480d573362018c00516004357fd6e62841f18c721ed3147d9ee5b55f92da1e651ce6f2565d1f7e9915718a20ad62018be05162018c405262018b805162018c605262018c205162018c8052606062018c40a4602062018be0f35b637bde82f28118613c275760443610341761480d576024358060a01c61480d57610620525f5433181561397b576020806106a0526007610640527f216c656e6465720000000000000000000000000000000000000000000000000061066052610640816106a001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610680528060040161069cfd5b600435610240527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6102605261062051610280526139ba610640613ff9565b61064050005b63bcead63e81186139db573461480d575f5460405260206040f35b6382f568418118613c27573461480d5760065460405260206040f35b6399bb33338118613c27573461480d5760015460405260206040f35b6386fc88d38118613a2f573461480d5760025460405260206040f35b631e33dcb38118613c27573461480d57600c5460405260206040f35b63314bee1d8118613a67573461480d5760035460405260206040f35b6331dc3ca88118613c27573461480d5760135460405260206040f35b63b6d1696c8118613a9f573461480d5760075460405260206040f35b63844e5b768118613c27573461480d5760085460405260206040f35b63fb6879d08118613ad7573461480d5760095460405260206040f35b63a67635188118613c27573461480d5760125460405260206040f35b6343933d518118613b0f573461480d57600b5460405260206040f35b6385bc2bed8118613c27573461480d57600f5460405260206040f35b63a0f73e3f8118613c27573461480d57600e5460405260206040f35b63d8585cce8118613c27573461480d5760115460405260206040f35b63fac7aae58118613b7f573461480d5760145460405260206040f35b6310d6f8578118613c27573461480d5760165460405260206040f35b637789dd008114600336111615613c27573461480d5760155460405260206040f35b6387553b7e8118613c275760243610341761480d5760176004356020525f5260405f20805460405260018101546060526002810154608052600381015460a052600481015460c052600581015460e052600681015461010052600781015461012052506101006040f35b5f5ffd5b60405160605180820281158383830414171561480d57905090506301e1338081049050600754801561480d5780820490509050815250565b60135460805180820182811061480d579050905060e05260145460805160a05180820281158383830414171561480d579050905080820182811061480d5790509050610100526101005160e051801561480d5780820490509050610120526080516101205180820281158383830414171561480d5790509050604052600e54606052613cf0610160613c2b565b610160516101405260c051610140511115613d7d576020806101c0526010610160527f216d61785f757066726f6e745f6665650000000000000000000000000000000061018052610160816101c001603082825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06101a052806004016101bcfd5b61014051815250565b60805160805160c05180820281158383830414171561480d57905090506040524260e05180820382811161480d5790509050606052613dc6610180613c2b565b6101805180820182811061480d5790509050815250565b606051613e555760208060e052601f6080527f6d6174683a206365696c5f646976206469766973696f6e206279207a65726f0060a05260808160e001603f82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060c0528060040160dcfd5b604051613e62575f613e7a565b60016060516040516001810381811161480d57905004015b815250565b6014544260155480820382811161480d579050905080820281158383830414171561480d57905090506040526007546301e133808102816301e1338082041861480d579050606052613ed2610160613ddd565b61016051610140526013546101405180820182811061480d579050905061016052610160516013554260155561016051815250565b60405160805180820281158383830414171561480d57905090506ec097ce7bc90715b34b9f10000000008104905060a05260a05160075480820281158383830414171561480d5790509050606051801561480d5780820490509050815250565b613f72610220613e7f565b6102205161020052610200516101805180820182811061480d579050905061020052610200516101a05180820382811161480d5790509050610200526102005160135560145461022052610220516101c05180820182811061480d579050905061022052610220516101e05180820382811161480d57905090506102205261022051601455565b6140046102a0613e7f565b6102a0506002546311f37ceb6102c05260206102c060046102dc845afa61402d573d5f5f3e3d5ffd5b60203d1061480d576102c09050516102a0525f6102c0526012546102e052600354610300526102e051156140665760016102c05261409f565b610300516347799da8610320526020610320600461033c845afa61408c573d5f5f3e3d5ffd5b60203d1061480d576103209050516102e0525b6102405161032052608036610340375f6103e8905b806103c05260176102e0516020525f5260405f2080546103e05260018101546104005260028101546104205260038101546104405260048101546104605260058101546104805260068101546104a05260078101546104c052506102c0516141255761042051610260511115614127565b5f5b61448757610300516335671214610500526102e051610520526020610500602461051c845afa614159573d5f5f3e3d5ffd5b60203d1061480d576105009050516104e05261048051331461417c576001614181565b6102c0515b15614425576101006103e060805e61419a610520613d86565b610520516105005261032051610500518082811882841002189050905061052052610500516105205180820382811161480d579050905061054052600854610540511015614248576102c05161423b5760026104c05261030051634cc82215610560526102e05161058052803b1561480d575f610560602461057c5f855af1614225573d5f5f3e3d5ffd5b506105405115614248576102e051601255614248565b61054051614248575f6012555b610520516ec097ce7bc90715b34b9f10000000008102816ec097ce7bc90715b34b9f100000000082041861480d5790506102a051801561480d578082049050905061056052610400516105605180820382811161480d5790509050610580526103e0516104205180820281158383830414171561480d57905090506105a052610540516104205180820281158383830414171561480d57905090506105c052610540516103e0526105805161040052428060401c61480d576104405260176102e0516020525f5260405f206103e05181556104005160018201556104205160028201556104405160038201556104605160048201556104805160058201556104a05160068201556104c051600782015550610340516105205180820182811061480d579050905061034052610360516105605180820182811061480d5790509050610360526103a0516105a05180820182811061480d57905090506103a052610380516105c05180820182811061480d579050905061038052610320516105205180820382811161480d57905090506103205233610480516102e0517f06ba74d0ebb47a34a11d1eafef80d99a580c6e3644549cab6a04fdb357caf4cf610560516105e052610520516106005260406105e0a46103205115614487575b6102c051614435576104e0614469565b610300516347799da8610500526020610500600461051c845afa61445b573d5f5f3e3d5ffd5b60203d1061480d5761050090505b516102e0526102e05115614487575f6102c0526001018181186140b4575b50505f61018052610340516101a052610380516101c0526103a0516101e0526144ae613f67565b6016546103605180820382811161480d579050905060165560015463561b90696103c052610360516103e05261034051610400526102805161042052803b1561480d575f6103c060646103dc5f855af161450a573d5f5f3e3d5ffd5b50337fe5b754fb1abb7f01b499791d0b820ae3b6af3424ac1c59768edb53f4ec31a929610360516103c052610340516103e05260406103c0a261036051815250565b5f546106a0526004546106c0526106c0516370a08231610700526106a051610720526020610700602461071c845afa614587573d5f5f3e3d5ffd5b60203d1061480d576107009050516106e052610660516106e051101561461f5760208061076052600f610700527f216d696e5f626f72726f775f6f75740000000000000000000000000000000000610720526107008161076001602f82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610740528060040161075cfd5b6106e05161062051116146b9576106c0516323b872dd610700526106a05161072052336107405261062051610760526020610700606461071c5f855af1614668573d5f5f3e3d5ffd5b3d61467f57803b1561480d576001610780526146a9565b3d602081183d602010021880610700016107201161480d57610700518060011c61480d5761078052505b6107809050511561480d5761480b565b6106e0511561474b576106c0516323b872dd610700526106a0516107205233610740526106e051610760526020610700606461071c5f855af16146fe573d5f5f3e3d5ffd5b3d61471557803b1561480d5760016107805261473f565b3d602081183d602010021880610700016107201161480d57610700518060011c61480d5761078052505b6107809050511561480d575b610620516106e05180820382811161480d5790509050610240526106405161026052336102805261477d610720613ff9565b61072051610700526106805161070051101561480b57602080610780526013610720527f216d696e5f636f6c6c61746572616c5f6f757400000000000000000000000000610740526107208161078001603382825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610760528060040161077cfd5b565b5f80fd3c273c273c273c273a133c27075d3c273abb3a8303653af339c0044a3b9b38d62ccc0da73b63150b3a4b1d4b3b473c273c273c27109c03d32c58046c23022ca139f73c273b2b3c2727a505e6197500182d1d3c273bbd85582017c80fa9715a3e4003c6b8d6cd3c6495fc8205a578434e6e32b091dfecc5758319486781185600a1657679706572830004030037" - } - ], - "isFixedGasLimit": false - }, - { - "hash": "0x14e4672c021483fb4a622320c87d195a8b30e964184e9b9e0ef1270b35450fb5", - "transactionType": "CALL", - "contractName": null, - "contractAddress": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "function": "deployCreate2(bytes32,bytes)", - "arguments": [ - "0xb225d45c357dcb440c61a4455f8d89195fe74f935162b84c29db67527d45654c", - "0x3461005f5760206104f55f395f518060a01c61005f576040526040515f557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f60605260405160805260406060a161045c6100636100003961045c610000f35b5f80fd5f3560e01c60026006820660011b61045001601e395f51565b63f0350c04811861044a5760243610341761044c576004358060a01c61044c576040525f543318156100b55760208060c05260066060527f216f776e6572000000000000000000000000000000000000000000000000000060805260608160c001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b6040516001557f23e1f881d1e797ea57a7247e53536f0bfc37c42e6645b3bdc4b1c9a0e0d8a1335f5460605260405160805260406060a1005b63a67c2dcb811861044a573461044c573360015418156101795760208060a052600e6040527f2170656e64696e675f6f776e657200000000000000000000000000000000000060605260408160a001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060805280600401609cfd5b5f6001555f54604052335f557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e06040516060523360805260406060a1005b631cff79cd81186101db57604336111561044c575f6120805260016120a052610247565b638da5cb5b811861044a573461044c575f5460405260206040f35b63a04a0908811861044a57606336111561044c576044356120805260016120a052610247565b637aa2e8e9811861042d57608336111561044c57604435612080526064358060011c61044c576120a0525b6004358060a01c61044c576040526024356004018035612000811161044c57506020813501808260603750505f543318156102f4576020806121205260066120c0527f216f776e657200000000000000000000000000000000000000000000000000006120e0526120c08161212001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0612100528060040161211cfd5b6040366120c037604051612080515a6060506120006141206060516080858786f1905090509050616120523d61200081183d61200010021861410052614100602081510180826161405e5050616120516120c05260206161405101806161406120e05e506120c05161036a576120a0511561036d565b60015b6103e95760208061416052600b614100527f63616c6c206661696c6564000000000000000000000000000000000000000000614120526141008161416001602b82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0614140528060040161415cfd5b60208061410052806141000160206120e05101806120e0835e508051806020830101601f825f03163682375050601f19601f82516020010116905081019050614100f35b637f4ec4c3811861044a573461044c5760015460405260206040f35b5b005b5f80fd001800ee01f601b70449021c855820a3db694ded9d7c1495ee4ed1d9c797b93560dfd939842a4959ed2acac4bdd58719045c810c00a1657679706572830004030036000000000000000000000000000005281a2b04a182085d37cc9e6dd552795caa" - ], - "transaction": { - "from": "0x000005281a2b04a182085d37cc9e6dd552795caa", - "to": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "gas": "0x10b43e", - "value": "0x0", - "input": "0x26307668b225d45c357dcb440c61a4455f8d89195fe74f935162b84c29db67527d45654c000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000005153461005f5760206104f55f395f518060a01c61005f576040526040515f557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f60605260405160805260406060a161045c6100636100003961045c610000f35b5f80fd5f3560e01c60026006820660011b61045001601e395f51565b63f0350c04811861044a5760243610341761044c576004358060a01c61044c576040525f543318156100b55760208060c05260066060527f216f776e6572000000000000000000000000000000000000000000000000000060805260608160c001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b6040516001557f23e1f881d1e797ea57a7247e53536f0bfc37c42e6645b3bdc4b1c9a0e0d8a1335f5460605260405160805260406060a1005b63a67c2dcb811861044a573461044c573360015418156101795760208060a052600e6040527f2170656e64696e675f6f776e657200000000000000000000000000000000000060605260408160a001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060805280600401609cfd5b5f6001555f54604052335f557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e06040516060523360805260406060a1005b631cff79cd81186101db57604336111561044c575f6120805260016120a052610247565b638da5cb5b811861044a573461044c575f5460405260206040f35b63a04a0908811861044a57606336111561044c576044356120805260016120a052610247565b637aa2e8e9811861042d57608336111561044c57604435612080526064358060011c61044c576120a0525b6004358060a01c61044c576040526024356004018035612000811161044c57506020813501808260603750505f543318156102f4576020806121205260066120c0527f216f776e657200000000000000000000000000000000000000000000000000006120e0526120c08161212001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0612100528060040161211cfd5b6040366120c037604051612080515a6060506120006141206060516080858786f1905090509050616120523d61200081183d61200010021861410052614100602081510180826161405e5050616120516120c05260206161405101806161406120e05e506120c05161036a576120a0511561036d565b60015b6103e95760208061416052600b614100527f63616c6c206661696c6564000000000000000000000000000000000000000000614120526141008161416001602b82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0614140528060040161415cfd5b60208061410052806141000160206120e05101806120e0835e508051806020830101601f825f03163682375050601f19601f82516020010116905081019050614100f35b637f4ec4c3811861044a573461044c5760015460405260206040f35b5b005b5f80fd001800ee01f601b70449021c855820a3db694ded9d7c1495ee4ed1d9c797b93560dfd939842a4959ed2acac4bdd58719045c810c00a1657679706572830004030036000000000000000000000000000005281a2b04a182085d37cc9e6dd552795caa0000000000000000000000", - "nonce": "0x1c", - "chainId": "0x1" - }, - "additionalContracts": [ - { - "transactionType": "CREATE2", - "contractName": "daddy", - "address": "0xf190bba1f5db12ac0a3ee65adbf5bfe52ed2f4a7", - "initCode": "0x3461005f5760206104f55f395f518060a01c61005f576040526040515f557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f60605260405160805260406060a161045c6100636100003961045c610000f35b5f80fd5f3560e01c60026006820660011b61045001601e395f51565b63f0350c04811861044a5760243610341761044c576004358060a01c61044c576040525f543318156100b55760208060c05260066060527f216f776e6572000000000000000000000000000000000000000000000000000060805260608160c001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b6040516001557f23e1f881d1e797ea57a7247e53536f0bfc37c42e6645b3bdc4b1c9a0e0d8a1335f5460605260405160805260406060a1005b63a67c2dcb811861044a573461044c573360015418156101795760208060a052600e6040527f2170656e64696e675f6f776e657200000000000000000000000000000000000060605260408160a001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060805280600401609cfd5b5f6001555f54604052335f557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e06040516060523360805260406060a1005b631cff79cd81186101db57604336111561044c575f6120805260016120a052610247565b638da5cb5b811861044a573461044c575f5460405260206040f35b63a04a0908811861044a57606336111561044c576044356120805260016120a052610247565b637aa2e8e9811861042d57608336111561044c57604435612080526064358060011c61044c576120a0525b6004358060a01c61044c576040526024356004018035612000811161044c57506020813501808260603750505f543318156102f4576020806121205260066120c0527f216f776e657200000000000000000000000000000000000000000000000000006120e0526120c08161212001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0612100528060040161211cfd5b6040366120c037604051612080515a6060506120006141206060516080858786f1905090509050616120523d61200081183d61200010021861410052614100602081510180826161405e5050616120516120c05260206161405101806161406120e05e506120c05161036a576120a0511561036d565b60015b6103e95760208061416052600b614100527f63616c6c206661696c6564000000000000000000000000000000000000000000614120526141008161416001602b82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0614140528060040161415cfd5b60208061410052806141000160206120e05101806120e0835e508051806020830101601f825f03163682375050601f19601f82516020010116905081019050614100f35b637f4ec4c3811861044a573461044c5760015460405260206040f35b5b005b5f80fd001800ee01f601b70449021c855820a3db694ded9d7c1495ee4ed1d9c797b93560dfd939842a4959ed2acac4bdd58719045c810c00a1657679706572830004030036000000000000000000000000000005281a2b04a182085d37cc9e6dd552795caa" - } - ], - "isFixedGasLimit": false - }, - { - "hash": "0xad90791552ad7eba970c9739848c78c108ed028081af542b0fa3be0982184c97", - "transactionType": "CALL", - "contractName": null, - "contractAddress": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "function": "deployCreate2(bytes32,bytes)", - "arguments": [ - "0x0000000000000000000000000000000000000000000000000000000000001069", - "0x60a060405234801561000f575f80fd5b506040516133ed3803806133ed833981810160405281019061003191906100c9565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050506100f4565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100988261006f565b9050919050565b6100a88161008e565b81146100b2575f80fd5b50565b5f815190506100c38161009f565b92915050565b5f602082840312156100de576100dd61006b565b5b5f6100eb848285016100b5565b91505092915050565b6080516132d361011a5f395f818161019e0152818161022801526102ba01526132d35ff3fe608060405234801562000010575f80fd5b506004361062000044575f3560e01c80632e7f138a1462000048578063862a179e146200007e578063de490aca14620000a0575b5f80fd5b620000666004803603810190620000609190620003bd565b620000c2565b6040516200007591906200044b565b60405180910390f35b62000088620002a0565b6040516200009791906200044b565b60405180910390f35b620000aa620002b8565b604051620000b991906200044b565b60405180910390f35b5f8085858585604051620000d690620002dc565b620000e59493929190620004c6565b604051809103905ff080158015620000ff573d5f803e3d5ffd5b5090508073ffffffffffffffffffffffffffffffffffffffff1663748747e67352605bbf54845f520a3e94792d019f62407db2f86040518263ffffffff1660e01b81526004016200015191906200044b565b5f604051808303815f87803b15801562000169575f80fd5b505af11580156200017c573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663f629b7907f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401620001db91906200044b565b5f604051808303815f87803b158015620001f3575f80fd5b505af115801562000206573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff16636a5f1aa27f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b81526004016200026591906200044b565b5f604051808303815f87803b1580156200027d575f80fd5b505af115801562000290573d5f803e3d5ffd5b5050505080915050949350505050565b7352605bbf54845f520a3e94792d019f62407db2f881565b7f000000000000000000000000000000000000000000000000000000000000000081565b612d93806200050b83390190565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6200031d82620002f2565b9050919050565b6200032f8162000311565b81146200033a575f80fd5b50565b5f813590506200034d8162000324565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011262000377576200037662000353565b5b8235905067ffffffffffffffff81111562000397576200039662000357565b5b602083019150836001820283011115620003b657620003b56200035b565b5b9250929050565b5f805f8060608587031215620003d857620003d7620002ea565b5b5f620003e7878288016200033d565b9450506020620003fa878288016200033d565b935050604085013567ffffffffffffffff8111156200041e576200041d620002ee565b5b6200042c878288016200035f565b925092505092959194509250565b620004458162000311565b82525050565b5f602082019050620004605f8301846200043a565b92915050565b5f82825260208201905092915050565b828183375f83830152505050565b5f601f19601f8301169050919050565b5f620004a1838562000466565b9350620004b083858462000476565b620004bb8362000484565b840190509392505050565b5f606082019050620004db5f8301876200043a565b620004ea60208301866200043a565b8181036040830152620004ff81848662000494565b90509594505050505056fe60e060405260015f806101000a81548160ff0219169083151502179055506127105f60016101000a81548161ffff021916908361ffff16021790555034801562000047575f80fd5b5060405162002d9338038062002d9383398181016040528101906200006d91906200097b565b8281818181818173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250503073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250506200014b8282333333604051602401620000fa95949392919062000a5e565b6040516020818303038152906040526397073ae660e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506200023c60201b60201c565b5073d377919fa87120584b21279a491f82d5265a139c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc555050505050508173ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60018190555062000233827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60805173ffffffffffffffffffffffffffffffffffffffff16620002db60201b9092919060201c565b50505062000e0a565b60605f8073d377919fa87120584b21279a491f82d5265a139c73ffffffffffffffffffffffffffffffffffffffff16846040516200027b919062000b0a565b5f60405180830381855af49150503d805f8114620002b5576040519150601f19603f3d011682016040523d82523d5f602084013e620002ba565b606091505b509150915081620002d1576040513d805f833e8082fd5b8092505050919050565b5f63095ea7b360e01b8383604051602401620002f992919062000b3c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506200036a84826200041360201b60201c565b6200040d57620003fa8463095ea7b360e01b855f6040516024016200039192919062000bbd565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050620004d260201b60201c565b6200040c8482620004d260201b60201c565b5b50505050565b5f805f8473ffffffffffffffffffffffffffffffffffffffff16846040516200043d919062000b0a565b5f604051808303815f865af19150503d805f811462000478576040519150601f19603f3d011682016040523d82523d5f602084013e6200047d565b606091505b5091509150818015620004ae57505f81511480620004ad575080806020019051810190620004ac919062000c22565b5b5b8015620004c85750620004c785620005a060201b60201c565b5b9250505092915050565b5f62000535826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620005c260201b9092919060201c565b90505f815114806200055957508080602001905181019062000558919062000c22565b5b6200059b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005929062000cc6565b60405180910390fd5b505050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060620005d884845f85620005e160201b60201c565b90509392505050565b60608247101562000629576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006209062000d5a565b60405180910390fd5b5f808673ffffffffffffffffffffffffffffffffffffffff16858760405162000653919062000b0a565b5f6040518083038185875af1925050503d805f81146200068f576040519150601f19603f3d011682016040523d82523d5f602084013e62000694565b606091505b5091509150620006ad87838387620006b960201b60201c565b92505050949350505050565b6060831562000728575f8351036200071f57620006dc85620005a060201b60201c565b6200071e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007159062000dc8565b60405180910390fd5b5b8290506200073b565b6200073a83836200074360201b60201c565b5b949350505050565b5f82511115620007565781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200078c919062000de8565b60405180910390fd5b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007d182620007a6565b9050919050565b620007e381620007c5565b8114620007ee575f80fd5b50565b5f815190506200080181620007d8565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b62000857826200080f565b810181811067ffffffffffffffff821117156200087957620008786200081f565b5b80604052505050565b5f6200088d62000795565b90506200089b82826200084c565b919050565b5f67ffffffffffffffff821115620008bd57620008bc6200081f565b5b620008c8826200080f565b9050602081019050919050565b5f5b83811015620008f4578082015181840152602081019050620008d7565b5f8484015250505050565b5f620009156200090f84620008a0565b62000882565b9050828152602081018484840111156200093457620009336200080b565b5b62000941848285620008d5565b509392505050565b5f82601f83011262000960576200095f62000807565b5b815162000972848260208601620008ff565b91505092915050565b5f805f606084860312156200099557620009946200079e565b5b5f620009a486828701620007f1565b9350506020620009b786828701620007f1565b925050604084015167ffffffffffffffff811115620009db57620009da620007a2565b5b620009e98682870162000949565b9150509250925092565b620009fe81620007c5565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f62000a2a8262000a04565b62000a36818562000a0e565b935062000a48818560208601620008d5565b62000a53816200080f565b840191505092915050565b5f60a08201905062000a735f830188620009f3565b818103602083015262000a87818762000a1e565b905062000a986040830186620009f3565b62000aa76060830185620009f3565b62000ab66080830184620009f3565b9695505050505050565b5f81519050919050565b5f81905092915050565b5f62000ae08262000ac0565b62000aec818562000aca565b935062000afe818560208601620008d5565b80840191505092915050565b5f62000b17828462000ad4565b915081905092915050565b5f819050919050565b62000b368162000b22565b82525050565b5f60408201905062000b515f830185620009f3565b62000b60602083018462000b2b565b9392505050565b5f819050919050565b5f60ff82169050919050565b5f819050919050565b5f62000ba562000b9f62000b998462000b67565b62000b7c565b62000b70565b9050919050565b62000bb78162000b85565b82525050565b5f60408201905062000bd25f830185620009f3565b62000be1602083018462000bac565b9392505050565b5f8115159050919050565b62000bfe8162000be8565b811462000c09575f80fd5b50565b5f8151905062000c1c8162000bf3565b92915050565b5f6020828403121562000c3a5762000c396200079e565b5b5f62000c498482850162000c0c565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f62000cae602a8362000a0e565b915062000cbb8262000c52565b604082019050919050565b5f6020820190508181035f83015262000cdf8162000ca0565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f5f8201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b5f62000d4260268362000a0e565b915062000d4f8262000ce6565b604082019050919050565b5f6020820190508181035f83015262000d738162000d34565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f62000db0601d8362000a0e565b915062000dbd8262000d7a565b602082019050919050565b5f6020820190508181035f83015262000de18162000da2565b9050919050565b5f6020820190508181035f83015262000e02818462000a1e565b905092915050565b60805160a05160c051611f1162000e825f395f8181610ce601528181611076015261112301525f81816105b30152818161068f0152818161082c01528181610911015281816109cd01528181610c2901528181610d0a01528181610dd801528181610eb6015261128801525f6111b10152611f115ff3fe608060405234801561000f575f80fd5b5060043610610190575f3560e01c80639d7fb70c116100dc578063b460af9411610095578063d19a3bb81161006f578063d19a3bb814610505578063d696860114610523578063ecf708581461053f578063fde813a81461055d57610191565b8063b460af9414610489578063ba087652146104b9578063bdc8144b146104e957610191565b80639d7fb70c146103a35780639f40a7b3146103bf578063a318c1a4146103ef578063a9059cbb1461041f578063a96e874d1461044f578063ac00ff261461046d57610191565b8063503160d9116101495780636e553f65116101235780636e553f65146103095780637d9699321461033957806394bf804d14610357578063950b3d731461038757610191565b8063503160d9146102b05780635d265d3f146102cc5780636718835f146102eb57610191565b806304bd4629146101c857806323b872dd146101f85780633d6cb5751461022857806346aa2f121461024457806349317f1d146102745780634a5d09431461029257610191565b5b5f73d377919fa87120584b21279a491f82d5265a139c9050365f80375f80365f845af43d5f803e805f81146101c4573d5ff35b3d5ffd5b6101e260048036038101906101dd91906115f1565b610579565b6040516101ef9190611634565b60405180910390f35b610212600480360381019061020d9190611677565b6105a2565b60405161021f91906116e1565b60405180910390f35b610242600480360381019061023d91906116fa565b610671565b005b61025e600480360381019061025991906115f1565b610685565b60405161026b9190611634565b60405180910390f35b61027c610740565b6040516102899190611634565b60405180910390f35b61029a61075f565b6040516102a79190611634565b60405180910390f35b6102ca60048036038101906102c591906116fa565b610779565b005b6102d461078d565b6040516102e29291906117af565b60405180910390f35b6102f361080b565b60405161030091906116e1565b60405180910390f35b610323600480360381019061031e91906117dd565b61081b565b6040516103309190611634565b60405180910390f35b6103416108e6565b60405161034e9190611634565b60405180910390f35b610371600480360381019061036c91906117dd565b610900565b60405161037e9190611634565b60405180910390f35b6103a1600480360381019061039c91906116fa565b6109cb565b005b6103bd60048036038101906103b891906116fa565b610a5c565b005b6103d960048036038101906103d4919061181b565b610a70565b6040516103e69190611634565b60405180910390f35b6104096004803603810190610404919061181b565b610b44565b6040516104169190611634565b60405180910390f35b6104396004803603810190610434919061187f565b610c18565b60405161044691906116e1565b60405180910390f35b610457610ce4565b6040516104649190611918565b60405180910390f35b6104876004803603810190610482919061195b565b610d08565b005b6104a3600480360381019061049e9190611986565b610da8565b6040516104b09190611634565b60405180910390f35b6104d360048036038101906104ce9190611986565b610dbe565b6040516104e09190611634565b60405180910390f35b61050360048036038101906104fe91906116fa565b610dd6565b005b61050d610e9c565b60405161051a91906119e5565b60405180910390f35b61053d600480360381019061053891906116fa565b610eb4565b005b610547610f45565b6040516105549190611634565b60405180910390f35b610577600480360381019061057291906116fa565b610f4b565b005b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9050919050565b5f6105ae848484610f5f565b6106497f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401610602939291906119fe565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610f64565b80602001905181019061065c9190611a47565b905061066a84848484610ffe565b9392505050565b610679611004565b61068281611074565b50565b5f8060015490505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061071a9190611a86565b9050808211156107355780826107309190611ade565b610737565b5f5b92505050919050565b5f610749611004565b610751611120565b905061075c81611256565b90565b5f8060019054906101000a900461ffff1661ffff16905090565b610781611004565b61078a81611423565b50565b5f6060610798611426565b63440368a360e01b604051602401604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050915091509091565b5f8054906101000a900460ff1681565b5f61082783828461142a565b6108c07f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636e553f658585604051602401610879929190611b11565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610f64565b8060200190518101906108d39190611a86565b90506108e083828461142f565b92915050565b5f8060039054906101000a900461ffff1661ffff16905090565b5f61090c81848461142a565b6109a57f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166394bf804d858560405160240161095e929190611b11565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610f64565b8060200190518101906109b89190611a86565b90506109c581848461142f565b92915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166348e4a649336040518263ffffffff1660e01b8152600401610a2491906119e5565b5f6040518083038186803b158015610a3a575f80fd5b505afa158015610a4c573d5f803e3d5ffd5b50505050610a5981611434565b50565b610a64611004565b610a6d816114dc565b50565b5f610a7e81868686866114df565b610b1a85858585604051602401610a989493929190611b38565b6040516020818303038152906040527f9f40a7b3000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610f64565b806020019051810190610b2d9190611a86565b9050610b3c8186868686611526565b949350505050565b5f610b5285828686866114df565b610bee85858585604051602401610b6c9493929190611b38565b6040516020818303038152906040527fa318c1a4000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610f64565b806020019051810190610c019190611a86565b9050610c108582868686611526565b949350505050565b5f610c24338484610f5f565b610cbd7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401610c76929190611b7b565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610f64565b806020019051810190610cd09190611a47565b9050610cde33848484610ffe565b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166348e4a649336040518263ffffffff1660e01b8152600401610d6191906119e5565b5f6040518083038186803b158015610d77575f80fd5b505afa158015610d89573d5f803e3d5ffd5b50505050805f806101000a81548160ff02191690831515021790555050565b5f610db58484845f610b44565b90509392505050565b5f610dcd848484612710610a70565b90509392505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166348e4a649336040518263ffffffff1660e01b8152600401610e2f91906119e5565b5f6040518083038186803b158015610e45575f80fd5b505afa158015610e57573d5f803e3d5ffd5b50505050806001819055507f5d2e73196f8ba1b44e887e2bcc9bcd1f3e657add341d4a0a632ffff00d6903f281604051610e919190611634565b60405180910390a150565b73d377919fa87120584b21279a491f82d5265a139c81565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166348e4a649336040518263ffffffff1660e01b8152600401610f0d91906119e5565b5f6040518083038186803b158015610f23575f80fd5b505afa158015610f35573d5f803e3d5ffd5b50505050610f428161152d565b50565b60015481565b610f53611004565b610f5c81611590565b50565b505050565b60605f8073d377919fa87120584b21279a491f82d5265a139c73ffffffffffffffffffffffffffffffffffffffff1684604051610fa19190611bdc565b5f60405180830381855af49150503d805f8114610fd9576040519150601f19603f3d011682016040523d82523d5f602084013e610fde565b606091505b509150915081610ff4576040513d805f833e8082fd5b8092505050919050565b50505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611072576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106990611c4c565b60405180910390fd5b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637bde82f2825f60059054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016110f0929190611b11565b5f604051808303815f87803b158015611107575f80fd5b505af1158015611119573d5f803e3d5ffd5b5050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663254e97d56040518163ffffffff1660e01b81526004016020604051808303815f875af115801561118b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111af9190611a86565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161120891906119e5565b602060405180830381865afa158015611223573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112479190611a86565b6112519190611c6a565b905090565b5f8054906101000a900460ff166112855760015f806101000a81548160ff021916908315150217905550611420565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112ef573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113139190611a86565b90508082111561139b576127105f60019054906101000a900461ffff1661ffff168261133f9190611c9d565b6113499190611d0b565b81836113559190611ade565b1115611396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138d90611d85565b60405180910390fd5b61141e565b8181111561141d576127105f60039054906101000a900461ffff1661ffff16826113c59190611c9d565b6113cf9190611d0b565b82826113db9190611ade565b111561141c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141390611d85565b60405180910390fd5b5b5b505b50565b50565b5f90565b505050565b505050565b5f8111611476576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146d90611ded565b60405180910390fd5b61ffff80168111156114bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b490611e55565b60405180910390fd5b805f60016101000a81548161ffff021916908361ffff16021790555050565b50565b825f60056101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b5050505050565b6127108110611571576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156890611ebd565b60405180910390fd5b805f60036101000a81548161ffff021916908361ffff16021790555050565b50565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6115c082611597565b9050919050565b6115d0816115b6565b81146115da575f80fd5b50565b5f813590506115eb816115c7565b92915050565b5f6020828403121561160657611605611593565b5b5f611613848285016115dd565b91505092915050565b5f819050919050565b61162e8161161c565b82525050565b5f6020820190506116475f830184611625565b92915050565b6116568161161c565b8114611660575f80fd5b50565b5f813590506116718161164d565b92915050565b5f805f6060848603121561168e5761168d611593565b5b5f61169b868287016115dd565b93505060206116ac868287016115dd565b92505060406116bd86828701611663565b9150509250925092565b5f8115159050919050565b6116db816116c7565b82525050565b5f6020820190506116f45f8301846116d2565b92915050565b5f6020828403121561170f5761170e611593565b5b5f61171c84828501611663565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561175c578082015181840152602081019050611741565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61178182611725565b61178b818561172f565b935061179b81856020860161173f565b6117a481611767565b840191505092915050565b5f6040820190506117c25f8301856116d2565b81810360208301526117d48184611777565b90509392505050565b5f80604083850312156117f3576117f2611593565b5b5f61180085828601611663565b9250506020611811858286016115dd565b9150509250929050565b5f805f806080858703121561183357611832611593565b5b5f61184087828801611663565b9450506020611851878288016115dd565b9350506040611862878288016115dd565b925050606061187387828801611663565b91505092959194509250565b5f806040838503121561189557611894611593565b5b5f6118a2858286016115dd565b92505060206118b385828601611663565b9150509250929050565b5f819050919050565b5f6118e06118db6118d684611597565b6118bd565b611597565b9050919050565b5f6118f1826118c6565b9050919050565b5f611902826118e7565b9050919050565b611912816118f8565b82525050565b5f60208201905061192b5f830184611909565b92915050565b61193a816116c7565b8114611944575f80fd5b50565b5f8135905061195581611931565b92915050565b5f602082840312156119705761196f611593565b5b5f61197d84828501611947565b91505092915050565b5f805f6060848603121561199d5761199c611593565b5b5f6119aa86828701611663565b93505060206119bb868287016115dd565b92505060406119cc868287016115dd565b9150509250925092565b6119df816115b6565b82525050565b5f6020820190506119f85f8301846119d6565b92915050565b5f606082019050611a115f8301866119d6565b611a1e60208301856119d6565b611a2b6040830184611625565b949350505050565b5f81519050611a4181611931565b92915050565b5f60208284031215611a5c57611a5b611593565b5b5f611a6984828501611a33565b91505092915050565b5f81519050611a808161164d565b92915050565b5f60208284031215611a9b57611a9a611593565b5b5f611aa884828501611a72565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611ae88261161c565b9150611af38361161c565b9250828203905081811115611b0b57611b0a611ab1565b5b92915050565b5f604082019050611b245f830185611625565b611b3160208301846119d6565b9392505050565b5f608082019050611b4b5f830187611625565b611b5860208301866119d6565b611b6560408301856119d6565b611b726060830184611625565b95945050505050565b5f604082019050611b8e5f8301856119d6565b611b9b6020830184611625565b9392505050565b5f81905092915050565b5f611bb682611725565b611bc08185611ba2565b9350611bd081856020860161173f565b80840191505092915050565b5f611be78284611bac565b915081905092915050565b5f82825260208201905092915050565b7f2173656c660000000000000000000000000000000000000000000000000000005f82015250565b5f611c36600583611bf2565b9150611c4182611c02565b602082019050919050565b5f6020820190508181035f830152611c6381611c2a565b9050919050565b5f611c748261161c565b9150611c7f8361161c565b9250828201905080821115611c9757611c96611ab1565b5b92915050565b5f611ca78261161c565b9150611cb28361161c565b9250828202611cc08161161c565b91508282048414831517611cd757611cd6611ab1565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f611d158261161c565b9150611d208361161c565b925082611d3057611d2f611cde565b5b828204905092915050565b7f6865616c7468436865636b0000000000000000000000000000000000000000005f82015250565b5f611d6f600b83611bf2565b9150611d7a82611d3b565b602082019050919050565b5f6020820190508181035f830152611d9c81611d63565b9050919050565b7f217a65726f2070726f66697400000000000000000000000000000000000000005f82015250565b5f611dd7600c83611bf2565b9150611de282611da3565b602082019050919050565b5f6020820190508181035f830152611e0481611dcb565b9050919050565b7f21746f6f206869676800000000000000000000000000000000000000000000005f82015250565b5f611e3f600983611bf2565b9150611e4a82611e0b565b602082019050919050565b5f6020820190508181035f830152611e6c81611e33565b9050919050565b7f216c6f7373206c696d69740000000000000000000000000000000000000000005f82015250565b5f611ea7600b83611bf2565b9150611eb282611e73565b602082019050919050565b5f6020820190508181035f830152611ed481611e9b565b905091905056fea2646970667358221220146c55a183bf0bb8c96d1500d26745455dd7745811eb7ab834cd5efe2b1ace7764736f6c63430008170033a2646970667358221220da9fdac7d7a6d588d050fde162869c25df623a1c8d2377251c41d435c6b2efc064736f6c63430008170033000000000000000000000000f190bba1f5db12ac0a3ee65adbf5bfe52ed2f4a7" - ], - "transaction": { - "from": "0x000005281a2b04a182085d37cc9e6dd552795caa", - "to": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "gas": "0x8b50b1", - "value": "0x0", - "input": "0x2630766800000000000000000000000000000000000000000000000000000000000010690000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000340d60a060405234801561000f575f80fd5b506040516133ed3803806133ed833981810160405281019061003191906100c9565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050506100f4565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100988261006f565b9050919050565b6100a88161008e565b81146100b2575f80fd5b50565b5f815190506100c38161009f565b92915050565b5f602082840312156100de576100dd61006b565b5b5f6100eb848285016100b5565b91505092915050565b6080516132d361011a5f395f818161019e0152818161022801526102ba01526132d35ff3fe608060405234801562000010575f80fd5b506004361062000044575f3560e01c80632e7f138a1462000048578063862a179e146200007e578063de490aca14620000a0575b5f80fd5b620000666004803603810190620000609190620003bd565b620000c2565b6040516200007591906200044b565b60405180910390f35b62000088620002a0565b6040516200009791906200044b565b60405180910390f35b620000aa620002b8565b604051620000b991906200044b565b60405180910390f35b5f8085858585604051620000d690620002dc565b620000e59493929190620004c6565b604051809103905ff080158015620000ff573d5f803e3d5ffd5b5090508073ffffffffffffffffffffffffffffffffffffffff1663748747e67352605bbf54845f520a3e94792d019f62407db2f86040518263ffffffff1660e01b81526004016200015191906200044b565b5f604051808303815f87803b15801562000169575f80fd5b505af11580156200017c573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663f629b7907f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401620001db91906200044b565b5f604051808303815f87803b158015620001f3575f80fd5b505af115801562000206573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff16636a5f1aa27f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b81526004016200026591906200044b565b5f604051808303815f87803b1580156200027d575f80fd5b505af115801562000290573d5f803e3d5ffd5b5050505080915050949350505050565b7352605bbf54845f520a3e94792d019f62407db2f881565b7f000000000000000000000000000000000000000000000000000000000000000081565b612d93806200050b83390190565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6200031d82620002f2565b9050919050565b6200032f8162000311565b81146200033a575f80fd5b50565b5f813590506200034d8162000324565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011262000377576200037662000353565b5b8235905067ffffffffffffffff81111562000397576200039662000357565b5b602083019150836001820283011115620003b657620003b56200035b565b5b9250929050565b5f805f8060608587031215620003d857620003d7620002ea565b5b5f620003e7878288016200033d565b9450506020620003fa878288016200033d565b935050604085013567ffffffffffffffff8111156200041e576200041d620002ee565b5b6200042c878288016200035f565b925092505092959194509250565b620004458162000311565b82525050565b5f602082019050620004605f8301846200043a565b92915050565b5f82825260208201905092915050565b828183375f83830152505050565b5f601f19601f8301169050919050565b5f620004a1838562000466565b9350620004b083858462000476565b620004bb8362000484565b840190509392505050565b5f606082019050620004db5f8301876200043a565b620004ea60208301866200043a565b8181036040830152620004ff81848662000494565b90509594505050505056fe60e060405260015f806101000a81548160ff0219169083151502179055506127105f60016101000a81548161ffff021916908361ffff16021790555034801562000047575f80fd5b5060405162002d9338038062002d9383398181016040528101906200006d91906200097b565b8281818181818173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250503073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250506200014b8282333333604051602401620000fa95949392919062000a5e565b6040516020818303038152906040526397073ae660e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506200023c60201b60201c565b5073d377919fa87120584b21279a491f82d5265a139c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc555050505050508173ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60018190555062000233827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60805173ffffffffffffffffffffffffffffffffffffffff16620002db60201b9092919060201c565b50505062000e0a565b60605f8073d377919fa87120584b21279a491f82d5265a139c73ffffffffffffffffffffffffffffffffffffffff16846040516200027b919062000b0a565b5f60405180830381855af49150503d805f8114620002b5576040519150601f19603f3d011682016040523d82523d5f602084013e620002ba565b606091505b509150915081620002d1576040513d805f833e8082fd5b8092505050919050565b5f63095ea7b360e01b8383604051602401620002f992919062000b3c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506200036a84826200041360201b60201c565b6200040d57620003fa8463095ea7b360e01b855f6040516024016200039192919062000bbd565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050620004d260201b60201c565b6200040c8482620004d260201b60201c565b5b50505050565b5f805f8473ffffffffffffffffffffffffffffffffffffffff16846040516200043d919062000b0a565b5f604051808303815f865af19150503d805f811462000478576040519150601f19603f3d011682016040523d82523d5f602084013e6200047d565b606091505b5091509150818015620004ae57505f81511480620004ad575080806020019051810190620004ac919062000c22565b5b5b8015620004c85750620004c785620005a060201b60201c565b5b9250505092915050565b5f62000535826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620005c260201b9092919060201c565b90505f815114806200055957508080602001905181019062000558919062000c22565b5b6200059b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005929062000cc6565b60405180910390fd5b505050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060620005d884845f85620005e160201b60201c565b90509392505050565b60608247101562000629576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006209062000d5a565b60405180910390fd5b5f808673ffffffffffffffffffffffffffffffffffffffff16858760405162000653919062000b0a565b5f6040518083038185875af1925050503d805f81146200068f576040519150601f19603f3d011682016040523d82523d5f602084013e62000694565b606091505b5091509150620006ad87838387620006b960201b60201c565b92505050949350505050565b6060831562000728575f8351036200071f57620006dc85620005a060201b60201c565b6200071e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007159062000dc8565b60405180910390fd5b5b8290506200073b565b6200073a83836200074360201b60201c565b5b949350505050565b5f82511115620007565781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200078c919062000de8565b60405180910390fd5b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007d182620007a6565b9050919050565b620007e381620007c5565b8114620007ee575f80fd5b50565b5f815190506200080181620007d8565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b62000857826200080f565b810181811067ffffffffffffffff821117156200087957620008786200081f565b5b80604052505050565b5f6200088d62000795565b90506200089b82826200084c565b919050565b5f67ffffffffffffffff821115620008bd57620008bc6200081f565b5b620008c8826200080f565b9050602081019050919050565b5f5b83811015620008f4578082015181840152602081019050620008d7565b5f8484015250505050565b5f620009156200090f84620008a0565b62000882565b9050828152602081018484840111156200093457620009336200080b565b5b62000941848285620008d5565b509392505050565b5f82601f83011262000960576200095f62000807565b5b815162000972848260208601620008ff565b91505092915050565b5f805f606084860312156200099557620009946200079e565b5b5f620009a486828701620007f1565b9350506020620009b786828701620007f1565b925050604084015167ffffffffffffffff811115620009db57620009da620007a2565b5b620009e98682870162000949565b9150509250925092565b620009fe81620007c5565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f62000a2a8262000a04565b62000a36818562000a0e565b935062000a48818560208601620008d5565b62000a53816200080f565b840191505092915050565b5f60a08201905062000a735f830188620009f3565b818103602083015262000a87818762000a1e565b905062000a986040830186620009f3565b62000aa76060830185620009f3565b62000ab66080830184620009f3565b9695505050505050565b5f81519050919050565b5f81905092915050565b5f62000ae08262000ac0565b62000aec818562000aca565b935062000afe818560208601620008d5565b80840191505092915050565b5f62000b17828462000ad4565b915081905092915050565b5f819050919050565b62000b368162000b22565b82525050565b5f60408201905062000b515f830185620009f3565b62000b60602083018462000b2b565b9392505050565b5f819050919050565b5f60ff82169050919050565b5f819050919050565b5f62000ba562000b9f62000b998462000b67565b62000b7c565b62000b70565b9050919050565b62000bb78162000b85565b82525050565b5f60408201905062000bd25f830185620009f3565b62000be1602083018462000bac565b9392505050565b5f8115159050919050565b62000bfe8162000be8565b811462000c09575f80fd5b50565b5f8151905062000c1c8162000bf3565b92915050565b5f6020828403121562000c3a5762000c396200079e565b5b5f62000c498482850162000c0c565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f62000cae602a8362000a0e565b915062000cbb8262000c52565b604082019050919050565b5f6020820190508181035f83015262000cdf8162000ca0565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f5f8201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b5f62000d4260268362000a0e565b915062000d4f8262000ce6565b604082019050919050565b5f6020820190508181035f83015262000d738162000d34565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f62000db0601d8362000a0e565b915062000dbd8262000d7a565b602082019050919050565b5f6020820190508181035f83015262000de18162000da2565b9050919050565b5f6020820190508181035f83015262000e02818462000a1e565b905092915050565b60805160a05160c051611f1162000e825f395f8181610ce601528181611076015261112301525f81816105b30152818161068f0152818161082c01528181610911015281816109cd01528181610c2901528181610d0a01528181610dd801528181610eb6015261128801525f6111b10152611f115ff3fe608060405234801561000f575f80fd5b5060043610610190575f3560e01c80639d7fb70c116100dc578063b460af9411610095578063d19a3bb81161006f578063d19a3bb814610505578063d696860114610523578063ecf708581461053f578063fde813a81461055d57610191565b8063b460af9414610489578063ba087652146104b9578063bdc8144b146104e957610191565b80639d7fb70c146103a35780639f40a7b3146103bf578063a318c1a4146103ef578063a9059cbb1461041f578063a96e874d1461044f578063ac00ff261461046d57610191565b8063503160d9116101495780636e553f65116101235780636e553f65146103095780637d9699321461033957806394bf804d14610357578063950b3d731461038757610191565b8063503160d9146102b05780635d265d3f146102cc5780636718835f146102eb57610191565b806304bd4629146101c857806323b872dd146101f85780633d6cb5751461022857806346aa2f121461024457806349317f1d146102745780634a5d09431461029257610191565b5b5f73d377919fa87120584b21279a491f82d5265a139c9050365f80375f80365f845af43d5f803e805f81146101c4573d5ff35b3d5ffd5b6101e260048036038101906101dd91906115f1565b610579565b6040516101ef9190611634565b60405180910390f35b610212600480360381019061020d9190611677565b6105a2565b60405161021f91906116e1565b60405180910390f35b610242600480360381019061023d91906116fa565b610671565b005b61025e600480360381019061025991906115f1565b610685565b60405161026b9190611634565b60405180910390f35b61027c610740565b6040516102899190611634565b60405180910390f35b61029a61075f565b6040516102a79190611634565b60405180910390f35b6102ca60048036038101906102c591906116fa565b610779565b005b6102d461078d565b6040516102e29291906117af565b60405180910390f35b6102f361080b565b60405161030091906116e1565b60405180910390f35b610323600480360381019061031e91906117dd565b61081b565b6040516103309190611634565b60405180910390f35b6103416108e6565b60405161034e9190611634565b60405180910390f35b610371600480360381019061036c91906117dd565b610900565b60405161037e9190611634565b60405180910390f35b6103a1600480360381019061039c91906116fa565b6109cb565b005b6103bd60048036038101906103b891906116fa565b610a5c565b005b6103d960048036038101906103d4919061181b565b610a70565b6040516103e69190611634565b60405180910390f35b6104096004803603810190610404919061181b565b610b44565b6040516104169190611634565b60405180910390f35b6104396004803603810190610434919061187f565b610c18565b60405161044691906116e1565b60405180910390f35b610457610ce4565b6040516104649190611918565b60405180910390f35b6104876004803603810190610482919061195b565b610d08565b005b6104a3600480360381019061049e9190611986565b610da8565b6040516104b09190611634565b60405180910390f35b6104d360048036038101906104ce9190611986565b610dbe565b6040516104e09190611634565b60405180910390f35b61050360048036038101906104fe91906116fa565b610dd6565b005b61050d610e9c565b60405161051a91906119e5565b60405180910390f35b61053d600480360381019061053891906116fa565b610eb4565b005b610547610f45565b6040516105549190611634565b60405180910390f35b610577600480360381019061057291906116fa565b610f4b565b005b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9050919050565b5f6105ae848484610f5f565b6106497f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401610602939291906119fe565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610f64565b80602001905181019061065c9190611a47565b905061066a84848484610ffe565b9392505050565b610679611004565b61068281611074565b50565b5f8060015490505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061071a9190611a86565b9050808211156107355780826107309190611ade565b610737565b5f5b92505050919050565b5f610749611004565b610751611120565b905061075c81611256565b90565b5f8060019054906101000a900461ffff1661ffff16905090565b610781611004565b61078a81611423565b50565b5f6060610798611426565b63440368a360e01b604051602401604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050915091509091565b5f8054906101000a900460ff1681565b5f61082783828461142a565b6108c07f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636e553f658585604051602401610879929190611b11565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610f64565b8060200190518101906108d39190611a86565b90506108e083828461142f565b92915050565b5f8060039054906101000a900461ffff1661ffff16905090565b5f61090c81848461142a565b6109a57f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166394bf804d858560405160240161095e929190611b11565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610f64565b8060200190518101906109b89190611a86565b90506109c581848461142f565b92915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166348e4a649336040518263ffffffff1660e01b8152600401610a2491906119e5565b5f6040518083038186803b158015610a3a575f80fd5b505afa158015610a4c573d5f803e3d5ffd5b50505050610a5981611434565b50565b610a64611004565b610a6d816114dc565b50565b5f610a7e81868686866114df565b610b1a85858585604051602401610a989493929190611b38565b6040516020818303038152906040527f9f40a7b3000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610f64565b806020019051810190610b2d9190611a86565b9050610b3c8186868686611526565b949350505050565b5f610b5285828686866114df565b610bee85858585604051602401610b6c9493929190611b38565b6040516020818303038152906040527fa318c1a4000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610f64565b806020019051810190610c019190611a86565b9050610c108582868686611526565b949350505050565b5f610c24338484610f5f565b610cbd7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401610c76929190611b7b565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610f64565b806020019051810190610cd09190611a47565b9050610cde33848484610ffe565b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166348e4a649336040518263ffffffff1660e01b8152600401610d6191906119e5565b5f6040518083038186803b158015610d77575f80fd5b505afa158015610d89573d5f803e3d5ffd5b50505050805f806101000a81548160ff02191690831515021790555050565b5f610db58484845f610b44565b90509392505050565b5f610dcd848484612710610a70565b90509392505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166348e4a649336040518263ffffffff1660e01b8152600401610e2f91906119e5565b5f6040518083038186803b158015610e45575f80fd5b505afa158015610e57573d5f803e3d5ffd5b50505050806001819055507f5d2e73196f8ba1b44e887e2bcc9bcd1f3e657add341d4a0a632ffff00d6903f281604051610e919190611634565b60405180910390a150565b73d377919fa87120584b21279a491f82d5265a139c81565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166348e4a649336040518263ffffffff1660e01b8152600401610f0d91906119e5565b5f6040518083038186803b158015610f23575f80fd5b505afa158015610f35573d5f803e3d5ffd5b50505050610f428161152d565b50565b60015481565b610f53611004565b610f5c81611590565b50565b505050565b60605f8073d377919fa87120584b21279a491f82d5265a139c73ffffffffffffffffffffffffffffffffffffffff1684604051610fa19190611bdc565b5f60405180830381855af49150503d805f8114610fd9576040519150601f19603f3d011682016040523d82523d5f602084013e610fde565b606091505b509150915081610ff4576040513d805f833e8082fd5b8092505050919050565b50505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611072576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106990611c4c565b60405180910390fd5b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637bde82f2825f60059054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016110f0929190611b11565b5f604051808303815f87803b158015611107575f80fd5b505af1158015611119573d5f803e3d5ffd5b5050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663254e97d56040518163ffffffff1660e01b81526004016020604051808303815f875af115801561118b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111af9190611a86565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161120891906119e5565b602060405180830381865afa158015611223573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112479190611a86565b6112519190611c6a565b905090565b5f8054906101000a900460ff166112855760015f806101000a81548160ff021916908315150217905550611420565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112ef573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113139190611a86565b90508082111561139b576127105f60019054906101000a900461ffff1661ffff168261133f9190611c9d565b6113499190611d0b565b81836113559190611ade565b1115611396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138d90611d85565b60405180910390fd5b61141e565b8181111561141d576127105f60039054906101000a900461ffff1661ffff16826113c59190611c9d565b6113cf9190611d0b565b82826113db9190611ade565b111561141c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141390611d85565b60405180910390fd5b5b5b505b50565b50565b5f90565b505050565b505050565b5f8111611476576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146d90611ded565b60405180910390fd5b61ffff80168111156114bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b490611e55565b60405180910390fd5b805f60016101000a81548161ffff021916908361ffff16021790555050565b50565b825f60056101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b5050505050565b6127108110611571576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156890611ebd565b60405180910390fd5b805f60036101000a81548161ffff021916908361ffff16021790555050565b50565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6115c082611597565b9050919050565b6115d0816115b6565b81146115da575f80fd5b50565b5f813590506115eb816115c7565b92915050565b5f6020828403121561160657611605611593565b5b5f611613848285016115dd565b91505092915050565b5f819050919050565b61162e8161161c565b82525050565b5f6020820190506116475f830184611625565b92915050565b6116568161161c565b8114611660575f80fd5b50565b5f813590506116718161164d565b92915050565b5f805f6060848603121561168e5761168d611593565b5b5f61169b868287016115dd565b93505060206116ac868287016115dd565b92505060406116bd86828701611663565b9150509250925092565b5f8115159050919050565b6116db816116c7565b82525050565b5f6020820190506116f45f8301846116d2565b92915050565b5f6020828403121561170f5761170e611593565b5b5f61171c84828501611663565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561175c578082015181840152602081019050611741565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61178182611725565b61178b818561172f565b935061179b81856020860161173f565b6117a481611767565b840191505092915050565b5f6040820190506117c25f8301856116d2565b81810360208301526117d48184611777565b90509392505050565b5f80604083850312156117f3576117f2611593565b5b5f61180085828601611663565b9250506020611811858286016115dd565b9150509250929050565b5f805f806080858703121561183357611832611593565b5b5f61184087828801611663565b9450506020611851878288016115dd565b9350506040611862878288016115dd565b925050606061187387828801611663565b91505092959194509250565b5f806040838503121561189557611894611593565b5b5f6118a2858286016115dd565b92505060206118b385828601611663565b9150509250929050565b5f819050919050565b5f6118e06118db6118d684611597565b6118bd565b611597565b9050919050565b5f6118f1826118c6565b9050919050565b5f611902826118e7565b9050919050565b611912816118f8565b82525050565b5f60208201905061192b5f830184611909565b92915050565b61193a816116c7565b8114611944575f80fd5b50565b5f8135905061195581611931565b92915050565b5f602082840312156119705761196f611593565b5b5f61197d84828501611947565b91505092915050565b5f805f6060848603121561199d5761199c611593565b5b5f6119aa86828701611663565b93505060206119bb868287016115dd565b92505060406119cc868287016115dd565b9150509250925092565b6119df816115b6565b82525050565b5f6020820190506119f85f8301846119d6565b92915050565b5f606082019050611a115f8301866119d6565b611a1e60208301856119d6565b611a2b6040830184611625565b949350505050565b5f81519050611a4181611931565b92915050565b5f60208284031215611a5c57611a5b611593565b5b5f611a6984828501611a33565b91505092915050565b5f81519050611a808161164d565b92915050565b5f60208284031215611a9b57611a9a611593565b5b5f611aa884828501611a72565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611ae88261161c565b9150611af38361161c565b9250828203905081811115611b0b57611b0a611ab1565b5b92915050565b5f604082019050611b245f830185611625565b611b3160208301846119d6565b9392505050565b5f608082019050611b4b5f830187611625565b611b5860208301866119d6565b611b6560408301856119d6565b611b726060830184611625565b95945050505050565b5f604082019050611b8e5f8301856119d6565b611b9b6020830184611625565b9392505050565b5f81905092915050565b5f611bb682611725565b611bc08185611ba2565b9350611bd081856020860161173f565b80840191505092915050565b5f611be78284611bac565b915081905092915050565b5f82825260208201905092915050565b7f2173656c660000000000000000000000000000000000000000000000000000005f82015250565b5f611c36600583611bf2565b9150611c4182611c02565b602082019050919050565b5f6020820190508181035f830152611c6381611c2a565b9050919050565b5f611c748261161c565b9150611c7f8361161c565b9250828201905080821115611c9757611c96611ab1565b5b92915050565b5f611ca78261161c565b9150611cb28361161c565b9250828202611cc08161161c565b91508282048414831517611cd757611cd6611ab1565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f611d158261161c565b9150611d208361161c565b925082611d3057611d2f611cde565b5b828204905092915050565b7f6865616c7468436865636b0000000000000000000000000000000000000000005f82015250565b5f611d6f600b83611bf2565b9150611d7a82611d3b565b602082019050919050565b5f6020820190508181035f830152611d9c81611d63565b9050919050565b7f217a65726f2070726f66697400000000000000000000000000000000000000005f82015250565b5f611dd7600c83611bf2565b9150611de282611da3565b602082019050919050565b5f6020820190508181035f830152611e0481611dcb565b9050919050565b7f21746f6f206869676800000000000000000000000000000000000000000000005f82015250565b5f611e3f600983611bf2565b9150611e4a82611e0b565b602082019050919050565b5f6020820190508181035f830152611e6c81611e33565b9050919050565b7f216c6f7373206c696d69740000000000000000000000000000000000000000005f82015250565b5f611ea7600b83611bf2565b9150611eb282611e73565b602082019050919050565b5f6020820190508181035f830152611ed481611e9b565b905091905056fea2646970667358221220146c55a183bf0bb8c96d1500d26745455dd7745811eb7ab834cd5efe2b1ace7764736f6c63430008170033a2646970667358221220da9fdac7d7a6d588d050fde162869c25df623a1c8d2377251c41d435c6b2efc064736f6c63430008170033000000000000000000000000f190bba1f5db12ac0a3ee65adbf5bfe52ed2f4a700000000000000000000000000000000000000", - "nonce": "0x1d", - "chainId": "0x1" - }, - "additionalContracts": [ - { - "transactionType": "CREATE2", - "contractName": "LenderFactory", - "address": "0x7c64a2c59bf66456c97775f161d7e67d7d2f87ab", - "initCode": "0x60a060405234801561000f575f80fd5b506040516133ed3803806133ed833981810160405281019061003191906100c9565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050506100f4565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100988261006f565b9050919050565b6100a88161008e565b81146100b2575f80fd5b50565b5f815190506100c38161009f565b92915050565b5f602082840312156100de576100dd61006b565b5b5f6100eb848285016100b5565b91505092915050565b6080516132d361011a5f395f818161019e0152818161022801526102ba01526132d35ff3fe608060405234801562000010575f80fd5b506004361062000044575f3560e01c80632e7f138a1462000048578063862a179e146200007e578063de490aca14620000a0575b5f80fd5b620000666004803603810190620000609190620003bd565b620000c2565b6040516200007591906200044b565b60405180910390f35b62000088620002a0565b6040516200009791906200044b565b60405180910390f35b620000aa620002b8565b604051620000b991906200044b565b60405180910390f35b5f8085858585604051620000d690620002dc565b620000e59493929190620004c6565b604051809103905ff080158015620000ff573d5f803e3d5ffd5b5090508073ffffffffffffffffffffffffffffffffffffffff1663748747e67352605bbf54845f520a3e94792d019f62407db2f86040518263ffffffff1660e01b81526004016200015191906200044b565b5f604051808303815f87803b15801562000169575f80fd5b505af11580156200017c573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663f629b7907f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401620001db91906200044b565b5f604051808303815f87803b158015620001f3575f80fd5b505af115801562000206573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff16636a5f1aa27f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b81526004016200026591906200044b565b5f604051808303815f87803b1580156200027d575f80fd5b505af115801562000290573d5f803e3d5ffd5b5050505080915050949350505050565b7352605bbf54845f520a3e94792d019f62407db2f881565b7f000000000000000000000000000000000000000000000000000000000000000081565b612d93806200050b83390190565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6200031d82620002f2565b9050919050565b6200032f8162000311565b81146200033a575f80fd5b50565b5f813590506200034d8162000324565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011262000377576200037662000353565b5b8235905067ffffffffffffffff81111562000397576200039662000357565b5b602083019150836001820283011115620003b657620003b56200035b565b5b9250929050565b5f805f8060608587031215620003d857620003d7620002ea565b5b5f620003e7878288016200033d565b9450506020620003fa878288016200033d565b935050604085013567ffffffffffffffff8111156200041e576200041d620002ee565b5b6200042c878288016200035f565b925092505092959194509250565b620004458162000311565b82525050565b5f602082019050620004605f8301846200043a565b92915050565b5f82825260208201905092915050565b828183375f83830152505050565b5f601f19601f8301169050919050565b5f620004a1838562000466565b9350620004b083858462000476565b620004bb8362000484565b840190509392505050565b5f606082019050620004db5f8301876200043a565b620004ea60208301866200043a565b8181036040830152620004ff81848662000494565b90509594505050505056fe60e060405260015f806101000a81548160ff0219169083151502179055506127105f60016101000a81548161ffff021916908361ffff16021790555034801562000047575f80fd5b5060405162002d9338038062002d9383398181016040528101906200006d91906200097b565b8281818181818173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250503073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250506200014b8282333333604051602401620000fa95949392919062000a5e565b6040516020818303038152906040526397073ae660e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506200023c60201b60201c565b5073d377919fa87120584b21279a491f82d5265a139c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc555050505050508173ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60018190555062000233827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60805173ffffffffffffffffffffffffffffffffffffffff16620002db60201b9092919060201c565b50505062000e0a565b60605f8073d377919fa87120584b21279a491f82d5265a139c73ffffffffffffffffffffffffffffffffffffffff16846040516200027b919062000b0a565b5f60405180830381855af49150503d805f8114620002b5576040519150601f19603f3d011682016040523d82523d5f602084013e620002ba565b606091505b509150915081620002d1576040513d805f833e8082fd5b8092505050919050565b5f63095ea7b360e01b8383604051602401620002f992919062000b3c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506200036a84826200041360201b60201c565b6200040d57620003fa8463095ea7b360e01b855f6040516024016200039192919062000bbd565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050620004d260201b60201c565b6200040c8482620004d260201b60201c565b5b50505050565b5f805f8473ffffffffffffffffffffffffffffffffffffffff16846040516200043d919062000b0a565b5f604051808303815f865af19150503d805f811462000478576040519150601f19603f3d011682016040523d82523d5f602084013e6200047d565b606091505b5091509150818015620004ae57505f81511480620004ad575080806020019051810190620004ac919062000c22565b5b5b8015620004c85750620004c785620005a060201b60201c565b5b9250505092915050565b5f62000535826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620005c260201b9092919060201c565b90505f815114806200055957508080602001905181019062000558919062000c22565b5b6200059b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005929062000cc6565b60405180910390fd5b505050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060620005d884845f85620005e160201b60201c565b90509392505050565b60608247101562000629576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006209062000d5a565b60405180910390fd5b5f808673ffffffffffffffffffffffffffffffffffffffff16858760405162000653919062000b0a565b5f6040518083038185875af1925050503d805f81146200068f576040519150601f19603f3d011682016040523d82523d5f602084013e62000694565b606091505b5091509150620006ad87838387620006b960201b60201c565b92505050949350505050565b6060831562000728575f8351036200071f57620006dc85620005a060201b60201c565b6200071e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007159062000dc8565b60405180910390fd5b5b8290506200073b565b6200073a83836200074360201b60201c565b5b949350505050565b5f82511115620007565781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200078c919062000de8565b60405180910390fd5b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007d182620007a6565b9050919050565b620007e381620007c5565b8114620007ee575f80fd5b50565b5f815190506200080181620007d8565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b62000857826200080f565b810181811067ffffffffffffffff821117156200087957620008786200081f565b5b80604052505050565b5f6200088d62000795565b90506200089b82826200084c565b919050565b5f67ffffffffffffffff821115620008bd57620008bc6200081f565b5b620008c8826200080f565b9050602081019050919050565b5f5b83811015620008f4578082015181840152602081019050620008d7565b5f8484015250505050565b5f620009156200090f84620008a0565b62000882565b9050828152602081018484840111156200093457620009336200080b565b5b62000941848285620008d5565b509392505050565b5f82601f83011262000960576200095f62000807565b5b815162000972848260208601620008ff565b91505092915050565b5f805f606084860312156200099557620009946200079e565b5b5f620009a486828701620007f1565b9350506020620009b786828701620007f1565b925050604084015167ffffffffffffffff811115620009db57620009da620007a2565b5b620009e98682870162000949565b9150509250925092565b620009fe81620007c5565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f62000a2a8262000a04565b62000a36818562000a0e565b935062000a48818560208601620008d5565b62000a53816200080f565b840191505092915050565b5f60a08201905062000a735f830188620009f3565b818103602083015262000a87818762000a1e565b905062000a986040830186620009f3565b62000aa76060830185620009f3565b62000ab66080830184620009f3565b9695505050505050565b5f81519050919050565b5f81905092915050565b5f62000ae08262000ac0565b62000aec818562000aca565b935062000afe818560208601620008d5565b80840191505092915050565b5f62000b17828462000ad4565b915081905092915050565b5f819050919050565b62000b368162000b22565b82525050565b5f60408201905062000b515f830185620009f3565b62000b60602083018462000b2b565b9392505050565b5f819050919050565b5f60ff82169050919050565b5f819050919050565b5f62000ba562000b9f62000b998462000b67565b62000b7c565b62000b70565b9050919050565b62000bb78162000b85565b82525050565b5f60408201905062000bd25f830185620009f3565b62000be1602083018462000bac565b9392505050565b5f8115159050919050565b62000bfe8162000be8565b811462000c09575f80fd5b50565b5f8151905062000c1c8162000bf3565b92915050565b5f6020828403121562000c3a5762000c396200079e565b5b5f62000c498482850162000c0c565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f62000cae602a8362000a0e565b915062000cbb8262000c52565b604082019050919050565b5f6020820190508181035f83015262000cdf8162000ca0565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f5f8201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b5f62000d4260268362000a0e565b915062000d4f8262000ce6565b604082019050919050565b5f6020820190508181035f83015262000d738162000d34565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f62000db0601d8362000a0e565b915062000dbd8262000d7a565b602082019050919050565b5f6020820190508181035f83015262000de18162000da2565b9050919050565b5f6020820190508181035f83015262000e02818462000a1e565b905092915050565b60805160a05160c051611f1162000e825f395f8181610ce601528181611076015261112301525f81816105b30152818161068f0152818161082c01528181610911015281816109cd01528181610c2901528181610d0a01528181610dd801528181610eb6015261128801525f6111b10152611f115ff3fe608060405234801561000f575f80fd5b5060043610610190575f3560e01c80639d7fb70c116100dc578063b460af9411610095578063d19a3bb81161006f578063d19a3bb814610505578063d696860114610523578063ecf708581461053f578063fde813a81461055d57610191565b8063b460af9414610489578063ba087652146104b9578063bdc8144b146104e957610191565b80639d7fb70c146103a35780639f40a7b3146103bf578063a318c1a4146103ef578063a9059cbb1461041f578063a96e874d1461044f578063ac00ff261461046d57610191565b8063503160d9116101495780636e553f65116101235780636e553f65146103095780637d9699321461033957806394bf804d14610357578063950b3d731461038757610191565b8063503160d9146102b05780635d265d3f146102cc5780636718835f146102eb57610191565b806304bd4629146101c857806323b872dd146101f85780633d6cb5751461022857806346aa2f121461024457806349317f1d146102745780634a5d09431461029257610191565b5b5f73d377919fa87120584b21279a491f82d5265a139c9050365f80375f80365f845af43d5f803e805f81146101c4573d5ff35b3d5ffd5b6101e260048036038101906101dd91906115f1565b610579565b6040516101ef9190611634565b60405180910390f35b610212600480360381019061020d9190611677565b6105a2565b60405161021f91906116e1565b60405180910390f35b610242600480360381019061023d91906116fa565b610671565b005b61025e600480360381019061025991906115f1565b610685565b60405161026b9190611634565b60405180910390f35b61027c610740565b6040516102899190611634565b60405180910390f35b61029a61075f565b6040516102a79190611634565b60405180910390f35b6102ca60048036038101906102c591906116fa565b610779565b005b6102d461078d565b6040516102e29291906117af565b60405180910390f35b6102f361080b565b60405161030091906116e1565b60405180910390f35b610323600480360381019061031e91906117dd565b61081b565b6040516103309190611634565b60405180910390f35b6103416108e6565b60405161034e9190611634565b60405180910390f35b610371600480360381019061036c91906117dd565b610900565b60405161037e9190611634565b60405180910390f35b6103a1600480360381019061039c91906116fa565b6109cb565b005b6103bd60048036038101906103b891906116fa565b610a5c565b005b6103d960048036038101906103d4919061181b565b610a70565b6040516103e69190611634565b60405180910390f35b6104096004803603810190610404919061181b565b610b44565b6040516104169190611634565b60405180910390f35b6104396004803603810190610434919061187f565b610c18565b60405161044691906116e1565b60405180910390f35b610457610ce4565b6040516104649190611918565b60405180910390f35b6104876004803603810190610482919061195b565b610d08565b005b6104a3600480360381019061049e9190611986565b610da8565b6040516104b09190611634565b60405180910390f35b6104d360048036038101906104ce9190611986565b610dbe565b6040516104e09190611634565b60405180910390f35b61050360048036038101906104fe91906116fa565b610dd6565b005b61050d610e9c565b60405161051a91906119e5565b60405180910390f35b61053d600480360381019061053891906116fa565b610eb4565b005b610547610f45565b6040516105549190611634565b60405180910390f35b610577600480360381019061057291906116fa565b610f4b565b005b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9050919050565b5f6105ae848484610f5f565b6106497f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401610602939291906119fe565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610f64565b80602001905181019061065c9190611a47565b905061066a84848484610ffe565b9392505050565b610679611004565b61068281611074565b50565b5f8060015490505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061071a9190611a86565b9050808211156107355780826107309190611ade565b610737565b5f5b92505050919050565b5f610749611004565b610751611120565b905061075c81611256565b90565b5f8060019054906101000a900461ffff1661ffff16905090565b610781611004565b61078a81611423565b50565b5f6060610798611426565b63440368a360e01b604051602401604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050915091509091565b5f8054906101000a900460ff1681565b5f61082783828461142a565b6108c07f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636e553f658585604051602401610879929190611b11565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610f64565b8060200190518101906108d39190611a86565b90506108e083828461142f565b92915050565b5f8060039054906101000a900461ffff1661ffff16905090565b5f61090c81848461142a565b6109a57f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166394bf804d858560405160240161095e929190611b11565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610f64565b8060200190518101906109b89190611a86565b90506109c581848461142f565b92915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166348e4a649336040518263ffffffff1660e01b8152600401610a2491906119e5565b5f6040518083038186803b158015610a3a575f80fd5b505afa158015610a4c573d5f803e3d5ffd5b50505050610a5981611434565b50565b610a64611004565b610a6d816114dc565b50565b5f610a7e81868686866114df565b610b1a85858585604051602401610a989493929190611b38565b6040516020818303038152906040527f9f40a7b3000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610f64565b806020019051810190610b2d9190611a86565b9050610b3c8186868686611526565b949350505050565b5f610b5285828686866114df565b610bee85858585604051602401610b6c9493929190611b38565b6040516020818303038152906040527fa318c1a4000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610f64565b806020019051810190610c019190611a86565b9050610c108582868686611526565b949350505050565b5f610c24338484610f5f565b610cbd7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401610c76929190611b7b565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610f64565b806020019051810190610cd09190611a47565b9050610cde33848484610ffe565b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166348e4a649336040518263ffffffff1660e01b8152600401610d6191906119e5565b5f6040518083038186803b158015610d77575f80fd5b505afa158015610d89573d5f803e3d5ffd5b50505050805f806101000a81548160ff02191690831515021790555050565b5f610db58484845f610b44565b90509392505050565b5f610dcd848484612710610a70565b90509392505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166348e4a649336040518263ffffffff1660e01b8152600401610e2f91906119e5565b5f6040518083038186803b158015610e45575f80fd5b505afa158015610e57573d5f803e3d5ffd5b50505050806001819055507f5d2e73196f8ba1b44e887e2bcc9bcd1f3e657add341d4a0a632ffff00d6903f281604051610e919190611634565b60405180910390a150565b73d377919fa87120584b21279a491f82d5265a139c81565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166348e4a649336040518263ffffffff1660e01b8152600401610f0d91906119e5565b5f6040518083038186803b158015610f23575f80fd5b505afa158015610f35573d5f803e3d5ffd5b50505050610f428161152d565b50565b60015481565b610f53611004565b610f5c81611590565b50565b505050565b60605f8073d377919fa87120584b21279a491f82d5265a139c73ffffffffffffffffffffffffffffffffffffffff1684604051610fa19190611bdc565b5f60405180830381855af49150503d805f8114610fd9576040519150601f19603f3d011682016040523d82523d5f602084013e610fde565b606091505b509150915081610ff4576040513d805f833e8082fd5b8092505050919050565b50505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611072576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106990611c4c565b60405180910390fd5b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637bde82f2825f60059054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016110f0929190611b11565b5f604051808303815f87803b158015611107575f80fd5b505af1158015611119573d5f803e3d5ffd5b5050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663254e97d56040518163ffffffff1660e01b81526004016020604051808303815f875af115801561118b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111af9190611a86565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161120891906119e5565b602060405180830381865afa158015611223573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112479190611a86565b6112519190611c6a565b905090565b5f8054906101000a900460ff166112855760015f806101000a81548160ff021916908315150217905550611420565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112ef573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113139190611a86565b90508082111561139b576127105f60019054906101000a900461ffff1661ffff168261133f9190611c9d565b6113499190611d0b565b81836113559190611ade565b1115611396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138d90611d85565b60405180910390fd5b61141e565b8181111561141d576127105f60039054906101000a900461ffff1661ffff16826113c59190611c9d565b6113cf9190611d0b565b82826113db9190611ade565b111561141c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141390611d85565b60405180910390fd5b5b5b505b50565b50565b5f90565b505050565b505050565b5f8111611476576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146d90611ded565b60405180910390fd5b61ffff80168111156114bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b490611e55565b60405180910390fd5b805f60016101000a81548161ffff021916908361ffff16021790555050565b50565b825f60056101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b5050505050565b6127108110611571576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156890611ebd565b60405180910390fd5b805f60036101000a81548161ffff021916908361ffff16021790555050565b50565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6115c082611597565b9050919050565b6115d0816115b6565b81146115da575f80fd5b50565b5f813590506115eb816115c7565b92915050565b5f6020828403121561160657611605611593565b5b5f611613848285016115dd565b91505092915050565b5f819050919050565b61162e8161161c565b82525050565b5f6020820190506116475f830184611625565b92915050565b6116568161161c565b8114611660575f80fd5b50565b5f813590506116718161164d565b92915050565b5f805f6060848603121561168e5761168d611593565b5b5f61169b868287016115dd565b93505060206116ac868287016115dd565b92505060406116bd86828701611663565b9150509250925092565b5f8115159050919050565b6116db816116c7565b82525050565b5f6020820190506116f45f8301846116d2565b92915050565b5f6020828403121561170f5761170e611593565b5b5f61171c84828501611663565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561175c578082015181840152602081019050611741565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61178182611725565b61178b818561172f565b935061179b81856020860161173f565b6117a481611767565b840191505092915050565b5f6040820190506117c25f8301856116d2565b81810360208301526117d48184611777565b90509392505050565b5f80604083850312156117f3576117f2611593565b5b5f61180085828601611663565b9250506020611811858286016115dd565b9150509250929050565b5f805f806080858703121561183357611832611593565b5b5f61184087828801611663565b9450506020611851878288016115dd565b9350506040611862878288016115dd565b925050606061187387828801611663565b91505092959194509250565b5f806040838503121561189557611894611593565b5b5f6118a2858286016115dd565b92505060206118b385828601611663565b9150509250929050565b5f819050919050565b5f6118e06118db6118d684611597565b6118bd565b611597565b9050919050565b5f6118f1826118c6565b9050919050565b5f611902826118e7565b9050919050565b611912816118f8565b82525050565b5f60208201905061192b5f830184611909565b92915050565b61193a816116c7565b8114611944575f80fd5b50565b5f8135905061195581611931565b92915050565b5f602082840312156119705761196f611593565b5b5f61197d84828501611947565b91505092915050565b5f805f6060848603121561199d5761199c611593565b5b5f6119aa86828701611663565b93505060206119bb868287016115dd565b92505060406119cc868287016115dd565b9150509250925092565b6119df816115b6565b82525050565b5f6020820190506119f85f8301846119d6565b92915050565b5f606082019050611a115f8301866119d6565b611a1e60208301856119d6565b611a2b6040830184611625565b949350505050565b5f81519050611a4181611931565b92915050565b5f60208284031215611a5c57611a5b611593565b5b5f611a6984828501611a33565b91505092915050565b5f81519050611a808161164d565b92915050565b5f60208284031215611a9b57611a9a611593565b5b5f611aa884828501611a72565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611ae88261161c565b9150611af38361161c565b9250828203905081811115611b0b57611b0a611ab1565b5b92915050565b5f604082019050611b245f830185611625565b611b3160208301846119d6565b9392505050565b5f608082019050611b4b5f830187611625565b611b5860208301866119d6565b611b6560408301856119d6565b611b726060830184611625565b95945050505050565b5f604082019050611b8e5f8301856119d6565b611b9b6020830184611625565b9392505050565b5f81905092915050565b5f611bb682611725565b611bc08185611ba2565b9350611bd081856020860161173f565b80840191505092915050565b5f611be78284611bac565b915081905092915050565b5f82825260208201905092915050565b7f2173656c660000000000000000000000000000000000000000000000000000005f82015250565b5f611c36600583611bf2565b9150611c4182611c02565b602082019050919050565b5f6020820190508181035f830152611c6381611c2a565b9050919050565b5f611c748261161c565b9150611c7f8361161c565b9250828201905080821115611c9757611c96611ab1565b5b92915050565b5f611ca78261161c565b9150611cb28361161c565b9250828202611cc08161161c565b91508282048414831517611cd757611cd6611ab1565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f611d158261161c565b9150611d208361161c565b925082611d3057611d2f611cde565b5b828204905092915050565b7f6865616c7468436865636b0000000000000000000000000000000000000000005f82015250565b5f611d6f600b83611bf2565b9150611d7a82611d3b565b602082019050919050565b5f6020820190508181035f830152611d9c81611d63565b9050919050565b7f217a65726f2070726f66697400000000000000000000000000000000000000005f82015250565b5f611dd7600c83611bf2565b9150611de282611da3565b602082019050919050565b5f6020820190508181035f830152611e0481611dcb565b9050919050565b7f21746f6f206869676800000000000000000000000000000000000000000000005f82015250565b5f611e3f600983611bf2565b9150611e4a82611e0b565b602082019050919050565b5f6020820190508181035f830152611e6c81611e33565b9050919050565b7f216c6f7373206c696d69740000000000000000000000000000000000000000005f82015250565b5f611ea7600b83611bf2565b9150611eb282611e73565b602082019050919050565b5f6020820190508181035f830152611ed481611e9b565b905091905056fea2646970667358221220146c55a183bf0bb8c96d1500d26745455dd7745811eb7ab834cd5efe2b1ace7764736f6c63430008170033a2646970667358221220da9fdac7d7a6d588d050fde162869c25df623a1c8d2377251c41d435c6b2efc064736f6c63430008170033000000000000000000000000f190bba1f5db12ac0a3ee65adbf5bfe52ed2f4a7" - } - ], - "isFixedGasLimit": false - }, - { - "hash": "0x5d148264ea091160f6cc99dc791a20240d9497d87380faca3503bb5fe04e9721", - "transactionType": "CALL", - "contractName": null, - "contractAddress": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "function": "deployCreate2(bytes32,bytes)", - "arguments": [ - "0x0000000000000000000000000000000000000000000000000000000000001069", - "0x6108705150346100a25760206108cd5f395f518060a01c6100a25760405260206108ed5f395f518060a01c6100a257606052602061090d5f395f518060a01c6100a257608052602061092d5f395f518060a01c6100a25760a052602061094d5f395f518060a01c6100a25760c0526040516107f052606051610810526080516108305260a0516108505260c051610870526107f06100a661000039610890610000f35b5f80fd5f3560e01c60026005820660011b6107e601601e395f51565b63a8d18a8181186107de57610244361034176107e2576004358060a01c6107e2576040526024358060a01c6107e2576060526044358060a01c6107e2576080526101e0606460a037336102c052610260516102e052606051610300526040516103205260806102a0526102a0805160208201209050610280527f602d3d8160093d39f3363d3d373d3d3d363d73000000000000000000000000006102c05260206107f05f395f5160601b6102d3527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006102e7526102805160366102c05ff580610103573d5f5f3e3d5ffd5b6102a0527f602d3d8160093d39f3363d3d373d3d3d363d73000000000000000000000000006102e05260206108105f395f5160601b6102f3527f5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000610307526102805160366102e05ff580610179573d5f5f3e3d5ffd5b6102c0527f602d3d8160093d39f3363d3d373d3d3d363d73000000000000000000000000006103005260206108305f395f5160601b610313527f5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000610327526102805160366103005ff5806101ef573d5f5f3e3d5ffd5b6102e0527f602d3d8160093d39f3363d3d373d3d3d363d73000000000000000000000000006103205260206108505f395f5160601b610333527f5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000610347526102805160366103205ff580610265573d5f5f3e3d5ffd5b610300526060516395d89b41610360526060610360600461037c845afa61028e573d5f5f3e3d5ffd5b3d606081183d60601002188061036001610380116107e2576103606103605161036001106107e25761036051610360018051826103600182516020018301116107e257602081116107e257506040816103e05e50506103e090506040816103205e506040516395d89b416103a05260606103a060046103bc845afa610315573d5f5f3e3d5ffd5b3d606081183d6060100218806103a0016103c0116107e2576103a06103a0516103a001106107e2576103a0516103a0018051826103a00182516020018301116107e257602081116107e257506040816104205e505061042090506040816103605e505f6005610420527f466c65782000000000000000000000000000000000000000000000000000000061044052610420805160208201836105000181518152505080830192505050610320518161050001610340518152508082019150506001610460527f2f00000000000000000000000000000000000000000000000000000000000000610480526104608051602082018361050001815181525050808301925050506103605181610500016103805181525080820191505060076104a0527f204c656e646572000000000000000000000000000000000000000000000000006104c0526104a0805160208201836105000181518152505080830192505050806104e0526104e09050606d816103a05e5060206108705f395f51632e7f138a610440526060604051610460526102a05161048052806104a0528061046001606d6103a0825e8051806020830101601f825f03163682375050601f19601f82516020010116905081015050602061044060e461045c5f855af16104fb573d5f5f3e3d5ffd5b3d602081183d60201002188061044001610460116107e257610440518060a01c6107e2576105405250610540905051610420526102a05163768ee73c6104405261042051610460526102e051610480526080516104a0526102c0516104c052604060406104e05e604060a06105205e60c060e06105605e803b156107e2575f6104406101c461045c5f855af1610593573d5f5f3e3d5ffd5b506102c05163c4d66de8610440526102a05161046052803b156107e2575f610440602461045c5f855af16105c9573d5f5f3e3d5ffd5b506102e051633026b273610440526102a0516104605261042051610480526080516104a052610300516104c052604060406104e05e60606101a06105205e803b156107e2575f61044061012461045c5f855af1610628573d5f5f3e3d5ffd5b5061030051633aa4b4d7610440526102e05161046052604051610480526060516104a052610200516104c05260406102206104e05e803b156107e2575f61044060c461045c5f855af161067d573d5f5f3e3d5ffd5b506102a051337f0c527fa5031da3f8c5bc57d08f87bbef1ce3ba8e01ea1a1612157a53905f113b60606102c06104405e610420516104a0526080610440a360806102a06104405e610420516104c05260a0610440f35b63a96e874d81186107de57346107e25760206107f060403960206040f35b63bf9a09da811861070f57346107e257602061081060403960206040f35b635c87416481186107de57346107e257602061083060403960206040f35b6363779c74811861074b57346107e257602061085060403960206040f35b63ffa1ad7481186107de57346107e25760208060805260056040527f312e302e30000000000000000000000000000000000000000000000000000000606052604081608001602582825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506080f35b63a27e679381186107de57346107e257602061087060403960206040f35b5f5ffd5b5f80fd072d06d306f107c000188558206ac9dae1c53cd6af4ed16a690a418405e3b6f39e0e6b1ea1e47f8ef5a05c559a1907f0810a18a0a1657679706572830004030037000000000000000000000000f87d5d598c08a84a9e1fd32d9d6362eabd2f3e110000000000000000000000009926f9e7f53b07047b584efe96800486f929650e0000000000000000000000009ef894c5ddc316a36d17310e8433c39fa78056c30000000000000000000000006403a3b5b8f9f972a629c7ad945b642f5eff2d940000000000000000000000007c64a2c59bf66456c97775f161d7e67d7d2f87ab" - ], - "transaction": { - "from": "0x000005281a2b04a182085d37cc9e6dd552795caa", - "to": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "gas": "0x1b6af8", - "value": "0x0", - "input": "0x2630766800000000000000000000000000000000000000000000000000000000000010690000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000096d6108705150346100a25760206108cd5f395f518060a01c6100a25760405260206108ed5f395f518060a01c6100a257606052602061090d5f395f518060a01c6100a257608052602061092d5f395f518060a01c6100a25760a052602061094d5f395f518060a01c6100a25760c0526040516107f052606051610810526080516108305260a0516108505260c051610870526107f06100a661000039610890610000f35b5f80fd5f3560e01c60026005820660011b6107e601601e395f51565b63a8d18a8181186107de57610244361034176107e2576004358060a01c6107e2576040526024358060a01c6107e2576060526044358060a01c6107e2576080526101e0606460a037336102c052610260516102e052606051610300526040516103205260806102a0526102a0805160208201209050610280527f602d3d8160093d39f3363d3d373d3d3d363d73000000000000000000000000006102c05260206107f05f395f5160601b6102d3527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006102e7526102805160366102c05ff580610103573d5f5f3e3d5ffd5b6102a0527f602d3d8160093d39f3363d3d373d3d3d363d73000000000000000000000000006102e05260206108105f395f5160601b6102f3527f5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000610307526102805160366102e05ff580610179573d5f5f3e3d5ffd5b6102c0527f602d3d8160093d39f3363d3d373d3d3d363d73000000000000000000000000006103005260206108305f395f5160601b610313527f5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000610327526102805160366103005ff5806101ef573d5f5f3e3d5ffd5b6102e0527f602d3d8160093d39f3363d3d373d3d3d363d73000000000000000000000000006103205260206108505f395f5160601b610333527f5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000610347526102805160366103205ff580610265573d5f5f3e3d5ffd5b610300526060516395d89b41610360526060610360600461037c845afa61028e573d5f5f3e3d5ffd5b3d606081183d60601002188061036001610380116107e2576103606103605161036001106107e25761036051610360018051826103600182516020018301116107e257602081116107e257506040816103e05e50506103e090506040816103205e506040516395d89b416103a05260606103a060046103bc845afa610315573d5f5f3e3d5ffd5b3d606081183d6060100218806103a0016103c0116107e2576103a06103a0516103a001106107e2576103a0516103a0018051826103a00182516020018301116107e257602081116107e257506040816104205e505061042090506040816103605e505f6005610420527f466c65782000000000000000000000000000000000000000000000000000000061044052610420805160208201836105000181518152505080830192505050610320518161050001610340518152508082019150506001610460527f2f00000000000000000000000000000000000000000000000000000000000000610480526104608051602082018361050001815181525050808301925050506103605181610500016103805181525080820191505060076104a0527f204c656e646572000000000000000000000000000000000000000000000000006104c0526104a0805160208201836105000181518152505080830192505050806104e0526104e09050606d816103a05e5060206108705f395f51632e7f138a610440526060604051610460526102a05161048052806104a0528061046001606d6103a0825e8051806020830101601f825f03163682375050601f19601f82516020010116905081015050602061044060e461045c5f855af16104fb573d5f5f3e3d5ffd5b3d602081183d60201002188061044001610460116107e257610440518060a01c6107e2576105405250610540905051610420526102a05163768ee73c6104405261042051610460526102e051610480526080516104a0526102c0516104c052604060406104e05e604060a06105205e60c060e06105605e803b156107e2575f6104406101c461045c5f855af1610593573d5f5f3e3d5ffd5b506102c05163c4d66de8610440526102a05161046052803b156107e2575f610440602461045c5f855af16105c9573d5f5f3e3d5ffd5b506102e051633026b273610440526102a0516104605261042051610480526080516104a052610300516104c052604060406104e05e60606101a06105205e803b156107e2575f61044061012461045c5f855af1610628573d5f5f3e3d5ffd5b5061030051633aa4b4d7610440526102e05161046052604051610480526060516104a052610200516104c05260406102206104e05e803b156107e2575f61044060c461045c5f855af161067d573d5f5f3e3d5ffd5b506102a051337f0c527fa5031da3f8c5bc57d08f87bbef1ce3ba8e01ea1a1612157a53905f113b60606102c06104405e610420516104a0526080610440a360806102a06104405e610420516104c05260a0610440f35b63a96e874d81186107de57346107e25760206107f060403960206040f35b63bf9a09da811861070f57346107e257602061081060403960206040f35b635c87416481186107de57346107e257602061083060403960206040f35b6363779c74811861074b57346107e257602061085060403960206040f35b63ffa1ad7481186107de57346107e25760208060805260056040527f312e302e30000000000000000000000000000000000000000000000000000000606052604081608001602582825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506080f35b63a27e679381186107de57346107e257602061087060403960206040f35b5f5ffd5b5f80fd072d06d306f107c000188558206ac9dae1c53cd6af4ed16a690a418405e3b6f39e0e6b1ea1e47f8ef5a05c559a1907f0810a18a0a1657679706572830004030037000000000000000000000000f87d5d598c08a84a9e1fd32d9d6362eabd2f3e110000000000000000000000009926f9e7f53b07047b584efe96800486f929650e0000000000000000000000009ef894c5ddc316a36d17310e8433c39fa78056c30000000000000000000000006403a3b5b8f9f972a629c7ad945b642f5eff2d940000000000000000000000007c64a2c59bf66456c97775f161d7e67d7d2f87ab00000000000000000000000000000000000000", - "nonce": "0x1e", - "chainId": "0x1" - }, - "additionalContracts": [ - { - "transactionType": "CREATE2", - "contractName": "factory", - "address": "0x7488ccbe472267398420f62673926343a32a27b7", - "initCode": "0x6108705150346100a25760206108cd5f395f518060a01c6100a25760405260206108ed5f395f518060a01c6100a257606052602061090d5f395f518060a01c6100a257608052602061092d5f395f518060a01c6100a25760a052602061094d5f395f518060a01c6100a25760c0526040516107f052606051610810526080516108305260a0516108505260c051610870526107f06100a661000039610890610000f35b5f80fd5f3560e01c60026005820660011b6107e601601e395f51565b63a8d18a8181186107de57610244361034176107e2576004358060a01c6107e2576040526024358060a01c6107e2576060526044358060a01c6107e2576080526101e0606460a037336102c052610260516102e052606051610300526040516103205260806102a0526102a0805160208201209050610280527f602d3d8160093d39f3363d3d373d3d3d363d73000000000000000000000000006102c05260206107f05f395f5160601b6102d3527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006102e7526102805160366102c05ff580610103573d5f5f3e3d5ffd5b6102a0527f602d3d8160093d39f3363d3d373d3d3d363d73000000000000000000000000006102e05260206108105f395f5160601b6102f3527f5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000610307526102805160366102e05ff580610179573d5f5f3e3d5ffd5b6102c0527f602d3d8160093d39f3363d3d373d3d3d363d73000000000000000000000000006103005260206108305f395f5160601b610313527f5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000610327526102805160366103005ff5806101ef573d5f5f3e3d5ffd5b6102e0527f602d3d8160093d39f3363d3d373d3d3d363d73000000000000000000000000006103205260206108505f395f5160601b610333527f5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000610347526102805160366103205ff580610265573d5f5f3e3d5ffd5b610300526060516395d89b41610360526060610360600461037c845afa61028e573d5f5f3e3d5ffd5b3d606081183d60601002188061036001610380116107e2576103606103605161036001106107e25761036051610360018051826103600182516020018301116107e257602081116107e257506040816103e05e50506103e090506040816103205e506040516395d89b416103a05260606103a060046103bc845afa610315573d5f5f3e3d5ffd5b3d606081183d6060100218806103a0016103c0116107e2576103a06103a0516103a001106107e2576103a0516103a0018051826103a00182516020018301116107e257602081116107e257506040816104205e505061042090506040816103605e505f6005610420527f466c65782000000000000000000000000000000000000000000000000000000061044052610420805160208201836105000181518152505080830192505050610320518161050001610340518152508082019150506001610460527f2f00000000000000000000000000000000000000000000000000000000000000610480526104608051602082018361050001815181525050808301925050506103605181610500016103805181525080820191505060076104a0527f204c656e646572000000000000000000000000000000000000000000000000006104c0526104a0805160208201836105000181518152505080830192505050806104e0526104e09050606d816103a05e5060206108705f395f51632e7f138a610440526060604051610460526102a05161048052806104a0528061046001606d6103a0825e8051806020830101601f825f03163682375050601f19601f82516020010116905081015050602061044060e461045c5f855af16104fb573d5f5f3e3d5ffd5b3d602081183d60201002188061044001610460116107e257610440518060a01c6107e2576105405250610540905051610420526102a05163768ee73c6104405261042051610460526102e051610480526080516104a0526102c0516104c052604060406104e05e604060a06105205e60c060e06105605e803b156107e2575f6104406101c461045c5f855af1610593573d5f5f3e3d5ffd5b506102c05163c4d66de8610440526102a05161046052803b156107e2575f610440602461045c5f855af16105c9573d5f5f3e3d5ffd5b506102e051633026b273610440526102a0516104605261042051610480526080516104a052610300516104c052604060406104e05e60606101a06105205e803b156107e2575f61044061012461045c5f855af1610628573d5f5f3e3d5ffd5b5061030051633aa4b4d7610440526102e05161046052604051610480526060516104a052610200516104c05260406102206104e05e803b156107e2575f61044060c461045c5f855af161067d573d5f5f3e3d5ffd5b506102a051337f0c527fa5031da3f8c5bc57d08f87bbef1ce3ba8e01ea1a1612157a53905f113b60606102c06104405e610420516104a0526080610440a360806102a06104405e610420516104c05260a0610440f35b63a96e874d81186107de57346107e25760206107f060403960206040f35b63bf9a09da811861070f57346107e257602061081060403960206040f35b635c87416481186107de57346107e257602061083060403960206040f35b6363779c74811861074b57346107e257602061085060403960206040f35b63ffa1ad7481186107de57346107e25760208060805260056040527f312e302e30000000000000000000000000000000000000000000000000000000606052604081608001602582825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506080f35b63a27e679381186107de57346107e257602061087060403960206040f35b5f5ffd5b5f80fd072d06d306f107c000188558206ac9dae1c53cd6af4ed16a690a418405e3b6f39e0e6b1ea1e47f8ef5a05c559a1907f0810a18a0a1657679706572830004030037000000000000000000000000f87d5d598c08a84a9e1fd32d9d6362eabd2f3e110000000000000000000000009926f9e7f53b07047b584efe96800486f929650e0000000000000000000000009ef894c5ddc316a36d17310e8433c39fa78056c30000000000000000000000006403a3b5b8f9f972a629c7ad945b642f5eff2d940000000000000000000000007c64a2c59bf66456c97775f161d7e67d7d2f87ab" - } - ], - "isFixedGasLimit": false - }, - { - "hash": "0xcfd79178ac3f65debf08311c8fb6b7a26a196853cc80c7f035a835fff47ac02b", - "transactionType": "CALL", - "contractName": null, - "contractAddress": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "function": "deployCreate2(bytes32,bytes)", - "arguments": [ - "0x0000000000000000000000000000000000000000000000000000000000001069", - "0x61076c5150346100365760206107de5f395f518060a01c6100365760405260405161076c5261076c61003a6100003961078c610000f35b5f80fd5f3560e01c6002600d820660011b61075201601e395f51565b637a520daa8118610080573461074e57602080604052806040015f5f548083528060051b5f82640100000000811161074e57801561006c57905b80600101548160051b602088010152600101818118610052575b505082016020019150509050810190506040f35b63de490aca811861073e573461074e57602061076c60403960206040f35b63b1315e8e81186101545760443610341761074e576004358060a01c61074e576080526024358060a01c61074e5760a0526040608060405e6100e060e0610742565b60e05160c05260208060e05264010000000260c0516020525f5260405f208160e0015f82548083528060051b5f82640100000000811161074e57801561013e57905b806001880101548160051b602088010152600101818118610122575b50508201602001915050905090508101905060e0f35b63b1283e77811861073e5760243610341761074e576004355f5481101561074e576001015460405260206040f35b636b78af48811861073e573461074e575f5460405260206040f35b63eb8bfec1811861073e5760443610341761074e576004358060a01c61074e576080526024358060a01c61074e5760a0526040608060405e6101df60e0610742565b60e05160c05264010000000260c0516020525f5260405f205460e052602060e0f35b63a07fd947811861073e5760443610341761074e575f60c05261023b565b63fbc4ca6981186102a15760643610341761074e5760443560c0525b6004358060a01c61074e576080526024358060a01c61074e5760a0526040608060405e610269610100610742565b6101005160e05264010000000260e0516020525f5260405f2060c051815481101561074e576001820101905054610100526020610100f35b63ffa1ad74811861073e573461074e5760208060805260056040527f312e302e30000000000000000000000000000000000000000000000000000000606052604081608001602582825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506080f35b636ea5511f81186105905760243610341761074e576004358060a01c61074e57608052602061076c5f395f513318156103bc5760208061010052600960a0527f626164206461646479000000000000000000000000000000000000000000000060c05260a08161010001602982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060e0528060040160fcfd5b6401000000016080516020525f5260405f2054156104475760208061010052600660a0527f21656d707479000000000000000000000000000000000000000000000000000060c05260a08161010001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060e0528060040160fcfd5b5f5463ffffffff811161074e576080518160010155600181015f555060016401000000016080516020525f5260405f2055608051634e530b4260c052602060c0600460dc845afa61049a573d5f5f3e3d5ffd5b3d602081183d60201002188060c00160e01161074e5760c0518060a01c61074e57610100525061010090505160a052608051632621db2f60e052602060e0600460fc845afa6104eb573d5f5f3e3d5ffd5b3d602081183d60201002188060e0016101001161074e5760e0518060a01c61074e57610120525061012090505160c052604060a060405e61052d610100610742565b6101005160e05264010000000260e0516020525f5260405f20805463ffffffff811161074e576080518160018401015560018101825550506080517fff9a26cbbdd44f5822f8f50aa2a27f542bf2cad9d030a34da3a9d3b8f8d2e99c5f610100a2005b633c242d40811861073e5760243610341761074e576004358060a01c61074e576040526401000000016040516020525f5260405f205460605260206060f35b63d100dab3811861073e5760243610341761074e576004358060a01c61074e57604052602061076c5f395f513318156106735760208060c05260096060527f626164206461646479000000000000000000000000000000000000000000000060805260608160c001602982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b60016401000000016040516020525f5260405f205418156106ff5760208060c05260096060527f21454e444f52534544000000000000000000000000000000000000000000000060805260608160c001602982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b60026401000000016040516020525f5260405f20556040517f29154439b5baa56433a55e57a85a624cc06f409c245aa5e5ff25d5e5e169ef1c5f6060a2005b5f5ffd5b60605160405118815250565b5f80fd0316073e073e073e02010018021f073e0182073e05cf019d009e855820e042d8b7aa6423002798176b333bc0d3acd2b005adee16975e3fa3b9771a4adb19076c81181a1820a1657679706572830004030038000000000000000000000000f190bba1f5db12ac0a3ee65adbf5bfe52ed2f4a7" - ], - "transaction": { - "from": "0x000005281a2b04a182085d37cc9e6dd552795caa", - "to": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "gas": "0x171f15", - "value": "0x0", - "input": "0x263076680000000000000000000000000000000000000000000000000000000000001069000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000007fe61076c5150346100365760206107de5f395f518060a01c6100365760405260405161076c5261076c61003a6100003961078c610000f35b5f80fd5f3560e01c6002600d820660011b61075201601e395f51565b637a520daa8118610080573461074e57602080604052806040015f5f548083528060051b5f82640100000000811161074e57801561006c57905b80600101548160051b602088010152600101818118610052575b505082016020019150509050810190506040f35b63de490aca811861073e573461074e57602061076c60403960206040f35b63b1315e8e81186101545760443610341761074e576004358060a01c61074e576080526024358060a01c61074e5760a0526040608060405e6100e060e0610742565b60e05160c05260208060e05264010000000260c0516020525f5260405f208160e0015f82548083528060051b5f82640100000000811161074e57801561013e57905b806001880101548160051b602088010152600101818118610122575b50508201602001915050905090508101905060e0f35b63b1283e77811861073e5760243610341761074e576004355f5481101561074e576001015460405260206040f35b636b78af48811861073e573461074e575f5460405260206040f35b63eb8bfec1811861073e5760443610341761074e576004358060a01c61074e576080526024358060a01c61074e5760a0526040608060405e6101df60e0610742565b60e05160c05264010000000260c0516020525f5260405f205460e052602060e0f35b63a07fd947811861073e5760443610341761074e575f60c05261023b565b63fbc4ca6981186102a15760643610341761074e5760443560c0525b6004358060a01c61074e576080526024358060a01c61074e5760a0526040608060405e610269610100610742565b6101005160e05264010000000260e0516020525f5260405f2060c051815481101561074e576001820101905054610100526020610100f35b63ffa1ad74811861073e573461074e5760208060805260056040527f312e302e30000000000000000000000000000000000000000000000000000000606052604081608001602582825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506080f35b636ea5511f81186105905760243610341761074e576004358060a01c61074e57608052602061076c5f395f513318156103bc5760208061010052600960a0527f626164206461646479000000000000000000000000000000000000000000000060c05260a08161010001602982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060e0528060040160fcfd5b6401000000016080516020525f5260405f2054156104475760208061010052600660a0527f21656d707479000000000000000000000000000000000000000000000000000060c05260a08161010001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060e0528060040160fcfd5b5f5463ffffffff811161074e576080518160010155600181015f555060016401000000016080516020525f5260405f2055608051634e530b4260c052602060c0600460dc845afa61049a573d5f5f3e3d5ffd5b3d602081183d60201002188060c00160e01161074e5760c0518060a01c61074e57610100525061010090505160a052608051632621db2f60e052602060e0600460fc845afa6104eb573d5f5f3e3d5ffd5b3d602081183d60201002188060e0016101001161074e5760e0518060a01c61074e57610120525061012090505160c052604060a060405e61052d610100610742565b6101005160e05264010000000260e0516020525f5260405f20805463ffffffff811161074e576080518160018401015560018101825550506080517fff9a26cbbdd44f5822f8f50aa2a27f542bf2cad9d030a34da3a9d3b8f8d2e99c5f610100a2005b633c242d40811861073e5760243610341761074e576004358060a01c61074e576040526401000000016040516020525f5260405f205460605260206060f35b63d100dab3811861073e5760243610341761074e576004358060a01c61074e57604052602061076c5f395f513318156106735760208060c05260096060527f626164206461646479000000000000000000000000000000000000000000000060805260608160c001602982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b60016401000000016040516020525f5260405f205418156106ff5760208060c05260096060527f21454e444f52534544000000000000000000000000000000000000000000000060805260608160c001602982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b60026401000000016040516020525f5260405f20556040517f29154439b5baa56433a55e57a85a624cc06f409c245aa5e5ff25d5e5e169ef1c5f6060a2005b5f5ffd5b60605160405118815250565b5f80fd0316073e073e073e02010018021f073e0182073e05cf019d009e855820e042d8b7aa6423002798176b333bc0d3acd2b005adee16975e3fa3b9771a4adb19076c81181a1820a1657679706572830004030038000000000000000000000000f190bba1f5db12ac0a3ee65adbf5bfe52ed2f4a70000", - "nonce": "0x1f", - "chainId": "0x1" - }, - "additionalContracts": [ - { - "transactionType": "CREATE2", - "contractName": "registry", - "address": "0x686725e618742071d52966e90ca4727b506bc5f1", - "initCode": "0x61076c5150346100365760206107de5f395f518060a01c6100365760405260405161076c5261076c61003a6100003961078c610000f35b5f80fd5f3560e01c6002600d820660011b61075201601e395f51565b637a520daa8118610080573461074e57602080604052806040015f5f548083528060051b5f82640100000000811161074e57801561006c57905b80600101548160051b602088010152600101818118610052575b505082016020019150509050810190506040f35b63de490aca811861073e573461074e57602061076c60403960206040f35b63b1315e8e81186101545760443610341761074e576004358060a01c61074e576080526024358060a01c61074e5760a0526040608060405e6100e060e0610742565b60e05160c05260208060e05264010000000260c0516020525f5260405f208160e0015f82548083528060051b5f82640100000000811161074e57801561013e57905b806001880101548160051b602088010152600101818118610122575b50508201602001915050905090508101905060e0f35b63b1283e77811861073e5760243610341761074e576004355f5481101561074e576001015460405260206040f35b636b78af48811861073e573461074e575f5460405260206040f35b63eb8bfec1811861073e5760443610341761074e576004358060a01c61074e576080526024358060a01c61074e5760a0526040608060405e6101df60e0610742565b60e05160c05264010000000260c0516020525f5260405f205460e052602060e0f35b63a07fd947811861073e5760443610341761074e575f60c05261023b565b63fbc4ca6981186102a15760643610341761074e5760443560c0525b6004358060a01c61074e576080526024358060a01c61074e5760a0526040608060405e610269610100610742565b6101005160e05264010000000260e0516020525f5260405f2060c051815481101561074e576001820101905054610100526020610100f35b63ffa1ad74811861073e573461074e5760208060805260056040527f312e302e30000000000000000000000000000000000000000000000000000000606052604081608001602582825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506080f35b636ea5511f81186105905760243610341761074e576004358060a01c61074e57608052602061076c5f395f513318156103bc5760208061010052600960a0527f626164206461646479000000000000000000000000000000000000000000000060c05260a08161010001602982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060e0528060040160fcfd5b6401000000016080516020525f5260405f2054156104475760208061010052600660a0527f21656d707479000000000000000000000000000000000000000000000000000060c05260a08161010001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060e0528060040160fcfd5b5f5463ffffffff811161074e576080518160010155600181015f555060016401000000016080516020525f5260405f2055608051634e530b4260c052602060c0600460dc845afa61049a573d5f5f3e3d5ffd5b3d602081183d60201002188060c00160e01161074e5760c0518060a01c61074e57610100525061010090505160a052608051632621db2f60e052602060e0600460fc845afa6104eb573d5f5f3e3d5ffd5b3d602081183d60201002188060e0016101001161074e5760e0518060a01c61074e57610120525061012090505160c052604060a060405e61052d610100610742565b6101005160e05264010000000260e0516020525f5260405f20805463ffffffff811161074e576080518160018401015560018101825550506080517fff9a26cbbdd44f5822f8f50aa2a27f542bf2cad9d030a34da3a9d3b8f8d2e99c5f610100a2005b633c242d40811861073e5760243610341761074e576004358060a01c61074e576040526401000000016040516020525f5260405f205460605260206060f35b63d100dab3811861073e5760243610341761074e576004358060a01c61074e57604052602061076c5f395f513318156106735760208060c05260096060527f626164206461646479000000000000000000000000000000000000000000000060805260608160c001602982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b60016401000000016040516020525f5260405f205418156106ff5760208060c05260096060527f21454e444f52534544000000000000000000000000000000000000000000000060805260608160c001602982825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b60026401000000016040516020525f5260405f20556040517f29154439b5baa56433a55e57a85a624cc06f409c245aa5e5ff25d5e5e169ef1c5f6060a2005b5f5ffd5b60605160405118815250565b5f80fd0316073e073e073e02010018021f073e0182073e05cf019d009e855820e042d8b7aa6423002798176b333bc0d3acd2b005adee16975e3fa3b9771a4adb19076c81181a1820a1657679706572830004030038000000000000000000000000f190bba1f5db12ac0a3ee65adbf5bfe52ed2f4a7" - } - ], - "isFixedGasLimit": false - }, - { - "hash": "0x476543912fe11f672a2f15989863eca0acb509edd4a4d81212a61a293c42bcac", - "transactionType": "CALL", - "contractName": null, - "contractAddress": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "function": "deployCreate2(bytes32,bytes)", - "arguments": [ - "0xf940cfcb609b6ab5cfe94a2fb6caa9b0f8ebc82d3b49578fe3c1c513df9b3ab1", - "0x608060405234801561000f575f80fd5b506109188061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c806306fdde03146100385780632d9e85bd14610056575b5f80fd5b610040610086565b60405161004d91906103e2565b60405180910390f35b610070600480360381019061006b9190610493565b6100bf565b60405161007d91906104e9565b60405180910390f35b6040518060400160405280601f81526020017f466c6578204c656e64657220537472617465677920415052204f7261636c650081525081565b5f808390505f8173ffffffffffffffffffffffffffffffffffffffff1663a96e874d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561010e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610132919061053d565b73ffffffffffffffffffffffffffffffffffffffff1663fac7aae56040518163ffffffff1660e01b8152600401602060405180830381865afa15801561017a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061019e9190610592565b90505f81036101b1575f92505050610352565b5f848373ffffffffffffffffffffffffffffffffffffffff166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101fc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102209190610592565b61022a91906105ea565b90505f810361023e575f9350505050610352565b8273ffffffffffffffffffffffffffffffffffffffff166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610287573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102ab919061063f565b73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102f3573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061031791906106a0565b600a61032391906107fa565b8161032e9190610844565b670de0b6b3a7640000836103429190610844565b61034c91906108b2565b93505050505b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561038f578082015181840152602081019050610374565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6103b482610358565b6103be8185610362565b93506103ce818560208601610372565b6103d78161039a565b840191505092915050565b5f6020820190508181035f8301526103fa81846103aa565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61042f82610406565b9050919050565b61043f81610425565b8114610449575f80fd5b50565b5f8135905061045a81610436565b92915050565b5f819050919050565b61047281610460565b811461047c575f80fd5b50565b5f8135905061048d81610469565b92915050565b5f80604083850312156104a9576104a8610402565b5b5f6104b68582860161044c565b92505060206104c78582860161047f565b9150509250929050565b5f819050919050565b6104e3816104d1565b82525050565b5f6020820190506104fc5f8301846104da565b92915050565b5f61050c82610425565b9050919050565b61051c81610502565b8114610526575f80fd5b50565b5f8151905061053781610513565b92915050565b5f6020828403121561055257610551610402565b5b5f61055f84828501610529565b91505092915050565b610571816104d1565b811461057b575f80fd5b50565b5f8151905061058c81610568565b92915050565b5f602082840312156105a7576105a6610402565b5b5f6105b48482850161057e565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6105f482610460565b91506105ff83610460565b92508282019050828112155f8312168382125f841215161715610625576106246105bd565b5b92915050565b5f8151905061063981610436565b92915050565b5f6020828403121561065457610653610402565b5b5f6106618482850161062b565b91505092915050565b5f60ff82169050919050565b61067f8161066a565b8114610689575f80fd5b50565b5f8151905061069a81610676565b92915050565b5f602082840312156106b5576106b4610402565b5b5f6106c28482850161068c565b91505092915050565b5f8160011c9050919050565b5f808291508390505b6001851115610720578086048111156106fc576106fb6105bd565b5b600185161561070b5780820291505b8081029050610719856106cb565b94506106e0565b94509492505050565b5f8261073857600190506107f3565b81610745575f90506107f3565b816001811461075b576002811461076557610794565b60019150506107f3565b60ff841115610777576107766105bd565b5b8360020a91508482111561078e5761078d6105bd565b5b506107f3565b5060208310610133831016604e8410600b84101617156107c95782820a9050838111156107c4576107c36105bd565b5b6107f3565b6107d684848460016106d7565b925090508184048111156107ed576107ec6105bd565b5b81810290505b9392505050565b5f610804826104d1565b915061080f8361066a565b925061083c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484610729565b905092915050565b5f61084e826104d1565b9150610859836104d1565b9250828202610867816104d1565b9150828204841483151761087e5761087d6105bd565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6108bc826104d1565b91506108c7836104d1565b9250826108d7576108d6610885565b5b82820490509291505056fea264697066735822122078887d45f5b32b89b6d1c1d4ee3ff19dd951e4a8d6f3ee7e33e1885a656f9bad64736f6c63430008170033" - ], - "transaction": { - "from": "0x000005281a2b04a182085d37cc9e6dd552795caa", - "to": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "gas": "0x1cec75", - "value": "0x0", - "input": "0x26307668f940cfcb609b6ab5cfe94a2fb6caa9b0f8ebc82d3b49578fe3c1c513df9b3ab100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000935608060405234801561000f575f80fd5b506109188061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c806306fdde03146100385780632d9e85bd14610056575b5f80fd5b610040610086565b60405161004d91906103e2565b60405180910390f35b610070600480360381019061006b9190610493565b6100bf565b60405161007d91906104e9565b60405180910390f35b6040518060400160405280601f81526020017f466c6578204c656e64657220537472617465677920415052204f7261636c650081525081565b5f808390505f8173ffffffffffffffffffffffffffffffffffffffff1663a96e874d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561010e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610132919061053d565b73ffffffffffffffffffffffffffffffffffffffff1663fac7aae56040518163ffffffff1660e01b8152600401602060405180830381865afa15801561017a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061019e9190610592565b90505f81036101b1575f92505050610352565b5f848373ffffffffffffffffffffffffffffffffffffffff166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101fc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102209190610592565b61022a91906105ea565b90505f810361023e575f9350505050610352565b8273ffffffffffffffffffffffffffffffffffffffff166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610287573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102ab919061063f565b73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102f3573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061031791906106a0565b600a61032391906107fa565b8161032e9190610844565b670de0b6b3a7640000836103429190610844565b61034c91906108b2565b93505050505b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561038f578082015181840152602081019050610374565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6103b482610358565b6103be8185610362565b93506103ce818560208601610372565b6103d78161039a565b840191505092915050565b5f6020820190508181035f8301526103fa81846103aa565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61042f82610406565b9050919050565b61043f81610425565b8114610449575f80fd5b50565b5f8135905061045a81610436565b92915050565b5f819050919050565b61047281610460565b811461047c575f80fd5b50565b5f8135905061048d81610469565b92915050565b5f80604083850312156104a9576104a8610402565b5b5f6104b68582860161044c565b92505060206104c78582860161047f565b9150509250929050565b5f819050919050565b6104e3816104d1565b82525050565b5f6020820190506104fc5f8301846104da565b92915050565b5f61050c82610425565b9050919050565b61051c81610502565b8114610526575f80fd5b50565b5f8151905061053781610513565b92915050565b5f6020828403121561055257610551610402565b5b5f61055f84828501610529565b91505092915050565b610571816104d1565b811461057b575f80fd5b50565b5f8151905061058c81610568565b92915050565b5f602082840312156105a7576105a6610402565b5b5f6105b48482850161057e565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6105f482610460565b91506105ff83610460565b92508282019050828112155f8312168382125f841215161715610625576106246105bd565b5b92915050565b5f8151905061063981610436565b92915050565b5f6020828403121561065457610653610402565b5b5f6106618482850161062b565b91505092915050565b5f60ff82169050919050565b61067f8161066a565b8114610689575f80fd5b50565b5f8151905061069a81610676565b92915050565b5f602082840312156106b5576106b4610402565b5b5f6106c28482850161068c565b91505092915050565b5f8160011c9050919050565b5f808291508390505b6001851115610720578086048111156106fc576106fb6105bd565b5b600185161561070b5780820291505b8081029050610719856106cb565b94506106e0565b94509492505050565b5f8261073857600190506107f3565b81610745575f90506107f3565b816001811461075b576002811461076557610794565b60019150506107f3565b60ff841115610777576107766105bd565b5b8360020a91508482111561078e5761078d6105bd565b5b506107f3565b5060208310610133831016604e8410600b84101617156107c95782820a9050838111156107c4576107c36105bd565b5b6107f3565b6107d684848460016106d7565b925090508184048111156107ed576107ec6105bd565b5b81810290505b9392505050565b5f610804826104d1565b915061080f8361066a565b925061083c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484610729565b905092915050565b5f61084e826104d1565b9150610859836104d1565b9250828202610867816104d1565b9150828204841483151761087e5761087d6105bd565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6108bc826104d1565b91506108c7836104d1565b9250826108d7576108d6610885565b5b82820490509291505056fea264697066735822122078887d45f5b32b89b6d1c1d4ee3ff19dd951e4a8d6f3ee7e33e1885a656f9bad64736f6c634300081700330000000000000000000000", - "nonce": "0x20", - "chainId": "0x1" - }, - "additionalContracts": [ - { - "transactionType": "CREATE2", - "contractName": "StrategyAprOracle", - "address": "0xc9691f6a6cf5260035e226da9c9884fa20fe9224", - "initCode": "0x608060405234801561000f575f80fd5b506109188061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c806306fdde03146100385780632d9e85bd14610056575b5f80fd5b610040610086565b60405161004d91906103e2565b60405180910390f35b610070600480360381019061006b9190610493565b6100bf565b60405161007d91906104e9565b60405180910390f35b6040518060400160405280601f81526020017f466c6578204c656e64657220537472617465677920415052204f7261636c650081525081565b5f808390505f8173ffffffffffffffffffffffffffffffffffffffff1663a96e874d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561010e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610132919061053d565b73ffffffffffffffffffffffffffffffffffffffff1663fac7aae56040518163ffffffff1660e01b8152600401602060405180830381865afa15801561017a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061019e9190610592565b90505f81036101b1575f92505050610352565b5f848373ffffffffffffffffffffffffffffffffffffffff166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101fc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102209190610592565b61022a91906105ea565b90505f810361023e575f9350505050610352565b8273ffffffffffffffffffffffffffffffffffffffff166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610287573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102ab919061063f565b73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102f3573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061031791906106a0565b600a61032391906107fa565b8161032e9190610844565b670de0b6b3a7640000836103429190610844565b61034c91906108b2565b93505050505b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561038f578082015181840152602081019050610374565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6103b482610358565b6103be8185610362565b93506103ce818560208601610372565b6103d78161039a565b840191505092915050565b5f6020820190508181035f8301526103fa81846103aa565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61042f82610406565b9050919050565b61043f81610425565b8114610449575f80fd5b50565b5f8135905061045a81610436565b92915050565b5f819050919050565b61047281610460565b811461047c575f80fd5b50565b5f8135905061048d81610469565b92915050565b5f80604083850312156104a9576104a8610402565b5b5f6104b68582860161044c565b92505060206104c78582860161047f565b9150509250929050565b5f819050919050565b6104e3816104d1565b82525050565b5f6020820190506104fc5f8301846104da565b92915050565b5f61050c82610425565b9050919050565b61051c81610502565b8114610526575f80fd5b50565b5f8151905061053781610513565b92915050565b5f6020828403121561055257610551610402565b5b5f61055f84828501610529565b91505092915050565b610571816104d1565b811461057b575f80fd5b50565b5f8151905061058c81610568565b92915050565b5f602082840312156105a7576105a6610402565b5b5f6105b48482850161057e565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6105f482610460565b91506105ff83610460565b92508282019050828112155f8312168382125f841215161715610625576106246105bd565b5b92915050565b5f8151905061063981610436565b92915050565b5f6020828403121561065457610653610402565b5b5f6106618482850161062b565b91505092915050565b5f60ff82169050919050565b61067f8161066a565b8114610689575f80fd5b50565b5f8151905061069a81610676565b92915050565b5f602082840312156106b5576106b4610402565b5b5f6106c28482850161068c565b91505092915050565b5f8160011c9050919050565b5f808291508390505b6001851115610720578086048111156106fc576106fb6105bd565b5b600185161561070b5780820291505b8081029050610719856106cb565b94506106e0565b94509492505050565b5f8261073857600190506107f3565b81610745575f90506107f3565b816001811461075b576002811461076557610794565b60019150506107f3565b60ff841115610777576107766105bd565b5b8360020a91508482111561078e5761078d6105bd565b5b506107f3565b5060208310610133831016604e8410600b84101617156107c95782820a9050838111156107c4576107c36105bd565b5b6107f3565b6107d684848460016106d7565b925090508184048111156107ed576107ec6105bd565b5b81810290505b9392505050565b5f610804826104d1565b915061080f8361066a565b925061083c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484610729565b905092915050565b5f61084e826104d1565b9150610859836104d1565b9250828202610867816104d1565b9150828204841483151761087e5761087d6105bd565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6108bc826104d1565b91506108c7836104d1565b9250826108d7576108d6610885565b5b82820490509291505056fea264697066735822122078887d45f5b32b89b6d1c1d4ee3ff19dd951e4a8d6f3ee7e33e1885a656f9bad64736f6c63430008170033" - } - ], - "isFixedGasLimit": false - }, - { - "hash": "0xe94869cd37e358d8cabc0c66a6ee980f031973ee12851283b84727b6235bf6e1", - "transactionType": "CALL", - "contractName": null, - "contractAddress": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "function": "deployCreate2(bytes32,bytes)", - "arguments": [ - "0xad312f52075d9f2caa16b5cfe186b17700bffda218dab96e862cef1c1969771c", - "0x6102f3610011610000396102f3610000f35f3560e01c60026003820660011b6102ed01601e395f51565b63a89ae3988118610038576064361034176102e9576060366060376100a0565b63190afab681186102e55760a4361034176102e957604060646060375f60a0526100a0565b631c247e248118610083576084361034176102e9576064356060526040366080376100a0565b638f5f953781186102e55760c4361034176102e957606060646060375b6004358060a01c6102e95760405260405163314bee1d60e052602060e0600460fc845afa6100d0573d5f5f3e3d5ffd5b3d602081183d60201002188060e001610100116102e95760e0518060a01c6102e957610120525061012090505160c05260403660e03760c05163f659d4836101205260243561014052604060806101605e6040610120606461013c845afa61013a573d5f5f3e3d5ffd5b60403d106102e95761012090506040816101a05e5060406101a060e05e5f610120525f612710905b806101405260e051156102dc5760605160e05118156102dc576040516387553b7e6102605260e05161028052610100610260602461027c845afa6101a8573d5f5f3e3d5ffd5b3d61010081183d6101001002188061026001610360116102e9578061026001610360116102e95760606102606103805e6102c0518060401c6102e9576103e0526102e0518060401c6102e95761040052610300518060a01c6102e95761042052610320518060a01c6102e95761044052610340518060041c6102e95761046052506103809050610100816101605e506044356101a05110156102dc5761012051604051630ff8afc16102605260e051610280526020610260602461027c845afa610274573d5f5f3e3d5ffd5b60203d106102e9576102609050518082018281106102e957905090506101205260c05163356712146102605260e051610280526020610260602461027c845afa6102c0573d5f5f3e3d5ffd5b60203d106102e95761026090505160e052600101818118610162575b50506020610120f35b5f5ffd5b5f80fd02e5005d0018855820ffcf26fc0049014c374bb7b47355841de2147449989b80cd783b0398ba6b6f331902f3810600a1657679706572830004030036" - ], - "transaction": { - "from": "0x000005281a2b04a182085d37cc9e6dd552795caa", - "to": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "gas": "0xacd5b", - "value": "0x0", - "input": "0x26307668ad312f52075d9f2caa16b5cfe186b17700bffda218dab96e862cef1c1969771c0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000033a6102f3610011610000396102f3610000f35f3560e01c60026003820660011b6102ed01601e395f51565b63a89ae3988118610038576064361034176102e9576060366060376100a0565b63190afab681186102e55760a4361034176102e957604060646060375f60a0526100a0565b631c247e248118610083576084361034176102e9576064356060526040366080376100a0565b638f5f953781186102e55760c4361034176102e957606060646060375b6004358060a01c6102e95760405260405163314bee1d60e052602060e0600460fc845afa6100d0573d5f5f3e3d5ffd5b3d602081183d60201002188060e001610100116102e95760e0518060a01c6102e957610120525061012090505160c05260403660e03760c05163f659d4836101205260243561014052604060806101605e6040610120606461013c845afa61013a573d5f5f3e3d5ffd5b60403d106102e95761012090506040816101a05e5060406101a060e05e5f610120525f612710905b806101405260e051156102dc5760605160e05118156102dc576040516387553b7e6102605260e05161028052610100610260602461027c845afa6101a8573d5f5f3e3d5ffd5b3d61010081183d6101001002188061026001610360116102e9578061026001610360116102e95760606102606103805e6102c0518060401c6102e9576103e0526102e0518060401c6102e95761040052610300518060a01c6102e95761042052610320518060a01c6102e95761044052610340518060041c6102e95761046052506103809050610100816101605e506044356101a05110156102dc5761012051604051630ff8afc16102605260e051610280526020610260602461027c845afa610274573d5f5f3e3d5ffd5b60203d106102e9576102609050518082018281106102e957905090506101205260c05163356712146102605260e051610280526020610260602461027c845afa6102c0573d5f5f3e3d5ffd5b60203d106102e95761026090505160e052600101818118610162575b50506020610120f35b5f5ffd5b5f80fd02e5005d0018855820ffcf26fc0049014c374bb7b47355841de2147449989b80cd783b0398ba6b6f331902f3810600a1657679706572830004030036000000000000", - "nonce": "0x21", - "chainId": "0x1" - }, - "additionalContracts": [ - { - "transactionType": "CREATE2", - "contractName": "debt_in_front_helper", - "address": "0x723241843bc351d87d929cf90d12cd80de661146", - "initCode": "0x6102f3610011610000396102f3610000f35f3560e01c60026003820660011b6102ed01601e395f51565b63a89ae3988118610038576064361034176102e9576060366060376100a0565b63190afab681186102e55760a4361034176102e957604060646060375f60a0526100a0565b631c247e248118610083576084361034176102e9576064356060526040366080376100a0565b638f5f953781186102e55760c4361034176102e957606060646060375b6004358060a01c6102e95760405260405163314bee1d60e052602060e0600460fc845afa6100d0573d5f5f3e3d5ffd5b3d602081183d60201002188060e001610100116102e95760e0518060a01c6102e957610120525061012090505160c05260403660e03760c05163f659d4836101205260243561014052604060806101605e6040610120606461013c845afa61013a573d5f5f3e3d5ffd5b60403d106102e95761012090506040816101a05e5060406101a060e05e5f610120525f612710905b806101405260e051156102dc5760605160e05118156102dc576040516387553b7e6102605260e05161028052610100610260602461027c845afa6101a8573d5f5f3e3d5ffd5b3d61010081183d6101001002188061026001610360116102e9578061026001610360116102e95760606102606103805e6102c0518060401c6102e9576103e0526102e0518060401c6102e95761040052610300518060a01c6102e95761042052610320518060a01c6102e95761044052610340518060041c6102e95761046052506103809050610100816101605e506044356101a05110156102dc5761012051604051630ff8afc16102605260e051610280526020610260602461027c845afa610274573d5f5f3e3d5ffd5b60203d106102e9576102609050518082018281106102e957905090506101205260c05163356712146102605260e051610280526020610260602461027c845afa6102c0573d5f5f3e3d5ffd5b60203d106102e95761026090505160e052600101818118610162575b50506020610120f35b5f5ffd5b5f80fd02e5005d0018855820ffcf26fc0049014c374bb7b47355841de2147449989b80cd783b0398ba6b6f331902f3810600a1657679706572830004030036" - } - ], - "isFixedGasLimit": false - }, - { - "hash": "0x2f0f1791d646f293d4f13a917111b21f6879019facab1c8e0e2bd3b58efcb263", - "transactionType": "CALL", - "contractName": null, - "contractAddress": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "function": "deployCreate2(bytes32,bytes)", - "arguments": [ - "0x4d560702de8e0a6315d03a4ccf86b84b978c45f17ce78215063c735e9e4359c6", - "0x61311d6100116100003961311d610000f35f3560e01c60026003821660011b61311501601e395f51565b6336dd33f78118610508576024361034176131115760043560040180358060a01c613111576101205260208101358060a01c613111576101405260408101356101605260608101356101805260808101356101a05260a08101356101c05260c08101356101e05260e08101356102005261010081013561022052610120810135610240526101408101356102605261016081013561028052610180810135810180358060a01c613111576102a05260208101358101803561271081116131115750602081350180826102c0375050506101a0810135810180358060a01c61311157612a00526020810135810180356127108111613111575060208135018082612a2037505050506101205161019f576020806151c0526006615160527f216f776e6572000000000000000000000000000000000000000000000000000061518052615160816151c001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06151a052806004016151bcfd5b61014051632621db2f615180526020615180600461519c845afa6101c5573d5f5f3e3d5ffd5b3d602081183d602010021880615180016151a01161311157615180518060a01c613111576151c052506151c090505161516052615160516323b872dd61518052336151a052306151c0526101a0516151e0526020615180606461519c5f855af1610231573d5f5f3e3d5ffd5b3d61024857803b1561311157600161520052610272565b3d602081183d602010021880615180016151a01161311157615180518060011c6131115761520052505b6152009050511561311157635cffe9de61a2a05260803061a2c05273f939e0a03fb07f59a73314e73794be0e57ac1b4e61a2e0526101805161a300528061a32052604060016151a052806151c052806151a0016101c06101205182526101405160208301526101605160408301526101805160608301526101a05160808301526101c05160a08301526101e05160c08301526102005160e0830152610220516101008301526102405161012083015261026051610140830152610280516101608301528061018083015280820160406102a051825280602083015280820160206102c05101806102c0835e508051806020830101601f825f03163682375050601f19601f82516020010116905081019050905081019050806101a08301528082016040612a005182528060208301528082016020612a20510180612a20835e508051806020830101601f825f03163682375050601f19601f82516020010116905081019050905081019050905081019050615180526151808161a2c00160208251018083835e508051806020830101601f825f03163682375050601f19601f825160200101169050905081015050602061a2a06151a461a2bc5f7326de7861e213a5351f6ed767d00e0839930e9ee15af161044f573d5f5f3e3d5ffd5b3d602081183d60201002188061a2a00161a2c0116131115761a2a0518060011c6131115761f460525061f46050306151c052610160516151e05260406151a0526151a08051602082012090506151805261014051639c756a4b6151a052615180516151c052610120516151e052803b15613111575f6151a060446151bc5f855af16104dc573d5f5f3e3d5ffd5b5073f939e0a03fb07f59a73314e73794be0e57ac1b4e60405233606052610501611b4b565b6020615180f35b6366a3caeb8118610a9a576024361034176131115760043560040180358060a01c613111576101205260208101358060a01c613111576101405260408101356101605260608101356101805260808101356101a05260a08101356101c05260c08101356101e05260e08101356102005261010081013561022052610120810135810180358060a01c6131115761024052602081013581018035612710811161311157506020813501808261026037505050610140810135810180358060a01c613111576129a05260208101358101803561271081116131115750602081350180826129c037505050506101405161510052615100516387553b7e615220526101605161524052610100615220602461523c845afa610628573d5f5f3e3d5ffd5b3d61010081183d610100100218806152200161532011613111578061522001615320116131115760606152206153405e615280518060401c613111576153a0526152a0518060401c613111576153c0526152c0518060a01c613111576153e0526152e0518060a01c6131115761540052615300518060041c6131115761542052506153409050610100816151205e50336151c051181561073a57602080615280526006615220527f216f776e65720000000000000000000000000000000000000000000000000000615240526152208161528001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0615260528060040161527cfd5b61510051632fdba1f6615220526101605161524052803b15613111575f615220602461523c5f855af161076f573d5f5f3e3d5ffd5b5061510051632621db2f615240526020615240600461525c845afa610796573d5f5f3e3d5ffd5b3d602081183d602010021880615240016152601161311157615240518060a01c613111576152805250615280905051615220526101a0511561085857615220516323b872dd61524052336152605230615280526101a0516152a0526020615240606461525c5f855af161080b573d5f5f3e3d5ffd5b3d61082257803b156131115760016152c05261084c565b3d602081183d602010021880615240016152601161311157615240518060011c613111576152c052505b6152c090505115613111575b635cffe9de61a3005260803061a3205273f939e0a03fb07f59a73314e73794be0e57ac1b4e61a340526101805161a360528061a380526040600461526052806152805280615260016101606101205182526101405160208301526101605160408301526101805160608301526101a05160808301526101c05160a08301526101e05160c08301526102005160e0830152610220516101008301528061012083015280820160406102405182528060208301528082016020610260510180610260835e508051806020830101601f825f03163682375050601f19601f825160200101169050810190509050810190508061014083015280820160406129a051825280602083015280820160206129c05101806129c0835e508051806020830101601f825f03163682375050601f19601f82516020010116905081019050905081019050905081019050615240526152408161a3200160208251018083835e508051806020830101601f825f03163682375050601f19601f825160200101169050905081015050602061a30061514461a31c5f7326de7861e213a5351f6ed767d00e0839930e9ee15af1610a0c573d5f5f3e3d5ffd5b3d602081183d60201002188061a3000161a320116131115761a300518060011c6131115761f460525061f4605061510051639c756a4b6152405261016051615260523361528052803b15613111575f615240604461525c5f855af1610a73573d5f5f3e3d5ffd5b5073f939e0a03fb07f59a73314e73794be0e57ac1b4e60405233606052610a98611b4b565b005b6323e30c8b8118611b475760a436103417613111576004358060a01c6131115762025000526024358060a01c6131115762025020526084356004018035620186a08111613111575060208135018082620250403750507326de7861e213a5351f6ed767d00e0839930e9ee1331815610b8b576020806203d7605260076203d700527f2163616c6c6572000000000000000000000000000000000000000000000000006203d720526203d700816203d76001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06203d74052806004016203d75cfd5b3062025000511815610c16576020806203d76052600a6203d700527f21696e69746961746f72000000000000000000000000000000000000000000006203d720526203d700816203d76001602a82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06203d74052806004016203d75cfd5b73f939e0a03fb07f59a73314e73794be0e57ac1b4e62025020511815610cb5576020806203d7605260066203d700527f21746f6b656e00000000000000000000000000000000000000000000000000006203d720526203d700816203d76001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06203d74052806004016203d75cfd5b600562025040511015610d41576020806203d7605260056203d700527f21646174610000000000000000000000000000000000000000000000000000006203d720526203d700816203d76001602582825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06203d74052806004016203d75cfd5b6044356370a082316203d70052306203d7205260206203d70060246203d71c73f939e0a03fb07f59a73314e73794be0e57ac1b4e5afa610d83573d5f5f3e3d5ffd5b60203d10613111576203d700511015610e15576020806203d7a05260076203d740527f21616d6f756e74000000000000000000000000000000000000000000000000006203d760526203d740816203d7a001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06203d78052806004016203d79cfd5b60643515610e9c576020806203d7605260046203d700527f21666565000000000000000000000000000000000000000000000000000000006203d720526203d700816203d76001602482825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06203d74052806004016203d75cfd5b601f620250405111156131115762025060516203d7405260206203d720526203d720602081511861311157602081018151602083010160208201116131115780518060041c613111576203d76052506203d7609050516203d7005260016203d7005118610f245760443561286052602062025040510180620250406128805e5061102a611caf565b60026203d7005118610f515760443561286052602062025040510180620250406128805e5061102a612214565b60046203d7005118610f7e5760443561286052602062025040510180620250406128805e5061102a6126b2565b60086203d7005118610fab5760443561286052602062025040510180620250406128805e5061102a612c13565b6020806203d78052600a6203d720527f216f7065726174696f6e000000000000000000000000000000000000000000006203d740526203d720816203d78001602a82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06203d76052806004016203d77cfd5b63a9059cbb6203d720527326de7861e213a5351f6ed767d00e0839930e9ee16203d740526044356203d7605260206203d72060446203d73c5f73f939e0a03fb07f59a73314e73794be0e57ac1b4e5af1611086573d5f5f3e3d5ffd5b3d6110b25773f939e0a03fb07f59a73314e73794be0e57ac1b4e3b156131115760016203d780526110e0565b3d602081183d6020100218806203d720016203d74011613111576203d720518060011c613111576203d78052505b6203d7805115613111577f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd96203d7205260206203d720f35b63e5be3bea8118611b47576024361034176131115760043560040180358060a01c613111576101205260208101358060a01c61311157610140526040810135610160526060810135610180526080810135810180358060a01c613111576101a05260208101358101803561271081116131115750602081350180826101c03750505060a0810135810180358060a01c6131115761290052602081013581018035612710811161311157506020813501808261292037505050506101405161506052615060516387553b7e61518052610160516151a052610100615180602461519c845afa611208573d5f5f3e3d5ffd5b3d61010081183d610100100218806151800161528011613111578061518001615280116131115760606151806152a05e6151e0518060401c6131115761530052615200518060401c6131115761532052615220518060a01c6131115761534052615240518060a01c6131115761536052615260518060041c6131115761538052506152a09050610100816150805e503361512051181561131a576020806151e0526006615180527f216f776e657200000000000000000000000000000000000000000000000000006151a052615180816151e001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06151c052806004016151dcfd5b61506051632fdba1f661518052610160516151a052803b15613111575f615180602461519c5f855af161134f573d5f5f3e3d5ffd5b50635cffe9de61a1a05260803061a1c05273f939e0a03fb07f59a73314e73794be0e57ac1b4e61a1e0526101805161a200528061a22052604060026151a052806151c052806151a00160c061012051825261014051602083015261016051604083015261018051606083015280608083015280820160406101a051825280602083015280820160206101c05101806101c0835e508051806020830101601f825f03163682375050601f19601f825160200101169050810190509050810190508060a083015280820160406129005182528060208301528082016020612920510180612920835e508051806020830101601f825f03163682375050601f19601f82516020010116905081019050905081019050905081019050615180526151808161a1c00160208251018083835e508051806020830101601f825f03163682375050601f19601f825160200101169050905081015050602061a1a06150a461a1bc5f7326de7861e213a5351f6ed767d00e0839930e9ee15af16114d3573d5f5f3e3d5ffd5b3d602081183d60201002188061a1a00161a1c0116131115761a1a0518060011c6131115761f260525061f2605061506051632621db2f6151a05260206151a060046151bc845afa611526573d5f5f3e3d5ffd5b3d602081183d6020100218806151a0016151c011613111576151a0518060a01c613111576151e052506151e09050516151805261506051634e530b426151c05260206151c060046151dc845afa61157f573d5f5f3e3d5ffd5b3d602081183d6020100218806151c0016151e011613111576151c0518060a01c6131115761520052506152009050516151a05273f939e0a03fb07f59a73314e73794be0e57ac1b4e604052336060526115d6611b4b565b73f939e0a03fb07f59a73314e73794be0e57ac1b4e6151a05114611607576151a05160405233606052611607611b4b565b005b6337d231858118611b47576024361034176131115760043560040180358060a01c613111576101205260208101358060a01c613111576101405260408101356101605260608101356101805260808101356101a05260a0810135810180358060a01c613111576101c05260208101358101803561271081116131115750602081350180826101e03750505060c0810135810180358060a01c6131115761292052602081013581018035612710811161311157506020813501808261294037505050506101405161508052615080516387553b7e6151a052610160516151c0526101006151a060246151bc845afa611702573d5f5f3e3d5ffd5b3d61010081183d610100100218806151a0016152a01161311157806151a0016152a0116131115760606151a06152c05e615200518060401c6131115761532052615220518060401c6131115761534052615240518060a01c6131115761536052615260518060a01c6131115761538052615280518060041c613111576153a052506152c09050610100816150a05e5033615140511815611814576020806152005260066151a0527f216f776e657200000000000000000000000000000000000000000000000000006151c0526151a08161520001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06151e052806004016151fcfd5b61508051632fdba1f66151a052610160516151c052803b15613111575f6151a060246151bc5f855af1611849573d5f5f3e3d5ffd5b50635cffe9de61a1e05260803061a2005273f939e0a03fb07f59a73314e73794be0e57ac1b4e61a220526101805161a240528061a26052604060086151c052806151e052806151c00160e06101205182526101405160208301526101605160408301526101805160608301526101a05160808301528060a083015280820160406101c051825280602083015280820160206101e05101806101e0835e508051806020830101601f825f03163682375050601f19601f825160200101169050810190509050810190508060c083015280820160406129205182528060208301528082016020612940510180612940835e508051806020830101601f825f03163682375050601f19601f825160200101169050810190509050810190509050810190506151a0526151a08161a2000160208251018083835e508051806020830101601f825f03163682375050601f19601f825160200101169050905081015050602061a1e06150c461a1fc5f7326de7861e213a5351f6ed767d00e0839930e9ee15af16119d6573d5f5f3e3d5ffd5b3d602081183d60201002188061a1e00161a200116131115761a1e0518060011c6131115761f2c0525061f2c05061508051639c756a4b6151a052610160516151c052336151e052803b15613111575f6151a060446151bc5f855af1611a3d573d5f5f3e3d5ffd5b5061508051632621db2f6151c05260206151c060046151dc845afa611a64573d5f5f3e3d5ffd5b3d602081183d6020100218806151c0016151e011613111576151c0518060a01c6131115761520052506152009050516151a05261508051634e530b426151e05260206151e060046151fc845afa611abd573d5f5f3e3d5ffd5b3d602081183d6020100218806151e00161520011613111576151e0518060a01c6131115761522052506152209050516151c05273f939e0a03fb07f59a73314e73794be0e57ac1b4e60405233606052611b14611b4b565b73f939e0a03fb07f59a73314e73794be0e57ac1b4e6151c05114611b45576151c05160405233606052611b45611b4b565b005b5f5ffd5b6040516370a0823160a0523060c052602060a0602460bc845afa611b71573d5f5f3e3d5ffd5b60203d106131115760a090505160805260805115611bfd5760405163a9059cbb60a0526040606060c05e602060a0604460bc5f855af1611bb3573d5f5f3e3d5ffd5b3d611bca57803b1561311157600161010052611bf1565b3d602081183d60201002188060a00160c0116131115760a0518060011c6131115761010052505b61010090505115613111575b565b60605115611cad576127a05163095ea7b36127e052604051612800526127c0516128205260206127e060446127fc5f855af1611c3d573d5f5f3e3d5ffd5b3d611c5457803b1561311157600161284052611c7e565b3d602081183d6020100218806127e00161280011613111576127e0518060011c6131115761284052505b61284090505115613111576040515a60605f5f8251602084015f8787f1905090509050611cad573d5f5f3e3d5ffd5b565b615060366201af4037612880516151018110603f821116156131115750612880516128a0016128e011613111576128a0518060041c613111576201ffa0526128a06128c0516128a00110613111576128c0516128a001612880516128a0016101c08201116131115780518060a01c613111576201ffc05260208101518060a01c613111576201ffe05260408101516202000052606081015162020020526080810151620200405260a0810151620200605260c0810151620200805260e0810151620200a052610100810151620200c052610120810151620200e0526101408101516202010052610160810151620201205280610180820151820110613111576101808101518101612880516128a00160408201116131115780518060a01c61311157620201405280602082015182011061311157602081015181018051612880516128a0018251602001830111613111576127108111613111575060208151018082620201605e505050806101a0820151820110613111576101a08101518101612880516128a00160408201116131115780518060a01c61311157620228a05280602082015182011061311157602081015181018051612880516128a0018251602001830111613111576127108111613111575060208151018082620228c05e505050506201ffa080516201af40526020810180516201af605260208101516201af805260408101516201afa05260608101516201afc05260808101516201afe05260a08101516201b0005260c08101516201b0205260e08101516201b040526101008101516201b060526101208101516201b080526101408101516201b0a0526101608101516201b0c052610180810180516201b0e05260208101602081510180826201b1005e5050506128e0810180516201d8405260208101602081510180826201d8605e50505050506201af80516201ffa0526201ffa051632621db2f6201ffe05260206201ffe060046201fffc845afa611f8f573d5f5f3e3d5ffd5b3d602081183d6020100218806201ffe0016202000011613111576201ffe0518060a01c61311157620200205250620200209050516201ffc0526201ffa051634e530b42620200005260206202000060046202001c845afa611ff2573d5f5f3e3d5ffd5b3d602081183d602010021880620200000162020020116131115762020000518060a01c61311157620200405250620200409050516201ffe0526201b0e05160405260206201b1005101806201b10060605e5073f939e0a03fb07f59a73314e73794be0e57ac1b4e6127a052612860516127c05261206d611bff565b6201ffc0516370a08231620200205230620200405260206202002060246202003c845afa61209d573d5f5f3e3d5ffd5b60203d10613111576202002090505162020000526201ffc05163095ea7b362020020526201af805162020040526202000051620200605260206202002060446202003c5f855af16120f0573d5f5f3e3d5ffd5b3d61210857803b156131115760016202008052612136565b3d602081183d602010021880620200200162020040116131115762020020518060011c613111576202008052505b6202008090505115613111576201ffa05163f70d8c1162020020526201afa05162020040526202000051620200605260e06201b000620200805e6020620200206101246202003c5f855af161218d573d5f5f3e3d5ffd5b60203d10613111576202002050506201ffe0516370a08231620200405230620200605260206202004060246202005c845afa6121cb573d5f5f3e3d5ffd5b60203d10613111576202004090505162020020526201d8405160405260206201d8605101806201d86060605e506201ffe0516127a05262020020516127c052612212611bff565b565b614f60366201af4037612880516150018110603f821116156131115750612880516128a0016128e011613111576128a0518060041c613111576201fea0526128a06128c0516128a00110613111576128c0516128a001612880516128a00160c08201116131115780518060a01c613111576201fec05260208101518060a01c613111576201fee05260408101516201ff005260608101516201ff20528060808201518201106131115760808101518101612880516128a00160408201116131115780518060a01c613111576201ff405280602082015182011061311157602081015181018051612880516128a00182516020018301116131115761271081116131115750602081510180826201ff605e5050508060a08201518201106131115760a08101518101612880516128a00160408201116131115780518060a01c61311157620226a05280602082015182011061311157602081015181018051612880516128a0018251602001830111613111576127108111613111575060208151018082620226c05e505050506201fea080516201af40526020810180516201af605260208101516201af805260408101516201afa05260608101516201afc0526080810180516201afe05260208101602081510180826201b0005e5050506127e0810180516201d7405260208101602081510180826201d7605e50505050506201af80516201fea0526201fea051632621db2f6201fee05260206201fee060046201fefc845afa612446573d5f5f3e3d5ffd5b3d602081183d6020100218806201fee0016201ff0011613111576201fee0518060a01c613111576201ff2052506201ff209050516201fec0526201fea051634e530b426201ff005260206201ff0060046201ff1c845afa6124a9573d5f5f3e3d5ffd5b3d602081183d6020100218806201ff00016201ff2011613111576201ff00518060a01c613111576201ff4052506201ff409050516201fee0526201d7405160405260206201d7605101806201d76060605e5073f939e0a03fb07f59a73314e73794be0e57ac1b4e6127a052612860516127c052612524611bff565b6201fea051630ff8afc16201ff20526201afa0516201ff405260206201ff2060246201ff3c845afa612558573d5f5f3e3d5ffd5b60203d10613111576201ff209050516201ff00526201fee05163095ea7b36201ff20526201af80516201ff40526201ff00516201ff605260206201ff2060446201ff3c5f855af16125ab573d5f5f3e3d5ffd5b3d6125c357803b156131115760016201ff80526125f1565b3d602081183d6020100218806201ff20016201ff4011613111576201ff20518060011c613111576201ff8052505b6201ff8090505115613111576201fea05163aa665baf6201ff20526201afa0516201ff4052803b15613111575f6201ff2060246201ff3c5f855af1612638573d5f5f3e3d5ffd5b506201fec0516370a082316201ff4052306201ff605260206201ff4060246201ff5c845afa612669573d5f5f3e3d5ffd5b60203d10613111576201ff409050516201ff20526201afe05160405260206201b0005101806201b00060605e506201fec0516127a0526201ff20516127c0526126b0611bff565b565b615000366201af4037612880516150a18110603f821116156131115750612880516128a0016128e011613111576128a0518060041c613111576201ff40526128a06128c0516128a00110613111576128c0516128a001612880516128a0016101608201116131115780518060a01c613111576201ff605260208101518060a01c613111576201ff805260408101516201ffa05260608101516201ffc05260808101516201ffe05260a0810151620200005260c0810151620200205260e08101516202004052610100810151620200605280610120820151820110613111576101208101518101612880516128a00160408201116131115780518060a01c61311157620200805280602082015182011061311157602081015181018051612880516128a0018251602001830111613111576127108111613111575060208151018082620200a05e50505080610140820151820110613111576101408101518101612880516128a00160408201116131115780518060a01c61311157620227e05280602082015182011061311157602081015181018051612880516128a0018251602001830111613111576127108111613111575060208151018082620228005e505050506201ff4080516201af40526020810180516201af605260208101516201af805260408101516201afa05260608101516201afc05260808101516201afe05260a08101516201b0005260c08101516201b0205260e08101516201b040526101008101516201b06052610120810180516201b0805260208101602081510180826201b0a05e505050612880810180516201d7e05260208101602081510180826201d8005e50505050506201af80516201ff40526201ff4051632621db2f6201ff805260206201ff8060046201ff9c845afa612950573d5f5f3e3d5ffd5b3d602081183d6020100218806201ff80016201ffa011613111576201ff80518060a01c613111576201ffc052506201ffc09050516201ff60526201ff4051634e530b426201ffa05260206201ffa060046201ffbc845afa6129b3573d5f5f3e3d5ffd5b3d602081183d6020100218806201ffa0016201ffc011613111576201ffa0518060a01c613111576201ffe052506201ffe09050516201ff80526201b0805160405260206201b0a05101806201b0a060605e5073f939e0a03fb07f59a73314e73794be0e57ac1b4e6127a052612860516127c052612a2e611bff565b6201ff60516370a082316201ffc052306201ffe05260206201ffc060246201ffdc845afa612a5e573d5f5f3e3d5ffd5b60203d10613111576201ffc09050516201ffa0526201ff605163095ea7b36201ffc0526201af80516201ffe0526201ffa051620200005260206201ffc060446201ffdc5f855af1612ab1573d5f5f3e3d5ffd5b3d612ac957803b156131115760016202002052612af7565b3d602081183d6020100218806201ffc0016201ffe011613111576201ffc0518060011c613111576202002052505b6202002090505115613111576201ff405163650f939c6201ffc0526201afa0516201ffe0526201ffa0516202000052803b15613111575f6201ffc060446201ffdc5f855af1612b48573d5f5f3e3d5ffd5b506201ff405163f8e61b696201ffc0526201afa0516201ffe0526201b00051620200005260606201b020620200205e803b15613111575f6201ffc060a46201ffdc5f855af1612b99573d5f5f3e3d5ffd5b506201ff80516370a082316201ffe05230620200005260206201ffe060246201fffc845afa612bca573d5f5f3e3d5ffd5b60203d10613111576201ffe09050516201ffc0526201d7e05160405260206201d8005101806201d80060605e506201ff80516127a0526201ffc0516127c052612c11611bff565b565b614f80366201af4037612880516150218110603f821116156131115750612880516128a0016128e011613111576128a0518060041c613111576201fec0526128a06128c0516128a00110613111576128c0516128a001612880516128a00160e08201116131115780518060a01c613111576201fee05260208101518060a01c613111576201ff005260408101516201ff205260608101516201ff405260808101516201ff60528060a08201518201106131115760a08101518101612880516128a00160408201116131115780518060a01c613111576201ff805280602082015182011061311157602081015181018051612880516128a00182516020018301116131115761271081116131115750602081510180826201ffa05e5050508060c08201518201106131115760c08101518101612880516128a00160408201116131115780518060a01c61311157620226e05280602082015182011061311157602081015181018051612880516128a0018251602001830111613111576127108111613111575060208151018082620227005e505050506201fec080516201af40526020810180516201af605260208101516201af805260408101516201afa05260608101516201afc05260808101516201afe05260a0810180516201b0005260208101602081510180826201b0205e505050612800810180516201d7605260208101602081510180826201d7805e50505050506201af80516201fec0526201fec051632621db2f6201ff005260206201ff0060046201ff1c845afa612e59573d5f5f3e3d5ffd5b3d602081183d6020100218806201ff00016201ff2011613111576201ff00518060a01c613111576201ff4052506201ff409050516201fee0526201fec051634e530b426201ff205260206201ff2060046201ff3c845afa612ebc573d5f5f3e3d5ffd5b3d602081183d6020100218806201ff20016201ff4011613111576201ff20518060a01c613111576201ff6052506201ff609050516201ff00526201d7605160405260206201d7805101806201d78060605e5073f939e0a03fb07f59a73314e73794be0e57ac1b4e6127a052612860516127c052612f37611bff565b6201ff00516370a082316201ff4052306201ff605260206201ff4060246201ff5c845afa612f67573d5f5f3e3d5ffd5b60203d10613111576201ff409050516201ff20526201ff005163095ea7b36201ff40526201af80516201ff60526201ff20516201ff805260206201ff4060446201ff5c5f855af1612fba573d5f5f3e3d5ffd5b3d612fd257803b156131115760016201ffa052613000565b3d602081183d6020100218806201ff40016201ff6011613111576201ff40518060011c613111576201ffa052505b6201ffa090505115613111576201fec05163d8aed1456201ff40526201afa0516201ff60526201ff20516201ff8052803b15613111575f6201ff4060446201ff5c5f855af1613051573d5f5f3e3d5ffd5b506201fec051636a48f8b36201ff40526201afa0516201ff60526201afe0516201ff8052803b15613111575f6201ff4060446201ff5c5f855af1613097573d5f5f3e3d5ffd5b506201fee0516370a082316201ff6052306201ff805260206201ff6060246201ff7c845afa6130c8573d5f5f3e3d5ffd5b60203d10613111576201ff609050516201ff40526201b0005160405260206201b0205101806201b02060605e506201fee0516127a0526201ff40516127c05261310f611bff565b565b5f80fd1b47160911180018855820d4c2e171e08b2bd882a379f506a0b1a0839ef850979623c6f11bbd55c2383b0a19311d810800a1657679706572830004030036" - ], - "transaction": { - "from": "0x000005281a2b04a182085d37cc9e6dd552795caa", - "to": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "gas": "0x8f06fa", - "value": "0x0", - "input": "0x263076684d560702de8e0a6315d03a4ccf86b84b978c45f17ce78215063c735e9e4359c60000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000316461311d6100116100003961311d610000f35f3560e01c60026003821660011b61311501601e395f51565b6336dd33f78118610508576024361034176131115760043560040180358060a01c613111576101205260208101358060a01c613111576101405260408101356101605260608101356101805260808101356101a05260a08101356101c05260c08101356101e05260e08101356102005261010081013561022052610120810135610240526101408101356102605261016081013561028052610180810135810180358060a01c613111576102a05260208101358101803561271081116131115750602081350180826102c0375050506101a0810135810180358060a01c61311157612a00526020810135810180356127108111613111575060208135018082612a2037505050506101205161019f576020806151c0526006615160527f216f776e6572000000000000000000000000000000000000000000000000000061518052615160816151c001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06151a052806004016151bcfd5b61014051632621db2f615180526020615180600461519c845afa6101c5573d5f5f3e3d5ffd5b3d602081183d602010021880615180016151a01161311157615180518060a01c613111576151c052506151c090505161516052615160516323b872dd61518052336151a052306151c0526101a0516151e0526020615180606461519c5f855af1610231573d5f5f3e3d5ffd5b3d61024857803b1561311157600161520052610272565b3d602081183d602010021880615180016151a01161311157615180518060011c6131115761520052505b6152009050511561311157635cffe9de61a2a05260803061a2c05273f939e0a03fb07f59a73314e73794be0e57ac1b4e61a2e0526101805161a300528061a32052604060016151a052806151c052806151a0016101c06101205182526101405160208301526101605160408301526101805160608301526101a05160808301526101c05160a08301526101e05160c08301526102005160e0830152610220516101008301526102405161012083015261026051610140830152610280516101608301528061018083015280820160406102a051825280602083015280820160206102c05101806102c0835e508051806020830101601f825f03163682375050601f19601f82516020010116905081019050905081019050806101a08301528082016040612a005182528060208301528082016020612a20510180612a20835e508051806020830101601f825f03163682375050601f19601f82516020010116905081019050905081019050905081019050615180526151808161a2c00160208251018083835e508051806020830101601f825f03163682375050601f19601f825160200101169050905081015050602061a2a06151a461a2bc5f7326de7861e213a5351f6ed767d00e0839930e9ee15af161044f573d5f5f3e3d5ffd5b3d602081183d60201002188061a2a00161a2c0116131115761a2a0518060011c6131115761f460525061f46050306151c052610160516151e05260406151a0526151a08051602082012090506151805261014051639c756a4b6151a052615180516151c052610120516151e052803b15613111575f6151a060446151bc5f855af16104dc573d5f5f3e3d5ffd5b5073f939e0a03fb07f59a73314e73794be0e57ac1b4e60405233606052610501611b4b565b6020615180f35b6366a3caeb8118610a9a576024361034176131115760043560040180358060a01c613111576101205260208101358060a01c613111576101405260408101356101605260608101356101805260808101356101a05260a08101356101c05260c08101356101e05260e08101356102005261010081013561022052610120810135810180358060a01c6131115761024052602081013581018035612710811161311157506020813501808261026037505050610140810135810180358060a01c613111576129a05260208101358101803561271081116131115750602081350180826129c037505050506101405161510052615100516387553b7e615220526101605161524052610100615220602461523c845afa610628573d5f5f3e3d5ffd5b3d61010081183d610100100218806152200161532011613111578061522001615320116131115760606152206153405e615280518060401c613111576153a0526152a0518060401c613111576153c0526152c0518060a01c613111576153e0526152e0518060a01c6131115761540052615300518060041c6131115761542052506153409050610100816151205e50336151c051181561073a57602080615280526006615220527f216f776e65720000000000000000000000000000000000000000000000000000615240526152208161528001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0615260528060040161527cfd5b61510051632fdba1f6615220526101605161524052803b15613111575f615220602461523c5f855af161076f573d5f5f3e3d5ffd5b5061510051632621db2f615240526020615240600461525c845afa610796573d5f5f3e3d5ffd5b3d602081183d602010021880615240016152601161311157615240518060a01c613111576152805250615280905051615220526101a0511561085857615220516323b872dd61524052336152605230615280526101a0516152a0526020615240606461525c5f855af161080b573d5f5f3e3d5ffd5b3d61082257803b156131115760016152c05261084c565b3d602081183d602010021880615240016152601161311157615240518060011c613111576152c052505b6152c090505115613111575b635cffe9de61a3005260803061a3205273f939e0a03fb07f59a73314e73794be0e57ac1b4e61a340526101805161a360528061a380526040600461526052806152805280615260016101606101205182526101405160208301526101605160408301526101805160608301526101a05160808301526101c05160a08301526101e05160c08301526102005160e0830152610220516101008301528061012083015280820160406102405182528060208301528082016020610260510180610260835e508051806020830101601f825f03163682375050601f19601f825160200101169050810190509050810190508061014083015280820160406129a051825280602083015280820160206129c05101806129c0835e508051806020830101601f825f03163682375050601f19601f82516020010116905081019050905081019050905081019050615240526152408161a3200160208251018083835e508051806020830101601f825f03163682375050601f19601f825160200101169050905081015050602061a30061514461a31c5f7326de7861e213a5351f6ed767d00e0839930e9ee15af1610a0c573d5f5f3e3d5ffd5b3d602081183d60201002188061a3000161a320116131115761a300518060011c6131115761f460525061f4605061510051639c756a4b6152405261016051615260523361528052803b15613111575f615240604461525c5f855af1610a73573d5f5f3e3d5ffd5b5073f939e0a03fb07f59a73314e73794be0e57ac1b4e60405233606052610a98611b4b565b005b6323e30c8b8118611b475760a436103417613111576004358060a01c6131115762025000526024358060a01c6131115762025020526084356004018035620186a08111613111575060208135018082620250403750507326de7861e213a5351f6ed767d00e0839930e9ee1331815610b8b576020806203d7605260076203d700527f2163616c6c6572000000000000000000000000000000000000000000000000006203d720526203d700816203d76001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06203d74052806004016203d75cfd5b3062025000511815610c16576020806203d76052600a6203d700527f21696e69746961746f72000000000000000000000000000000000000000000006203d720526203d700816203d76001602a82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06203d74052806004016203d75cfd5b73f939e0a03fb07f59a73314e73794be0e57ac1b4e62025020511815610cb5576020806203d7605260066203d700527f21746f6b656e00000000000000000000000000000000000000000000000000006203d720526203d700816203d76001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06203d74052806004016203d75cfd5b600562025040511015610d41576020806203d7605260056203d700527f21646174610000000000000000000000000000000000000000000000000000006203d720526203d700816203d76001602582825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06203d74052806004016203d75cfd5b6044356370a082316203d70052306203d7205260206203d70060246203d71c73f939e0a03fb07f59a73314e73794be0e57ac1b4e5afa610d83573d5f5f3e3d5ffd5b60203d10613111576203d700511015610e15576020806203d7a05260076203d740527f21616d6f756e74000000000000000000000000000000000000000000000000006203d760526203d740816203d7a001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06203d78052806004016203d79cfd5b60643515610e9c576020806203d7605260046203d700527f21666565000000000000000000000000000000000000000000000000000000006203d720526203d700816203d76001602482825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06203d74052806004016203d75cfd5b601f620250405111156131115762025060516203d7405260206203d720526203d720602081511861311157602081018151602083010160208201116131115780518060041c613111576203d76052506203d7609050516203d7005260016203d7005118610f245760443561286052602062025040510180620250406128805e5061102a611caf565b60026203d7005118610f515760443561286052602062025040510180620250406128805e5061102a612214565b60046203d7005118610f7e5760443561286052602062025040510180620250406128805e5061102a6126b2565b60086203d7005118610fab5760443561286052602062025040510180620250406128805e5061102a612c13565b6020806203d78052600a6203d720527f216f7065726174696f6e000000000000000000000000000000000000000000006203d740526203d720816203d78001602a82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06203d76052806004016203d77cfd5b63a9059cbb6203d720527326de7861e213a5351f6ed767d00e0839930e9ee16203d740526044356203d7605260206203d72060446203d73c5f73f939e0a03fb07f59a73314e73794be0e57ac1b4e5af1611086573d5f5f3e3d5ffd5b3d6110b25773f939e0a03fb07f59a73314e73794be0e57ac1b4e3b156131115760016203d780526110e0565b3d602081183d6020100218806203d720016203d74011613111576203d720518060011c613111576203d78052505b6203d7805115613111577f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd96203d7205260206203d720f35b63e5be3bea8118611b47576024361034176131115760043560040180358060a01c613111576101205260208101358060a01c61311157610140526040810135610160526060810135610180526080810135810180358060a01c613111576101a05260208101358101803561271081116131115750602081350180826101c03750505060a0810135810180358060a01c6131115761290052602081013581018035612710811161311157506020813501808261292037505050506101405161506052615060516387553b7e61518052610160516151a052610100615180602461519c845afa611208573d5f5f3e3d5ffd5b3d61010081183d610100100218806151800161528011613111578061518001615280116131115760606151806152a05e6151e0518060401c6131115761530052615200518060401c6131115761532052615220518060a01c6131115761534052615240518060a01c6131115761536052615260518060041c6131115761538052506152a09050610100816150805e503361512051181561131a576020806151e0526006615180527f216f776e657200000000000000000000000000000000000000000000000000006151a052615180816151e001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06151c052806004016151dcfd5b61506051632fdba1f661518052610160516151a052803b15613111575f615180602461519c5f855af161134f573d5f5f3e3d5ffd5b50635cffe9de61a1a05260803061a1c05273f939e0a03fb07f59a73314e73794be0e57ac1b4e61a1e0526101805161a200528061a22052604060026151a052806151c052806151a00160c061012051825261014051602083015261016051604083015261018051606083015280608083015280820160406101a051825280602083015280820160206101c05101806101c0835e508051806020830101601f825f03163682375050601f19601f825160200101169050810190509050810190508060a083015280820160406129005182528060208301528082016020612920510180612920835e508051806020830101601f825f03163682375050601f19601f82516020010116905081019050905081019050905081019050615180526151808161a1c00160208251018083835e508051806020830101601f825f03163682375050601f19601f825160200101169050905081015050602061a1a06150a461a1bc5f7326de7861e213a5351f6ed767d00e0839930e9ee15af16114d3573d5f5f3e3d5ffd5b3d602081183d60201002188061a1a00161a1c0116131115761a1a0518060011c6131115761f260525061f2605061506051632621db2f6151a05260206151a060046151bc845afa611526573d5f5f3e3d5ffd5b3d602081183d6020100218806151a0016151c011613111576151a0518060a01c613111576151e052506151e09050516151805261506051634e530b426151c05260206151c060046151dc845afa61157f573d5f5f3e3d5ffd5b3d602081183d6020100218806151c0016151e011613111576151c0518060a01c6131115761520052506152009050516151a05273f939e0a03fb07f59a73314e73794be0e57ac1b4e604052336060526115d6611b4b565b73f939e0a03fb07f59a73314e73794be0e57ac1b4e6151a05114611607576151a05160405233606052611607611b4b565b005b6337d231858118611b47576024361034176131115760043560040180358060a01c613111576101205260208101358060a01c613111576101405260408101356101605260608101356101805260808101356101a05260a0810135810180358060a01c613111576101c05260208101358101803561271081116131115750602081350180826101e03750505060c0810135810180358060a01c6131115761292052602081013581018035612710811161311157506020813501808261294037505050506101405161508052615080516387553b7e6151a052610160516151c0526101006151a060246151bc845afa611702573d5f5f3e3d5ffd5b3d61010081183d610100100218806151a0016152a01161311157806151a0016152a0116131115760606151a06152c05e615200518060401c6131115761532052615220518060401c6131115761534052615240518060a01c6131115761536052615260518060a01c6131115761538052615280518060041c613111576153a052506152c09050610100816150a05e5033615140511815611814576020806152005260066151a0527f216f776e657200000000000000000000000000000000000000000000000000006151c0526151a08161520001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06151e052806004016151fcfd5b61508051632fdba1f66151a052610160516151c052803b15613111575f6151a060246151bc5f855af1611849573d5f5f3e3d5ffd5b50635cffe9de61a1e05260803061a2005273f939e0a03fb07f59a73314e73794be0e57ac1b4e61a220526101805161a240528061a26052604060086151c052806151e052806151c00160e06101205182526101405160208301526101605160408301526101805160608301526101a05160808301528060a083015280820160406101c051825280602083015280820160206101e05101806101e0835e508051806020830101601f825f03163682375050601f19601f825160200101169050810190509050810190508060c083015280820160406129205182528060208301528082016020612940510180612940835e508051806020830101601f825f03163682375050601f19601f825160200101169050810190509050810190509050810190506151a0526151a08161a2000160208251018083835e508051806020830101601f825f03163682375050601f19601f825160200101169050905081015050602061a1e06150c461a1fc5f7326de7861e213a5351f6ed767d00e0839930e9ee15af16119d6573d5f5f3e3d5ffd5b3d602081183d60201002188061a1e00161a200116131115761a1e0518060011c6131115761f2c0525061f2c05061508051639c756a4b6151a052610160516151c052336151e052803b15613111575f6151a060446151bc5f855af1611a3d573d5f5f3e3d5ffd5b5061508051632621db2f6151c05260206151c060046151dc845afa611a64573d5f5f3e3d5ffd5b3d602081183d6020100218806151c0016151e011613111576151c0518060a01c6131115761520052506152009050516151a05261508051634e530b426151e05260206151e060046151fc845afa611abd573d5f5f3e3d5ffd5b3d602081183d6020100218806151e00161520011613111576151e0518060a01c6131115761522052506152209050516151c05273f939e0a03fb07f59a73314e73794be0e57ac1b4e60405233606052611b14611b4b565b73f939e0a03fb07f59a73314e73794be0e57ac1b4e6151c05114611b45576151c05160405233606052611b45611b4b565b005b5f5ffd5b6040516370a0823160a0523060c052602060a0602460bc845afa611b71573d5f5f3e3d5ffd5b60203d106131115760a090505160805260805115611bfd5760405163a9059cbb60a0526040606060c05e602060a0604460bc5f855af1611bb3573d5f5f3e3d5ffd5b3d611bca57803b1561311157600161010052611bf1565b3d602081183d60201002188060a00160c0116131115760a0518060011c6131115761010052505b61010090505115613111575b565b60605115611cad576127a05163095ea7b36127e052604051612800526127c0516128205260206127e060446127fc5f855af1611c3d573d5f5f3e3d5ffd5b3d611c5457803b1561311157600161284052611c7e565b3d602081183d6020100218806127e00161280011613111576127e0518060011c6131115761284052505b61284090505115613111576040515a60605f5f8251602084015f8787f1905090509050611cad573d5f5f3e3d5ffd5b565b615060366201af4037612880516151018110603f821116156131115750612880516128a0016128e011613111576128a0518060041c613111576201ffa0526128a06128c0516128a00110613111576128c0516128a001612880516128a0016101c08201116131115780518060a01c613111576201ffc05260208101518060a01c613111576201ffe05260408101516202000052606081015162020020526080810151620200405260a0810151620200605260c0810151620200805260e0810151620200a052610100810151620200c052610120810151620200e0526101408101516202010052610160810151620201205280610180820151820110613111576101808101518101612880516128a00160408201116131115780518060a01c61311157620201405280602082015182011061311157602081015181018051612880516128a0018251602001830111613111576127108111613111575060208151018082620201605e505050806101a0820151820110613111576101a08101518101612880516128a00160408201116131115780518060a01c61311157620228a05280602082015182011061311157602081015181018051612880516128a0018251602001830111613111576127108111613111575060208151018082620228c05e505050506201ffa080516201af40526020810180516201af605260208101516201af805260408101516201afa05260608101516201afc05260808101516201afe05260a08101516201b0005260c08101516201b0205260e08101516201b040526101008101516201b060526101208101516201b080526101408101516201b0a0526101608101516201b0c052610180810180516201b0e05260208101602081510180826201b1005e5050506128e0810180516201d8405260208101602081510180826201d8605e50505050506201af80516201ffa0526201ffa051632621db2f6201ffe05260206201ffe060046201fffc845afa611f8f573d5f5f3e3d5ffd5b3d602081183d6020100218806201ffe0016202000011613111576201ffe0518060a01c61311157620200205250620200209050516201ffc0526201ffa051634e530b42620200005260206202000060046202001c845afa611ff2573d5f5f3e3d5ffd5b3d602081183d602010021880620200000162020020116131115762020000518060a01c61311157620200405250620200409050516201ffe0526201b0e05160405260206201b1005101806201b10060605e5073f939e0a03fb07f59a73314e73794be0e57ac1b4e6127a052612860516127c05261206d611bff565b6201ffc0516370a08231620200205230620200405260206202002060246202003c845afa61209d573d5f5f3e3d5ffd5b60203d10613111576202002090505162020000526201ffc05163095ea7b362020020526201af805162020040526202000051620200605260206202002060446202003c5f855af16120f0573d5f5f3e3d5ffd5b3d61210857803b156131115760016202008052612136565b3d602081183d602010021880620200200162020040116131115762020020518060011c613111576202008052505b6202008090505115613111576201ffa05163f70d8c1162020020526201afa05162020040526202000051620200605260e06201b000620200805e6020620200206101246202003c5f855af161218d573d5f5f3e3d5ffd5b60203d10613111576202002050506201ffe0516370a08231620200405230620200605260206202004060246202005c845afa6121cb573d5f5f3e3d5ffd5b60203d10613111576202004090505162020020526201d8405160405260206201d8605101806201d86060605e506201ffe0516127a05262020020516127c052612212611bff565b565b614f60366201af4037612880516150018110603f821116156131115750612880516128a0016128e011613111576128a0518060041c613111576201fea0526128a06128c0516128a00110613111576128c0516128a001612880516128a00160c08201116131115780518060a01c613111576201fec05260208101518060a01c613111576201fee05260408101516201ff005260608101516201ff20528060808201518201106131115760808101518101612880516128a00160408201116131115780518060a01c613111576201ff405280602082015182011061311157602081015181018051612880516128a00182516020018301116131115761271081116131115750602081510180826201ff605e5050508060a08201518201106131115760a08101518101612880516128a00160408201116131115780518060a01c61311157620226a05280602082015182011061311157602081015181018051612880516128a0018251602001830111613111576127108111613111575060208151018082620226c05e505050506201fea080516201af40526020810180516201af605260208101516201af805260408101516201afa05260608101516201afc0526080810180516201afe05260208101602081510180826201b0005e5050506127e0810180516201d7405260208101602081510180826201d7605e50505050506201af80516201fea0526201fea051632621db2f6201fee05260206201fee060046201fefc845afa612446573d5f5f3e3d5ffd5b3d602081183d6020100218806201fee0016201ff0011613111576201fee0518060a01c613111576201ff2052506201ff209050516201fec0526201fea051634e530b426201ff005260206201ff0060046201ff1c845afa6124a9573d5f5f3e3d5ffd5b3d602081183d6020100218806201ff00016201ff2011613111576201ff00518060a01c613111576201ff4052506201ff409050516201fee0526201d7405160405260206201d7605101806201d76060605e5073f939e0a03fb07f59a73314e73794be0e57ac1b4e6127a052612860516127c052612524611bff565b6201fea051630ff8afc16201ff20526201afa0516201ff405260206201ff2060246201ff3c845afa612558573d5f5f3e3d5ffd5b60203d10613111576201ff209050516201ff00526201fee05163095ea7b36201ff20526201af80516201ff40526201ff00516201ff605260206201ff2060446201ff3c5f855af16125ab573d5f5f3e3d5ffd5b3d6125c357803b156131115760016201ff80526125f1565b3d602081183d6020100218806201ff20016201ff4011613111576201ff20518060011c613111576201ff8052505b6201ff8090505115613111576201fea05163aa665baf6201ff20526201afa0516201ff4052803b15613111575f6201ff2060246201ff3c5f855af1612638573d5f5f3e3d5ffd5b506201fec0516370a082316201ff4052306201ff605260206201ff4060246201ff5c845afa612669573d5f5f3e3d5ffd5b60203d10613111576201ff409050516201ff20526201afe05160405260206201b0005101806201b00060605e506201fec0516127a0526201ff20516127c0526126b0611bff565b565b615000366201af4037612880516150a18110603f821116156131115750612880516128a0016128e011613111576128a0518060041c613111576201ff40526128a06128c0516128a00110613111576128c0516128a001612880516128a0016101608201116131115780518060a01c613111576201ff605260208101518060a01c613111576201ff805260408101516201ffa05260608101516201ffc05260808101516201ffe05260a0810151620200005260c0810151620200205260e08101516202004052610100810151620200605280610120820151820110613111576101208101518101612880516128a00160408201116131115780518060a01c61311157620200805280602082015182011061311157602081015181018051612880516128a0018251602001830111613111576127108111613111575060208151018082620200a05e50505080610140820151820110613111576101408101518101612880516128a00160408201116131115780518060a01c61311157620227e05280602082015182011061311157602081015181018051612880516128a0018251602001830111613111576127108111613111575060208151018082620228005e505050506201ff4080516201af40526020810180516201af605260208101516201af805260408101516201afa05260608101516201afc05260808101516201afe05260a08101516201b0005260c08101516201b0205260e08101516201b040526101008101516201b06052610120810180516201b0805260208101602081510180826201b0a05e505050612880810180516201d7e05260208101602081510180826201d8005e50505050506201af80516201ff40526201ff4051632621db2f6201ff805260206201ff8060046201ff9c845afa612950573d5f5f3e3d5ffd5b3d602081183d6020100218806201ff80016201ffa011613111576201ff80518060a01c613111576201ffc052506201ffc09050516201ff60526201ff4051634e530b426201ffa05260206201ffa060046201ffbc845afa6129b3573d5f5f3e3d5ffd5b3d602081183d6020100218806201ffa0016201ffc011613111576201ffa0518060a01c613111576201ffe052506201ffe09050516201ff80526201b0805160405260206201b0a05101806201b0a060605e5073f939e0a03fb07f59a73314e73794be0e57ac1b4e6127a052612860516127c052612a2e611bff565b6201ff60516370a082316201ffc052306201ffe05260206201ffc060246201ffdc845afa612a5e573d5f5f3e3d5ffd5b60203d10613111576201ffc09050516201ffa0526201ff605163095ea7b36201ffc0526201af80516201ffe0526201ffa051620200005260206201ffc060446201ffdc5f855af1612ab1573d5f5f3e3d5ffd5b3d612ac957803b156131115760016202002052612af7565b3d602081183d6020100218806201ffc0016201ffe011613111576201ffc0518060011c613111576202002052505b6202002090505115613111576201ff405163650f939c6201ffc0526201afa0516201ffe0526201ffa0516202000052803b15613111575f6201ffc060446201ffdc5f855af1612b48573d5f5f3e3d5ffd5b506201ff405163f8e61b696201ffc0526201afa0516201ffe0526201b00051620200005260606201b020620200205e803b15613111575f6201ffc060a46201ffdc5f855af1612b99573d5f5f3e3d5ffd5b506201ff80516370a082316201ffe05230620200005260206201ffe060246201fffc845afa612bca573d5f5f3e3d5ffd5b60203d10613111576201ffe09050516201ffc0526201d7e05160405260206201d8005101806201d80060605e506201ff80516127a0526201ffc0516127c052612c11611bff565b565b614f80366201af4037612880516150218110603f821116156131115750612880516128a0016128e011613111576128a0518060041c613111576201fec0526128a06128c0516128a00110613111576128c0516128a001612880516128a00160e08201116131115780518060a01c613111576201fee05260208101518060a01c613111576201ff005260408101516201ff205260608101516201ff405260808101516201ff60528060a08201518201106131115760a08101518101612880516128a00160408201116131115780518060a01c613111576201ff805280602082015182011061311157602081015181018051612880516128a00182516020018301116131115761271081116131115750602081510180826201ffa05e5050508060c08201518201106131115760c08101518101612880516128a00160408201116131115780518060a01c61311157620226e05280602082015182011061311157602081015181018051612880516128a0018251602001830111613111576127108111613111575060208151018082620227005e505050506201fec080516201af40526020810180516201af605260208101516201af805260408101516201afa05260608101516201afc05260808101516201afe05260a0810180516201b0005260208101602081510180826201b0205e505050612800810180516201d7605260208101602081510180826201d7805e50505050506201af80516201fec0526201fec051632621db2f6201ff005260206201ff0060046201ff1c845afa612e59573d5f5f3e3d5ffd5b3d602081183d6020100218806201ff00016201ff2011613111576201ff00518060a01c613111576201ff4052506201ff409050516201fee0526201fec051634e530b426201ff205260206201ff2060046201ff3c845afa612ebc573d5f5f3e3d5ffd5b3d602081183d6020100218806201ff20016201ff4011613111576201ff20518060a01c613111576201ff6052506201ff609050516201ff00526201d7605160405260206201d7805101806201d78060605e5073f939e0a03fb07f59a73314e73794be0e57ac1b4e6127a052612860516127c052612f37611bff565b6201ff00516370a082316201ff4052306201ff605260206201ff4060246201ff5c845afa612f67573d5f5f3e3d5ffd5b60203d10613111576201ff409050516201ff20526201ff005163095ea7b36201ff40526201af80516201ff60526201ff20516201ff805260206201ff4060446201ff5c5f855af1612fba573d5f5f3e3d5ffd5b3d612fd257803b156131115760016201ffa052613000565b3d602081183d6020100218806201ff40016201ff6011613111576201ff40518060011c613111576201ffa052505b6201ffa090505115613111576201fec05163d8aed1456201ff40526201afa0516201ff60526201ff20516201ff8052803b15613111575f6201ff4060446201ff5c5f855af1613051573d5f5f3e3d5ffd5b506201fec051636a48f8b36201ff40526201afa0516201ff60526201afe0516201ff8052803b15613111575f6201ff4060446201ff5c5f855af1613097573d5f5f3e3d5ffd5b506201fee0516370a082316201ff6052306201ff805260206201ff6060246201ff7c845afa6130c8573d5f5f3e3d5ffd5b60203d10613111576201ff609050516201ff40526201b0005160405260206201b0205101806201b02060605e506201fee0516127a0526201ff40516127c05261310f611bff565b565b5f80fd1b47160911180018855820d4c2e171e08b2bd882a379f506a0b1a0839ef850979623c6f11bbd55c2383b0a19311d810800a165767970657283000403003600000000000000000000000000000000000000000000000000000000", - "nonce": "0x22", - "chainId": "0x1" - }, - "additionalContracts": [ - { - "transactionType": "CREATE2", - "contractName": "leverage_zapper", - "address": "0x9dc6f23d0322a4805ff31856531f166ad590b661", - "initCode": "0x61311d6100116100003961311d610000f35f3560e01c60026003821660011b61311501601e395f51565b6336dd33f78118610508576024361034176131115760043560040180358060a01c613111576101205260208101358060a01c613111576101405260408101356101605260608101356101805260808101356101a05260a08101356101c05260c08101356101e05260e08101356102005261010081013561022052610120810135610240526101408101356102605261016081013561028052610180810135810180358060a01c613111576102a05260208101358101803561271081116131115750602081350180826102c0375050506101a0810135810180358060a01c61311157612a00526020810135810180356127108111613111575060208135018082612a2037505050506101205161019f576020806151c0526006615160527f216f776e6572000000000000000000000000000000000000000000000000000061518052615160816151c001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06151a052806004016151bcfd5b61014051632621db2f615180526020615180600461519c845afa6101c5573d5f5f3e3d5ffd5b3d602081183d602010021880615180016151a01161311157615180518060a01c613111576151c052506151c090505161516052615160516323b872dd61518052336151a052306151c0526101a0516151e0526020615180606461519c5f855af1610231573d5f5f3e3d5ffd5b3d61024857803b1561311157600161520052610272565b3d602081183d602010021880615180016151a01161311157615180518060011c6131115761520052505b6152009050511561311157635cffe9de61a2a05260803061a2c05273f939e0a03fb07f59a73314e73794be0e57ac1b4e61a2e0526101805161a300528061a32052604060016151a052806151c052806151a0016101c06101205182526101405160208301526101605160408301526101805160608301526101a05160808301526101c05160a08301526101e05160c08301526102005160e0830152610220516101008301526102405161012083015261026051610140830152610280516101608301528061018083015280820160406102a051825280602083015280820160206102c05101806102c0835e508051806020830101601f825f03163682375050601f19601f82516020010116905081019050905081019050806101a08301528082016040612a005182528060208301528082016020612a20510180612a20835e508051806020830101601f825f03163682375050601f19601f82516020010116905081019050905081019050905081019050615180526151808161a2c00160208251018083835e508051806020830101601f825f03163682375050601f19601f825160200101169050905081015050602061a2a06151a461a2bc5f7326de7861e213a5351f6ed767d00e0839930e9ee15af161044f573d5f5f3e3d5ffd5b3d602081183d60201002188061a2a00161a2c0116131115761a2a0518060011c6131115761f460525061f46050306151c052610160516151e05260406151a0526151a08051602082012090506151805261014051639c756a4b6151a052615180516151c052610120516151e052803b15613111575f6151a060446151bc5f855af16104dc573d5f5f3e3d5ffd5b5073f939e0a03fb07f59a73314e73794be0e57ac1b4e60405233606052610501611b4b565b6020615180f35b6366a3caeb8118610a9a576024361034176131115760043560040180358060a01c613111576101205260208101358060a01c613111576101405260408101356101605260608101356101805260808101356101a05260a08101356101c05260c08101356101e05260e08101356102005261010081013561022052610120810135810180358060a01c6131115761024052602081013581018035612710811161311157506020813501808261026037505050610140810135810180358060a01c613111576129a05260208101358101803561271081116131115750602081350180826129c037505050506101405161510052615100516387553b7e615220526101605161524052610100615220602461523c845afa610628573d5f5f3e3d5ffd5b3d61010081183d610100100218806152200161532011613111578061522001615320116131115760606152206153405e615280518060401c613111576153a0526152a0518060401c613111576153c0526152c0518060a01c613111576153e0526152e0518060a01c6131115761540052615300518060041c6131115761542052506153409050610100816151205e50336151c051181561073a57602080615280526006615220527f216f776e65720000000000000000000000000000000000000000000000000000615240526152208161528001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0615260528060040161527cfd5b61510051632fdba1f6615220526101605161524052803b15613111575f615220602461523c5f855af161076f573d5f5f3e3d5ffd5b5061510051632621db2f615240526020615240600461525c845afa610796573d5f5f3e3d5ffd5b3d602081183d602010021880615240016152601161311157615240518060a01c613111576152805250615280905051615220526101a0511561085857615220516323b872dd61524052336152605230615280526101a0516152a0526020615240606461525c5f855af161080b573d5f5f3e3d5ffd5b3d61082257803b156131115760016152c05261084c565b3d602081183d602010021880615240016152601161311157615240518060011c613111576152c052505b6152c090505115613111575b635cffe9de61a3005260803061a3205273f939e0a03fb07f59a73314e73794be0e57ac1b4e61a340526101805161a360528061a380526040600461526052806152805280615260016101606101205182526101405160208301526101605160408301526101805160608301526101a05160808301526101c05160a08301526101e05160c08301526102005160e0830152610220516101008301528061012083015280820160406102405182528060208301528082016020610260510180610260835e508051806020830101601f825f03163682375050601f19601f825160200101169050810190509050810190508061014083015280820160406129a051825280602083015280820160206129c05101806129c0835e508051806020830101601f825f03163682375050601f19601f82516020010116905081019050905081019050905081019050615240526152408161a3200160208251018083835e508051806020830101601f825f03163682375050601f19601f825160200101169050905081015050602061a30061514461a31c5f7326de7861e213a5351f6ed767d00e0839930e9ee15af1610a0c573d5f5f3e3d5ffd5b3d602081183d60201002188061a3000161a320116131115761a300518060011c6131115761f460525061f4605061510051639c756a4b6152405261016051615260523361528052803b15613111575f615240604461525c5f855af1610a73573d5f5f3e3d5ffd5b5073f939e0a03fb07f59a73314e73794be0e57ac1b4e60405233606052610a98611b4b565b005b6323e30c8b8118611b475760a436103417613111576004358060a01c6131115762025000526024358060a01c6131115762025020526084356004018035620186a08111613111575060208135018082620250403750507326de7861e213a5351f6ed767d00e0839930e9ee1331815610b8b576020806203d7605260076203d700527f2163616c6c6572000000000000000000000000000000000000000000000000006203d720526203d700816203d76001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06203d74052806004016203d75cfd5b3062025000511815610c16576020806203d76052600a6203d700527f21696e69746961746f72000000000000000000000000000000000000000000006203d720526203d700816203d76001602a82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06203d74052806004016203d75cfd5b73f939e0a03fb07f59a73314e73794be0e57ac1b4e62025020511815610cb5576020806203d7605260066203d700527f21746f6b656e00000000000000000000000000000000000000000000000000006203d720526203d700816203d76001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06203d74052806004016203d75cfd5b600562025040511015610d41576020806203d7605260056203d700527f21646174610000000000000000000000000000000000000000000000000000006203d720526203d700816203d76001602582825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06203d74052806004016203d75cfd5b6044356370a082316203d70052306203d7205260206203d70060246203d71c73f939e0a03fb07f59a73314e73794be0e57ac1b4e5afa610d83573d5f5f3e3d5ffd5b60203d10613111576203d700511015610e15576020806203d7a05260076203d740527f21616d6f756e74000000000000000000000000000000000000000000000000006203d760526203d740816203d7a001602782825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06203d78052806004016203d79cfd5b60643515610e9c576020806203d7605260046203d700527f21666565000000000000000000000000000000000000000000000000000000006203d720526203d700816203d76001602482825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06203d74052806004016203d75cfd5b601f620250405111156131115762025060516203d7405260206203d720526203d720602081511861311157602081018151602083010160208201116131115780518060041c613111576203d76052506203d7609050516203d7005260016203d7005118610f245760443561286052602062025040510180620250406128805e5061102a611caf565b60026203d7005118610f515760443561286052602062025040510180620250406128805e5061102a612214565b60046203d7005118610f7e5760443561286052602062025040510180620250406128805e5061102a6126b2565b60086203d7005118610fab5760443561286052602062025040510180620250406128805e5061102a612c13565b6020806203d78052600a6203d720527f216f7065726174696f6e000000000000000000000000000000000000000000006203d740526203d720816203d78001602a82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06203d76052806004016203d77cfd5b63a9059cbb6203d720527326de7861e213a5351f6ed767d00e0839930e9ee16203d740526044356203d7605260206203d72060446203d73c5f73f939e0a03fb07f59a73314e73794be0e57ac1b4e5af1611086573d5f5f3e3d5ffd5b3d6110b25773f939e0a03fb07f59a73314e73794be0e57ac1b4e3b156131115760016203d780526110e0565b3d602081183d6020100218806203d720016203d74011613111576203d720518060011c613111576203d78052505b6203d7805115613111577f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd96203d7205260206203d720f35b63e5be3bea8118611b47576024361034176131115760043560040180358060a01c613111576101205260208101358060a01c61311157610140526040810135610160526060810135610180526080810135810180358060a01c613111576101a05260208101358101803561271081116131115750602081350180826101c03750505060a0810135810180358060a01c6131115761290052602081013581018035612710811161311157506020813501808261292037505050506101405161506052615060516387553b7e61518052610160516151a052610100615180602461519c845afa611208573d5f5f3e3d5ffd5b3d61010081183d610100100218806151800161528011613111578061518001615280116131115760606151806152a05e6151e0518060401c6131115761530052615200518060401c6131115761532052615220518060a01c6131115761534052615240518060a01c6131115761536052615260518060041c6131115761538052506152a09050610100816150805e503361512051181561131a576020806151e0526006615180527f216f776e657200000000000000000000000000000000000000000000000000006151a052615180816151e001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06151c052806004016151dcfd5b61506051632fdba1f661518052610160516151a052803b15613111575f615180602461519c5f855af161134f573d5f5f3e3d5ffd5b50635cffe9de61a1a05260803061a1c05273f939e0a03fb07f59a73314e73794be0e57ac1b4e61a1e0526101805161a200528061a22052604060026151a052806151c052806151a00160c061012051825261014051602083015261016051604083015261018051606083015280608083015280820160406101a051825280602083015280820160206101c05101806101c0835e508051806020830101601f825f03163682375050601f19601f825160200101169050810190509050810190508060a083015280820160406129005182528060208301528082016020612920510180612920835e508051806020830101601f825f03163682375050601f19601f82516020010116905081019050905081019050905081019050615180526151808161a1c00160208251018083835e508051806020830101601f825f03163682375050601f19601f825160200101169050905081015050602061a1a06150a461a1bc5f7326de7861e213a5351f6ed767d00e0839930e9ee15af16114d3573d5f5f3e3d5ffd5b3d602081183d60201002188061a1a00161a1c0116131115761a1a0518060011c6131115761f260525061f2605061506051632621db2f6151a05260206151a060046151bc845afa611526573d5f5f3e3d5ffd5b3d602081183d6020100218806151a0016151c011613111576151a0518060a01c613111576151e052506151e09050516151805261506051634e530b426151c05260206151c060046151dc845afa61157f573d5f5f3e3d5ffd5b3d602081183d6020100218806151c0016151e011613111576151c0518060a01c6131115761520052506152009050516151a05273f939e0a03fb07f59a73314e73794be0e57ac1b4e604052336060526115d6611b4b565b73f939e0a03fb07f59a73314e73794be0e57ac1b4e6151a05114611607576151a05160405233606052611607611b4b565b005b6337d231858118611b47576024361034176131115760043560040180358060a01c613111576101205260208101358060a01c613111576101405260408101356101605260608101356101805260808101356101a05260a0810135810180358060a01c613111576101c05260208101358101803561271081116131115750602081350180826101e03750505060c0810135810180358060a01c6131115761292052602081013581018035612710811161311157506020813501808261294037505050506101405161508052615080516387553b7e6151a052610160516151c0526101006151a060246151bc845afa611702573d5f5f3e3d5ffd5b3d61010081183d610100100218806151a0016152a01161311157806151a0016152a0116131115760606151a06152c05e615200518060401c6131115761532052615220518060401c6131115761534052615240518060a01c6131115761536052615260518060a01c6131115761538052615280518060041c613111576153a052506152c09050610100816150a05e5033615140511815611814576020806152005260066151a0527f216f776e657200000000000000000000000000000000000000000000000000006151c0526151a08161520001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06151e052806004016151fcfd5b61508051632fdba1f66151a052610160516151c052803b15613111575f6151a060246151bc5f855af1611849573d5f5f3e3d5ffd5b50635cffe9de61a1e05260803061a2005273f939e0a03fb07f59a73314e73794be0e57ac1b4e61a220526101805161a240528061a26052604060086151c052806151e052806151c00160e06101205182526101405160208301526101605160408301526101805160608301526101a05160808301528060a083015280820160406101c051825280602083015280820160206101e05101806101e0835e508051806020830101601f825f03163682375050601f19601f825160200101169050810190509050810190508060c083015280820160406129205182528060208301528082016020612940510180612940835e508051806020830101601f825f03163682375050601f19601f825160200101169050810190509050810190509050810190506151a0526151a08161a2000160208251018083835e508051806020830101601f825f03163682375050601f19601f825160200101169050905081015050602061a1e06150c461a1fc5f7326de7861e213a5351f6ed767d00e0839930e9ee15af16119d6573d5f5f3e3d5ffd5b3d602081183d60201002188061a1e00161a200116131115761a1e0518060011c6131115761f2c0525061f2c05061508051639c756a4b6151a052610160516151c052336151e052803b15613111575f6151a060446151bc5f855af1611a3d573d5f5f3e3d5ffd5b5061508051632621db2f6151c05260206151c060046151dc845afa611a64573d5f5f3e3d5ffd5b3d602081183d6020100218806151c0016151e011613111576151c0518060a01c6131115761520052506152009050516151a05261508051634e530b426151e05260206151e060046151fc845afa611abd573d5f5f3e3d5ffd5b3d602081183d6020100218806151e00161520011613111576151e0518060a01c6131115761522052506152209050516151c05273f939e0a03fb07f59a73314e73794be0e57ac1b4e60405233606052611b14611b4b565b73f939e0a03fb07f59a73314e73794be0e57ac1b4e6151c05114611b45576151c05160405233606052611b45611b4b565b005b5f5ffd5b6040516370a0823160a0523060c052602060a0602460bc845afa611b71573d5f5f3e3d5ffd5b60203d106131115760a090505160805260805115611bfd5760405163a9059cbb60a0526040606060c05e602060a0604460bc5f855af1611bb3573d5f5f3e3d5ffd5b3d611bca57803b1561311157600161010052611bf1565b3d602081183d60201002188060a00160c0116131115760a0518060011c6131115761010052505b61010090505115613111575b565b60605115611cad576127a05163095ea7b36127e052604051612800526127c0516128205260206127e060446127fc5f855af1611c3d573d5f5f3e3d5ffd5b3d611c5457803b1561311157600161284052611c7e565b3d602081183d6020100218806127e00161280011613111576127e0518060011c6131115761284052505b61284090505115613111576040515a60605f5f8251602084015f8787f1905090509050611cad573d5f5f3e3d5ffd5b565b615060366201af4037612880516151018110603f821116156131115750612880516128a0016128e011613111576128a0518060041c613111576201ffa0526128a06128c0516128a00110613111576128c0516128a001612880516128a0016101c08201116131115780518060a01c613111576201ffc05260208101518060a01c613111576201ffe05260408101516202000052606081015162020020526080810151620200405260a0810151620200605260c0810151620200805260e0810151620200a052610100810151620200c052610120810151620200e0526101408101516202010052610160810151620201205280610180820151820110613111576101808101518101612880516128a00160408201116131115780518060a01c61311157620201405280602082015182011061311157602081015181018051612880516128a0018251602001830111613111576127108111613111575060208151018082620201605e505050806101a0820151820110613111576101a08101518101612880516128a00160408201116131115780518060a01c61311157620228a05280602082015182011061311157602081015181018051612880516128a0018251602001830111613111576127108111613111575060208151018082620228c05e505050506201ffa080516201af40526020810180516201af605260208101516201af805260408101516201afa05260608101516201afc05260808101516201afe05260a08101516201b0005260c08101516201b0205260e08101516201b040526101008101516201b060526101208101516201b080526101408101516201b0a0526101608101516201b0c052610180810180516201b0e05260208101602081510180826201b1005e5050506128e0810180516201d8405260208101602081510180826201d8605e50505050506201af80516201ffa0526201ffa051632621db2f6201ffe05260206201ffe060046201fffc845afa611f8f573d5f5f3e3d5ffd5b3d602081183d6020100218806201ffe0016202000011613111576201ffe0518060a01c61311157620200205250620200209050516201ffc0526201ffa051634e530b42620200005260206202000060046202001c845afa611ff2573d5f5f3e3d5ffd5b3d602081183d602010021880620200000162020020116131115762020000518060a01c61311157620200405250620200409050516201ffe0526201b0e05160405260206201b1005101806201b10060605e5073f939e0a03fb07f59a73314e73794be0e57ac1b4e6127a052612860516127c05261206d611bff565b6201ffc0516370a08231620200205230620200405260206202002060246202003c845afa61209d573d5f5f3e3d5ffd5b60203d10613111576202002090505162020000526201ffc05163095ea7b362020020526201af805162020040526202000051620200605260206202002060446202003c5f855af16120f0573d5f5f3e3d5ffd5b3d61210857803b156131115760016202008052612136565b3d602081183d602010021880620200200162020040116131115762020020518060011c613111576202008052505b6202008090505115613111576201ffa05163f70d8c1162020020526201afa05162020040526202000051620200605260e06201b000620200805e6020620200206101246202003c5f855af161218d573d5f5f3e3d5ffd5b60203d10613111576202002050506201ffe0516370a08231620200405230620200605260206202004060246202005c845afa6121cb573d5f5f3e3d5ffd5b60203d10613111576202004090505162020020526201d8405160405260206201d8605101806201d86060605e506201ffe0516127a05262020020516127c052612212611bff565b565b614f60366201af4037612880516150018110603f821116156131115750612880516128a0016128e011613111576128a0518060041c613111576201fea0526128a06128c0516128a00110613111576128c0516128a001612880516128a00160c08201116131115780518060a01c613111576201fec05260208101518060a01c613111576201fee05260408101516201ff005260608101516201ff20528060808201518201106131115760808101518101612880516128a00160408201116131115780518060a01c613111576201ff405280602082015182011061311157602081015181018051612880516128a00182516020018301116131115761271081116131115750602081510180826201ff605e5050508060a08201518201106131115760a08101518101612880516128a00160408201116131115780518060a01c61311157620226a05280602082015182011061311157602081015181018051612880516128a0018251602001830111613111576127108111613111575060208151018082620226c05e505050506201fea080516201af40526020810180516201af605260208101516201af805260408101516201afa05260608101516201afc0526080810180516201afe05260208101602081510180826201b0005e5050506127e0810180516201d7405260208101602081510180826201d7605e50505050506201af80516201fea0526201fea051632621db2f6201fee05260206201fee060046201fefc845afa612446573d5f5f3e3d5ffd5b3d602081183d6020100218806201fee0016201ff0011613111576201fee0518060a01c613111576201ff2052506201ff209050516201fec0526201fea051634e530b426201ff005260206201ff0060046201ff1c845afa6124a9573d5f5f3e3d5ffd5b3d602081183d6020100218806201ff00016201ff2011613111576201ff00518060a01c613111576201ff4052506201ff409050516201fee0526201d7405160405260206201d7605101806201d76060605e5073f939e0a03fb07f59a73314e73794be0e57ac1b4e6127a052612860516127c052612524611bff565b6201fea051630ff8afc16201ff20526201afa0516201ff405260206201ff2060246201ff3c845afa612558573d5f5f3e3d5ffd5b60203d10613111576201ff209050516201ff00526201fee05163095ea7b36201ff20526201af80516201ff40526201ff00516201ff605260206201ff2060446201ff3c5f855af16125ab573d5f5f3e3d5ffd5b3d6125c357803b156131115760016201ff80526125f1565b3d602081183d6020100218806201ff20016201ff4011613111576201ff20518060011c613111576201ff8052505b6201ff8090505115613111576201fea05163aa665baf6201ff20526201afa0516201ff4052803b15613111575f6201ff2060246201ff3c5f855af1612638573d5f5f3e3d5ffd5b506201fec0516370a082316201ff4052306201ff605260206201ff4060246201ff5c845afa612669573d5f5f3e3d5ffd5b60203d10613111576201ff409050516201ff20526201afe05160405260206201b0005101806201b00060605e506201fec0516127a0526201ff20516127c0526126b0611bff565b565b615000366201af4037612880516150a18110603f821116156131115750612880516128a0016128e011613111576128a0518060041c613111576201ff40526128a06128c0516128a00110613111576128c0516128a001612880516128a0016101608201116131115780518060a01c613111576201ff605260208101518060a01c613111576201ff805260408101516201ffa05260608101516201ffc05260808101516201ffe05260a0810151620200005260c0810151620200205260e08101516202004052610100810151620200605280610120820151820110613111576101208101518101612880516128a00160408201116131115780518060a01c61311157620200805280602082015182011061311157602081015181018051612880516128a0018251602001830111613111576127108111613111575060208151018082620200a05e50505080610140820151820110613111576101408101518101612880516128a00160408201116131115780518060a01c61311157620227e05280602082015182011061311157602081015181018051612880516128a0018251602001830111613111576127108111613111575060208151018082620228005e505050506201ff4080516201af40526020810180516201af605260208101516201af805260408101516201afa05260608101516201afc05260808101516201afe05260a08101516201b0005260c08101516201b0205260e08101516201b040526101008101516201b06052610120810180516201b0805260208101602081510180826201b0a05e505050612880810180516201d7e05260208101602081510180826201d8005e50505050506201af80516201ff40526201ff4051632621db2f6201ff805260206201ff8060046201ff9c845afa612950573d5f5f3e3d5ffd5b3d602081183d6020100218806201ff80016201ffa011613111576201ff80518060a01c613111576201ffc052506201ffc09050516201ff60526201ff4051634e530b426201ffa05260206201ffa060046201ffbc845afa6129b3573d5f5f3e3d5ffd5b3d602081183d6020100218806201ffa0016201ffc011613111576201ffa0518060a01c613111576201ffe052506201ffe09050516201ff80526201b0805160405260206201b0a05101806201b0a060605e5073f939e0a03fb07f59a73314e73794be0e57ac1b4e6127a052612860516127c052612a2e611bff565b6201ff60516370a082316201ffc052306201ffe05260206201ffc060246201ffdc845afa612a5e573d5f5f3e3d5ffd5b60203d10613111576201ffc09050516201ffa0526201ff605163095ea7b36201ffc0526201af80516201ffe0526201ffa051620200005260206201ffc060446201ffdc5f855af1612ab1573d5f5f3e3d5ffd5b3d612ac957803b156131115760016202002052612af7565b3d602081183d6020100218806201ffc0016201ffe011613111576201ffc0518060011c613111576202002052505b6202002090505115613111576201ff405163650f939c6201ffc0526201afa0516201ffe0526201ffa0516202000052803b15613111575f6201ffc060446201ffdc5f855af1612b48573d5f5f3e3d5ffd5b506201ff405163f8e61b696201ffc0526201afa0516201ffe0526201b00051620200005260606201b020620200205e803b15613111575f6201ffc060a46201ffdc5f855af1612b99573d5f5f3e3d5ffd5b506201ff80516370a082316201ffe05230620200005260206201ffe060246201fffc845afa612bca573d5f5f3e3d5ffd5b60203d10613111576201ffe09050516201ffc0526201d7e05160405260206201d8005101806201d80060605e506201ff80516127a0526201ffc0516127c052612c11611bff565b565b614f80366201af4037612880516150218110603f821116156131115750612880516128a0016128e011613111576128a0518060041c613111576201fec0526128a06128c0516128a00110613111576128c0516128a001612880516128a00160e08201116131115780518060a01c613111576201fee05260208101518060a01c613111576201ff005260408101516201ff205260608101516201ff405260808101516201ff60528060a08201518201106131115760a08101518101612880516128a00160408201116131115780518060a01c613111576201ff805280602082015182011061311157602081015181018051612880516128a00182516020018301116131115761271081116131115750602081510180826201ffa05e5050508060c08201518201106131115760c08101518101612880516128a00160408201116131115780518060a01c61311157620226e05280602082015182011061311157602081015181018051612880516128a0018251602001830111613111576127108111613111575060208151018082620227005e505050506201fec080516201af40526020810180516201af605260208101516201af805260408101516201afa05260608101516201afc05260808101516201afe05260a0810180516201b0005260208101602081510180826201b0205e505050612800810180516201d7605260208101602081510180826201d7805e50505050506201af80516201fec0526201fec051632621db2f6201ff005260206201ff0060046201ff1c845afa612e59573d5f5f3e3d5ffd5b3d602081183d6020100218806201ff00016201ff2011613111576201ff00518060a01c613111576201ff4052506201ff409050516201fee0526201fec051634e530b426201ff205260206201ff2060046201ff3c845afa612ebc573d5f5f3e3d5ffd5b3d602081183d6020100218806201ff20016201ff4011613111576201ff20518060a01c613111576201ff6052506201ff609050516201ff00526201d7605160405260206201d7805101806201d78060605e5073f939e0a03fb07f59a73314e73794be0e57ac1b4e6127a052612860516127c052612f37611bff565b6201ff00516370a082316201ff4052306201ff605260206201ff4060246201ff5c845afa612f67573d5f5f3e3d5ffd5b60203d10613111576201ff409050516201ff20526201ff005163095ea7b36201ff40526201af80516201ff60526201ff20516201ff805260206201ff4060446201ff5c5f855af1612fba573d5f5f3e3d5ffd5b3d612fd257803b156131115760016201ffa052613000565b3d602081183d6020100218806201ff40016201ff6011613111576201ff40518060011c613111576201ffa052505b6201ffa090505115613111576201fec05163d8aed1456201ff40526201afa0516201ff60526201ff20516201ff8052803b15613111575f6201ff4060446201ff5c5f855af1613051573d5f5f3e3d5ffd5b506201fec051636a48f8b36201ff40526201afa0516201ff60526201afe0516201ff8052803b15613111575f6201ff4060446201ff5c5f855af1613097573d5f5f3e3d5ffd5b506201fee0516370a082316201ff6052306201ff805260206201ff6060246201ff7c845afa6130c8573d5f5f3e3d5ffd5b60203d10613111576201ff609050516201ff40526201b0005160405260206201b0205101806201b02060605e506201fee0516127a0526201ff40516127c05261310f611bff565b565b5f80fd1b47160911180018855820d4c2e171e08b2bd882a379f506a0b1a0839ef850979623c6f11bbd55c2383b0a19311d810800a1657679706572830004030036" + "contractName": "yv_auction_taker", + "address": "0x2447680186067b6ef959df69d4b1dc55ce543a9f", + "initCode": "0x6103ba610011610000396103ba610000f35f3560e01c60026003820660011b6103b401601e395f51565b63f4f2557581186103ac576044361034176103b0576004358060a01c6103b0576040526040516383d8cfc0608052602060806004609c845afa61005d573d5f5f3e3d5ffd5b3d602081183d60201002188060800160a0116103b0576080518060a01c6103b05760c0525060c0905051606052604051631d7650cf60a052602060a0600460bc845afa6100ac573d5f5f3e3d5ffd5b3d602081183d60201002188060a00160c0116103b05760a0518060a01c6103b05760e0525060e090505160805260405163b8c50436610100526080602435610120527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61014052306101605280610180526040606060c05e604060a05260a08161012001606082825e8051806020830101601f825f03163682375050601f19601f825160200101169050905081015050602061010060e461011c5f855af1610176573d5f5f3e3d5ffd5b60203d106103b05761010050506060516370a0823160c0523060e052602060c0602460dc845afa6101a9573d5f5f3e3d5ffd5b60203d106103b05760c090505160a05260a051156102395760605163a9059cbb60c0523360e05260a05161010052602060c0604460dc5f855af16101ef573d5f5f3e3d5ffd5b3d61020657803b156103b05760016101205261022d565b3d602081183d60201002188060c00160e0116103b05760c0518060011c6103b05761012052505b610120905051156103b0575b005b63c92632b581186103ac5760a4361034176103b0576024358060a01c6103b0576040526084356004018035620186a081116103b0575060208135018082606037505060403662018720376040606051186103b05760605160800160c0116103b0576080518060a01c6103b057620187605260a0518060a01c6103b057620187805262018760805162018720526020810151620187405250620187405163ba0876526201876052604435620187805230620187a05230620187c05260206201876060646201877c5f855af1610311573d5f5f3e3d5ffd5b60203d106103b057620187605050620187205163095ea7b36201876052336201878052606435620187a05260206201876060446201877c5f855af1610358573d5f5f3e3d5ffd5b3d61037057803b156103b0576001620187c05261039e565b3d602081183d602010021880620187600162018780116103b05762018760518060011c6103b057620187c052505b620187c0905051156103b057005b5f5ffd5b5f80fd03ac0018023b85582044497807ac4bb883ce45ef4579cd6f2cfa2128d988bfc5e85ab7c7295eb431751903ba810600a1657679706572830004030036" } ], "isFixedGasLimit": false @@ -322,388 +32,34 @@ ], "receipts": [ { - "status": "0x1", - "cumulativeGasUsed": "0x1ec51c9", - "logs": [ - { - "address": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "topics": [ - "0xb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f7", - "0x0000000000000000000000006403a3b5b8f9f972a629c7ad945b642f5eff2d94", - "0x9f98d6ff7dcaed7d062f05dd70f1faf65163ae9d7bcd77b2bd4aaeaa91085f09" - ], - "data": "0x", - "blockHash": "0xa89f8bf6d2c0b2e493e3693f492f698633c64275719d8a03f202d5aa3c1579c9", - "blockNumber": "0x177971b", - "blockTimestamp": "0x69adc69f", - "transactionHash": "0xba99a5eeddbc8c04fa66f77c8ecdd2a8c84eac2d5e7f7d8f0a19151eaaeee0eb", - "transactionIndex": "0xa6", - "logIndex": "0x198", - "removed": false - } - ], - "logsBloom": "0x00020000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000002000000000000000000000000000080000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000002000000002000000000000000000000000000000000000000000000000000000000000000000000000400000", - "type": "0x2", - "transactionHash": "0xba99a5eeddbc8c04fa66f77c8ecdd2a8c84eac2d5e7f7d8f0a19151eaaeee0eb", - "transactionIndex": "0xa6", - "blockHash": "0xa89f8bf6d2c0b2e493e3693f492f698633c64275719d8a03f202d5aa3c1579c9", - "blockNumber": "0x177971b", - "gasUsed": "0x185a6a", - "effectiveGasPrice": "0x1d2f880", - "blobGasUsed": "0x0", - "from": "0x000005281a2b04a182085d37cc9e6dd552795caa", - "to": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "contractAddress": null - }, - { - "status": "0x1", - "cumulativeGasUsed": "0x1176094", - "logs": [ - { - "address": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "topics": [ - "0xb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f7", - "0x0000000000000000000000009ef894c5ddc316a36d17310e8433c39fa78056c3", - "0xc8f8748469a113fa72400f44218dcd4b08c703a5c92ac6d03e2bb93b07e25b3e" - ], - "data": "0x", - "blockHash": "0x5e21a362ddcd423aa1b74d5a42f17d6931ac2e59c6143cb5b75312b8b8c83296", - "blockNumber": "0x177971c", - "blockTimestamp": "0x69adc6ab", - "transactionHash": "0xef44f21c268446f7ad3565144ed2f1494ed7b38a202750d306988ced814f246f", - "transactionIndex": "0x9a", - "logIndex": "0x205", - "removed": false - } - ], - "logsBloom": "0x00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000400000000000000000000080000000000000000000000000000000010040000000000000000000000000000000000000000200000000000000000000002000000020000000000000000200000000000000000000000000000000000000000000000000002000000000", - "type": "0x2", - "transactionHash": "0xef44f21c268446f7ad3565144ed2f1494ed7b38a202750d306988ced814f246f", - "transactionIndex": "0x9a", - "blockHash": "0x5e21a362ddcd423aa1b74d5a42f17d6931ac2e59c6143cb5b75312b8b8c83296", - "blockNumber": "0x177971c", - "gasUsed": "0x6f721", - "effectiveGasPrice": "0x1e3a6e3", - "blobGasUsed": "0x0", - "from": "0x000005281a2b04a182085d37cc9e6dd552795caa", - "to": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "contractAddress": null - }, - { - "status": "0x1", - "cumulativeGasUsed": "0xfe1222", - "logs": [ - { - "address": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "topics": [ - "0xb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f7", - "0x0000000000000000000000009926f9e7f53b07047b584efe96800486f929650e", - "0x0d1437ad3c0178dada89d7d0dc809c39692e3da14b7cf2447e23cec594e7ea32" - ], - "data": "0x", - "blockHash": "0x54dd464dbf38da0dbfe600157f703fab0e945ba732cd3c5e14cf0a1022fb676d", - "blockNumber": "0x177971d", - "blockTimestamp": "0x69adc6b7", - "transactionHash": "0x3f16585f0d8ef9f607f3ad52bdd36ae244a28c0051a07882df6f4f8fb18dfe2f", - "transactionIndex": "0xc0", - "logIndex": "0x1ac", - "removed": false - } - ], - "logsBloom": "0x00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000002000000000000000000000000000200000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000080000000000000000000000010000000000008000000000000000000000000000000000000000200000000000000000000002000000000000000000000010000000000000000000000000000000000000000000000000000000000000000", - "type": "0x2", - "transactionHash": "0x3f16585f0d8ef9f607f3ad52bdd36ae244a28c0051a07882df6f4f8fb18dfe2f", - "transactionIndex": "0xc0", - "blockHash": "0x54dd464dbf38da0dbfe600157f703fab0e945ba732cd3c5e14cf0a1022fb676d", - "blockNumber": "0x177971d", - "gasUsed": "0xf244a", - "effectiveGasPrice": "0x1dda51a", - "blobGasUsed": "0x0", - "from": "0x000005281a2b04a182085d37cc9e6dd552795caa", - "to": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "contractAddress": null - }, - { - "status": "0x1", - "cumulativeGasUsed": "0x1bea3fd", - "logs": [ - { - "address": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "topics": [ - "0xb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f7", - "0x000000000000000000000000f87d5d598c08a84a9e1fd32d9d6362eabd2f3e11", - "0x1ead274fe7129ad78066290b2407c34aa37cdc8604dab425922873281d21d4d1" - ], - "data": "0x", - "blockHash": "0x62b072d6b10cb63439ceb50d70d53463a08f001226ba00ba900214672288d543", - "blockNumber": "0x177971e", - "blockTimestamp": "0x69adc6c3", - "transactionHash": "0x08d14d88a7ae55553b98c42b5dea4c821112bbe934eb1ee64abd478a6624a0ad", - "transactionIndex": "0xe3", - "logIndex": "0x1c7", - "removed": false - } - ], - "logsBloom": "0x00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000080000000000000000000000000000000000120000000000000000000000000000000000000080000000000000000000000000002000000000000000000000000000000000000000000000000200000000000000000000002000000000000000000000000000000000000001000000000000000000000000000000002000000000000000", - "type": "0x2", - "transactionHash": "0x08d14d88a7ae55553b98c42b5dea4c821112bbe934eb1ee64abd478a6624a0ad", - "transactionIndex": "0xe3", - "blockHash": "0x62b072d6b10cb63439ceb50d70d53463a08f001226ba00ba900214672288d543", - "blockNumber": "0x177971e", - "gasUsed": "0x3e00af", - "effectiveGasPrice": "0x1cea209", - "blobGasUsed": "0x0", - "from": "0x000005281a2b04a182085d37cc9e6dd552795caa", - "to": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "contractAddress": null - }, - { - "status": "0x1", - "cumulativeGasUsed": "0x1a5a66c", - "logs": [ - { - "address": "0xf190bba1f5db12ac0a3ee65adbf5bfe52ed2f4a7", - "topics": [ - "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0" - ], - "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005281a2b04a182085d37cc9e6dd552795caa", - "blockHash": "0x7af1e4d5aca02c18ec062dfc20d37a34453fb1b1472bb0f9f31ddeba4bb6029e", - "blockNumber": "0x177971f", - "blockTimestamp": "0x69adc6cf", - "transactionHash": "0x14e4672c021483fb4a622320c87d195a8b30e964184e9b9e0ef1270b35450fb5", - "transactionIndex": "0x117", - "logIndex": "0x27e", - "removed": false - }, - { - "address": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "topics": [ - "0xb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f7", - "0x000000000000000000000000f190bba1f5db12ac0a3ee65adbf5bfe52ed2f4a7", - "0x03c05d909ec30128cfbbfcce45f1edf8ede3f9284d7de7a9b18dcfa11266d70d" - ], - "data": "0x", - "blockHash": "0x7af1e4d5aca02c18ec062dfc20d37a34453fb1b1472bb0f9f31ddeba4bb6029e", - "blockNumber": "0x177971f", - "blockTimestamp": "0x69adc6cf", - "transactionHash": "0x14e4672c021483fb4a622320c87d195a8b30e964184e9b9e0ef1270b35450fb5", - "transactionIndex": "0x117", - "logIndex": "0x27f", - "removed": false - } - ], - "logsBloom": "0x00020000000000000000000000000000000000000000000000810000000000000000000000000000000000000000000000000000000000000002000000000080000000000000000000000000000000000001000000000000000000000004000000000000000000000000000000000000000000400000000000000000001000400000000000000000000000000000100000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000008000000200000000000000000000002000000000000000000008000000000000000000000002000000000000000000000000000000000001000000", - "type": "0x2", - "transactionHash": "0x14e4672c021483fb4a622320c87d195a8b30e964184e9b9e0ef1270b35450fb5", - "transactionIndex": "0x117", - "blockHash": "0x7af1e4d5aca02c18ec062dfc20d37a34453fb1b1472bb0f9f31ddeba4bb6029e", - "blockNumber": "0x177971f", - "gasUsed": "0x4f309", - "effectiveGasPrice": "0x1eab680", - "blobGasUsed": "0x0", - "from": "0x000005281a2b04a182085d37cc9e6dd552795caa", - "to": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "contractAddress": null - }, - { - "status": "0x1", - "cumulativeGasUsed": "0x17aa1b8", - "logs": [ - { - "address": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "topics": [ - "0xb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f7", - "0x0000000000000000000000007c64a2c59bf66456c97775f161d7e67d7d2f87ab", - "0x6d4914ab77d14fe927bd27b275f5597cad5de90ad08abea92c8a93a301bb4a20" - ], - "data": "0x", - "blockHash": "0x5987e8f631ad63f21691235da5ec4ba14227c43f9994f2fd9b09db5055b6fb67", - "blockNumber": "0x1779720", - "blockTimestamp": "0x69adc6db", - "transactionHash": "0xad90791552ad7eba970c9739848c78c108ed028081af542b0fa3be0982184c97", - "transactionIndex": "0xa0", - "logIndex": "0x24b", - "removed": false - } - ], - "logsBloom": "0x00020000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000080000000000082000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000080080000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000002000000000000000000000000000000000001000000000000000000000000000000000000000000000000000", - "type": "0x2", - "transactionHash": "0xad90791552ad7eba970c9739848c78c108ed028081af542b0fa3be0982184c97", - "transactionIndex": "0xa0", - "blockHash": "0x5987e8f631ad63f21691235da5ec4ba14227c43f9994f2fd9b09db5055b6fb67", - "blockNumber": "0x1779720", - "gasUsed": "0x2bb4ed", - "effectiveGasPrice": "0x1eff261", - "blobGasUsed": "0x0", - "from": "0x000005281a2b04a182085d37cc9e6dd552795caa", - "to": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "contractAddress": null - }, - { - "status": "0x1", - "cumulativeGasUsed": "0xe7e2af", - "logs": [ - { - "address": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "topics": [ - "0xb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f7", - "0x0000000000000000000000007488ccbe472267398420f62673926343a32a27b7", - "0x6d4914ab77d14fe927bd27b275f5597cad5de90ad08abea92c8a93a301bb4a20" - ], - "data": "0x", - "blockHash": "0x9a1d55e78a95faad842e8b2f6d9c1a5090dfc9a74461a995d7e73b5a0d7b27de", - "blockNumber": "0x1779721", - "blockTimestamp": "0x69adc6e7", - "transactionHash": "0x5d148264ea091160f6cc99dc791a20240d9497d87380faca3503bb5fe04e9721", - "transactionIndex": "0xc9", - "logIndex": "0x12e", - "removed": false - } - ], - "logsBloom": "0x00020000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000080080000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000002040000000000000000000000000000000001000000000000000000000000000000800000000000000000000", "type": "0x2", - "transactionHash": "0x5d148264ea091160f6cc99dc791a20240d9497d87380faca3503bb5fe04e9721", - "transactionIndex": "0xc9", - "blockHash": "0x9a1d55e78a95faad842e8b2f6d9c1a5090dfc9a74461a995d7e73b5a0d7b27de", - "blockNumber": "0x1779721", - "gasUsed": "0x81fb2", - "effectiveGasPrice": "0x1f1ad7c", - "blobGasUsed": "0x0", - "from": "0x000005281a2b04a182085d37cc9e6dd552795caa", - "to": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "contractAddress": null - }, - { "status": "0x1", - "cumulativeGasUsed": "0x14028c5", + "cumulativeGasUsed": "0x31f015f", "logs": [ { "address": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", "topics": [ "0xb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f7", - "0x000000000000000000000000686725e618742071d52966e90ca4727b506bc5f1", - "0x6d4914ab77d14fe927bd27b275f5597cad5de90ad08abea92c8a93a301bb4a20" + "0x0000000000000000000000002447680186067b6ef959df69d4b1dc55ce543a9f", + "0xdce91b2f1d6c279f1fe8d67fcfa6989149da1a0e91c5c1b5e32f0a0394dcf9ee" ], "data": "0x", - "blockHash": "0x3f7c84e2ced4bb894ce6b1400acce4681934b97d3e9b2042b5cc71cef68b5818", - "blockNumber": "0x1779722", - "blockTimestamp": "0x69adc6f3", - "transactionHash": "0xcfd79178ac3f65debf08311c8fb6b7a26a196853cc80c7f035a835fff47ac02b", - "transactionIndex": "0x94", - "logIndex": "0x39a", + "blockHash": "0xa75992a87b07e68100dbe67908d908034d97dc7f2cfea08576bea8e382399f7a", + "blockNumber": "0x179de31", + "blockTimestamp": "0x69c93c5f", + "transactionHash": "0xf52f6a73815495053346d5d0f0879fac17404b92cd3ab80913ca5eb37685e937", + "transactionIndex": "0x20a", + "logIndex": "0x547", "removed": false } ], - "logsBloom": "0x00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000080080000000000001000000000000000000000000000000000001000000000000000000000000200000000000000000000002000000000000000000000000000000000001000000000000000000000000000000000000000000000000000", - "type": "0x2", - "transactionHash": "0xcfd79178ac3f65debf08311c8fb6b7a26a196853cc80c7f035a835fff47ac02b", - "transactionIndex": "0x94", - "blockHash": "0x3f7c84e2ced4bb894ce6b1400acce4681934b97d3e9b2042b5cc71cef68b5818", - "blockNumber": "0x1779722", - "gasUsed": "0x740f8", - "effectiveGasPrice": "0x1d6f6ad", - "blobGasUsed": "0x0", - "from": "0x000005281a2b04a182085d37cc9e6dd552795caa", - "to": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "contractAddress": null - }, - { - "status": "0x1", - "cumulativeGasUsed": "0x3492d33", - "logs": [ - { - "address": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "topics": [ - "0xb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f7", - "0x000000000000000000000000c9691f6a6cf5260035e226da9c9884fa20fe9224", - "0x33b605026b05b17c439aa8552a983d8f8de038bbb1a4a25b39db6c839a571a89" - ], - "data": "0x", - "blockHash": "0xc7a30103654d17063cf8750ad8a1d3c799df1d29b64b4583528c85277c9374c3", - "blockNumber": "0x1779723", - "blockTimestamp": "0x69adc6ff", - "transactionHash": "0x476543912fe11f672a2f15989863eca0acb509edd4a4d81212a61a293c42bcac", - "transactionIndex": "0x1c2", - "logIndex": "0x36e", - "removed": false - } - ], - "logsBloom": "0x00020000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000002002000010000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000001000000000080000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000004000", - "type": "0x2", - "transactionHash": "0x476543912fe11f672a2f15989863eca0acb509edd4a4d81212a61a293c42bcac", - "transactionIndex": "0x1c2", - "blockHash": "0xc7a30103654d17063cf8750ad8a1d3c799df1d29b64b4583528c85277c9374c3", - "blockNumber": "0x1779723", - "gasUsed": "0x891ea", - "effectiveGasPrice": "0x1d01281", - "blobGasUsed": "0x0", - "from": "0x000005281a2b04a182085d37cc9e6dd552795caa", - "to": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "contractAddress": null - }, - { - "status": "0x1", - "cumulativeGasUsed": "0x117439e", - "logs": [ - { - "address": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "topics": [ - "0xb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f7", - "0x000000000000000000000000723241843bc351d87d929cf90d12cd80de661146", - "0xd037c54c749adffb5ef7391dc82cb3509d344c3ebd8621bd449eae37b018ff31" - ], - "data": "0x", - "blockHash": "0x0974317fe9188dd69a4d5afac343cb329c3ef7ad27636c74dcaf064467dbad5d", - "blockNumber": "0x1779724", - "blockTimestamp": "0x69adc70b", - "transactionHash": "0xe94869cd37e358d8cabc0c66a6ee980f031973ee12851283b84727b6235bf6e1", - "transactionIndex": "0xbf", - "logIndex": "0x18d", - "removed": false - } - ], - "logsBloom": "0x00020000040000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000080000000000000000020000000000000000000000000000000000000000000000000000000000200000000000000000000002000000200000000000000000000000000000000000000000000000000000000000000000000000000000000", - "type": "0x2", - "transactionHash": "0xe94869cd37e358d8cabc0c66a6ee980f031973ee12851283b84727b6235bf6e1", - "transactionIndex": "0xbf", - "blockHash": "0x0974317fe9188dd69a4d5afac343cb329c3ef7ad27636c74dcaf064467dbad5d", - "blockNumber": "0x1779724", - "gasUsed": "0x36390", - "effectiveGasPrice": "0x209be42", - "blobGasUsed": "0x0", - "from": "0x000005281a2b04a182085d37cc9e6dd552795caa", - "to": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "contractAddress": null - }, - { - "status": "0x1", - "cumulativeGasUsed": "0x11ffc86", - "logs": [ - { - "address": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", - "topics": [ - "0xb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f7", - "0x0000000000000000000000009dc6f23d0322a4805ff31856531f166ad590b661", - "0x5b4a53078a392f52ba2d0f29687b3a7d02dbdb341c0bbbf1b0d10bc1b930a77d" - ], - "data": "0x", - "blockHash": "0x6c1a3a3d5f8b2a3c81a286a75bc95e9299bb478021f6d095a1d5aea1ce7d5d4f", - "blockNumber": "0x1779725", - "blockTimestamp": "0x69adc717", - "transactionHash": "0x2f0f1791d646f293d4f13a917111b21f6879019facab1c8e0e2bd3b58efcb263", - "transactionIndex": "0xb4", - "logIndex": "0x184", - "removed": false - } - ], - "logsBloom": "0x00020000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000040000000000000000002000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400004000000000000000000000000000000000100000000200000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "type": "0x2", - "transactionHash": "0x2f0f1791d646f293d4f13a917111b21f6879019facab1c8e0e2bd3b58efcb263", - "transactionIndex": "0xb4", - "blockHash": "0x6c1a3a3d5f8b2a3c81a286a75bc95e9299bb478021f6d095a1d5aea1ce7d5d4f", - "blockNumber": "0x1779725", - "gasUsed": "0x2a60e2", - "effectiveGasPrice": "0x20400ec", + "logsBloom": "0x00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000020000000000000000000000000000000000000000000000000000000000000100000000000000400000000000000000000000080010000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000002000000000000000000000000000000000000040000000000000080000000000000000000000000000000000", + "transactionHash": "0xf52f6a73815495053346d5d0f0879fac17404b92cd3ab80913ca5eb37685e937", + "transactionIndex": "0x20a", + "blockHash": "0xa75992a87b07e68100dbe67908d908034d97dc7f2cfea08576bea8e382399f7a", + "blockNumber": "0x179de31", + "gasUsed": "0x40cc3", + "effectiveGasPrice": "0x572c1a2", "blobGasUsed": "0x0", "from": "0x000005281a2b04a182085d37cc9e6dd552795caa", "to": "0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed", @@ -713,7 +69,7 @@ "libraries": [], "pending": [], "returns": {}, - "timestamp": 1772996399199, + "timestamp": 1774795877952, "chain": 1, - "commit": "39cfbee" + "commit": "8192814" } \ No newline at end of file diff --git a/script/Deploy.s.sol b/script/Deploy.s.sol index 2ab9eb0..839d50d 100644 --- a/script/Deploy.s.sol +++ b/script/Deploy.s.sol @@ -4,12 +4,14 @@ pragma solidity 0.8.23; import {IERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {IAuctionTaker} from "./interfaces/IAuctionTaker.sol"; import {ICatFactory} from "./interfaces/ICatFactory.sol"; import {IDaddy} from "./interfaces/IDaddy.sol"; import {IDebtInFrontHelper} from "./interfaces/IDebtInFrontHelper.sol"; import {IDeployer} from "./interfaces/IDeployer.sol"; import {ILeverageZapper} from "./interfaces/ILeverageZapper.sol"; import {IRegistry} from "./interfaces/IRegistry.sol"; +import {ISwapExecutor} from "./interfaces/ISwapExecutor.sol"; import {LenderFactory} from "../src/lender/LenderFactory.sol"; import {StrategyAprOracle} from "../src/lender/periphery/StrategyAprOracle.sol"; @@ -19,7 +21,7 @@ import "forge-std/Script.sol"; // ---- Usage ---- // deploy: -// forge script script/Deploy.s.sol:Deploy --verify --slow --legacy --etherscan-api-key $KEY --rpc-url $RPC_URL --broadcast +// forge script script/Deploy.s.sol:Deploy --verify --slow -g 250 --etherscan-api-key $KEY --rpc-url $RPC_URL --broadcast // verify: // vyper -f solc_json src/price_feed.vy > out/build-info/verify.json @@ -47,7 +49,9 @@ contract Deploy is Script { // Periphery StrategyAprOracle public strategyAprOracle; IDebtInFrontHelper public debtInFrontHelper; + ISwapExecutor public swapExecutor; ILeverageZapper public leverageZapper; + IAuctionTaker public auctionTaker; // Daddy IDaddy public daddy; @@ -108,7 +112,9 @@ contract Deploy is Script { vm.label({account: address(registry), newLabel: "Registry"}); vm.label({account: address(strategyAprOracle), newLabel: "StrategyAprOracle"}); vm.label({account: address(debtInFrontHelper), newLabel: "DebtInFrontHelper"}); + vm.label({account: address(swapExecutor), newLabel: "SwapExecutor"}); vm.label({account: address(leverageZapper), newLabel: "LeverageZapper"}); + vm.label({account: address(auctionTaker), newLabel: "AuctionTaker"}); } else { console2.log("---------------------------------"); console2.log("Original Auction: ", originalAuction); @@ -121,7 +127,9 @@ contract Deploy is Script { console2.log("Registry: ", address(registry)); console2.log("Strategy APR Oracle: ", address(strategyAprOracle)); console2.log("Debt In Front Helper: ", address(debtInFrontHelper)); + console2.log("Swap Executor: ", address(swapExecutor)); console2.log("Leverage Zapper: ", address(leverageZapper)); + console2.log("Auction Taker: ", address(auctionTaker)); console2.log("---------------------------------"); } @@ -164,8 +172,16 @@ contract Deploy is Script { debtInFrontHelper = IDebtInFrontHelper( DEPLOYER.deployCreate2(keccak256(abi.encode(SALT, "debtInFrontHelper")), abi.encodePacked(vm.getCode("debt_in_front_helper"))) ); - leverageZapper = - ILeverageZapper(DEPLOYER.deployCreate2(keccak256(abi.encode(SALT, "leverageZapper")), abi.encodePacked(vm.getCode("leverage_zapper")))); + swapExecutor = + ISwapExecutor(DEPLOYER.deployCreate2(keccak256(abi.encode(SALT, "swapExecutor")), abi.encodePacked(vm.getCode("swap_executor")))); + leverageZapper = ILeverageZapper( + DEPLOYER.deployCreate2( + keccak256(abi.encode(SALT, "leverageZapper")), + abi.encodePacked(vm.getCode("leverage_zapper"), abi.encode(address(daddy), address(registry), address(swapExecutor))) + ) + ); + auctionTaker = + IAuctionTaker(DEPLOYER.deployCreate2(keccak256(abi.encode(SALT, "auctionTaker")), abi.encodePacked(vm.getCode("yv_auction_taker")))); } } diff --git a/script/README.md b/script/README.md index 7f24d97..dbade8f 100644 --- a/script/README.md +++ b/script/README.md @@ -21,4 +21,5 @@ - Registry: 0x686725E618742071D52966e90ca4727B506bC5f1 - Strategy APR Oracle: 0xc9691f6a6cf5260035e226dA9C9884fA20Fe9224 - Debt In Front Helper: 0x723241843Bc351d87D929cF90D12cd80de661146 -- Leverage Zapper: 0x9Dc6f23d0322A4805FF31856531F166ad590B661 \ No newline at end of file +- Leverage Zapper: 0x9Dc6f23d0322A4805FF31856531F166ad590B661 +- Auction Taker: 0x2447680186067b6eF959Df69d4B1Dc55ce543a9F \ No newline at end of file diff --git a/script/interfaces/IAuctionTaker.sol b/script/interfaces/IAuctionTaker.sol new file mode 100644 index 0000000..bdcf4d0 --- /dev/null +++ b/script/interfaces/IAuctionTaker.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.23; + +interface IAuctionTaker { + + function takeAuction( + address auction, + uint256 auction_id + ) external; + +} diff --git a/script/interfaces/ILeverageZapper.sol b/script/interfaces/ILeverageZapper.sol index f23201b..1303ee7 100644 --- a/script/interfaces/ILeverageZapper.sol +++ b/script/interfaces/ILeverageZapper.sol @@ -15,6 +15,8 @@ interface ILeverageZapper { struct OpenLeveragedData { address owner; address trove_manager; + address flash_loan_token; + address auction_taker; uint256 owner_index; uint256 flash_loan_amount; uint256 collateral_amount; @@ -30,8 +32,8 @@ interface ILeverageZapper { } struct CloseLeveragedData { - address owner; address trove_manager; + address flash_loan_token; uint256 trove_id; uint256 flash_loan_amount; SwapData collateral_swap; @@ -39,8 +41,9 @@ interface ILeverageZapper { } struct LeverUpData { - address owner; address trove_manager; + address flash_loan_token; + address auction_taker; uint256 trove_id; uint256 flash_loan_amount; uint256 collateral_amount; @@ -53,8 +56,8 @@ interface ILeverageZapper { } struct LeverDownData { - address owner; address trove_manager; + address flash_loan_token; uint256 trove_id; uint256 flash_loan_amount; uint256 collateral_to_remove; @@ -62,6 +65,30 @@ interface ILeverageZapper { SwapData debt_swap; } + // ============================================================================================ + // Storage + // ============================================================================================ + + function routers( + address router + ) external view returns (bool); + function auction_takers( + address auction_taker + ) external view returns (bool); + + // ============================================================================================ + // Whitelist + // ============================================================================================ + + function set_router( + address router, + bool allowed + ) external; + function set_auction_taker( + address auction_taker, + bool allowed + ) external; + // ============================================================================================ // External functions // ============================================================================================ diff --git a/script/interfaces/ISwapExecutor.sol b/script/interfaces/ISwapExecutor.sol new file mode 100644 index 0000000..491e529 --- /dev/null +++ b/script/interfaces/ISwapExecutor.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.23; + +interface ISwapExecutor { + + function swap( + address router, + bytes calldata data, + address token_in, + address token_out + ) external; + +} diff --git a/src/dutch_desk.vy b/src/dutch_desk.vy index 3d7613c..6cbd9bf 100644 --- a/src/dutch_desk.vy +++ b/src/dutch_desk.vy @@ -55,7 +55,6 @@ struct InitializeParams: lender: address price_oracle: address auction: address - borrow_token: address collateral_token: address minimum_price_buffer_percentage: uint256 starting_price_buffer_percentage: uint256 diff --git a/src/factory.vy b/src/factory.vy index cba93ba..0ea7e92 100644 --- a/src/factory.vy +++ b/src/factory.vy @@ -40,7 +40,7 @@ struct DeployParams: collateral_token: address # address of the collateral token price_oracle: address # address of the Price Oracle contract minimum_debt: uint256 # minimum borrowable amount, e.g., `500 * borrow_token_precision` for 500 tokens - safe_collateral_ratio: uint256 # target CR after partial liquidation, e.g., `115` for 115%. must be greater than `100% + max_liquidation_fee` to avoid underflow in the safe CR calculation + safe_collateral_ratio: uint256 # target CR after partial liquidation, e.g., `115` for 115% minimum_collateral_ratio: uint256 # minimum CR to avoid liquidation, e.g., `110` for 110% max_penalty_collateral_ratio: uint256 # CR at which max liquidation fee applies, e.g., `105` for 105% min_liquidation_fee: uint256 # minimum liquidation fee in hundredths of a percent, e.g., `50` for 0.5% @@ -71,6 +71,13 @@ LENDER_FACTORY: public(immutable(ILenderFactory)) # Version VERSION: public(constant(String[28])) = "1.0.0" +# Validation constants +_MIN_TOKEN_DECIMALS: constant(uint256) = 6 +_MAX_TOKEN_DECIMALS: constant(uint256) = 18 +_ONE_HUNDRED_PCT: constant(uint256) = 100 +_BPS: constant(uint256) = 10_000 +_WAD: constant(uint256) = 10 ** 18 + # ============================================================================================ # Constructor @@ -116,6 +123,9 @@ def deploy(params: DeployParams) -> (address, address, address, address, address @return auction Address of the deployed Auction contract @return lender Address of the deployed Lender contract """ + # Validate parameters + self._validate_params(params) + # Compute the salt value salt: bytes32 = keccak256(abi_encode(msg.sender, params.salt, params.collateral_token, params.borrow_token)) @@ -170,7 +180,6 @@ def deploy(params: DeployParams) -> (address, address, address, address, address lender=lender, price_oracle=params.price_oracle, auction=auction, - borrow_token=params.borrow_token, collateral_token=params.collateral_token, minimum_price_buffer_percentage=params.minimum_price_buffer_percentage, starting_price_buffer_percentage=params.starting_price_buffer_percentage, @@ -198,4 +207,55 @@ def deploy(params: DeployParams) -> (address, address, address, address, address ) # Return addresses - return (trove_manager, sorted_troves, dutch_desk, auction, lender) \ No newline at end of file + return (trove_manager, sorted_troves, dutch_desk, auction, lender) + + +# ============================================================================================ +# Internal +# ============================================================================================ + + +@internal +@view +def _validate_params(params: DeployParams): + """ + @notice Validate deploy parameters to prevent bricked markets + @param params Deploy parameters struct + """ + # Addresses + assert params.borrow_token != empty(address), "!borrow_token" + assert params.collateral_token != empty(address), "!collateral_token" + assert params.price_oracle != empty(address), "!price_oracle" + assert params.borrow_token != params.collateral_token, "!same_token" + + # Token decimals + borrow_decimals: uint256 = convert(staticcall IERC20Detailed(params.borrow_token).decimals(), uint256) + collateral_decimals: uint256 = convert(staticcall IERC20Detailed(params.collateral_token).decimals(), uint256) + assert borrow_decimals >= _MIN_TOKEN_DECIMALS and borrow_decimals <= _MAX_TOKEN_DECIMALS, "!borrow_decimals" + assert collateral_decimals >= _MIN_TOKEN_DECIMALS and collateral_decimals <= _MAX_TOKEN_DECIMALS, "!collateral_decimals" + + # Collateral ratios + assert params.safe_collateral_ratio > params.minimum_collateral_ratio, "!safe_cr" + assert params.minimum_collateral_ratio > params.max_penalty_collateral_ratio, "!min_cr" + + # Liquidation fees + assert params.min_liquidation_fee <= params.max_liquidation_fee, "!liq_fee" + assert params.safe_collateral_ratio * _ONE_HUNDRED_PCT > _BPS + params.max_liquidation_fee, "!safe_cr_fee" + assert params.max_penalty_collateral_ratio * _ONE_HUNDRED_PCT >= _BPS + params.max_liquidation_fee, "!max_penalty_cr_fee" + + # Debt + assert params.minimum_debt > 0, "!minimum_debt" + + # Interest + assert params.upfront_interest_period > 0, "!upfront_interest_period" + assert params.interest_rate_adj_cooldown > 0, "!interest_rate_adj_cooldown" + + # Auction + assert params.step_decay_rate < _BPS, "!step_decay_rate" + assert params.step_duration > 0, "!step_duration" + assert params.auction_length > 0, "!auction_length" + assert params.minimum_price_buffer_percentage > 0 and params.minimum_price_buffer_percentage <= _WAD, "!min_price_buffer" + assert params.starting_price_buffer_percentage >= _WAD, "!start_price_buffer" + assert params.re_kick_starting_price_buffer_percentage >= _WAD, "!re_kick_price_buffer" + assert params.starting_price_buffer_percentage >= params.minimum_price_buffer_percentage, "!start_price_buffer" + assert params.re_kick_starting_price_buffer_percentage >= params.minimum_price_buffer_percentage, "!re_kick_price_buffer" \ No newline at end of file diff --git a/src/interfaces/IAuction.vyi b/src/interfaces/IAuction.vyi index 998d5a5..f6411a1 100644 --- a/src/interfaces/IAuction.vyi +++ b/src/interfaces/IAuction.vyi @@ -32,6 +32,18 @@ struct InitializeParams: # ============================================================================================ +@external +@view +def buy_token() -> address: + ... + + +@external +@view +def sell_token() -> address: + ... + + @external @view def auctions(auction_id: uint256) -> AuctionInfo: @@ -72,4 +84,19 @@ def re_kick( starting_price: uint256, minimum_price: uint256, ): - ... \ No newline at end of file + ... + + +# ============================================================================================ +# Take +# ============================================================================================ + + +@external +def take( + auction_id: uint256, + max_take_amount: uint256 = max_value(uint256), + receiver: address = msg.sender, + data: Bytes[10 ** 5] = empty(Bytes[10 ** 5]), +) -> uint256: + ... diff --git a/src/interfaces/IDutchDesk.vyi b/src/interfaces/IDutchDesk.vyi index 3b56164..9b51a4b 100644 --- a/src/interfaces/IDutchDesk.vyi +++ b/src/interfaces/IDutchDesk.vyi @@ -11,7 +11,6 @@ struct InitializeParams: lender: address price_oracle: address auction: address - borrow_token: address collateral_token: address minimum_price_buffer_percentage: uint256 starting_price_buffer_percentage: uint256 @@ -33,6 +32,18 @@ def initialize(params: InitializeParams): # ============================================================================================ +@external +@view +def auction() -> address: + ... + + +@external +@view +def nonce() -> uint256: + ... + + @external def kick(amount: uint256, maximum_amount: uint256, receiver: address): ... \ No newline at end of file diff --git a/src/interfaces/IFlashLender.vyi b/src/interfaces/IMorpho.vyi similarity index 84% rename from src/interfaces/IFlashLender.vyi rename to src/interfaces/IMorpho.vyi index dc9f707..dff5dc0 100644 --- a/src/interfaces/IFlashLender.vyi +++ b/src/interfaces/IMorpho.vyi @@ -8,9 +8,8 @@ @external def flashLoan( - receiver: address, token: address, - amount: uint256, + assets: uint256, data: Bytes[10 ** 5], -) -> bool: +): ... diff --git a/src/interfaces/IRegistry.vyi b/src/interfaces/IRegistry.vyi new file mode 100644 index 0000000..43735c6 --- /dev/null +++ b/src/interfaces/IRegistry.vyi @@ -0,0 +1,12 @@ +# @version 0.4.3 + + +flag Status: + ENDORSED + UNENDORSED + + +@external +@view +def market_status(trove_manager: address) -> Status: + ... diff --git a/src/interfaces/ISwapExecutor.vyi b/src/interfaces/ISwapExecutor.vyi new file mode 100644 index 0000000..418bc1b --- /dev/null +++ b/src/interfaces/ISwapExecutor.vyi @@ -0,0 +1,11 @@ +# @version 0.4.3 + + +@external +def swap( + router: address, + data: Bytes[10 ** 4], + token_in: address, + token_out: address, +): + ... diff --git a/src/interfaces/ITroveManager.vyi b/src/interfaces/ITroveManager.vyi index 1b75454..61a0a3d 100644 --- a/src/interfaces/ITroveManager.vyi +++ b/src/interfaces/ITroveManager.vyi @@ -25,7 +25,6 @@ struct Trove: last_debt_update_time: uint64 last_interest_rate_adj_time: uint64 owner: address - pending_owner: address status: Status @@ -63,6 +62,12 @@ def collateral_token() -> address: ... +@external +@view +def dutch_desk() -> address: + ... + + @external @view def sorted_troves() -> address: @@ -81,28 +86,19 @@ def get_trove_debt_after_interest(trove_id: uint256) -> uint256: ... -# ============================================================================================ -# Initialize -# ============================================================================================ - - @external -def initialize(params: InitializeParams): +@view +def approved(owner: address, operator: address) -> bool: ... # ============================================================================================ -# Ownership +# Initialize # ============================================================================================ @external -def transfer_ownership(trove_id: uint256, new_owner: address): - ... - - -@external -def accept_ownership(trove_id: uint256): +def initialize(params: InitializeParams): ... @@ -122,6 +118,7 @@ def open_trove( max_upfront_fee: uint256, min_borrow_out: uint256, min_collateral_out: uint256, + owner: address = msg.sender, ) -> uint256: ... @@ -164,4 +161,4 @@ def repay(trove_id: uint256, debt_amount: uint256): @external def close_trove(trove_id: uint256): - ... \ No newline at end of file + ... diff --git a/src/interfaces/IVault.vyi b/src/interfaces/IVault.vyi new file mode 100644 index 0000000..a304084 --- /dev/null +++ b/src/interfaces/IVault.vyi @@ -0,0 +1,6 @@ +# @version 0.4.3 + + +@external +def redeem(shares: uint256, receiver: address, owner: address) -> uint256: + ... diff --git a/src/interfaces/IZapperAuctionTaker.vyi b/src/interfaces/IZapperAuctionTaker.vyi new file mode 100644 index 0000000..dab20bd --- /dev/null +++ b/src/interfaces/IZapperAuctionTaker.vyi @@ -0,0 +1,9 @@ +# @version 0.4.3 + + +@external +def takeAuction( + auction: address, + auction_id: uint256, +): + ... diff --git a/src/lender/LenderFactory.sol b/src/lender/LenderFactory.sol index d377ba6..7df2a11 100644 --- a/src/lender/LenderFactory.sol +++ b/src/lender/LenderFactory.sol @@ -52,9 +52,6 @@ contract LenderFactory { _lender.setPendingManagement(DADDY); _lender.setPerformanceFeeRecipient(DADDY); - // Disable health checks - _lender.setDoHealthCheck(false); - // Return the address of the new Lender return address(_lender); } diff --git a/src/periphery/leverage_zapper.vy b/src/periphery/leverage_zapper.vy index 7655fd8..e9137b7 100644 --- a/src/periphery/leverage_zapper.vy +++ b/src/periphery/leverage_zapper.vy @@ -4,14 +4,33 @@ @title Leverage Zapper @license GNU AGPLv3 @author Flex -@notice Enables leveraged positions using crvUSD flash loans and DEX aggregator swaps +@notice Enables leveraged positions using Morpho flash loans and DEX aggregator swaps +@dev The Morpho contract address is hardcoded to the Ethereum mainnet deployment """ from ethereum.ercs import IERC20 -from ..interfaces import IFlashLender +from ..interfaces import IMorpho +from ..interfaces import IRegistry +from ..interfaces import ISwapExecutor +from ..interfaces import IZapperAuctionTaker +from ..interfaces import IDutchDesk from ..interfaces import ITroveManager +# ============================================================================================ +# Events +# ============================================================================================ + + +event SetRouter: + router: indexed(address) + allowed: bool + +event SetAuctionTaker: + auction_taker: indexed(address) + allowed: bool + + # ============================================================================================ # Flags # ============================================================================================ @@ -37,6 +56,8 @@ struct SwapData: struct OpenLeveragedData: owner: address trove_manager: address + flash_loan_token: address + auction_taker: address owner_index: uint256 flash_loan_amount: uint256 collateral_amount: uint256 @@ -52,8 +73,8 @@ struct OpenLeveragedData: struct CloseLeveragedData: - owner: address trove_manager: address + flash_loan_token: address trove_id: uint256 flash_loan_amount: uint256 collateral_swap: SwapData @@ -61,8 +82,9 @@ struct CloseLeveragedData: struct LeverUpData: - owner: address trove_manager: address + flash_loan_token: address + auction_taker: address trove_id: uint256 flash_loan_amount: uint256 collateral_amount: uint256 @@ -75,8 +97,8 @@ struct LeverUpData: struct LeverDownData: - owner: address trove_manager: address + flash_loan_token: address trove_id: uint256 flash_loan_amount: uint256 collateral_to_remove: uint256 @@ -89,18 +111,92 @@ struct LeverDownData: # ============================================================================================ -# Max swap calldata size -_MAX_SWAP_DATA_SIZE: constant(uint256) = 10 ** 4 +# Contracts +DADDY: public(immutable(address)) +REGISTRY: public(immutable(IRegistry)) +SWAP_EXECUTOR: public(immutable(ISwapExecutor)) -# ERC3156 +# Max calldata size +_MAX_SWAP_DATA_SIZE: constant(uint256) = 10 ** 4 _MAX_FLASHLOAN_CALLBACK_DATA_SIZE: constant(uint256) = 10 ** 5 -_FLASHLOAN_CALLBACK_SUCCESS: constant(bytes32) = keccak256("ERC3156FlashBorrower.onFlashLoan") -# Flash loan token -_CRVUSD: constant(IERC20) = IERC20(0xf939E0A03FB07F59A73314E73794Be0E57ac1b4E) +# Flash loan provider +_MORPHO: constant(IMorpho) = IMorpho(0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb) + -# Flashloan provider (ERC-3156 compliant) -_FLASH_LENDER: constant(IFlashLender) = IFlashLender(0x26dE7861e213A5351F6ED767d00e0839930e9eE1) +# ============================================================================================ +# Storage +# ============================================================================================ + + +# Whitelists +routers: public(HashMap[address, bool]) +auction_takers: public(HashMap[address, bool]) + + +# ============================================================================================ +# Constructor +# ============================================================================================ + + +@deploy +def __init__(daddy: address, registry: address, swap_executor: address): + """ + @notice Initialize the contract + @param daddy Address of the Daddy contract + @param registry Address of the Registry contract + @param swap_executor Address of the Swap Executor contract + """ + DADDY = daddy + REGISTRY = IRegistry(registry) + SWAP_EXECUTOR = ISwapExecutor(swap_executor) + + +# ============================================================================================ +# Whitelist +# ============================================================================================ + + +@external +def set_router(router: address, allowed: bool): + """ + @notice Whitelist or remove a swap router + @dev Only callable by Daddy + @param router The router address + @param allowed True to whitelist, False to remove + """ + # Make sure the caller is Daddy + assert msg.sender == DADDY, "bad daddy" + + # Update whitelist + self.routers[router] = allowed + + # Emit event + log SetRouter( + router=router, + allowed=allowed, + ) + + +@external +def set_auction_taker(auction_taker: address, allowed: bool): + """ + @notice Whitelist or remove an Auction Taker + @dev Only callable by Daddy + @param auction_taker The Auction Taker address + @param allowed True to whitelist, False to remove + """ + # Make sure the caller is Daddy + assert msg.sender == DADDY, "bad daddy" + + # Update whitelist + self.auction_takers[auction_taker] = allowed + + # Emit event + log SetAuctionTaker( + auction_taker=auction_taker, + allowed=allowed, + ) # ============================================================================================ @@ -109,36 +205,34 @@ _FLASH_LENDER: constant(IFlashLender) = IFlashLender(0x26dE7861e213A5351F6ED767d @external +@nonreentrant def open_leveraged_trove(data: OpenLeveragedData) -> uint256: """ @notice Open a new leveraged Trove - @dev After this call, the owner must call `accept_ownership` on the Trove Manager to claim the Trove + @dev If a redemption is triggered, an `auction_taker` should be provided. + Otherwise, auction proceeds will be sent to this contract and may be swept by someone else @param data The open leveraged Trove parameters @return The Trove ID """ - # Make sure the owner is non-zero - assert data.owner != empty(address), "!owner" + # Validate input parameters + self._validate_params(data.trove_manager, data.collateral_swap.router, data.debt_swap.router, data.auction_taker) # Pull collateral from the caller collateral_token: address = staticcall ITroveManager(data.trove_manager).collateral_token() assert extcall IERC20(collateral_token).transferFrom(msg.sender, self, data.collateral_amount, default_return_value=True) # Initiate flash loan - extcall _FLASH_LENDER.flashLoan( - self, # receiver - _CRVUSD.address, # token - data.flash_loan_amount, # amount + extcall _MORPHO.flashLoan( + data.flash_loan_token, # token + data.flash_loan_amount, # assets abi_encode(Operation.OPEN, data), # data ) # Compute the Trove ID trove_id: uint256 = convert(keccak256(abi_encode(self, data.owner_index)), uint256) - # Transfer the Trove ownership to the owner - extcall ITroveManager(data.trove_manager).transfer_ownership(trove_id, data.owner) - - # Sweep any remaining crvUSD tokens to caller - self._sweep(_CRVUSD.address, msg.sender) + # Sweep any remaining flash loan tokens to caller + self._sweep(data.flash_loan_token, msg.sender) # Return the Trove ID return trove_id @@ -150,30 +244,30 @@ def open_leveraged_trove(data: OpenLeveragedData) -> uint256: @external +@nonreentrant def close_leveraged_trove(data: CloseLeveragedData): """ @notice Close a leveraged Trove - @dev Only callable by the Trove owner - @dev User must call `trove_manager.transfer_ownership(trove_id, zapper)` before calling this + @dev Only callable by the Trove owner or an approved operator + @dev The Zapper must be approved to operate on behalf of the Trove owner @param data The close leveraged Trove parameters """ + # Validate input parameters + self._validate_params(data.trove_manager, data.collateral_swap.router, data.debt_swap.router) + # Cache the Trove Manager instance trove_manager: ITroveManager = ITroveManager(data.trove_manager) # Get the Trove info trove: ITroveManager.Trove = staticcall trove_manager.troves(data.trove_id) - # Make sure the caller is the current Trove owner - assert trove.owner == msg.sender, "!owner" - - # Accept Trove ownership - extcall trove_manager.accept_ownership(data.trove_id) + # Make sure the caller is the Trove owner or an approved operator + assert trove.owner == msg.sender or staticcall trove_manager.approved(trove.owner, msg.sender), "!owner" # Initiate flash loan - extcall _FLASH_LENDER.flashLoan( - self, # receiver - _CRVUSD.address, # token - data.flash_loan_amount, # amount + extcall _MORPHO.flashLoan( + data.flash_loan_token, # token + data.flash_loan_amount, # assets abi_encode(Operation.CLOSE, data), # data ) @@ -181,15 +275,15 @@ def close_leveraged_trove(data: CloseLeveragedData): collateral_token: address = staticcall trove_manager.collateral_token() borrow_token: address = staticcall trove_manager.borrow_token() - # Sweep any remaining crvUSD tokens to caller - self._sweep(_CRVUSD.address, msg.sender) + # Sweep any remaining flash loan tokens to caller + self._sweep(data.flash_loan_token, msg.sender) # Sweep any remaining collateral tokens to caller - if collateral_token != _CRVUSD.address: + if collateral_token != data.flash_loan_token: self._sweep(collateral_token, msg.sender) # Sweep any remaining borrow tokens to caller - if borrow_token != _CRVUSD.address: + if borrow_token != data.flash_loan_token and borrow_token != collateral_token: self._sweep(borrow_token, msg.sender) @@ -199,24 +293,27 @@ def close_leveraged_trove(data: CloseLeveragedData): @external +@nonreentrant def lever_up_trove(data: LeverUpData): """ @notice Add leverage to an existing Trove - @dev Only callable by the Trove owner - @dev User must call `trove_manager.transfer_ownership(trove_id, zapper)` before calling this + @dev Only callable by the Trove owner or an approved operator + @dev The Zapper must be approved to operate on behalf of the Trove owner + @dev If a redemption is triggered, an `auction_taker` should be provided. + Otherwise, auction proceeds will be sent to this contract and may be swept by someone else @param data The lever up parameters """ + # Validate input parameters + self._validate_params(data.trove_manager, data.collateral_swap.router, data.debt_swap.router, data.auction_taker) + # Cache the Trove Manager instance trove_manager: ITroveManager = ITroveManager(data.trove_manager) # Get the Trove info trove: ITroveManager.Trove = staticcall trove_manager.troves(data.trove_id) - # Make sure the caller is the current Trove owner - assert trove.owner == msg.sender, "!owner" - - # Accept Trove ownership - extcall trove_manager.accept_ownership(data.trove_id) + # Make sure the caller is the Trove owner or an approved operator + assert trove.owner == msg.sender or staticcall trove_manager.approved(trove.owner, msg.sender), "!owner" # Pull collateral from the caller collateral_token: address = staticcall trove_manager.collateral_token() @@ -224,18 +321,14 @@ def lever_up_trove(data: LeverUpData): assert extcall IERC20(collateral_token).transferFrom(msg.sender, self, data.collateral_amount, default_return_value=True) # Initiate flash loan - extcall _FLASH_LENDER.flashLoan( - self, # receiver - _CRVUSD.address, # token - data.flash_loan_amount, # amount + extcall _MORPHO.flashLoan( + data.flash_loan_token, # token + data.flash_loan_amount, # assets abi_encode(Operation.LEVER_UP, data), # data ) - # Transfer Trove ownership back to caller - extcall trove_manager.transfer_ownership(data.trove_id, msg.sender) - - # Sweep any remaining crvUSD tokens to caller - self._sweep(_CRVUSD.address, msg.sender) + # Sweep any remaining flash loan tokens to caller + self._sweep(data.flash_loan_token, msg.sender) # ============================================================================================ @@ -244,49 +337,46 @@ def lever_up_trove(data: LeverUpData): @external +@nonreentrant def lever_down_trove(data: LeverDownData): """ @notice Reduce leverage on an existing Trove - @dev Only callable by the Trove owner - @dev User must call `trove_manager.transfer_ownership(trove_id, zapper)` before calling this + @dev Only callable by the Trove owner or an approved operator + @dev The Zapper must be approved to operate on behalf of the Trove owner @param data The lever down parameters """ + # Validate input parameters + self._validate_params(data.trove_manager, data.collateral_swap.router, data.debt_swap.router) + # Cache the Trove Manager instance trove_manager: ITroveManager = ITroveManager(data.trove_manager) # Get the Trove info trove: ITroveManager.Trove = staticcall trove_manager.troves(data.trove_id) - # Make sure the caller is the current Trove owner - assert trove.owner == msg.sender, "!owner" - - # Accept Trove ownership - extcall trove_manager.accept_ownership(data.trove_id) + # Make sure the caller is the Trove owner or an approved operator + assert trove.owner == msg.sender or staticcall trove_manager.approved(trove.owner, msg.sender), "!owner" # Initiate flash loan - extcall _FLASH_LENDER.flashLoan( - self, # receiver - _CRVUSD.address, # token - data.flash_loan_amount, # amount + extcall _MORPHO.flashLoan( + data.flash_loan_token, # token + data.flash_loan_amount, # assets abi_encode(Operation.LEVER_DOWN, data), # data ) - # Transfer Trove ownership back to caller - extcall trove_manager.transfer_ownership(data.trove_id, msg.sender) - # Get collateral and borrow tokens from the Trove Manager collateral_token: address = staticcall trove_manager.collateral_token() borrow_token: address = staticcall trove_manager.borrow_token() - # Sweep any remaining crvUSD tokens to caller - self._sweep(_CRVUSD.address, msg.sender) + # Sweep any remaining flash loan tokens to caller + self._sweep(data.flash_loan_token, msg.sender) # Sweep any remaining collateral tokens to caller - if collateral_token != _CRVUSD.address: + if collateral_token != data.flash_loan_token: self._sweep(collateral_token, msg.sender) # Sweep any remaining borrow tokens to caller - if borrow_token != _CRVUSD.address: + if borrow_token != data.flash_loan_token and borrow_token != collateral_token: self._sweep(borrow_token, msg.sender) @@ -296,51 +386,38 @@ def lever_down_trove(data: LeverDownData): @external -def onFlashLoan( - initiator: address, - token: address, - amount: uint256, - fee: uint256, +def onMorphoFlashLoan( + assets: uint256, data: Bytes[_MAX_FLASHLOAN_CALLBACK_DATA_SIZE], -) -> bytes32: +): """ - @notice ERC-3156 flash loan callback - @dev Only callable by the flash lender - @param initiator The address that initiated the flash loan - @param token The token that was flash loaned - @param amount The amount that was flash loaned - @param fee The fee charged for the flash loan + @notice Morpho flash loan callback + @dev Only callable by Morpho + @param assets The amount that was flash loaned @param data Encoded operation parameters - @return The ERC-3156 callback success hash """ # Sanity checks - assert msg.sender == _FLASH_LENDER.address, "!caller" - assert initiator == self, "!initiator" - assert token == _CRVUSD.address, "!token" - assert len(data) > 4, "!data" - assert staticcall _CRVUSD.balanceOf(self) >= amount, "!amount" - assert fee == 0, "!fee" - - # Decode operation type from the first 32 bytes of the flash loan data + assert msg.sender == _MORPHO.address, "!caller" + assert len(data) >= 32, "!data" + + # Decode operation type from the first 32 bytes operation: Operation = abi_decode(slice(data, 0, 32), Operation) # Branch on operation + flash_loan_token: address = empty(address) if operation == Operation.OPEN: - self._handle_open(amount, data) + flash_loan_token = self._handle_open(assets, data) elif operation == Operation.CLOSE: - self._handle_close(amount, data) + flash_loan_token = self._handle_close(assets, data) elif operation == Operation.LEVER_UP: - self._handle_lever_up(amount, data) + flash_loan_token = self._handle_lever_up(assets, data) elif operation == Operation.LEVER_DOWN: - self._handle_lever_down(amount, data) + flash_loan_token = self._handle_lever_down(assets, data) else: raise "!operation" - # Repay the flash loan - assert extcall _CRVUSD.transfer(_FLASH_LENDER.address, amount, default_return_value=True) - - # Return success hash - return _FLASHLOAN_CALLBACK_SUCCESS + # Approve Morpho to pull repayment (no fee) + assert extcall IERC20(flash_loan_token).approve(_MORPHO.address, assets, default_return_value=True) # ============================================================================================ @@ -349,11 +426,12 @@ def onFlashLoan( @internal -def _handle_open(flash_loan_amount: uint256, data: Bytes[_MAX_FLASHLOAN_CALLBACK_DATA_SIZE]): +def _handle_open(flash_loan_amount: uint256, data: Bytes[_MAX_FLASHLOAN_CALLBACK_DATA_SIZE]) -> address: """ @notice Handle the open leveraged Trove operation inside the flash loan callback - @param flash_loan_amount The amount of crvUSD that was flash loaned + @param flash_loan_amount The amount that was flash loaned @param data The encoded parameters + @return The flash loan token address """ # Decode parameters operation: Operation = empty(Operation) @@ -365,8 +443,8 @@ def _handle_open(flash_loan_amount: uint256, data: Bytes[_MAX_FLASHLOAN_CALLBACK collateral_token: address = staticcall trove_manager.collateral_token() borrow_token: address = staticcall trove_manager.borrow_token() - # crvUSD --> collateral - self._swap(params.collateral_swap, _CRVUSD.address, flash_loan_amount) + # Flash loan token --> collateral + self._swap(params.collateral_swap, params.flash_loan_token, collateral_token, flash_loan_amount) # Get the available collateral available_collateral: uint256 = staticcall IERC20(collateral_token).balanceOf(self) @@ -374,6 +452,10 @@ def _handle_open(flash_loan_amount: uint256, data: Bytes[_MAX_FLASHLOAN_CALLBACK # Approve spending of the collateral by the Trove Manager assert extcall IERC20(collateral_token).approve(params.trove_manager, available_collateral, default_return_value=True) + # Record the Dutch Desk nonce before opening the Trove + dutch_desk: IDutchDesk = IDutchDesk(staticcall trove_manager.dutch_desk()) + nonce_before: uint256 = staticcall dutch_desk.nonce() + # Open the Trove extcall trove_manager.open_trove( params.owner_index, @@ -385,22 +467,30 @@ def _handle_open(flash_loan_amount: uint256, data: Bytes[_MAX_FLASHLOAN_CALLBACK params.max_upfront_fee, params.min_borrow_out, params.min_collateral_out, + params.owner, ) # Make sure our approval is always back to 0 assert extcall IERC20(collateral_token).approve(params.trove_manager, 0, default_return_value=True) - # Borrow token --> crvUSD + # Take the auction if one was kicked and an auction taker was provided + if params.auction_taker != empty(address) and staticcall dutch_desk.nonce() > nonce_before: + extcall IZapperAuctionTaker(params.auction_taker).takeAuction(staticcall dutch_desk.auction(), nonce_before) + + # Borrow token --> flash loan token borrow_token_balance: uint256 = staticcall IERC20(borrow_token).balanceOf(self) - self._swap(params.debt_swap, borrow_token, borrow_token_balance) + self._swap(params.debt_swap, borrow_token, params.flash_loan_token, borrow_token_balance) + + return params.flash_loan_token @internal -def _handle_close(flash_loan_amount: uint256, data: Bytes[_MAX_FLASHLOAN_CALLBACK_DATA_SIZE]): +def _handle_close(flash_loan_amount: uint256, data: Bytes[_MAX_FLASHLOAN_CALLBACK_DATA_SIZE]) -> address: """ @notice Handle the close leveraged Trove operation inside the flash loan callback - @param flash_loan_amount The amount of crvUSD that was flash loaned + @param flash_loan_amount The amount that was flash loaned @param data The encoded parameters + @return The flash loan token address """ # Decode parameters operation: Operation = empty(Operation) @@ -412,8 +502,8 @@ def _handle_close(flash_loan_amount: uint256, data: Bytes[_MAX_FLASHLOAN_CALLBAC collateral_token: address = staticcall trove_manager.collateral_token() borrow_token: address = staticcall trove_manager.borrow_token() - # crvUSD --> borrow token - self._swap(params.debt_swap, _CRVUSD.address, flash_loan_amount) + # Flash loan token --> borrow token + self._swap(params.debt_swap, params.flash_loan_token, borrow_token, flash_loan_amount) # Get the Trove debt after interest trove_debt: uint256 = staticcall trove_manager.get_trove_debt_after_interest(params.trove_id) @@ -427,17 +517,20 @@ def _handle_close(flash_loan_amount: uint256, data: Bytes[_MAX_FLASHLOAN_CALLBAC # Make sure our approval is always back to 0 assert extcall IERC20(borrow_token).approve(params.trove_manager, 0, default_return_value=True) - # Collateral --> crvUSD + # Collateral --> flash loan token collateral_balance: uint256 = staticcall IERC20(collateral_token).balanceOf(self) - self._swap(params.collateral_swap, collateral_token, collateral_balance) + self._swap(params.collateral_swap, collateral_token, params.flash_loan_token, collateral_balance) + + return params.flash_loan_token @internal -def _handle_lever_up(flash_loan_amount: uint256, data: Bytes[_MAX_FLASHLOAN_CALLBACK_DATA_SIZE]): +def _handle_lever_up(flash_loan_amount: uint256, data: Bytes[_MAX_FLASHLOAN_CALLBACK_DATA_SIZE]) -> address: """ @notice Handle the lever up operation inside the flash loan callback - @param flash_loan_amount The amount of crvUSD that was flash loaned + @param flash_loan_amount The amount that was flash loaned @param data The encoded parameters + @return The flash loan token address """ # Decode parameters operation: Operation = empty(Operation) @@ -449,8 +542,8 @@ def _handle_lever_up(flash_loan_amount: uint256, data: Bytes[_MAX_FLASHLOAN_CALL collateral_token: address = staticcall trove_manager.collateral_token() borrow_token: address = staticcall trove_manager.borrow_token() - # crvUSD --> collateral - self._swap(params.collateral_swap, _CRVUSD.address, flash_loan_amount) + # Flash loan token --> collateral + self._swap(params.collateral_swap, params.flash_loan_token, collateral_token, flash_loan_amount) # Get the available collateral available_collateral: uint256 = staticcall IERC20(collateral_token).balanceOf(self) @@ -464,6 +557,10 @@ def _handle_lever_up(flash_loan_amount: uint256, data: Bytes[_MAX_FLASHLOAN_CALL # Make sure our approval is always back to 0 assert extcall IERC20(collateral_token).approve(params.trove_manager, 0, default_return_value=True) + # Record the Dutch Desk nonce before borrowing + dutch_desk: IDutchDesk = IDutchDesk(staticcall trove_manager.dutch_desk()) + nonce_before: uint256 = staticcall dutch_desk.nonce() + # Borrow additional debt extcall trove_manager.borrow( params.trove_id, @@ -473,16 +570,23 @@ def _handle_lever_up(flash_loan_amount: uint256, data: Bytes[_MAX_FLASHLOAN_CALL params.min_collateral_out, ) - # Borrow token --> crvUSD + # Take the auction if one was kicked and an auction taker was provided + if params.auction_taker != empty(address) and staticcall dutch_desk.nonce() > nonce_before: + extcall IZapperAuctionTaker(params.auction_taker).takeAuction(staticcall dutch_desk.auction(), nonce_before) + + # Borrow token --> flash loan token borrow_token_balance: uint256 = staticcall IERC20(borrow_token).balanceOf(self) - self._swap(params.debt_swap, borrow_token, borrow_token_balance) + self._swap(params.debt_swap, borrow_token, params.flash_loan_token, borrow_token_balance) + + return params.flash_loan_token @internal -def _handle_lever_down(flash_loan_amount: uint256, data: Bytes[_MAX_FLASHLOAN_CALLBACK_DATA_SIZE]): +def _handle_lever_down(flash_loan_amount: uint256, data: Bytes[_MAX_FLASHLOAN_CALLBACK_DATA_SIZE]) -> address: """ @notice Handle the lever down operation inside the flash loan callback - @param flash_loan_amount The amount of crvUSD that was flash loaned + @param flash_loan_amount The amount that was flash loaned + @return The flash loan token address @param data The encoded parameters """ # Decode parameters @@ -495,8 +599,8 @@ def _handle_lever_down(flash_loan_amount: uint256, data: Bytes[_MAX_FLASHLOAN_CA collateral_token: address = staticcall trove_manager.collateral_token() borrow_token: address = staticcall trove_manager.borrow_token() - # crvUSD --> borrow token - self._swap(params.debt_swap, _CRVUSD.address, flash_loan_amount) + # Flash loan token --> borrow token + self._swap(params.debt_swap, params.flash_loan_token, borrow_token, flash_loan_amount) # Get the available borrow tokens available_borrow: uint256 = staticcall IERC20(borrow_token).balanceOf(self) @@ -513,9 +617,11 @@ def _handle_lever_down(flash_loan_amount: uint256, data: Bytes[_MAX_FLASHLOAN_CA # Remove collateral extcall trove_manager.remove_collateral(params.trove_id, params.collateral_to_remove) - # Collateral --> crvUSD + # Collateral --> flash loan token collateral_balance: uint256 = staticcall IERC20(collateral_token).balanceOf(self) - self._swap(params.collateral_swap, collateral_token, collateral_balance) + self._swap(params.collateral_swap, collateral_token, params.flash_loan_token, collateral_balance) + + return params.flash_loan_token # ============================================================================================ @@ -524,26 +630,55 @@ def _handle_lever_down(flash_loan_amount: uint256, data: Bytes[_MAX_FLASHLOAN_CA @internal -def _swap(swap: SwapData, token_in: address, amount_in: uint256): +@view +def _validate_params( + trove_manager: address, + collateral_swap_router: address, + debt_swap_router: address, + auction_taker: address = empty(address), +): """ - @notice Execute a swap via a DEX aggregator router - @dev Skips if swap data is empty + @notice Validate input parameters for the external functions + @param trove_manager The Trove Manager address + @param collateral_swap_router The collateral swap router address + @param debt_swap_router The debt swap router address + @param auction_taker The Auction Taker address + """ + # Make sure the Trove Manager is endorsed + assert staticcall REGISTRY.market_status(trove_manager) == IRegistry.Status.ENDORSED, "!endorsed" + + # If provided, make sure the collateral swap router is whitelisted + if collateral_swap_router != empty(address): + assert self.routers[collateral_swap_router], "!collateral_swap_router" + + # If provided, make sure the debt swap router is whitelisted + if debt_swap_router != empty(address): + assert self.routers[debt_swap_router], "!debt_swap_router" + + # If provided, make sure the Auction Taker is whitelisted + if auction_taker != empty(address): + assert self.auction_takers[auction_taker], "!auction_taker" + + +@internal +def _swap(swap: SwapData, token_in: address, token_out: address, amount_in: uint256): + """ + @notice Execute a swap via the Swap Executor + @dev Skips if swap data is empty. Caller should encode slippage protection in the router calldata @param swap The swap parameters (router address + calldata) - @param token_in The input token to approve - @param amount_in The amount to approve for the swap + @param token_in The input token + @param token_out The output token + @param amount_in The amount to swap """ # Return early if no swap data if len(swap.data) == 0: return - # Approve input token to the router - assert extcall IERC20(token_in).approve(swap.router, amount_in, default_return_value=True) + # Transfer input tokens to the Swap Executor + assert extcall IERC20(token_in).transfer(SWAP_EXECUTOR.address, amount_in, default_return_value=True) - # Execute the swap - raw_call(swap.router, swap.data) - - # Make sure our approval is always back to 0 - assert extcall IERC20(token_in).approve(swap.router, 0, default_return_value=True) + # Execute the swap via the Swap Executor. Output tokens are sent back to this contract + extcall SWAP_EXECUTOR.swap(swap.router, swap.data, token_in, token_out) @internal diff --git a/src/periphery/swap_executor.vy b/src/periphery/swap_executor.vy new file mode 100644 index 0000000..8070389 --- /dev/null +++ b/src/periphery/swap_executor.vy @@ -0,0 +1,52 @@ +# @version 0.4.3 + +""" +@title Swap Executor +@license GNU AGPLv3 +@author Flex +@notice Executes swaps on behalf of the Leverage Zapper via DEX aggregator routers +""" + +from ethereum.ercs import IERC20 + +# ============================================================================================ +# Constants +# ============================================================================================ + + +# Max swap calldata size +_MAX_SWAP_DATA_SIZE: constant(uint256) = 10 ** 4 + + +# ============================================================================================ +# Swap +# ============================================================================================ + + +@external +def swap(router: address, data: Bytes[_MAX_SWAP_DATA_SIZE], token_in: address, token_out: address): + """ + @notice Execute a swap and transfer the output tokens back to the caller + @dev Caller must transfer input tokens to this contract before calling + @dev Caller should encode slippage protection in the router calldata + @param router The DEX aggregator router address + @param data The swap calldata + @param token_in The input token + @param token_out The output token + """ + # Get the input tokens amount + amount_in: uint256 = staticcall IERC20(token_in).balanceOf(self) + + # Approve the router to spend input tokens + assert extcall IERC20(token_in).approve(router, amount_in, default_return_value=True) + + # Execute the swap + raw_call(router, data) + + # Make sure our approval is always back to 0 + assert extcall IERC20(token_in).approve(router, 0, default_return_value=True) + + # Send all output tokens back to the caller + amount_out: uint256 = staticcall IERC20(token_out).balanceOf(self) + if amount_out > 0: + assert extcall IERC20(token_out).transfer(msg.sender, amount_out, default_return_value=True) diff --git a/src/periphery/yv_auction_taker.vy b/src/periphery/yv_auction_taker.vy new file mode 100644 index 0000000..d76a40c --- /dev/null +++ b/src/periphery/yv_auction_taker.vy @@ -0,0 +1,88 @@ +# @version 0.4.3 + +""" +@title Yearn Vault Auction Taker +@license GNU AGPLv3 +@author Flex +@notice Takes auctions for markets where the collateral is a Yearn vault + and the borrow token is the vault's underlying asset (e.g. yvUSD/USDC) +@dev Can be used as the `auction_taker` in the Leverage Zapper or called directly +""" + +from ethereum.ercs import IERC20 + +from ..interfaces import IAuction +from ..interfaces import IVault +from ..interfaces import IZapperAuctionTaker +from ..interfaces import ITaker + +# ============================================================================================ +# Interfaces +# ============================================================================================ + + +implements: IZapperAuctionTaker +implements: ITaker + + +# ============================================================================================ +# Constants +# ============================================================================================ + + +# Max callback data size +_MAX_CALLBACK_DATA_SIZE: constant(uint256) = 10 ** 5 + + +# ============================================================================================ +# Auction Taker +# ============================================================================================ + + +@external +def takeAuction(auction: address, auction_id: uint256): + """ + @notice Take an auction, redeeming vault collateral to pay + @param auction The auction contract address + @param auction_id The auction ID to take + """ + # Read tokens before taking (can't read during callback due to reentrancy guard) + buy_token: address = staticcall IAuction(auction).buy_token() + sell_token: address = staticcall IAuction(auction).sell_token() + + # Take the full auction amount with callback + extcall IAuction(auction).take(auction_id, max_value(uint256), self, abi_encode(buy_token, sell_token)) + + # Transfer any leftover buy tokens to the caller + leftover: uint256 = staticcall IERC20(buy_token).balanceOf(self) + if leftover > 0: + assert extcall IERC20(buy_token).transfer(msg.sender, leftover, default_return_value=True) + + +@external +def takeCallback( + auction_id: uint256, + taker: address, + amount_taken: uint256, + needed_amount: uint256, + data: Bytes[_MAX_CALLBACK_DATA_SIZE], +): + """ + @notice Auction callback - redeems vault tokens for underlying and approves payment + @dev Called by the auction contract during `take` + @param auction_id The auction ID + @param taker The address that initiated the take + @param amount_taken The amount of vault tokens received + @param needed_amount The amount of buy tokens to pay + @param data Encoded buy token and sell token addresses + """ + # Decode the token addresses + buy_token: address = empty(address) + sell_token: address = empty(address) + buy_token, sell_token = abi_decode(data, (address, address)) + + # Redeem the vault collateral for the underlying + extcall IVault(sell_token).redeem(amount_taken, self, self) + + # Approve the auction to pull the needed buy tokens + assert extcall IERC20(buy_token).approve(msg.sender, needed_amount, default_return_value=True) diff --git a/src/trove_manager.vy b/src/trove_manager.vy index 7468a81..1f58886 100644 --- a/src/trove_manager.vy +++ b/src/trove_manager.vy @@ -22,15 +22,10 @@ from interfaces import ISortedTroves # ============================================================================================ -event PendingOwnershipTransfer: - trove_id: indexed(uint256) - old_owner: indexed(address) - new_owner: indexed(address) - -event OwnershipTransferred: - trove_id: indexed(uint256) - old_owner: indexed(address) - new_owner: indexed(address) +event Approval: + owner: indexed(address) + operator: indexed(address) + approved: bool event OpenTrove: trove_id: indexed(uint256) @@ -124,7 +119,6 @@ struct Trove: last_debt_update_time: uint64 last_interest_rate_adj_time: uint64 owner: address - pending_owner: address status: Status @@ -195,6 +189,9 @@ last_debt_update_time: public(uint256) # last timestamp when `total_debt` and ` collateral_balance: public(uint256) # total collateral tokens currently held by the contract troves: public(HashMap[uint256, Trove]) # Trove ID --> Trove info +# Approvals +approved: public(HashMap[address, HashMap[address, bool]]) # owner --> operator --> approved + # ============================================================================================ # Initialize @@ -252,15 +249,16 @@ def initialize(params: InitializeParams): @external @view -def get_upfront_fee(debt_amount: uint256, annual_interest_rate: uint256) -> uint256: +def get_upfront_fee(debt_amount: uint256, annual_interest_rate: uint256, is_existing_debt: bool = False) -> uint256: """ @notice Get the upfront fee for borrowing a specified amount of debt at a given annual interest rate @dev The fee represents prepaid interest over upfront interest period using the system's average rate after the new debt - @param debt_amount The amount of debt to be borrowed + @param debt_amount The amount of debt to charge the fee on @param annual_interest_rate The annual interest rate for the debt + @param is_existing_debt True if debt_amount is already part of total_debt (e.g. rate adjustments) @return upfront_fee The calculated upfront fee """ - return self._get_upfront_fee(debt_amount, annual_interest_rate) + return self._get_upfront_fee(debt_amount, annual_interest_rate, max_value(uint256), is_existing_debt) @external @@ -289,68 +287,25 @@ def sync_total_debt() -> uint256: # ============================================================================================ -# Ownership +# Approvals # ============================================================================================ @external -def transfer_ownership(trove_id: uint256, new_owner: address): - """ - @notice Starts the ownership transfer of a Trove to a new owner - @dev Only callable by the current `owner` - @dev Replaces the pending transfer if there is one - @dev New owner must call `accept_ownership` to finalize the transfer - @param trove_id Unique identifier of the Trove - @param new_owner The address of the new owner - """ - # Cache Trove info - trove: Trove = self.troves[trove_id] - - # Make sure the caller is the owner of the Trove - assert trove.owner == msg.sender, "!owner" - - # Set the pending owner - trove.pending_owner = new_owner - - # Save changes to storage - self.troves[trove_id] = trove - - # Emit event - log PendingOwnershipTransfer( - trove_id=trove_id, - old_owner=msg.sender, - new_owner=new_owner - ) - - -@external -def accept_ownership(trove_id: uint256): +def approve(operator: address, approved: bool): """ - @notice Accept ownership of a Trove - @dev Only callable by the current `pending_owner` - @param trove_id Unique identifier of the Trove + @notice Approve or revoke an operator to act on all Troves owned by the caller + @param operator The address to approve or revoke + @param approved True to approve, False to revoke """ - # Cache Trove info - trove: Trove = self.troves[trove_id] - - # Make sure the caller is the pending owner of the Trove - assert trove.pending_owner == msg.sender, "!pending_owner" - - # Cache the old owner for event - old_owner: address = trove.owner - - # Set the new owner and clear the pending owner - trove.owner = trove.pending_owner - trove.pending_owner = empty(address) - - # Save changes to storage - self.troves[trove_id] = trove + # Update approval mapping + self.approved[msg.sender][operator] = approved # Emit event - log OwnershipTransferred( - trove_id=trove_id, - old_owner=old_owner, - new_owner=msg.sender + log Approval( + owner=msg.sender, + operator=operator, + approved=approved, ) @@ -370,10 +325,10 @@ def open_trove( max_upfront_fee: uint256, min_borrow_out: uint256, min_collateral_out: uint256, + owner: address = msg.sender, ) -> uint256: """ @notice Open a new Trove with specified collateral, debt, and interest rate - @dev Caller will become the owner of the Trove @dev Caller must approve this contract to transfer collateral tokens on its behalf before calling @dev Trove debt increases by `debt_amount` plus the upfront fee. Tokens from idle liquidity arrive atomically; any shortfall is redeemed from other troves and airdropped on auction settlement. @@ -387,12 +342,16 @@ def open_trove( @param max_upfront_fee Maximum upfront fee the caller is willing to pay @param min_borrow_out Minimum borrow tokens received atomically from idle liquidity @param min_collateral_out Minimum amount of collateral tokens to be redeemed + @param owner The address that will own the Trove. Defaults to msg.sender @return trove_id Unique identifier for the new Trove """ # Make sure collateral and debt amounts are non-zero assert collateral_amount > 0, "!collateral_amount" assert debt_amount > 0, "!debt_amount" + # Make sure the owner is valid + assert owner != empty(address) and owner != self and owner != self.lender, "!owner" + # Make sure the annual interest rate is within bounds assert annual_interest_rate >= self.min_annual_interest_rate, "!min_annual_interest_rate" assert annual_interest_rate <= self.max_annual_interest_rate, "!max_annual_interest_rate" @@ -430,8 +389,7 @@ def open_trove( annual_interest_rate=annual_interest_rate, last_debt_update_time=convert(block.timestamp, uint64), last_interest_rate_adj_time=convert(block.timestamp, uint64), - owner=msg.sender, - pending_owner=empty(address), + owner=owner, status=Status.ACTIVE ) @@ -463,7 +421,7 @@ def open_trove( # Emit event log OpenTrove( trove_id=trove_id, - trove_owner=msg.sender, + trove_owner=owner, collateral_amount=collateral_amount, debt_amount=debt_amount, upfront_fee=upfront_fee, @@ -482,7 +440,7 @@ def open_trove( def add_collateral(trove_id: uint256, collateral_amount: uint256): """ @notice Add collateral to an existing Trove - @dev Only callable by the Trove owner + @dev Only callable by the Trove owner or an approved operator @dev Caller must approve this contract to transfer collateral tokens on its behalf before calling @param trove_id Unique identifier of the Trove @param collateral_amount Amount of collateral tokens to add @@ -493,8 +451,8 @@ def add_collateral(trove_id: uint256, collateral_amount: uint256): # Cache Trove info trove: Trove = self.troves[trove_id] - # Make sure the caller is the owner of the Trove - assert trove.owner == msg.sender, "!owner" + # Make sure the caller is the owner or an approved operator + assert trove.owner == msg.sender or self.approved[trove.owner][msg.sender], "!owner" # Make sure the Trove is active assert trove.status == Status.ACTIVE, "!active" @@ -511,7 +469,7 @@ def add_collateral(trove_id: uint256, collateral_amount: uint256): # Emit event log AddCollateral( trove_id=trove_id, - trove_owner=msg.sender, + trove_owner=trove.owner, collateral_amount=collateral_amount ) @@ -520,7 +478,7 @@ def add_collateral(trove_id: uint256, collateral_amount: uint256): def remove_collateral(trove_id: uint256, collateral_amount: uint256): """ @notice Remove collateral from an existing Trove - @dev Only callable by the Trove owner + @dev Only callable by the Trove owner or an approved operator @param trove_id Unique identifier of the Trove @param collateral_amount Amount of collateral tokens to remove """ @@ -530,8 +488,8 @@ def remove_collateral(trove_id: uint256, collateral_amount: uint256): # Cache Trove info trove: Trove = self.troves[trove_id] - # Make sure the caller is the owner of the Trove - assert trove.owner == msg.sender, "!owner" + # Make sure the caller is the owner or an approved operator + assert trove.owner == msg.sender or self.approved[trove.owner][msg.sender], "!owner" # Make sure the Trove is active assert trove.status == Status.ACTIVE, "!active" @@ -566,7 +524,7 @@ def remove_collateral(trove_id: uint256, collateral_amount: uint256): # Emit event log RemoveCollateral( trove_id=trove_id, - trove_owner=msg.sender, + trove_owner=trove.owner, collateral_amount=collateral_amount ) @@ -581,7 +539,7 @@ def borrow( ): """ @notice Borrow more tokens from an existing Trove - @dev Only callable by the Trove owner + @dev Only callable by the Trove owner or an approved operator @dev Trove debt increases by `debt_amount` plus the upfront fee. Tokens from idle liquidity arrive atomically; any shortfall is redeemed from other troves and airdropped on auction settlement. Total delivered can be less than requested if lender liquidity or redeemable collateral are insufficient @@ -597,8 +555,8 @@ def borrow( # Cache Trove info trove: Trove = self.troves[trove_id] - # Make sure the caller is the owner of the Trove - assert trove.owner == msg.sender, "!owner" + # Make sure the caller is the owner or an approved operator + assert trove.owner == msg.sender or self.approved[trove.owner][msg.sender], "!owner" # Make sure the Trove is active assert trove.status == Status.ACTIVE, "!active" @@ -653,7 +611,7 @@ def borrow( # Emit event log Borrow( trove_id=trove_id, - trove_owner=msg.sender, + trove_owner=trove.owner, debt_amount=new_debt, upfront_fee=upfront_fee ) @@ -663,7 +621,7 @@ def borrow( def repay(trove_id: uint256, debt_amount: uint256): """ @notice Repay part of the debt of an existing Trove - @dev Only callable by the Trove owner + @dev Only callable by the Trove owner or an approved operator @dev Caller must approve this contract to transfer borrow tokens on its behalf before calling @param trove_id Unique identifier of the Trove @param debt_amount Amount of debt to repay @@ -674,8 +632,8 @@ def repay(trove_id: uint256, debt_amount: uint256): # Cache Trove info trove: Trove = self.troves[trove_id] - # Make sure the caller is the owner of the Trove - assert trove.owner == msg.sender, "!owner" + # Make sure the caller is the owner or an approved operator + assert trove.owner == msg.sender or self.approved[trove.owner][msg.sender], "!owner" # Make sure the Trove is active assert trove.status == Status.ACTIVE, "!active" @@ -716,7 +674,7 @@ def repay(trove_id: uint256, debt_amount: uint256): # Emit event log Repay( trove_id=trove_id, - trove_owner=msg.sender, + trove_owner=trove.owner, debt_amount=debt_to_repay ) @@ -731,7 +689,7 @@ def adjust_interest_rate( ): """ @notice Adjust the annual interest rate of an existing Trove - @dev Only callable by the Trove owner + @dev Only callable by the Trove owner or an approved operator @param trove_id Unique identifier of the Trove @param new_annual_interest_rate New fixed annual interest rate to pay on the debt @param prev_id ID of previous Trove for the new insert position @@ -745,8 +703,8 @@ def adjust_interest_rate( # Cache Trove info trove: Trove = self.troves[trove_id] - # Make sure the caller is the owner of the Trove - assert trove.owner == msg.sender, "!owner" + # Make sure the caller is the owner or an approved operator + assert trove.owner == msg.sender or self.approved[trove.owner][msg.sender], "!owner" # Make sure the Trove is active assert trove.status == Status.ACTIVE, "!active" @@ -767,7 +725,7 @@ def adjust_interest_rate( # Apply upfront fee on premature adjustments and check collateral ratio if block.timestamp < convert(trove.last_interest_rate_adj_time, uint256) + self.interest_rate_adj_cooldown: # Calculate the upfront fee and make sure the user is ok with it - upfront_fee = self._get_upfront_fee(new_debt, new_annual_interest_rate, max_upfront_fee) + upfront_fee = self._get_upfront_fee(new_debt, new_annual_interest_rate, max_upfront_fee, True) # Charge the upfront fee new_debt += upfront_fee @@ -793,6 +751,14 @@ def adjust_interest_rate( trove.debt = new_debt trove.last_debt_update_time = convert(block.timestamp, uint64) + # Reinsert the Trove in the sorted list at its new position + extcall self.sorted_troves.re_insert( + trove_id, + new_annual_interest_rate, + prev_id, + next_id + ) + # Save changes to storage self.troves[trove_id] = trove @@ -804,18 +770,10 @@ def adjust_interest_rate( old_debt * old_annual_interest_rate, # weighted_debt_decrease ) - # Reinsert the Trove in the sorted list at its new position - extcall self.sorted_troves.re_insert( - trove_id, - new_annual_interest_rate, - prev_id, - next_id - ) - # Emit event log AdjustInterestRate( trove_id=trove_id, - trove_owner=msg.sender, + trove_owner=trove.owner, new_annual_interest_rate=new_annual_interest_rate, upfront_fee=upfront_fee ) @@ -830,15 +788,15 @@ def adjust_interest_rate( def close_trove(trove_id: uint256): """ @notice Close an existing Trove by repaying all its debt and withdrawing all its collateral - @dev Only callable by the Trove owner + @dev Only callable by the Trove owner or an approved operator @dev Caller must approve this contract to transfer borrow tokens on its behalf before calling @param trove_id Unique identifier of the Trove """ # Cache Trove info trove: Trove = self.troves[trove_id] - # Make sure the caller is the owner of the Trove - assert trove.owner == msg.sender, "!owner" + # Make sure the caller is the owner or an approved operator + assert trove.owner == msg.sender or self.approved[trove.owner][msg.sender], "!owner" # Make sure the Trove is active assert trove.status == Status.ACTIVE, "!active" @@ -879,7 +837,7 @@ def close_trove(trove_id: uint256): # Emit event log CloseTrove( trove_id=trove_id, - trove_owner=msg.sender, + trove_owner=trove.owner, collateral_amount=old_trove.collateral, debt_amount=trove_debt_after_interest ) @@ -889,15 +847,15 @@ def close_trove(trove_id: uint256): def close_zombie_trove(trove_id: uint256): """ @notice Close a zombie Trove by repaying all its debt (if it has any) and withdrawing all its collateral - @dev Only callable by the Trove owner + @dev Only callable by the Trove owner or an approved operator @dev If non-zero debt, caller must approve this contract to transfer borrow tokens on its behalf before calling @param trove_id Unique identifier of the Trove """ # Cache Trove info trove: Trove = self.troves[trove_id] - # Make sure the caller is the owner of the Trove - assert trove.owner == msg.sender, "!owner" + # Make sure the caller is the owner or an approved operator + assert trove.owner == msg.sender or self.approved[trove.owner][msg.sender], "!owner" # Make sure the Trove is zombie assert trove.status == Status.ZOMBIE, "!zombie" @@ -943,7 +901,7 @@ def close_zombie_trove(trove_id: uint256): # Emit event log CloseZombieTrove( trove_id=trove_id, - trove_owner=msg.sender, + trove_owner=trove.owner, collateral_amount=old_trove.collateral, debt_amount=trove_debt_after_interest ) @@ -978,9 +936,6 @@ def liquidate_trove( @param data The data to pass to the `receiver` callback. Defaults to empty @return The amount of liquidated collateral tokens """ - # Make sure the trove ID is non-zero - assert trove_id != 0, "!trove_id" - # Get the collateral price collateral_price: uint256 = staticcall self.price_oracle.get_price() @@ -1216,9 +1171,6 @@ def _redeem( @param receiver Address to transfer the auction proceeds to @return Amount of collateral tokens that were redeemed """ - # Accrue interest on the total debt - self._sync_total_debt() - # Get the collateral price collateral_price: uint256 = staticcall self.price_oracle.get_price() @@ -1411,22 +1363,24 @@ def _calculate_accrued_interest(weighted_debt: uint256, period: uint256) -> uint def _get_upfront_fee( debt_amount: uint256, annual_interest_rate: uint256, - max_upfront_fee: uint256 = max_value(uint256) + max_upfront_fee: uint256 = max_value(uint256), + is_existing_debt: bool = False, ) -> uint256: """ @notice Get the upfront fee for borrowing a specified amount of debt at a given annual interest rate @dev Make sure the calculated fee does not exceed `max_upfront_fee` @dev The fee represents prepaid interest over upfront interest period using the system's average rate after the new debt - @param debt_amount The amount of debt to be borrowed + @param debt_amount The amount of debt to charge the fee on @param annual_interest_rate The annual interest rate for the debt @param max_upfront_fee The maximum upfront fee the caller is willing to pay + @param is_existing_debt True if debt_amount is already part of total_debt @return upfront_fee The calculated upfront fee """ # Total debt after adding the new debt - new_total_debt: uint256 = self.total_debt + debt_amount + new_total_debt: uint256 = self.total_debt if is_existing_debt else self.total_debt + debt_amount # Total weighted debt after adding the new weighted debt - new_total_weighted_debt: uint256 = self.total_weighted_debt + (debt_amount * annual_interest_rate) + new_total_weighted_debt: uint256 = self.total_weighted_debt if is_existing_debt else self.total_weighted_debt + (debt_amount * annual_interest_rate) # Calculate the new average interest rate avg_interest_rate: uint256 = new_total_weighted_debt // new_total_debt diff --git a/test/AddCollateral.t.sol b/test/AddCollateral.t.sol index 6d08237..b18c70f 100644 --- a/test/AddCollateral.t.sol +++ b/test/AddCollateral.t.sol @@ -37,38 +37,37 @@ contract AddCollateralTests is Base { assertEq(_trove.last_debt_update_time, block.timestamp, "E3"); assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E4"); assertEq(_trove.owner, userBorrower, "E5"); - assertEq(_trove.pending_owner, address(0), "E6"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E7"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E6"); assertApproxEqRel( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO, 1e15, - "E8" + "E7" ); // 0.1% // Check sorted troves - assertFalse(sortedTroves.empty(), "E9"); - assertEq(sortedTroves.size(), 1, "E10"); - assertEq(sortedTroves.first(), _troveId, "E11"); - assertEq(sortedTroves.last(), _troveId, "E12"); - assertTrue(sortedTroves.contains(_troveId), "E13"); + assertFalse(sortedTroves.empty(), "E8"); + assertEq(sortedTroves.size(), 1, "E9"); + assertEq(sortedTroves.first(), _troveId, "E10"); + assertEq(sortedTroves.last(), _troveId, "E11"); + assertTrue(sortedTroves.contains(_troveId), "E12"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E14"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E15"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E16"); - assertEq(borrowToken.balanceOf(address(lender)), 0, "E17"); - assertEq(borrowToken.balanceOf(userBorrower), _amount, "E18"); + assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E13"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E14"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E15"); + assertEq(borrowToken.balanceOf(address(lender)), 0, "E16"); + assertEq(borrowToken.balanceOf(userBorrower), _amount, "E17"); // Check global info - assertEq(troveManager.total_debt(), _expectedDebt, "E19"); - assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E20"); - assertEq(troveManager.collateral_balance(), _collateralNeeded, "E21"); - assertEq(troveManager.zombie_trove_id(), 0, "E22"); + assertEq(troveManager.total_debt(), _expectedDebt, "E18"); + assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E19"); + assertEq(troveManager.collateral_balance(), _collateralNeeded, "E20"); + assertEq(troveManager.zombie_trove_id(), 0, "E21"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E23"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E24"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E22"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E23"); // Finally add collateral airdrop(address(collateralToken), userBorrower, _collateralAmountToAdd); @@ -81,42 +80,41 @@ contract AddCollateralTests is Base { // Check trove info _trove = troveManager.troves(_troveId); - assertEq(_trove.debt, _expectedDebt, "E25"); - assertEq(_trove.collateral, _collateralNeeded + _collateralAmountToAdd, "E26"); - assertEq(_trove.annual_interest_rate, DEFAULT_ANNUAL_INTEREST_RATE, "E27"); - assertEq(_trove.last_debt_update_time, block.timestamp, "E28"); - assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E29"); - assertEq(_trove.owner, userBorrower, "E30"); - assertEq(_trove.pending_owner, address(0), "E31"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E32"); + assertEq(_trove.debt, _expectedDebt, "E24"); + assertEq(_trove.collateral, _collateralNeeded + _collateralAmountToAdd, "E25"); + assertEq(_trove.annual_interest_rate, DEFAULT_ANNUAL_INTEREST_RATE, "E26"); + assertEq(_trove.last_debt_update_time, block.timestamp, "E27"); + assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E28"); + assertEq(_trove.owner, userBorrower, "E29"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E30"); assertGt( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO * 999 / 1000, // Decrease by 0.1% - "E33" + "E31" ); // Check sorted troves - assertFalse(sortedTroves.empty(), "E34"); - assertEq(sortedTroves.size(), 1, "E35"); - assertEq(sortedTroves.first(), _troveId, "E36"); - assertEq(sortedTroves.last(), _troveId, "E37"); - assertTrue(sortedTroves.contains(_troveId), "E38"); + assertFalse(sortedTroves.empty(), "E32"); + assertEq(sortedTroves.size(), 1, "E33"); + assertEq(sortedTroves.first(), _troveId, "E34"); + assertEq(sortedTroves.last(), _troveId, "E35"); + assertTrue(sortedTroves.contains(_troveId), "E36"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded + _collateralAmountToAdd, "E39"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E40"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E41"); - assertEq(borrowToken.balanceOf(address(lender)), 0, "E42"); - assertEq(borrowToken.balanceOf(userBorrower), _amount, "E43"); + assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded + _collateralAmountToAdd, "E37"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E38"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E39"); + assertEq(borrowToken.balanceOf(address(lender)), 0, "E40"); + assertEq(borrowToken.balanceOf(userBorrower), _amount, "E41"); // Check global info - assertEq(troveManager.total_debt(), _expectedDebt, "E44"); - assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E45"); - assertEq(troveManager.collateral_balance(), _collateralNeeded + _collateralAmountToAdd, "E46"); + assertEq(troveManager.total_debt(), _expectedDebt, "E42"); + assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E43"); + assertEq(troveManager.collateral_balance(), _collateralNeeded + _collateralAmountToAdd, "E44"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E47"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E48"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E45"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E46"); } function test_addCollateral_zeroCollateral( @@ -193,4 +191,49 @@ contract AddCollateralTests is Base { troveManager.add_collateral(_troveId, _amount); } + function test_addCollateral_approvedOperator( + uint256 _amount, + uint256 _collateralAmountToAdd + ) public { + _amount = bound(_amount, troveManager.min_debt(), maxFuzzAmount); + _collateralAmountToAdd = bound(_collateralAmountToAdd, minFuzzAmount, maxFuzzAmount); + + mintAndDepositIntoLender(userLender, _amount); + + uint256 _collateralNeeded = + (_amount * DEFAULT_TARGET_COLLATERAL_RATIO / BORROW_TOKEN_PRECISION) * ORACLE_PRICE_SCALE / priceOracle.get_price(); + uint256 _troveId = mintAndOpenTrove(userBorrower, _collateralNeeded, _amount, DEFAULT_ANNUAL_INTEREST_RATE); + + // Approve operator + vm.prank(userBorrower); + troveManager.approve(operator, true); + + // Operator adds collateral + airdrop(address(collateralToken), operator, _collateralAmountToAdd); + vm.startPrank(operator); + collateralToken.approve(address(troveManager), _collateralAmountToAdd); + troveManager.add_collateral(_troveId, _collateralAmountToAdd); + vm.stopPrank(); + + assertEq(troveManager.troves(_troveId).collateral, _collateralNeeded + _collateralAmountToAdd, "E0"); + } + + function test_addCollateral_unapprovedOperator_reverts( + uint256 _amount, + address _caller + ) public { + _amount = bound(_amount, troveManager.min_debt(), maxFuzzAmount); + vm.assume(_caller != userBorrower); + + mintAndDepositIntoLender(userLender, _amount); + + uint256 _collateralNeeded = + (_amount * DEFAULT_TARGET_COLLATERAL_RATIO / BORROW_TOKEN_PRECISION) * ORACLE_PRICE_SCALE / priceOracle.get_price(); + uint256 _troveId = mintAndOpenTrove(userBorrower, _collateralNeeded, _amount, DEFAULT_ANNUAL_INTEREST_RATE); + + vm.prank(_caller); + vm.expectRevert("!owner"); + troveManager.add_collateral(_troveId, minFuzzAmount); + } + } diff --git a/test/AdjustRate.t.sol b/test/AdjustRate.t.sol index d0d54b7..3971582 100644 --- a/test/AdjustRate.t.sol +++ b/test/AdjustRate.t.sol @@ -38,38 +38,37 @@ contract AdjustRateTests is Base { assertEq(_trove.last_debt_update_time, block.timestamp, "E3"); assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E4"); assertEq(_trove.owner, userBorrower, "E5"); - assertEq(_trove.pending_owner, address(0), "E6"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E7"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E6"); assertApproxEqRel( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO, 1e15, - "E8" + "E7" ); // 0.1% // Check sorted troves - assertFalse(sortedTroves.empty(), "E9"); - assertEq(sortedTroves.size(), 1, "E10"); - assertEq(sortedTroves.first(), _troveId, "E11"); - assertEq(sortedTroves.last(), _troveId, "E12"); - assertTrue(sortedTroves.contains(_troveId), "E13"); + assertFalse(sortedTroves.empty(), "E8"); + assertEq(sortedTroves.size(), 1, "E9"); + assertEq(sortedTroves.first(), _troveId, "E10"); + assertEq(sortedTroves.last(), _troveId, "E11"); + assertTrue(sortedTroves.contains(_troveId), "E12"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E14"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E15"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E16"); - assertEq(borrowToken.balanceOf(address(lender)), 0, "E17"); - assertEq(borrowToken.balanceOf(userBorrower), _amount, "E18"); + assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E13"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E14"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E15"); + assertEq(borrowToken.balanceOf(address(lender)), 0, "E16"); + assertEq(borrowToken.balanceOf(userBorrower), _amount, "E17"); // Check global info - assertEq(troveManager.total_debt(), _expectedDebt, "E19"); - assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E20"); - assertEq(troveManager.collateral_balance(), _collateralNeeded, "E21"); - assertEq(troveManager.zombie_trove_id(), 0, "E22"); + assertEq(troveManager.total_debt(), _expectedDebt, "E18"); + assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E19"); + assertEq(troveManager.collateral_balance(), _collateralNeeded, "E20"); + assertEq(troveManager.zombie_trove_id(), 0, "E21"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E23"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E24"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E22"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E23"); // Skip time to be able to adjust the rate again without upfront fee skip(troveManager.interest_rate_adj_cooldown()); @@ -86,40 +85,39 @@ contract AdjustRateTests is Base { // Check trove info _trove = troveManager.troves(_troveId); - assertEq(_trove.debt, _secondExpectedDebt, "E25"); - assertEq(_trove.collateral, _collateralNeeded, "E26"); - assertEq(_trove.annual_interest_rate, _newAnnualInterestRate, "E27"); - assertEq(_trove.last_debt_update_time, block.timestamp, "E28"); - assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E29"); - assertEq(_trove.owner, userBorrower, "E30"); - assertEq(_trove.pending_owner, address(0), "E31"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E32"); - assertGt(_trove.debt, _expectedDebt, "E33"); // debt increased due to interest + assertEq(_trove.debt, _secondExpectedDebt, "E24"); + assertEq(_trove.collateral, _collateralNeeded, "E25"); + assertEq(_trove.annual_interest_rate, _newAnnualInterestRate, "E26"); + assertEq(_trove.last_debt_update_time, block.timestamp, "E27"); + assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E28"); + assertEq(_trove.owner, userBorrower, "E29"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E30"); + assertGt(_trove.debt, _expectedDebt, "E31"); // debt increased due to interest // Check sorted troves - assertFalse(sortedTroves.empty(), "E34"); - assertEq(sortedTroves.size(), 1, "E35"); - assertEq(sortedTroves.first(), _troveId, "E36"); - assertEq(sortedTroves.last(), _troveId, "E37"); - assertTrue(sortedTroves.contains(_troveId), "E38"); + assertFalse(sortedTroves.empty(), "E32"); + assertEq(sortedTroves.size(), 1, "E33"); + assertEq(sortedTroves.first(), _troveId, "E34"); + assertEq(sortedTroves.last(), _troveId, "E35"); + assertTrue(sortedTroves.contains(_troveId), "E36"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E39"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E40"); - assertEq(collateralToken.balanceOf(address(userBorrower)), 0, "E41"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E42"); - assertGe(borrowToken.balanceOf(address(lender)), 0, "E43"); - assertEq(borrowToken.balanceOf(userBorrower), _amount, "E44"); + assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E37"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E38"); + assertEq(collateralToken.balanceOf(address(userBorrower)), 0, "E39"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E40"); + assertGe(borrowToken.balanceOf(address(lender)), 0, "E41"); + assertEq(borrowToken.balanceOf(userBorrower), _amount, "E42"); // Check global info - assertApproxEqAbs(troveManager.total_debt(), _secondExpectedDebt, 2, "E45"); - assertEq(troveManager.total_weighted_debt(), _secondExpectedDebt * _newAnnualInterestRate, "E46"); - assertEq(troveManager.collateral_balance(), _collateralNeeded, "E47"); - assertEq(troveManager.zombie_trove_id(), 0, "E48"); + assertApproxEqAbs(troveManager.total_debt(), _secondExpectedDebt, 2, "E43"); + assertEq(troveManager.total_weighted_debt(), _secondExpectedDebt * _newAnnualInterestRate, "E44"); + assertEq(troveManager.collateral_balance(), _collateralNeeded, "E45"); + assertEq(troveManager.zombie_trove_id(), 0, "E46"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E49"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E50"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E47"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E48"); } // 1. lend @@ -151,38 +149,37 @@ contract AdjustRateTests is Base { assertEq(_trove.last_debt_update_time, block.timestamp, "E3"); assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E4"); assertEq(_trove.owner, userBorrower, "E5"); - assertEq(_trove.pending_owner, address(0), "E6"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E7"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E6"); assertApproxEqRel( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO, 1e15, - "E8" + "E7" ); // 0.1% // Check sorted troves - assertFalse(sortedTroves.empty(), "E9"); - assertEq(sortedTroves.size(), 1, "E10"); - assertEq(sortedTroves.first(), _troveId, "E11"); - assertEq(sortedTroves.last(), _troveId, "E12"); - assertTrue(sortedTroves.contains(_troveId), "E13"); + assertFalse(sortedTroves.empty(), "E8"); + assertEq(sortedTroves.size(), 1, "E9"); + assertEq(sortedTroves.first(), _troveId, "E10"); + assertEq(sortedTroves.last(), _troveId, "E11"); + assertTrue(sortedTroves.contains(_troveId), "E12"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E14"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E15"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E16"); - assertEq(borrowToken.balanceOf(address(lender)), 0, "E17"); - assertEq(borrowToken.balanceOf(userBorrower), _amount, "E18"); + assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E13"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E14"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E15"); + assertEq(borrowToken.balanceOf(address(lender)), 0, "E16"); + assertEq(borrowToken.balanceOf(userBorrower), _amount, "E17"); // Check global info - assertEq(troveManager.total_debt(), _expectedDebt, "E19"); - assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E20"); - assertEq(troveManager.collateral_balance(), _collateralNeeded, "E21"); - assertEq(troveManager.zombie_trove_id(), 0, "E22"); + assertEq(troveManager.total_debt(), _expectedDebt, "E18"); + assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E19"); + assertEq(troveManager.collateral_balance(), _collateralNeeded, "E20"); + assertEq(troveManager.zombie_trove_id(), 0, "E21"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E23"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E24"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E22"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E23"); // Skip time but still be within the cooldown period skip(troveManager.interest_rate_adj_cooldown() / 2); @@ -191,10 +188,8 @@ contract AdjustRateTests is Base { uint256 _newAnnualInterestRate = DEFAULT_ANNUAL_INTEREST_RATE * 2; // 2% // Calculate second expected debt with interest accumulated - uint256 _interestOnFirstDebt = - _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE * (block.timestamp - _trove.last_debt_update_time) / (365 days * BORROW_TOKEN_PRECISION); - uint256 _secondExpectedDebt = troveManager.get_trove_debt_after_interest(_troveId) - + troveManager.get_upfront_fee(_expectedDebt + _interestOnFirstDebt, _newAnnualInterestRate); + uint256 _debtAfterInterest = troveManager.get_trove_debt_after_interest(_troveId); + uint256 _secondExpectedDebt = _debtAfterInterest + troveManager.get_upfront_fee(_debtAfterInterest, _newAnnualInterestRate, true); // Finally adjust the rate vm.prank(userBorrower); @@ -204,44 +199,43 @@ contract AdjustRateTests is Base { // Check trove info _trove = troveManager.troves(_troveId); - assertEq(_trove.debt, _secondExpectedDebt, "E25"); - assertEq(_trove.collateral, _collateralNeeded, "E26"); - assertEq(_trove.annual_interest_rate, _newAnnualInterestRate, "E27"); - assertEq(_trove.last_debt_update_time, block.timestamp, "E28"); - assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E29"); - assertEq(_trove.owner, userBorrower, "E30"); - assertEq(_trove.pending_owner, address(0), "E31"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E32"); + assertEq(_trove.debt, _secondExpectedDebt, "E24"); + assertEq(_trove.collateral, _collateralNeeded, "E25"); + assertEq(_trove.annual_interest_rate, _newAnnualInterestRate, "E26"); + assertEq(_trove.last_debt_update_time, block.timestamp, "E27"); + assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E28"); + assertEq(_trove.owner, userBorrower, "E29"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E30"); assertLt( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO, - "E33" + "E31" ); // increased debt --> lower CR // Check sorted troves - assertFalse(sortedTroves.empty(), "E34"); - assertEq(sortedTroves.size(), 1, "E35"); - assertEq(sortedTroves.first(), _troveId, "E36"); - assertEq(sortedTroves.last(), _troveId, "E37"); - assertTrue(sortedTroves.contains(_troveId), "E38"); + assertFalse(sortedTroves.empty(), "E32"); + assertEq(sortedTroves.size(), 1, "E33"); + assertEq(sortedTroves.first(), _troveId, "E34"); + assertEq(sortedTroves.last(), _troveId, "E35"); + assertTrue(sortedTroves.contains(_troveId), "E36"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E39"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E40"); - assertEq(collateralToken.balanceOf(address(userBorrower)), 0, "E41"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E42"); - assertGe(borrowToken.balanceOf(address(lender)), 0, "E43"); - assertEq(borrowToken.balanceOf(userBorrower), _amount, "E44"); + assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E37"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E38"); + assertEq(collateralToken.balanceOf(address(userBorrower)), 0, "E39"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E40"); + assertGe(borrowToken.balanceOf(address(lender)), 0, "E41"); + assertEq(borrowToken.balanceOf(userBorrower), _amount, "E42"); // Check global info - assertApproxEqAbs(troveManager.total_debt(), _secondExpectedDebt, 2, "E45"); - assertEq(troveManager.total_weighted_debt(), _secondExpectedDebt * _newAnnualInterestRate, "E46"); - assertEq(troveManager.collateral_balance(), _collateralNeeded, "E47"); - assertEq(troveManager.zombie_trove_id(), 0, "E48"); + assertApproxEqAbs(troveManager.total_debt(), _secondExpectedDebt, 2, "E43"); + assertEq(troveManager.total_weighted_debt(), _secondExpectedDebt * _newAnnualInterestRate, "E44"); + assertEq(troveManager.collateral_balance(), _collateralNeeded, "E45"); + assertEq(troveManager.zombie_trove_id(), 0, "E46"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E49"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E50"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E47"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E48"); } // 1. lend @@ -280,30 +274,28 @@ contract AdjustRateTests is Base { assertEq(_trove.last_debt_update_time, block.timestamp, "E3"); assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E4"); assertEq(_trove.owner, userBorrower, "E5"); - assertEq(_trove.pending_owner, address(0), "E6"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E7"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E6"); assertApproxEqRel( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO, 1e15, - "E8" + "E7" ); // 0.1% // Check another trove info _trove = troveManager.troves(_troveIdAnotherBorrower); - assertEq(_trove.debt, _expectedDebt, "E9"); - assertEq(_trove.collateral, _collateralNeeded, "E10"); - assertEq(_trove.annual_interest_rate, DEFAULT_ANNUAL_INTEREST_RATE, "E11"); - assertEq(_trove.last_debt_update_time, block.timestamp, "E12"); - assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E13"); - assertEq(_trove.owner, anotherUserBorrower, "E14"); - assertEq(_trove.pending_owner, address(0), "E15"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E16"); + assertEq(_trove.debt, _expectedDebt, "E8"); + assertEq(_trove.collateral, _collateralNeeded, "E9"); + assertEq(_trove.annual_interest_rate, DEFAULT_ANNUAL_INTEREST_RATE, "E10"); + assertEq(_trove.last_debt_update_time, block.timestamp, "E11"); + assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E12"); + assertEq(_trove.owner, anotherUserBorrower, "E13"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E14"); assertApproxEqRel( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO, 1e15, - "E17" + "E15" ); // 0.1% // Make sure those change places after we adjust the rate of the first trove @@ -311,30 +303,30 @@ contract AdjustRateTests is Base { uint256 _lastBefore = _troveIdAnotherBorrower; // Check sorted troves - assertFalse(sortedTroves.empty(), "E18"); - assertEq(sortedTroves.size(), 2, "E19"); - assertEq(sortedTroves.first(), _firstBefore, "E20"); - assertEq(sortedTroves.last(), _lastBefore, "E21"); - assertTrue(sortedTroves.contains(_troveId), "E22"); - assertTrue(sortedTroves.contains(_troveIdAnotherBorrower), "E23"); + assertFalse(sortedTroves.empty(), "E16"); + assertEq(sortedTroves.size(), 2, "E17"); + assertEq(sortedTroves.first(), _firstBefore, "E18"); + assertEq(sortedTroves.last(), _lastBefore, "E19"); + assertTrue(sortedTroves.contains(_troveId), "E20"); + assertTrue(sortedTroves.contains(_troveIdAnotherBorrower), "E21"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded * 2, "E24"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E25"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E26"); - assertApproxEqAbs(borrowToken.balanceOf(address(lender)), 0, 1, "E27"); - assertEq(borrowToken.balanceOf(userBorrower), _borrowAmount, "E28"); - assertEq(borrowToken.balanceOf(anotherUserBorrower), _borrowAmount, "E29"); + assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded * 2, "E22"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E23"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E24"); + assertApproxEqAbs(borrowToken.balanceOf(address(lender)), 0, 1, "E25"); + assertEq(borrowToken.balanceOf(userBorrower), _borrowAmount, "E26"); + assertEq(borrowToken.balanceOf(anotherUserBorrower), _borrowAmount, "E27"); // Check global info - assertEq(troveManager.total_debt(), _expectedDebt * 2, "E30"); - assertEq(troveManager.total_weighted_debt(), _expectedDebt * 2 * DEFAULT_ANNUAL_INTEREST_RATE, "E31"); - assertEq(troveManager.collateral_balance(), _collateralNeeded * 2, "E32"); - assertEq(troveManager.zombie_trove_id(), 0, "E33"); + assertEq(troveManager.total_debt(), _expectedDebt * 2, "E28"); + assertEq(troveManager.total_weighted_debt(), _expectedDebt * 2 * DEFAULT_ANNUAL_INTEREST_RATE, "E29"); + assertEq(troveManager.collateral_balance(), _collateralNeeded * 2, "E30"); + assertEq(troveManager.zombie_trove_id(), 0, "E31"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E34"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E35"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E32"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E33"); // Skip time to be able to adjust the rate again without upfront fee skip(troveManager.interest_rate_adj_cooldown()); @@ -348,15 +340,14 @@ contract AdjustRateTests is Base { // Check trove info _trove = troveManager.troves(_troveId); - assertEq(_trove.debt, _expectedDebt, "E36"); // did not touch this trove - assertEq(_trove.collateral, _collateralNeeded, "E37"); - assertEq(_trove.annual_interest_rate, DEFAULT_ANNUAL_INTEREST_RATE, "E38"); - assertEq(_trove.last_debt_update_time, block.timestamp - troveManager.interest_rate_adj_cooldown(), "E39"); - assertEq(_trove.last_interest_rate_adj_time, block.timestamp - troveManager.interest_rate_adj_cooldown(), "E40"); - assertEq(_trove.owner, userBorrower, "E41"); - assertEq(_trove.pending_owner, address(0), "E42"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E43"); - assertGt(troveManager.get_trove_debt_after_interest(_troveId), _expectedDebt, "E44"); // debt increased due to interest + assertEq(_trove.debt, _expectedDebt, "E34"); // did not touch this trove + assertEq(_trove.collateral, _collateralNeeded, "E35"); + assertEq(_trove.annual_interest_rate, DEFAULT_ANNUAL_INTEREST_RATE, "E36"); + assertEq(_trove.last_debt_update_time, block.timestamp - troveManager.interest_rate_adj_cooldown(), "E37"); + assertEq(_trove.last_interest_rate_adj_time, block.timestamp - troveManager.interest_rate_adj_cooldown(), "E38"); + assertEq(_trove.owner, userBorrower, "E39"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E40"); + assertGt(troveManager.get_trove_debt_after_interest(_troveId), _expectedDebt, "E41"); // debt increased due to interest // Calculate expected debt with interest accumulated uint256 _secondExpectedDebt = _expectedDebt @@ -365,30 +356,30 @@ contract AdjustRateTests is Base { // Check another trove info _trove = troveManager.troves(_troveIdAnotherBorrower); - assertEq(_trove.debt, _secondExpectedDebt, "E45"); - assertEq(_trove.collateral, _collateralNeeded, "E46"); - assertEq(_trove.annual_interest_rate, _newAnnualInterestRate, "E47"); - assertEq(_trove.last_debt_update_time, block.timestamp, "E48"); - assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E49"); - assertEq(_trove.owner, anotherUserBorrower, "E50"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E51"); - assertGt(_trove.debt, _expectedDebt, "E52"); // debt increased due to interest + assertEq(_trove.debt, _secondExpectedDebt, "E42"); + assertEq(_trove.collateral, _collateralNeeded, "E43"); + assertEq(_trove.annual_interest_rate, _newAnnualInterestRate, "E44"); + assertEq(_trove.last_debt_update_time, block.timestamp, "E45"); + assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E46"); + assertEq(_trove.owner, anotherUserBorrower, "E47"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E48"); + assertGt(_trove.debt, _expectedDebt, "E49"); // debt increased due to interest // Check sorted troves - assertFalse(sortedTroves.empty(), "E53"); - assertEq(sortedTroves.size(), 2, "E54"); - assertEq(sortedTroves.first(), _lastBefore, "E55"); // _changed place - assertEq(sortedTroves.last(), _firstBefore, "E56"); // _changed place - assertTrue(sortedTroves.contains(_troveId), "E57"); - assertTrue(sortedTroves.contains(_troveIdAnotherBorrower), "E58"); + assertFalse(sortedTroves.empty(), "E50"); + assertEq(sortedTroves.size(), 2, "E51"); + assertEq(sortedTroves.first(), _lastBefore, "E52"); // _changed place + assertEq(sortedTroves.last(), _firstBefore, "E53"); // _changed place + assertTrue(sortedTroves.contains(_troveId), "E54"); + assertTrue(sortedTroves.contains(_troveIdAnotherBorrower), "E55"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded * 2, "E59"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E60"); - assertEq(collateralToken.balanceOf(address(userBorrower)), 0, "E61"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E62"); - assertGe(borrowToken.balanceOf(address(lender)), 0, "E63"); - assertEq(borrowToken.balanceOf(userBorrower), _borrowAmount, "E64"); + assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded * 2, "E56"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E57"); + assertEq(collateralToken.balanceOf(address(userBorrower)), 0, "E58"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E59"); + assertGe(borrowToken.balanceOf(address(lender)), 0, "E60"); + assertEq(borrowToken.balanceOf(userBorrower), _borrowAmount, "E61"); // Add interest to `_expectedDebt` uint256 _expectedDebtWithInterest = _expectedDebt @@ -396,16 +387,16 @@ contract AdjustRateTests is Base { / (365 days * BORROW_TOKEN_PRECISION)); // Check global info - assertApproxEqAbs(troveManager.total_debt(), _expectedDebtWithInterest + _secondExpectedDebt, 3, "E65"); + assertApproxEqAbs(troveManager.total_debt(), _expectedDebtWithInterest + _secondExpectedDebt, 3, "E62"); assertEq( - troveManager.total_weighted_debt(), (_expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE) + (_secondExpectedDebt * _newAnnualInterestRate), "E66" + troveManager.total_weighted_debt(), (_expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE) + (_secondExpectedDebt * _newAnnualInterestRate), "E63" ); - assertEq(troveManager.collateral_balance(), _collateralNeeded * 2, "E67"); - assertEq(troveManager.zombie_trove_id(), 0, "E68"); + assertEq(troveManager.collateral_balance(), _collateralNeeded * 2, "E64"); + assertEq(troveManager.zombie_trove_id(), 0, "E65"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E69"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E70"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E66"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E67"); } function test_adjustRate_rateTooLow( @@ -547,17 +538,62 @@ contract AdjustRateTests is Base { // Calculate the maximum borrowable amount that would leave the trove at MCR uint256 _maxBorrowableAtMCR = ((_collateralNeeded * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / troveManager.minimum_collateral_ratio()) - * 995 / 1000; + * 998 / 1000; - // Open a trove - uint256 _troveId = mintAndOpenTrove(userBorrower, _collateralNeeded, _maxBorrowableAtMCR, DEFAULT_ANNUAL_INTEREST_RATE); + // Open a trove at max rate so the upfront fee on premature adjustment is large + uint256 _rate = troveManager.min_annual_interest_rate() * 20; + uint256 _troveId = mintAndOpenTrove(userBorrower, _collateralNeeded, _maxBorrowableAtMCR, _rate); - // Use max annual interest rate to increase the debt as much as possible - uint256 _newAnnualInterestRate = troveManager.max_annual_interest_rate(); // max rate + // Adjust to a different rate to trigger the premature adjustment fee + uint256 _newAnnualInterestRate = _rate - 1; vm.prank(userBorrower); vm.expectRevert("!minimum_collateral_ratio"); troveManager.adjust_interest_rate(_troveId, _newAnnualInterestRate, 0, 0, type(uint256).max); } + function test_adjustRate_approvedOperator( + uint256 _amount + ) public { + _amount = bound(_amount, troveManager.min_debt(), maxFuzzAmount); + + mintAndDepositIntoLender(userLender, _amount); + + uint256 _collateralNeeded = + (_amount * DEFAULT_TARGET_COLLATERAL_RATIO / BORROW_TOKEN_PRECISION) * ORACLE_PRICE_SCALE / priceOracle.get_price(); + uint256 _troveId = mintAndOpenTrove(userBorrower, _collateralNeeded, _amount, DEFAULT_ANNUAL_INTEREST_RATE); + + // Approve operator + vm.prank(userBorrower); + troveManager.approve(operator, true); + + // Skip past cooldown + skip(troveManager.interest_rate_adj_cooldown() + 1); + + // Operator adjusts rate + uint256 _newRate = DEFAULT_ANNUAL_INTEREST_RATE * 2; + vm.prank(operator); + troveManager.adjust_interest_rate(_troveId, _newRate, 0, 0, type(uint256).max); + + assertEq(troveManager.troves(_troveId).annual_interest_rate, _newRate, "E0"); + } + + function test_adjustRate_unapprovedOperator_reverts( + uint256 _amount, + address _caller + ) public { + _amount = bound(_amount, troveManager.min_debt(), maxFuzzAmount); + vm.assume(_caller != userBorrower); + + mintAndDepositIntoLender(userLender, _amount); + + uint256 _collateralNeeded = + (_amount * DEFAULT_TARGET_COLLATERAL_RATIO / BORROW_TOKEN_PRECISION) * ORACLE_PRICE_SCALE / priceOracle.get_price(); + uint256 _troveId = mintAndOpenTrove(userBorrower, _collateralNeeded, _amount, DEFAULT_ANNUAL_INTEREST_RATE); + + vm.prank(_caller); + vm.expectRevert("!owner"); + troveManager.adjust_interest_rate(_troveId, DEFAULT_ANNUAL_INTEREST_RATE * 2, 0, 0, type(uint256).max); + } + } diff --git a/test/AuctionTaker.t.sol b/test/AuctionTaker.t.sol new file mode 100644 index 0000000..7f3e212 --- /dev/null +++ b/test/AuctionTaker.t.sol @@ -0,0 +1,154 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.23; + +import "./Base.sol"; + +interface IERC4626 { + + function deposit( + uint256 assets, + address receiver + ) external returns (uint256); + +} + +contract AuctionTakerTests is Base { + + address public yvUSD = address(0x696d02Db93291651ED510704c9b286841d506987); + + uint256 public maxCollateralFuzzAmount; + uint256 public minCollateralFuzzAmount; + uint256 public maxLeverage; + + function setUp() public override { + Base.setUp(); + + // Deploy yvUSD/USDC market + address _oracle = deployCode("yvusd_to_usdc_oracle"); + (address _troveManager,,,, address _lender) = catFactory.deploy( + ICatFactory.DeployParams({ + borrow_token: address(borrowToken), + collateral_token: yvUSD, + price_oracle: _oracle, + minimum_debt: minimumDebt, + safe_collateral_ratio: safeCollateralRatio, + minimum_collateral_ratio: minimumCollateralRatio, + max_penalty_collateral_ratio: maxPenaltyCollateralRatio, + min_liquidation_fee: minLiquidationFee, + max_liquidation_fee: maxLiquidationFee, + upfront_interest_period: upfrontInterestPeriod, + interest_rate_adj_cooldown: interestRateAdjCooldown, + minimum_price_buffer_percentage: minimumPriceBufferPercentage, + starting_price_buffer_percentage: 1e18, // no buffer + re_kick_starting_price_buffer_percentage: reKickStartingPriceBufferPercentage, + step_duration: stepDuration, + step_decay_rate: stepDecayRate, + auction_length: auctionLength, + salt: bytes32(uint256(69)) + }) + ); + + // Override Base market with yvUSD/USDC market + troveManager = ITroveManager(_troveManager); + lender = ILender(_lender); + priceOracle = IPriceOracle(_oracle); + collateralToken = IERC20(yvUSD); + + // Recalculate constants for yvUSD market + DEFAULT_ANNUAL_INTEREST_RATE = troveManager.min_annual_interest_rate() * 2; + DEFAULT_TARGET_COLLATERAL_RATIO = troveManager.minimum_collateral_ratio() * 110 / 100; + + // Endorse yvUSD market in registry + vm.prank(deployerAddress); + daddy.execute(address(registry), abi.encodeWithSelector(IRegistry.endorse.selector, address(troveManager)), 0, true); + + // Whitelist mock router and auction taker + vm.startPrank(deployerAddress); + daddy.execute(address(leverageZapper), abi.encodeWithSelector(ILeverageZapper.set_router.selector, yvUSD, true), 0, true); + daddy.execute( + address(leverageZapper), abi.encodeWithSelector(ILeverageZapper.set_auction_taker.selector, address(auctionTaker), true), 0, true + ); + vm.stopPrank(); + + // Set fuzz bounds + maxCollateralFuzzAmount = 10_000 * 1e6; + minCollateralFuzzAmount = 600 * 1e6; + maxLeverage = (minimumCollateralRatio / (minimumCollateralRatio - 100)) * 90 / 100; + } + + function test_takeAuction( + uint256 _userCollateral, + uint256 _leverage + ) public { + _userCollateral = bound(_userCollateral, minCollateralFuzzAmount, maxCollateralFuzzAmount); + _leverage = bound(_leverage, 2, maxLeverage); + + airdrop(address(collateralToken), userBorrower, _userCollateral); + + uint256 additionalCollateral = _userCollateral * (_leverage - 1); + uint256 baseDebt = additionalCollateral * priceOracle.get_price() / ORACLE_PRICE_SCALE; + uint256 flashLoanAmount = baseDebt; + + // Small buffer for Aave premium (no swap slippage since we deposit directly into vault) + uint256 debtAmount = baseDebt + baseDebt / 1000; // 0.1% buffer + + // Fund the lender with enough for both troves + mintAndDepositIntoLender(userLender, debtAmount); + + // Exhaust lender liquidity by opening a trove from another user + uint256 firstCollateral = + (debtAmount * DEFAULT_TARGET_COLLATERAL_RATIO / BORROW_TOKEN_PRECISION) * ORACLE_PRICE_SCALE / priceOracle.get_price(); + mintAndOpenTrove(anotherUserBorrower, firstCollateral, debtAmount, DEFAULT_ANNUAL_INTEREST_RATE); + + // Approve zapper to pull collateral + vm.prank(userBorrower); + collateralToken.approve(address(leverageZapper), _userCollateral); + + // Open leveraged trove with auction taker to take the kicked auction + vm.prank(userBorrower); + uint256 troveId = leverageZapper.open_leveraged_trove( + ILeverageZapper.OpenLeveragedData({ + owner: userBorrower, + trove_manager: address(troveManager), + flash_loan_token: address(borrowToken), + auction_taker: address(auctionTaker), + owner_index: block.timestamp, + flash_loan_amount: flashLoanAmount, + collateral_amount: _userCollateral, + debt_amount: debtAmount, + prev_id: 0, + next_id: 0, + annual_interest_rate: DEFAULT_ANNUAL_INTEREST_RATE * 2, // higher rate so we can redeem the first trove + max_upfront_fee: type(uint256).max, + min_borrow_out: 0, + min_collateral_out: 0, + collateral_swap: ILeverageZapper.SwapData({ + router: yvUSD, data: abi.encodeWithSelector(IERC4626.deposit.selector, flashLoanAmount, address(leverageZapper)) + }), + debt_swap: ILeverageZapper.SwapData({router: address(0), data: ""}) + }) + ); + + // Verify trove + ITroveManager.Trove memory trove = troveManager.troves(troveId); + assertEq(trove.owner, userBorrower, "E0"); + assertEq(uint256(trove.status), uint256(ITroveManager.Status.active), "E1"); + assertGt(trove.debt, 0, "E2"); + + // Verify leverage: trove.collateral should be approximately _leverage * userCollateral + assertApproxEqRel(trove.collateral, _userCollateral * _leverage, 1e16, "E3"); // 1% tolerance + + // Verify zapper has no leftover tokens + assertEq(collateralToken.balanceOf(address(leverageZapper)), 0, "E4"); + assertEq(borrowToken.balanceOf(address(leverageZapper)), 0, "E5"); + + // Verify auction taker has no leftover tokens + assertEq(collateralToken.balanceOf(address(auctionTaker)), 0, "E6"); + assertEq(borrowToken.balanceOf(address(auctionTaker)), 0, "E7"); + + // Verify swept leftovers to borrower + assertEq(collateralToken.balanceOf(userBorrower), 0, "E8"); + assertGt(borrowToken.balanceOf(userBorrower), 0, "E9"); + } + +} diff --git a/test/Base.sol b/test/Base.sol index 5f53398..bdc2ee6 100644 --- a/test/Base.sol +++ b/test/Base.sol @@ -35,6 +35,7 @@ abstract contract Base is Deploy, Test { address public userBorrower = address(69); address public anotherUserBorrower = address(555); address public liquidator = address(88); + address public operator = address(99); // Market parameters uint256 public minimumDebt = 500; // 500 tokens diff --git a/test/Borrow.t.sol b/test/Borrow.t.sol index 5d199aa..ba94d13 100644 --- a/test/Borrow.t.sol +++ b/test/Borrow.t.sol @@ -49,38 +49,37 @@ contract BorrowTests is Base { assertEq(_trove.last_debt_update_time, block.timestamp, "E3"); assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E4"); assertEq(_trove.owner, userBorrower, "E5"); - assertEq(_trove.pending_owner, address(0), "E6"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E7"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E6"); assertApproxEqRel( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO * 2, 1e15, - "E8" + "E7" ); // 0.1% // Check sorted troves - assertFalse(sortedTroves.empty(), "E9"); - assertEq(sortedTroves.size(), 1, "E10"); - assertEq(sortedTroves.first(), _troveId, "E11"); - assertEq(sortedTroves.last(), _troveId, "E12"); - assertTrue(sortedTroves.contains(_troveId), "E13"); + assertFalse(sortedTroves.empty(), "E8"); + assertEq(sortedTroves.size(), 1, "E9"); + assertEq(sortedTroves.first(), _troveId, "E10"); + assertEq(sortedTroves.last(), _troveId, "E11"); + assertTrue(sortedTroves.contains(_troveId), "E12"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E14"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E15"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E16"); - assertEq(borrowToken.balanceOf(address(lender)), _lendAmount - _borrowAmount, "E17"); - assertEq(borrowToken.balanceOf(userBorrower), _borrowAmount, "E18"); + assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E13"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E14"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E15"); + assertEq(borrowToken.balanceOf(address(lender)), _lendAmount - _borrowAmount, "E16"); + assertEq(borrowToken.balanceOf(userBorrower), _borrowAmount, "E17"); // Check global info - assertEq(troveManager.total_debt(), _expectedDebt, "E19"); - assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E20"); - assertEq(troveManager.collateral_balance(), _collateralNeeded, "E21"); - assertEq(troveManager.zombie_trove_id(), 0, "E22"); + assertEq(troveManager.total_debt(), _expectedDebt, "E18"); + assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E19"); + assertEq(troveManager.collateral_balance(), _collateralNeeded, "E20"); + assertEq(troveManager.zombie_trove_id(), 0, "E21"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E23"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E24"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E22"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E23"); // Finally borrow more from the trove vm.prank(userBorrower); @@ -96,45 +95,44 @@ contract BorrowTests is Base { // Check trove info _trove = troveManager.troves(_troveId); - assertEq(_trove.debt, _expectedDebt * 2, "E25"); - assertEq(_trove.collateral, _collateralNeeded, "E26"); - assertEq(_trove.annual_interest_rate, DEFAULT_ANNUAL_INTEREST_RATE, "E27"); - assertEq(_trove.last_debt_update_time, block.timestamp, "E28"); - assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E29"); - assertEq(_trove.owner, userBorrower, "E30"); - assertEq(_trove.pending_owner, address(0), "E31"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E32"); + assertEq(_trove.debt, _expectedDebt * 2, "E24"); + assertEq(_trove.collateral, _collateralNeeded, "E25"); + assertEq(_trove.annual_interest_rate, DEFAULT_ANNUAL_INTEREST_RATE, "E26"); + assertEq(_trove.last_debt_update_time, block.timestamp, "E27"); + assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E28"); + assertEq(_trove.owner, userBorrower, "E29"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E30"); assertApproxEqRel( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO, 1e15, - "E33" + "E31" ); // 0.1% // Check sorted troves - assertFalse(sortedTroves.empty(), "E34"); - assertEq(sortedTroves.size(), 1, "E35"); - assertEq(sortedTroves.first(), _troveId, "E36"); - assertEq(sortedTroves.last(), _troveId, "E37"); - assertTrue(sortedTroves.contains(_troveId), "E38"); + assertFalse(sortedTroves.empty(), "E32"); + assertEq(sortedTroves.size(), 1, "E33"); + assertEq(sortedTroves.first(), _troveId, "E34"); + assertEq(sortedTroves.last(), _troveId, "E35"); + assertTrue(sortedTroves.contains(_troveId), "E36"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E39"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E40"); - assertEq(collateralToken.balanceOf(address(userBorrower)), 0, "E41"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E42"); - assertGe(borrowToken.balanceOf(address(lender)), 0, "E43"); - assertEq(borrowToken.balanceOf(userBorrower), _totalBorrowAmount, "E44"); + assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E37"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E38"); + assertEq(collateralToken.balanceOf(address(userBorrower)), 0, "E39"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E40"); + assertGe(borrowToken.balanceOf(address(lender)), 0, "E41"); + assertEq(borrowToken.balanceOf(userBorrower), _totalBorrowAmount, "E42"); // Check global info - assertEq(troveManager.total_debt(), _expectedDebt * 2, "E45"); - assertEq(troveManager.total_weighted_debt(), _expectedDebt * 2 * DEFAULT_ANNUAL_INTEREST_RATE, "E46"); - assertEq(troveManager.collateral_balance(), _collateralNeeded, "E47"); - assertEq(troveManager.zombie_trove_id(), 0, "E48"); + assertEq(troveManager.total_debt(), _expectedDebt * 2, "E43"); + assertEq(troveManager.total_weighted_debt(), _expectedDebt * 2 * DEFAULT_ANNUAL_INTEREST_RATE, "E44"); + assertEq(troveManager.collateral_balance(), _collateralNeeded, "E45"); + assertEq(troveManager.zombie_trove_id(), 0, "E46"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E49"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E50"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E47"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E48"); } // 1. lend @@ -168,37 +166,36 @@ contract BorrowTests is Base { assertEq(_trove.last_debt_update_time, block.timestamp, "E3"); assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E4"); assertEq(_trove.owner, userBorrower, "E5"); - assertEq(_trove.pending_owner, address(0), "E6"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E7"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E6"); assertGt( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO, - "E8" + "E7" ); // Check sorted troves - assertFalse(sortedTroves.empty(), "E9"); - assertEq(sortedTroves.size(), 1, "E10"); - assertEq(sortedTroves.first(), _troveId, "E11"); - assertEq(sortedTroves.last(), _troveId, "E12"); - assertTrue(sortedTroves.contains(_troveId), "E13"); + assertFalse(sortedTroves.empty(), "E8"); + assertEq(sortedTroves.size(), 1, "E9"); + assertEq(sortedTroves.first(), _troveId, "E10"); + assertEq(sortedTroves.last(), _troveId, "E11"); + assertTrue(sortedTroves.contains(_troveId), "E12"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E14"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E15"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E16"); - assertEq(borrowToken.balanceOf(address(lender)), _lendAmount - troveManager.min_debt(), "E17"); - assertEq(borrowToken.balanceOf(userBorrower), troveManager.min_debt(), "E18"); + assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E13"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E14"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E15"); + assertEq(borrowToken.balanceOf(address(lender)), _lendAmount - troveManager.min_debt(), "E16"); + assertEq(borrowToken.balanceOf(userBorrower), troveManager.min_debt(), "E17"); // Check global info - assertEq(troveManager.total_debt(), _expectedDebt, "E19"); - assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E20"); - assertEq(troveManager.collateral_balance(), _collateralNeeded, "E21"); - assertEq(troveManager.zombie_trove_id(), 0, "E22"); + assertEq(troveManager.total_debt(), _expectedDebt, "E18"); + assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E19"); + assertEq(troveManager.collateral_balance(), _collateralNeeded, "E20"); + assertEq(troveManager.zombie_trove_id(), 0, "E21"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E23"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E24"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E22"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E23"); // Calculate expected debt after second borrow uint256 _secondExpectedDebt = _expectedDebt + _borrowAmount + troveManager.get_upfront_fee(_borrowAmount, DEFAULT_ANNUAL_INTEREST_RATE); @@ -217,45 +214,44 @@ contract BorrowTests is Base { // Check trove info _trove = troveManager.troves(_troveId); - assertEq(_trove.debt, _secondExpectedDebt, "E25"); - assertEq(_trove.collateral, _collateralNeeded, "E26"); - assertEq(_trove.annual_interest_rate, DEFAULT_ANNUAL_INTEREST_RATE, "E27"); - assertEq(_trove.last_debt_update_time, block.timestamp, "E28"); - assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E29"); - assertEq(_trove.owner, userBorrower, "E30"); - assertEq(_trove.pending_owner, address(0), "E31"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E32"); + assertEq(_trove.debt, _secondExpectedDebt, "E24"); + assertEq(_trove.collateral, _collateralNeeded, "E25"); + assertEq(_trove.annual_interest_rate, DEFAULT_ANNUAL_INTEREST_RATE, "E26"); + assertEq(_trove.last_debt_update_time, block.timestamp, "E27"); + assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E28"); + assertEq(_trove.owner, userBorrower, "E29"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E30"); assertApproxEqRel( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO, 1e15, - "E33" + "E31" ); // 0.1% // Check sorted troves - assertFalse(sortedTroves.empty(), "E34"); - assertEq(sortedTroves.size(), 1, "E35"); - assertEq(sortedTroves.first(), _troveId, "E36"); - assertEq(sortedTroves.last(), _troveId, "E37"); - assertTrue(sortedTroves.contains(_troveId), "E38"); + assertFalse(sortedTroves.empty(), "E32"); + assertEq(sortedTroves.size(), 1, "E33"); + assertEq(sortedTroves.first(), _troveId, "E34"); + assertEq(sortedTroves.last(), _troveId, "E35"); + assertTrue(sortedTroves.contains(_troveId), "E36"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E39"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E40"); - assertEq(collateralToken.balanceOf(address(userBorrower)), 0, "E41"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E42"); - assertGe(borrowToken.balanceOf(address(lender)), 0, "E43"); - assertEq(borrowToken.balanceOf(userBorrower), _lendAmount, "E44"); + assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E37"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E38"); + assertEq(collateralToken.balanceOf(address(userBorrower)), 0, "E39"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E40"); + assertGe(borrowToken.balanceOf(address(lender)), 0, "E41"); + assertEq(borrowToken.balanceOf(userBorrower), _lendAmount, "E42"); // Check global info - assertEq(troveManager.total_debt(), _secondExpectedDebt, "E45"); - assertEq(troveManager.total_weighted_debt(), _secondExpectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E46"); - assertEq(troveManager.collateral_balance(), _collateralNeeded, "E47"); - assertEq(troveManager.zombie_trove_id(), 0, "E48"); + assertEq(troveManager.total_debt(), _secondExpectedDebt, "E43"); + assertEq(troveManager.total_weighted_debt(), _secondExpectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E44"); + assertEq(troveManager.collateral_balance(), _collateralNeeded, "E45"); + assertEq(troveManager.zombie_trove_id(), 0, "E46"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E49"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E50"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E47"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E48"); } // 1. lend @@ -291,38 +287,37 @@ contract BorrowTests is Base { assertEq(_trove.last_debt_update_time, block.timestamp, "E3"); assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E4"); assertEq(_trove.owner, userBorrower, "E5"); - assertEq(_trove.pending_owner, address(0), "E6"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E7"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E6"); assertApproxEqRel( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO, 1e15, - "E8" + "E7" ); // 0.1% // Check sorted troves - assertFalse(sortedTroves.empty(), "E9"); - assertEq(sortedTroves.size(), 1, "E10"); - assertEq(sortedTroves.first(), _troveId, "E11"); - assertEq(sortedTroves.last(), _troveId, "E12"); - assertTrue(sortedTroves.contains(_troveId), "E13"); + assertFalse(sortedTroves.empty(), "E8"); + assertEq(sortedTroves.size(), 1, "E9"); + assertEq(sortedTroves.first(), _troveId, "E10"); + assertEq(sortedTroves.last(), _troveId, "E11"); + assertTrue(sortedTroves.contains(_troveId), "E12"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E14"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E15"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E16"); - assertEq(borrowToken.balanceOf(address(lender)), _amount - _halfAmount, "E17"); - assertEq(borrowToken.balanceOf(userBorrower), _halfAmount, "E18"); + assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E13"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E14"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E15"); + assertEq(borrowToken.balanceOf(address(lender)), _amount - _halfAmount, "E16"); + assertEq(borrowToken.balanceOf(userBorrower), _halfAmount, "E17"); // Check global info - assertEq(troveManager.total_debt(), _expectedDebt, "E19"); - assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E20"); - assertEq(troveManager.collateral_balance(), _collateralNeeded, "E21"); - assertEq(troveManager.zombie_trove_id(), 0, "E22"); + assertEq(troveManager.total_debt(), _expectedDebt, "E18"); + assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E19"); + assertEq(troveManager.collateral_balance(), _collateralNeeded, "E20"); + assertEq(troveManager.zombie_trove_id(), 0, "E21"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E23"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E24"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E22"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E23"); // Higher rate for 2nd borrower so he can't redeem the first uint256 _higherRate = DEFAULT_ANNUAL_INTEREST_RATE * 2; @@ -333,44 +328,43 @@ contract BorrowTests is Base { // Check trove info _trove = troveManager.troves(_secondTroveId); - assertEq(_trove.debt, _secondExpectedDebt, "E25"); - assertEq(_trove.collateral, _collateralNeeded * 2, "E26"); - assertEq(_trove.annual_interest_rate, _higherRate, "E27"); - assertEq(_trove.last_debt_update_time, block.timestamp, "E28"); - assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E29"); - assertEq(_trove.owner, anotherUserBorrower, "E30"); - assertEq(_trove.pending_owner, address(0), "E31"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E32"); + assertEq(_trove.debt, _secondExpectedDebt, "E24"); + assertEq(_trove.collateral, _collateralNeeded * 2, "E25"); + assertEq(_trove.annual_interest_rate, _higherRate, "E26"); + assertEq(_trove.last_debt_update_time, block.timestamp, "E27"); + assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E28"); + assertEq(_trove.owner, anotherUserBorrower, "E29"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E30"); assertApproxEqRel( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO * 2, 1e15, - "E33" + "E31" ); // 0.1% // Check sorted troves - assertFalse(sortedTroves.empty(), "E34"); - assertEq(sortedTroves.size(), 2, "E35"); - assertEq(sortedTroves.first(), _secondTroveId, "E36"); - assertEq(sortedTroves.last(), _troveId, "E37"); - assertTrue(sortedTroves.contains(_secondTroveId), "E38"); + assertFalse(sortedTroves.empty(), "E32"); + assertEq(sortedTroves.size(), 2, "E33"); + assertEq(sortedTroves.first(), _secondTroveId, "E34"); + assertEq(sortedTroves.last(), _troveId, "E35"); + assertTrue(sortedTroves.contains(_secondTroveId), "E36"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded * 3, "E39"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E40"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E41"); - assertApproxEqAbs(borrowToken.balanceOf(address(lender)), 0, 1, "E42"); - assertEq(borrowToken.balanceOf(userBorrower), _halfAmount, "E43"); + assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded * 3, "E37"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E38"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E39"); + assertApproxEqAbs(borrowToken.balanceOf(address(lender)), 0, 1, "E40"); + assertEq(borrowToken.balanceOf(userBorrower), _halfAmount, "E41"); // Check global info - assertEq(troveManager.total_debt(), _expectedDebt + _secondExpectedDebt, "E44"); - assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE + _secondExpectedDebt * _higherRate, "E45"); - assertEq(troveManager.collateral_balance(), _collateralNeeded * 3, "E46"); - assertEq(troveManager.zombie_trove_id(), 0, "E47"); + assertEq(troveManager.total_debt(), _expectedDebt + _secondExpectedDebt, "E42"); + assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE + _secondExpectedDebt * _higherRate, "E43"); + assertEq(troveManager.collateral_balance(), _collateralNeeded * 3, "E44"); + assertEq(troveManager.zombie_trove_id(), 0, "E45"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E48"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E49"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E46"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E47"); uint256 _expectedCollateralAfterRedemption = _collateralNeeded - (_expectedDebt * ORACLE_PRICE_SCALE / priceOracle.get_price()); uint256 _secondBorrowAmount = _halfAmount * 101 / 100; // borrow a bit more to wipe out the first borrower @@ -390,25 +384,25 @@ contract BorrowTests is Base { uint256 _expectedTime = block.timestamp; // Check an auction was created (nonce incremented) - assertEq(dutchDesk.nonce(), 1, "E50"); + assertEq(dutchDesk.nonce(), 1, "E48"); // Auction should be active - assertTrue(auction.is_active(0), "E51"); + assertTrue(auction.is_active(0), "E49"); // Check collateral is in auction uint256 _auctionAvailable = auction.get_available_amount(0); - assertGt(_auctionAvailable, 0, "E52"); + assertGt(_auctionAvailable, 0, "E50"); // Check starting price is set correctly (with buffer) assertApproxEqAbs( auction.auctions(0).starting_price, _auctionAvailable * priceOracle.get_price(false) / WAD * dutchDesk.starting_price_buffer_percentage() / COLLATERAL_TOKEN_PRECISION, 3, - "E53" + "E51" ); // Check minimum price is set correctly (with buffer) - assertEq(auction.auctions(0).minimum_price, priceOracle.get_price(false) * dutchDesk.minimum_price_buffer_percentage() / WAD, "E54"); + assertEq(auction.auctions(0).minimum_price, priceOracle.get_price(false) * dutchDesk.minimum_price_buffer_percentage() / WAD, "E52"); // Take the auction takeAuction(0); @@ -417,45 +411,44 @@ contract BorrowTests is Base { // Check trove info _trove = troveManager.troves(_secondTroveId); - assertEq(_trove.debt, _secondExpectedDebt + _secondExpectedDebt2, "E55"); - assertEq(_trove.collateral, _collateralNeeded * 2, "E56"); - assertEq(_trove.annual_interest_rate, _higherRate, "E57"); - assertEq(_trove.last_debt_update_time, _expectedTime, "E58"); - assertEq(_trove.last_interest_rate_adj_time, _expectedTime, "E59"); - assertEq(_trove.owner, anotherUserBorrower, "E60"); - assertEq(_trove.pending_owner, address(0), "E61"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E62"); + assertEq(_trove.debt, _secondExpectedDebt + _secondExpectedDebt2, "E53"); + assertEq(_trove.collateral, _collateralNeeded * 2, "E54"); + assertEq(_trove.annual_interest_rate, _higherRate, "E55"); + assertEq(_trove.last_debt_update_time, _expectedTime, "E56"); + assertEq(_trove.last_interest_rate_adj_time, _expectedTime, "E57"); + assertEq(_trove.owner, anotherUserBorrower, "E58"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E59"); assertApproxEqRel( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO, 8e15, - "E63" + "E60" ); // 0.8%. Slightly worse CR due to increased second borrow amount // Check sorted troves - assertFalse(sortedTroves.empty(), "E64"); - assertEq(sortedTroves.size(), 1, "E65"); - assertEq(sortedTroves.first(), _secondTroveId, "E66"); - assertEq(sortedTroves.last(), _secondTroveId, "E67"); - assertTrue(sortedTroves.contains(_secondTroveId), "E68"); + assertFalse(sortedTroves.empty(), "E61"); + assertEq(sortedTroves.size(), 1, "E62"); + assertEq(sortedTroves.first(), _secondTroveId, "E63"); + assertEq(sortedTroves.last(), _secondTroveId, "E64"); + assertTrue(sortedTroves.contains(_secondTroveId), "E65"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _expectedCollateralAfterRedemption + _collateralNeeded * 2, "E69"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E70"); - assertEq(collateralToken.balanceOf(address(anotherUserBorrower)), 0, "E71"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E72"); - assertGe(borrowToken.balanceOf(address(lender)), 0, "E73"); - assertApproxEqRel(borrowToken.balanceOf(anotherUserBorrower), _amount, 25e15, "E74"); // 2.5%. Pays slippage due to the redemption + assertEq(collateralToken.balanceOf(address(troveManager)), _expectedCollateralAfterRedemption + _collateralNeeded * 2, "E66"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E67"); + assertEq(collateralToken.balanceOf(address(anotherUserBorrower)), 0, "E68"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E69"); + assertGe(borrowToken.balanceOf(address(lender)), 0, "E70"); + assertApproxEqRel(borrowToken.balanceOf(anotherUserBorrower), _amount, 25e15, "E71"); // 2.5%. Pays slippage due to the redemption // Check global info - assertEq(troveManager.total_debt(), _secondExpectedDebt + _secondExpectedDebt2, "E75"); - assertEq(troveManager.total_weighted_debt(), (_secondExpectedDebt + _secondExpectedDebt2) * _higherRate, "E76"); - assertEq(troveManager.collateral_balance(), _expectedCollateralAfterRedemption + _collateralNeeded * 2, "E77"); - assertEq(troveManager.zombie_trove_id(), 0, "E78"); + assertEq(troveManager.total_debt(), _secondExpectedDebt + _secondExpectedDebt2, "E72"); + assertEq(troveManager.total_weighted_debt(), (_secondExpectedDebt + _secondExpectedDebt2) * _higherRate, "E73"); + assertEq(troveManager.collateral_balance(), _expectedCollateralAfterRedemption + _collateralNeeded * 2, "E74"); + assertEq(troveManager.zombie_trove_id(), 0, "E75"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E79"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E80"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E76"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E77"); } function test_borrowFromActiveTrove_zeroDebt( @@ -912,4 +905,45 @@ contract BorrowTests is Base { ); } + function test_borrow_approvedOperator( + uint256 _amount + ) public { + _amount = bound(_amount, troveManager.min_debt() * 2, maxFuzzAmount); + + mintAndDepositIntoLender(userLender, _amount); + + uint256 _collateralNeeded = + (_amount * DEFAULT_TARGET_COLLATERAL_RATIO / BORROW_TOKEN_PRECISION) * ORACLE_PRICE_SCALE / priceOracle.get_price(); + uint256 _troveId = mintAndOpenTrove(userBorrower, _collateralNeeded, _amount / 2, DEFAULT_ANNUAL_INTEREST_RATE); + + // Approve operator + vm.prank(userBorrower); + troveManager.approve(operator, true); + + // Operator borrows + uint256 _borrowAmount = _amount / 4; + vm.prank(operator); + troveManager.borrow(_troveId, _borrowAmount, type(uint256).max, 0, 0); + + assertGt(troveManager.troves(_troveId).debt, _amount / 2, "E0"); + } + + function test_borrow_unapprovedOperator_reverts( + uint256 _amount, + address _caller + ) public { + _amount = bound(_amount, troveManager.min_debt(), maxFuzzAmount); + vm.assume(_caller != userBorrower); + + mintAndDepositIntoLender(userLender, _amount); + + uint256 _collateralNeeded = + (_amount * DEFAULT_TARGET_COLLATERAL_RATIO / BORROW_TOKEN_PRECISION) * ORACLE_PRICE_SCALE / priceOracle.get_price(); + uint256 _troveId = mintAndOpenTrove(userBorrower, _collateralNeeded, _amount, DEFAULT_ANNUAL_INTEREST_RATE); + + vm.prank(_caller); + vm.expectRevert("!owner"); + troveManager.borrow(_troveId, minFuzzAmount, type(uint256).max, 0, 0); + } + } diff --git a/test/CloseTrove.t.sol b/test/CloseTrove.t.sol index bf1975b..c673e3b 100644 --- a/test/CloseTrove.t.sol +++ b/test/CloseTrove.t.sol @@ -38,38 +38,37 @@ contract CloseTroveTests is Base { assertEq(_trove.last_debt_update_time, block.timestamp, "E3"); assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E4"); assertEq(_trove.owner, userBorrower, "E5"); - assertEq(_trove.pending_owner, address(0), "E6"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E7"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E6"); assertApproxEqRel( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO, 1e15, - "E8" + "E7" ); // 0.1% // Check sorted troves - assertFalse(sortedTroves.empty(), "E9"); - assertEq(sortedTroves.size(), 1, "E10"); - assertEq(sortedTroves.first(), _troveId, "E11"); - assertEq(sortedTroves.last(), _troveId, "E12"); - assertTrue(sortedTroves.contains(_troveId), "E13"); + assertFalse(sortedTroves.empty(), "E8"); + assertEq(sortedTroves.size(), 1, "E9"); + assertEq(sortedTroves.first(), _troveId, "E10"); + assertEq(sortedTroves.last(), _troveId, "E11"); + assertTrue(sortedTroves.contains(_troveId), "E12"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E14"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E15"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E16"); - assertEq(borrowToken.balanceOf(address(lender)), 0, "E17"); - assertEq(borrowToken.balanceOf(userBorrower), _amount, "E18"); + assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E13"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E14"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E15"); + assertEq(borrowToken.balanceOf(address(lender)), 0, "E16"); + assertEq(borrowToken.balanceOf(userBorrower), _amount, "E17"); // Check global info - assertEq(troveManager.total_debt(), _expectedDebt, "E19"); - assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E20"); - assertEq(troveManager.collateral_balance(), _collateralNeeded, "E21"); - assertEq(troveManager.zombie_trove_id(), 0, "E22"); + assertEq(troveManager.total_debt(), _expectedDebt, "E18"); + assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E19"); + assertEq(troveManager.collateral_balance(), _collateralNeeded, "E20"); + assertEq(troveManager.zombie_trove_id(), 0, "E21"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E23"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E24"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E22"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E23"); // Airdrop the the expected debt to the borrower airdrop(address(borrowToken), userBorrower, _expectedDebt); @@ -84,38 +83,38 @@ contract CloseTroveTests is Base { // Check trove info _trove = troveManager.troves(_troveId); - assertEq(_trove.debt, 0, "E25"); - assertEq(_trove.collateral, 0, "E26"); - assertEq(_trove.annual_interest_rate, 0, "E27"); - assertEq(_trove.last_debt_update_time, 0, "E28"); - assertEq(_trove.last_interest_rate_adj_time, 0, "E29"); - assertEq(_trove.owner, address(0), "E30"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.closed), "E31"); + assertEq(_trove.debt, 0, "E24"); + assertEq(_trove.collateral, 0, "E25"); + assertEq(_trove.annual_interest_rate, 0, "E26"); + assertEq(_trove.last_debt_update_time, 0, "E27"); + assertEq(_trove.last_interest_rate_adj_time, 0, "E28"); + assertEq(_trove.owner, address(0), "E29"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.closed), "E30"); // Check sorted troves - assertTrue(sortedTroves.empty(), "E32"); - assertEq(sortedTroves.size(), 0, "E33"); - assertEq(sortedTroves.first(), 0, "E34"); - assertEq(sortedTroves.last(), 0, "E35"); - assertFalse(sortedTroves.contains(_troveId), "E36"); + assertTrue(sortedTroves.empty(), "E31"); + assertEq(sortedTroves.size(), 0, "E32"); + assertEq(sortedTroves.first(), 0, "E33"); + assertEq(sortedTroves.last(), 0, "E34"); + assertFalse(sortedTroves.contains(_troveId), "E35"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), 0, "E37"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E38"); - assertEq(collateralToken.balanceOf(address(userBorrower)), _collateralNeeded, "E39"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E40"); - assertGe(borrowToken.balanceOf(address(lender)), _expectedDebt, "E41"); - assertEq(borrowToken.balanceOf(userBorrower), 0, "E42"); + assertEq(collateralToken.balanceOf(address(troveManager)), 0, "E36"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E37"); + assertEq(collateralToken.balanceOf(address(userBorrower)), _collateralNeeded, "E38"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E39"); + assertGe(borrowToken.balanceOf(address(lender)), _expectedDebt, "E40"); + assertEq(borrowToken.balanceOf(userBorrower), 0, "E41"); // Check global info - assertEq(troveManager.total_debt(), 0, "E43"); - assertEq(troveManager.total_weighted_debt(), 0, "E44"); - assertEq(troveManager.collateral_balance(), 0, "E45"); - assertEq(troveManager.zombie_trove_id(), 0, "E46"); + assertEq(troveManager.total_debt(), 0, "E42"); + assertEq(troveManager.total_weighted_debt(), 0, "E43"); + assertEq(troveManager.collateral_balance(), 0, "E44"); + assertEq(troveManager.zombie_trove_id(), 0, "E45"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E47"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E48"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E46"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E47"); } function test_closeTrove_notOwner( @@ -173,4 +172,50 @@ contract CloseTroveTests is Base { troveManager.close_trove(_troveId); } + function test_closeTrove_approvedOperator( + uint256 _amount + ) public { + _amount = bound(_amount, troveManager.min_debt(), maxFuzzAmount); + + mintAndDepositIntoLender(userLender, _amount); + + uint256 _collateralNeeded = + (_amount * DEFAULT_TARGET_COLLATERAL_RATIO / BORROW_TOKEN_PRECISION) * ORACLE_PRICE_SCALE / priceOracle.get_price(); + uint256 _troveId = mintAndOpenTrove(userBorrower, _collateralNeeded, _amount, DEFAULT_ANNUAL_INTEREST_RATE); + + // Approve operator + vm.prank(userBorrower); + troveManager.approve(operator, true); + + // Airdrop borrow tokens to operator to repay + uint256 _debt = troveManager.get_trove_debt_after_interest(_troveId); + airdrop(address(borrowToken), operator, _debt); + + // Operator closes the trove + vm.startPrank(operator); + borrowToken.approve(address(troveManager), _debt); + troveManager.close_trove(_troveId); + vm.stopPrank(); + + assertEq(uint256(troveManager.troves(_troveId).status), uint256(ITroveManager.Status.closed), "E0"); + } + + function test_closeTrove_unapprovedOperator_reverts( + uint256 _amount, + address _caller + ) public { + _amount = bound(_amount, troveManager.min_debt(), maxFuzzAmount); + vm.assume(_caller != userBorrower); + + mintAndDepositIntoLender(userLender, _amount); + + uint256 _collateralNeeded = + (_amount * DEFAULT_TARGET_COLLATERAL_RATIO / BORROW_TOKEN_PRECISION) * ORACLE_PRICE_SCALE / priceOracle.get_price(); + uint256 _troveId = mintAndOpenTrove(userBorrower, _collateralNeeded, _amount, DEFAULT_ANNUAL_INTEREST_RATE); + + vm.prank(_caller); + vm.expectRevert("!owner"); + troveManager.close_trove(_troveId); + } + } diff --git a/test/CloseZombieTrove.t.sol b/test/CloseZombieTrove.t.sol index 85a3506..e80b4e5 100644 --- a/test/CloseZombieTrove.t.sol +++ b/test/CloseZombieTrove.t.sol @@ -47,38 +47,37 @@ contract CloseZombieTroveTests is Base { assertEq(_trove.last_debt_update_time, block.timestamp, "E3"); assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E4"); assertEq(_trove.owner, userBorrower, "E5"); - assertEq(_trove.pending_owner, address(0), "E6"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E7"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E6"); assertApproxEqRel( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO, 1e15, - "E8" + "E7" ); // 0.1% // Check sorted troves - assertFalse(sortedTroves.empty(), "E9"); - assertEq(sortedTroves.size(), 1, "E10"); - assertEq(sortedTroves.first(), _troveId, "E11"); - assertEq(sortedTroves.last(), _troveId, "E12"); - assertTrue(sortedTroves.contains(_troveId), "E13"); + assertFalse(sortedTroves.empty(), "E8"); + assertEq(sortedTroves.size(), 1, "E9"); + assertEq(sortedTroves.first(), _troveId, "E10"); + assertEq(sortedTroves.last(), _troveId, "E11"); + assertTrue(sortedTroves.contains(_troveId), "E12"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E14"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E15"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E16"); - assertEq(borrowToken.balanceOf(address(lender)), 0, "E17"); - assertEq(borrowToken.balanceOf(userBorrower), _amount, "E18"); + assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E13"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E14"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E15"); + assertEq(borrowToken.balanceOf(address(lender)), 0, "E16"); + assertEq(borrowToken.balanceOf(userBorrower), _amount, "E17"); // Check global info - assertEq(troveManager.total_debt(), _expectedDebt, "E19"); - assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E20"); - assertEq(troveManager.collateral_balance(), _collateralNeeded, "E21"); - assertEq(troveManager.zombie_trove_id(), 0, "E22"); + assertEq(troveManager.total_debt(), _expectedDebt, "E18"); + assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E19"); + assertEq(troveManager.collateral_balance(), _collateralNeeded, "E20"); + assertEq(troveManager.zombie_trove_id(), 0, "E21"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E23"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E24"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E22"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E23"); // Pull enough liquidity to make trove a zombie trove (but above 0 debt) uint256 _amountToPull = _amount - 100 * BORROW_TOKEN_PRECISION; @@ -95,14 +94,14 @@ contract CloseZombieTroveTests is Base { uint256 _timeSkipped = takeAuction(0); // Do some intermediate checks on lender - assertEq(borrowToken.balanceOf(address(lender)), 0, "E25"); - assertApproxEqRel(borrowToken.balanceOf(address(userLender)), _amountToPull, 3e16, "E26"); // 3% Slippage + assertEq(borrowToken.balanceOf(address(lender)), 0, "E24"); + assertApproxEqRel(borrowToken.balanceOf(address(userLender)), _amountToPull, 3e16, "E25"); // 3% Slippage // Do some intermediate checks on borrower _trove = troveManager.troves(_troveId); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.zombie), "E27"); - assertEq(_trove.debt, _expectedDebt - _amountToPull, "E28"); - assertEq(troveManager.zombie_trove_id(), _troveId, "E29"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.zombie), "E26"); + assertEq(_trove.debt, _expectedDebt - _amountToPull, "E27"); + assertEq(troveManager.zombie_trove_id(), _troveId, "E28"); // Add interest from the time skipped during the auction uint256 _newExpectedDebt = @@ -121,39 +120,38 @@ contract CloseZombieTroveTests is Base { // Check trove info _trove = troveManager.troves(_troveId); - assertEq(_trove.debt, 0, "E30"); - assertEq(_trove.collateral, 0, "E31"); - assertEq(_trove.annual_interest_rate, 0, "E32"); - assertEq(_trove.last_debt_update_time, 0, "E33"); - assertEq(_trove.last_interest_rate_adj_time, 0, "E34"); - assertEq(_trove.owner, address(0), "E35"); - assertEq(_trove.pending_owner, address(0), "E36"); - assertEq(uint256(_trove.status), 4, "E37"); // Closed + assertEq(_trove.debt, 0, "E29"); + assertEq(_trove.collateral, 0, "E30"); + assertEq(_trove.annual_interest_rate, 0, "E31"); + assertEq(_trove.last_debt_update_time, 0, "E32"); + assertEq(_trove.last_interest_rate_adj_time, 0, "E33"); + assertEq(_trove.owner, address(0), "E34"); + assertEq(uint256(_trove.status), 4, "E35"); // Closed // Check sorted troves - assertTrue(sortedTroves.empty(), "E38"); - assertEq(sortedTroves.size(), 0, "E39"); - assertEq(sortedTroves.first(), 0, "E40"); - assertEq(sortedTroves.last(), 0, "E41"); - assertFalse(sortedTroves.contains(_troveId), "E42"); + assertTrue(sortedTroves.empty(), "E36"); + assertEq(sortedTroves.size(), 0, "E37"); + assertEq(sortedTroves.first(), 0, "E38"); + assertEq(sortedTroves.last(), 0, "E39"); + assertFalse(sortedTroves.contains(_troveId), "E40"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), 0, "E43"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E44"); - assertEq(collateralToken.balanceOf(address(userBorrower)), _expectedCollateralAfterRedemption, "E45"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E46"); - assertGe(borrowToken.balanceOf(address(lender)), _newExpectedDebt, "E47"); - assertEq(borrowToken.balanceOf(userBorrower), 0, "E48"); + assertEq(collateralToken.balanceOf(address(troveManager)), 0, "E41"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E42"); + assertEq(collateralToken.balanceOf(address(userBorrower)), _expectedCollateralAfterRedemption, "E43"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E44"); + assertGe(borrowToken.balanceOf(address(lender)), _newExpectedDebt, "E45"); + assertEq(borrowToken.balanceOf(userBorrower), 0, "E46"); // Check global info - assertApproxEqAbs(troveManager.total_debt(), 0, 2, "E49"); - assertEq(troveManager.total_weighted_debt(), 0, "E50"); - assertEq(troveManager.collateral_balance(), 0, "E51"); - assertEq(troveManager.zombie_trove_id(), 0, "E52"); + assertApproxEqAbs(troveManager.total_debt(), 0, 2, "E47"); + assertEq(troveManager.total_weighted_debt(), 0, "E48"); + assertEq(troveManager.collateral_balance(), 0, "E49"); + assertEq(troveManager.zombie_trove_id(), 0, "E50"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E53"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E54"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E51"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E52"); } // // 1. lend @@ -186,38 +184,37 @@ contract CloseZombieTroveTests is Base { assertEq(_trove.last_debt_update_time, block.timestamp, "E3"); assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E4"); assertEq(_trove.owner, userBorrower, "E5"); - assertEq(_trove.pending_owner, address(0), "E6"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E7"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E6"); assertApproxEqRel( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO, 1e15, - "E8" + "E7" ); // 0.1% // Check sorted troves - assertFalse(sortedTroves.empty(), "E9"); - assertEq(sortedTroves.size(), 1, "E10"); - assertEq(sortedTroves.first(), _troveId, "E11"); - assertEq(sortedTroves.last(), _troveId, "E12"); - assertTrue(sortedTroves.contains(_troveId), "E13"); + assertFalse(sortedTroves.empty(), "E8"); + assertEq(sortedTroves.size(), 1, "E9"); + assertEq(sortedTroves.first(), _troveId, "E10"); + assertEq(sortedTroves.last(), _troveId, "E11"); + assertTrue(sortedTroves.contains(_troveId), "E12"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E14"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E15"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E16"); - assertEq(borrowToken.balanceOf(address(lender)), 0, "E17"); - assertEq(borrowToken.balanceOf(userBorrower), _amount, "E18"); + assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E13"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E14"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E15"); + assertEq(borrowToken.balanceOf(address(lender)), 0, "E16"); + assertEq(borrowToken.balanceOf(userBorrower), _amount, "E17"); // Check global info - assertEq(troveManager.total_debt(), _expectedDebt, "E19"); - assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E20"); - assertEq(troveManager.collateral_balance(), _collateralNeeded, "E21"); - assertEq(troveManager.zombie_trove_id(), 0, "E22"); + assertEq(troveManager.total_debt(), _expectedDebt, "E18"); + assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E19"); + assertEq(troveManager.collateral_balance(), _collateralNeeded, "E20"); + assertEq(troveManager.zombie_trove_id(), 0, "E21"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E23"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E24"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E22"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E23"); // Expected profit is just the upfront fee uint256 _expectedProfit = troveManager.get_upfront_fee(_amount, DEFAULT_ANNUAL_INTEREST_RATE); @@ -232,8 +229,8 @@ contract CloseZombieTroveTests is Base { (uint256 _profit, uint256 _loss) = IKeeper(lenderFactory.KEEPER()).report(address(lender)); // Check return Values - assertEq(_profit, _expectedProfit, "E25"); - assertEq(_loss, 0, "E26"); + assertEq(_profit, _expectedProfit, "E24"); + assertEq(_loss, 0, "E25"); // Cache the expected time because it will be skipped during the auction uint256 _expectedTime = block.timestamp; @@ -247,44 +244,44 @@ contract CloseZombieTroveTests is Base { takeAuction(0); // Make sure lender got his funds - assertApproxEqRel(borrowToken.balanceOf(address(userLender)), _amountToPull, 3e16, "E27"); // 3%. Slippage + assertApproxEqRel(borrowToken.balanceOf(address(userLender)), _amountToPull, 3e16, "E26"); // 3%. Slippage // Check everything again // Check trove info _trove = troveManager.troves(_troveId); - assertEq(_trove.debt, 0, "E28"); - assertEq(_trove.collateral, _expectedCollateralAfterRedemption, "E29"); - assertEq(_trove.annual_interest_rate, DEFAULT_ANNUAL_INTEREST_RATE, "E30"); - assertEq(_trove.last_debt_update_time, _expectedTime, "E31"); - assertEq(_trove.last_interest_rate_adj_time, _expectedTime, "E32"); - assertEq(_trove.owner, userBorrower, "E33"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.zombie), "E34"); + assertEq(_trove.debt, 0, "E27"); + assertEq(_trove.collateral, _expectedCollateralAfterRedemption, "E28"); + assertEq(_trove.annual_interest_rate, DEFAULT_ANNUAL_INTEREST_RATE, "E29"); + assertEq(_trove.last_debt_update_time, _expectedTime, "E30"); + assertEq(_trove.last_interest_rate_adj_time, _expectedTime, "E31"); + assertEq(_trove.owner, userBorrower, "E32"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.zombie), "E33"); // Check sorted troves - assertTrue(sortedTroves.empty(), "E35"); - assertEq(sortedTroves.size(), 0, "E36"); - assertEq(sortedTroves.first(), 0, "E37"); - assertEq(sortedTroves.last(), 0, "E38"); - assertFalse(sortedTroves.contains(_troveId), "E39"); + assertTrue(sortedTroves.empty(), "E34"); + assertEq(sortedTroves.size(), 0, "E35"); + assertEq(sortedTroves.first(), 0, "E36"); + assertEq(sortedTroves.last(), 0, "E37"); + assertFalse(sortedTroves.contains(_troveId), "E38"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _expectedCollateralAfterRedemption, "E40"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E41"); - assertEq(collateralToken.balanceOf(address(userBorrower)), 0, "E42"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E43"); - assertGe(borrowToken.balanceOf(address(lender)), 0, "E44"); - assertEq(borrowToken.balanceOf(userBorrower), _amount, "E45"); + assertEq(collateralToken.balanceOf(address(troveManager)), _expectedCollateralAfterRedemption, "E39"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E40"); + assertEq(collateralToken.balanceOf(address(userBorrower)), 0, "E41"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E42"); + assertGe(borrowToken.balanceOf(address(lender)), 0, "E43"); + assertEq(borrowToken.balanceOf(userBorrower), _amount, "E44"); // Check global info - assertEq(troveManager.total_debt(), 0, "E46"); - assertEq(troveManager.total_weighted_debt(), 0, "E47"); - assertEq(troveManager.collateral_balance(), _expectedCollateralAfterRedemption, "E48"); - assertEq(troveManager.zombie_trove_id(), 0, "E49"); + assertEq(troveManager.total_debt(), 0, "E45"); + assertEq(troveManager.total_weighted_debt(), 0, "E46"); + assertEq(troveManager.collateral_balance(), _expectedCollateralAfterRedemption, "E47"); + assertEq(troveManager.zombie_trove_id(), 0, "E48"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E50"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E51"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E49"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E50"); // Finally close the zombie trove vm.prank(userBorrower); @@ -294,39 +291,38 @@ contract CloseZombieTroveTests is Base { // Check trove info _trove = troveManager.troves(_troveId); - assertEq(_trove.debt, 0, "E52"); - assertEq(_trove.collateral, 0, "E53"); - assertEq(_trove.annual_interest_rate, 0, "E54"); - assertEq(_trove.last_debt_update_time, 0, "E55"); - assertEq(_trove.last_interest_rate_adj_time, 0, "E56"); - assertEq(_trove.owner, address(0), "E57"); - assertEq(_trove.pending_owner, address(0), "E58"); - assertEq(uint256(_trove.status), 4, "E59"); // Closed + assertEq(_trove.debt, 0, "E51"); + assertEq(_trove.collateral, 0, "E52"); + assertEq(_trove.annual_interest_rate, 0, "E53"); + assertEq(_trove.last_debt_update_time, 0, "E54"); + assertEq(_trove.last_interest_rate_adj_time, 0, "E55"); + assertEq(_trove.owner, address(0), "E56"); + assertEq(uint256(_trove.status), 4, "E57"); // Closed // Check sorted troves - assertTrue(sortedTroves.empty(), "E60"); - assertEq(sortedTroves.size(), 0, "E61"); - assertEq(sortedTroves.first(), 0, "E62"); - assertEq(sortedTroves.last(), 0, "E63"); - assertFalse(sortedTroves.contains(_troveId), "E64"); + assertTrue(sortedTroves.empty(), "E58"); + assertEq(sortedTroves.size(), 0, "E59"); + assertEq(sortedTroves.first(), 0, "E60"); + assertEq(sortedTroves.last(), 0, "E61"); + assertFalse(sortedTroves.contains(_troveId), "E62"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), 0, "E65"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E66"); - assertEq(collateralToken.balanceOf(address(userBorrower)), _expectedCollateralAfterRedemption, "E67"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E68"); - assertGe(borrowToken.balanceOf(address(lender)), 0, "E69"); - assertEq(borrowToken.balanceOf(userBorrower), _amount, "E70"); + assertEq(collateralToken.balanceOf(address(troveManager)), 0, "E63"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E64"); + assertEq(collateralToken.balanceOf(address(userBorrower)), _expectedCollateralAfterRedemption, "E65"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E66"); + assertGe(borrowToken.balanceOf(address(lender)), 0, "E67"); + assertEq(borrowToken.balanceOf(userBorrower), _amount, "E68"); // Check global info - assertEq(troveManager.total_debt(), 0, "E71"); - assertEq(troveManager.total_weighted_debt(), 0, "E72"); - assertEq(troveManager.collateral_balance(), 0, "E73"); - assertEq(troveManager.zombie_trove_id(), 0, "E74"); + assertEq(troveManager.total_debt(), 0, "E69"); + assertEq(troveManager.total_weighted_debt(), 0, "E70"); + assertEq(troveManager.collateral_balance(), 0, "E71"); + assertEq(troveManager.zombie_trove_id(), 0, "E72"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E75"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E76"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E73"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E74"); } function test_closeZombieTrove_notOwner( @@ -384,4 +380,64 @@ contract CloseZombieTroveTests is Base { troveManager.close_zombie_trove(_troveId); } + function test_closeZombieTrove_approvedOperator( + uint256 _amount + ) public { + _amount = bound(_amount, troveManager.min_debt(), maxFuzzAmount); + + mintAndDepositIntoLender(userLender, _amount); + + uint256 _collateralNeeded = + (_amount * DEFAULT_TARGET_COLLATERAL_RATIO / BORROW_TOKEN_PRECISION) * ORACLE_PRICE_SCALE / priceOracle.get_price(); + uint256 _troveId = mintAndOpenTrove(userBorrower, _collateralNeeded, _amount, DEFAULT_ANNUAL_INTEREST_RATE); + + // Pull liquidity to make trove a zombie + uint256 _amountToPull = _amount - 100 * BORROW_TOKEN_PRECISION; + vm.prank(userLender); + lender.redeem(_amountToPull, userLender, userLender); + + assertEq(uint256(troveManager.troves(_troveId).status), uint256(ITroveManager.Status.zombie), "E0"); + + // Approve operator + vm.prank(userBorrower); + troveManager.approve(operator, true); + + // Airdrop borrow tokens to operator to repay + uint256 _debt = troveManager.get_trove_debt_after_interest(_troveId); + airdrop(address(borrowToken), operator, _debt); + + // Operator closes the zombie trove + vm.startPrank(operator); + borrowToken.approve(address(troveManager), _debt); + troveManager.close_zombie_trove(_troveId); + vm.stopPrank(); + + assertEq(uint256(troveManager.troves(_troveId).status), uint256(ITroveManager.Status.closed), "E1"); + } + + function test_closeZombieTrove_unapprovedOperator_reverts( + uint256 _amount, + address _caller + ) public { + _amount = bound(_amount, troveManager.min_debt(), maxFuzzAmount); + vm.assume(_caller != userBorrower); + + mintAndDepositIntoLender(userLender, _amount); + + uint256 _collateralNeeded = + (_amount * DEFAULT_TARGET_COLLATERAL_RATIO / BORROW_TOKEN_PRECISION) * ORACLE_PRICE_SCALE / priceOracle.get_price(); + uint256 _troveId = mintAndOpenTrove(userBorrower, _collateralNeeded, _amount, DEFAULT_ANNUAL_INTEREST_RATE); + + // Pull liquidity to make trove a zombie + uint256 _amountToPull = _amount - 100 * BORROW_TOKEN_PRECISION; + vm.prank(userLender); + lender.redeem(_amountToPull, userLender, userLender); + + assertEq(uint256(troveManager.troves(_troveId).status), uint256(ITroveManager.Status.zombie), "E0"); + + vm.prank(_caller); + vm.expectRevert("!owner"); + troveManager.close_zombie_trove(_troveId); + } + } diff --git a/test/DutchDesk.t.sol b/test/DutchDesk.t.sol index 9db3139..ddf4fd6 100644 --- a/test/DutchDesk.t.sol +++ b/test/DutchDesk.t.sol @@ -40,7 +40,6 @@ contract DutchDeskTests is Base { lender: address(lender), price_oracle: address(priceOracle), auction: address(auction), - borrow_token: address(borrowToken), collateral_token: address(collateralToken), minimum_price_buffer_percentage: minimumPriceBufferPercentage, starting_price_buffer_percentage: startingPriceBufferPercentage, diff --git a/test/Lend.t.sol b/test/Lend.t.sol index 05cd73f..28b5fb3 100644 --- a/test/Lend.t.sol +++ b/test/Lend.t.sol @@ -30,7 +30,6 @@ contract LendTests is Base { assertEq(lender.availableWithdrawLimit(userLender), type(uint256).max, "E3"); assertEq(lender.availableDepositLimit(userLender), type(uint256).max, "E4"); assertEq(lender.name(), "Flex yvWETH-2/USDC Lender", "E5"); - assertEq(lender.doHealthCheck(), false, "E6"); } // 1. lend @@ -69,38 +68,37 @@ contract LendTests is Base { assertEq(_trove.last_debt_update_time, block.timestamp, "E4"); assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E5"); assertEq(_trove.owner, userBorrower, "E6"); - assertEq(_trove.pending_owner, address(0), "E7"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E8"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E7"); assertApproxEqRel( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO, 1e15, - "E9" + "E8" ); // 0.1% // Check sorted troves - assertFalse(sortedTroves.empty(), "E10"); - assertEq(sortedTroves.size(), 1, "E11"); - assertEq(sortedTroves.first(), _troveId, "E12"); - assertEq(sortedTroves.last(), _troveId, "E13"); - assertTrue(sortedTroves.contains(_troveId), "E14"); + assertFalse(sortedTroves.empty(), "E9"); + assertEq(sortedTroves.size(), 1, "E10"); + assertEq(sortedTroves.first(), _troveId, "E11"); + assertEq(sortedTroves.last(), _troveId, "E12"); + assertTrue(sortedTroves.contains(_troveId), "E13"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E15"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E16"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E17"); - assertEq(borrowToken.balanceOf(address(lender)), 0, "E18"); - assertEq(borrowToken.balanceOf(userBorrower), _amount, "E19"); + assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E14"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E15"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E16"); + assertEq(borrowToken.balanceOf(address(lender)), 0, "E17"); + assertEq(borrowToken.balanceOf(userBorrower), _amount, "E18"); // Check global info - assertEq(troveManager.total_debt(), _expectedDebt, "E20"); - assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E21"); - assertEq(troveManager.collateral_balance(), _collateralNeeded, "E22"); - assertEq(troveManager.zombie_trove_id(), 0, "E23"); + assertEq(troveManager.total_debt(), _expectedDebt, "E19"); + assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E20"); + assertEq(troveManager.collateral_balance(), _collateralNeeded, "E21"); + assertEq(troveManager.zombie_trove_id(), 0, "E22"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E24"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E25"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E23"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E24"); // Skip some time, calculate expected interest uint256 _daysToSkip = 90 days; @@ -110,7 +108,7 @@ contract LendTests is Base { uint256 _expectedCollateralAfterRedemption = _collateralNeeded - ((_amount + _expectedProfit) * ORACLE_PRICE_SCALE / priceOracle.get_price()); // Sanity check - assertGt(_expectedProfit, 0, "E26"); + assertGt(_expectedProfit, 0, "E25"); // Earn Interest skip(_daysToSkip); @@ -119,8 +117,8 @@ contract LendTests is Base { (uint256 _profit, uint256 _loss) = IKeeper(lenderFactory.KEEPER()).report(address(lender)); // Check return Values - assertApproxEqAbs(_profit, _expectedProfit, 2, "E27"); - assertEq(_loss, 0, "E28"); + assertApproxEqAbs(_profit, _expectedProfit, 2, "E26"); + assertEq(_loss, 0, "E27"); uint256 _balanceBefore = borrowToken.balanceOf(userLender); @@ -133,56 +131,55 @@ contract LendTests is Base { // Check an auction was created uint256 _auctionId = 0; - assertTrue(auction.is_active(_auctionId), "E29"); - assertGt(auction.get_available_amount(_auctionId), 0, "E30"); + assertTrue(auction.is_active(_auctionId), "E28"); + assertGt(auction.get_available_amount(_auctionId), 0, "E29"); // Take the auction takeAuction(_auctionId); // Auction should be empty now - assertEq(auction.get_available_amount(_auctionId), 0, "E31"); - assertFalse(auction.is_active(_auctionId), "E32"); + assertEq(auction.get_available_amount(_auctionId), 0, "E30"); + assertFalse(auction.is_active(_auctionId), "E31"); // profit > slippage - assertGt(borrowToken.balanceOf(userLender), _balanceBefore + _amount, "E33"); + assertGt(borrowToken.balanceOf(userLender), _balanceBefore + _amount, "E32"); // Check everything again // Check trove info _trove = troveManager.troves(_troveId); - assertEq(_trove.debt, 0, "E34"); - assertApproxEqRel(_trove.collateral, _expectedCollateralAfterRedemption, 1e16, "E35"); // 1% - assertEq(_trove.annual_interest_rate, DEFAULT_ANNUAL_INTEREST_RATE, "E36"); - assertEq(_trove.last_debt_update_time, _expectedTime, "E37"); - assertEq(_trove.last_interest_rate_adj_time, _expectedTime - _daysToSkip, "E38"); - assertEq(_trove.owner, userBorrower, "E39"); - assertEq(_trove.pending_owner, address(0), "E40"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.zombie), "E41"); + assertEq(_trove.debt, 0, "E33"); + assertApproxEqRel(_trove.collateral, _expectedCollateralAfterRedemption, 1e16, "E34"); // 1% + assertEq(_trove.annual_interest_rate, DEFAULT_ANNUAL_INTEREST_RATE, "E35"); + assertEq(_trove.last_debt_update_time, _expectedTime, "E36"); + assertEq(_trove.last_interest_rate_adj_time, _expectedTime - _daysToSkip, "E37"); + assertEq(_trove.owner, userBorrower, "E38"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.zombie), "E39"); // Check sorted troves - assertTrue(sortedTroves.empty(), "E42"); - assertEq(sortedTroves.size(), 0, "E43"); - assertEq(sortedTroves.first(), 0, "E44"); - assertEq(sortedTroves.last(), 0, "E45"); - assertFalse(sortedTroves.contains(_troveId), "E46"); + assertTrue(sortedTroves.empty(), "E40"); + assertEq(sortedTroves.size(), 0, "E41"); + assertEq(sortedTroves.first(), 0, "E42"); + assertEq(sortedTroves.last(), 0, "E43"); + assertFalse(sortedTroves.contains(_troveId), "E44"); // Check balances - assertApproxEqRel(collateralToken.balanceOf(address(troveManager)), _expectedCollateralAfterRedemption, 1e16, "E47"); // 1% - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E48"); - assertEq(collateralToken.balanceOf(address(userBorrower)), 0, "E49"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E50"); - assertEq(borrowToken.balanceOf(address(lender)), 0, "E51"); - assertEq(borrowToken.balanceOf(userBorrower), _amount, "E52"); + assertApproxEqRel(collateralToken.balanceOf(address(troveManager)), _expectedCollateralAfterRedemption, 1e16, "E45"); // 1% + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E46"); + assertEq(collateralToken.balanceOf(address(userBorrower)), 0, "E47"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E48"); + assertEq(borrowToken.balanceOf(address(lender)), 0, "E49"); + assertEq(borrowToken.balanceOf(userBorrower), _amount, "E50"); // Check global info - assertApproxEqAbs(troveManager.total_debt(), 0, 2, "E53"); - assertEq(troveManager.total_weighted_debt(), 0, "E54"); - assertApproxEqRel(troveManager.collateral_balance(), _expectedCollateralAfterRedemption, 1e16, "E55"); // 1% - assertEq(troveManager.zombie_trove_id(), 0, "E56"); + assertApproxEqAbs(troveManager.total_debt(), 0, 2, "E51"); + assertEq(troveManager.total_weighted_debt(), 0, "E52"); + assertApproxEqRel(troveManager.collateral_balance(), _expectedCollateralAfterRedemption, 1e16, "E53"); // 1% + assertEq(troveManager.zombie_trove_id(), 0, "E54"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E57"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E58"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E55"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E56"); } // 1. lend @@ -222,38 +219,37 @@ contract LendTests is Base { assertEq(_trove.last_debt_update_time, block.timestamp, "E4"); assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E5"); assertEq(_trove.owner, userBorrower, "E6"); - assertEq(_trove.pending_owner, address(0), "E7"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E8"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E7"); assertApproxEqRel( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO, 1e15, - "E9" + "E8" ); // 0.1% // Check sorted troves - assertFalse(sortedTroves.empty(), "E10"); - assertEq(sortedTroves.size(), 1, "E11"); - assertEq(sortedTroves.first(), _troveId, "E12"); - assertEq(sortedTroves.last(), _troveId, "E13"); - assertTrue(sortedTroves.contains(_troveId), "E14"); + assertFalse(sortedTroves.empty(), "E9"); + assertEq(sortedTroves.size(), 1, "E10"); + assertEq(sortedTroves.first(), _troveId, "E11"); + assertEq(sortedTroves.last(), _troveId, "E12"); + assertTrue(sortedTroves.contains(_troveId), "E13"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E15"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E16"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E17"); - assertEq(borrowToken.balanceOf(address(lender)), 0, "E18"); - assertEq(borrowToken.balanceOf(userBorrower), _amount, "E19"); + assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E14"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E15"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E16"); + assertEq(borrowToken.balanceOf(address(lender)), 0, "E17"); + assertEq(borrowToken.balanceOf(userBorrower), _amount, "E18"); // Check global info - assertEq(troveManager.total_debt(), _expectedDebt, "E20"); - assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E21"); - assertEq(troveManager.collateral_balance(), _collateralNeeded, "E22"); - assertEq(troveManager.zombie_trove_id(), 0, "E23"); + assertEq(troveManager.total_debt(), _expectedDebt, "E19"); + assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E20"); + assertEq(troveManager.collateral_balance(), _collateralNeeded, "E21"); + assertEq(troveManager.zombie_trove_id(), 0, "E22"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E24"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E25"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E23"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E24"); // Skip some time, calculate expected interest uint256 _daysToSkip = 90 days; @@ -271,7 +267,7 @@ contract LendTests is Base { uint256 _expectedCollateralAfterRedemption = _collateralNeeded - (_amount * ORACLE_PRICE_SCALE / priceOracle.get_price()); // Sanity check - assertGt(_expectedProfit, 0, "E26"); + assertGt(_expectedProfit, 0, "E25"); uint256 _balanceBefore = borrowToken.balanceOf(userLender); @@ -284,55 +280,55 @@ contract LendTests is Base { // Check an auction was created uint256 _auctionId = 0; - assertTrue(auction.is_active(_auctionId), "E27"); - assertGt(auction.get_available_amount(_auctionId), 0, "E28"); + assertTrue(auction.is_active(_auctionId), "E26"); + assertGt(auction.get_available_amount(_auctionId), 0, "E27"); // Take the auction takeAuction(_auctionId); // Auction should be empty now - assertEq(auction.get_available_amount(_auctionId), 0, "E29"); - assertFalse(auction.is_active(_auctionId), "E30"); + assertEq(auction.get_available_amount(_auctionId), 0, "E28"); + assertFalse(auction.is_active(_auctionId), "E29"); // No report, no profit, loss bc `takeAuction` pricing is not perfect - assertApproxEqRel(borrowToken.balanceOf(userLender), _balanceBefore + _amount, 5e15, "E31"); // 0.5% + assertApproxEqRel(borrowToken.balanceOf(userLender), _balanceBefore + _amount, 5e15, "E30"); // 0.5% // Check everything again // Check trove info _trove = troveManager.troves(_troveId); - assertEq(_trove.debt, _expectedProfit, "E32"); - assertApproxEqRel(_trove.collateral, _expectedCollateralAfterRedemption, 5e15, "E33"); // 0.5% - assertEq(_trove.annual_interest_rate, DEFAULT_ANNUAL_INTEREST_RATE, "E34"); - assertEq(_trove.last_debt_update_time, _expectedTime, "E35"); - assertEq(_trove.last_interest_rate_adj_time, _expectedTime - _daysToSkip, "E36"); - assertEq(_trove.owner, userBorrower, "E37"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.zombie), "E38"); + assertEq(_trove.debt, _expectedProfit, "E31"); + assertApproxEqRel(_trove.collateral, _expectedCollateralAfterRedemption, 5e15, "E32"); // 0.5% + assertEq(_trove.annual_interest_rate, DEFAULT_ANNUAL_INTEREST_RATE, "E33"); + assertEq(_trove.last_debt_update_time, _expectedTime, "E34"); + assertEq(_trove.last_interest_rate_adj_time, _expectedTime - _daysToSkip, "E35"); + assertEq(_trove.owner, userBorrower, "E36"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.zombie), "E37"); // Check sorted troves - assertTrue(sortedTroves.empty(), "E39"); - assertEq(sortedTroves.size(), 0, "E40"); - assertEq(sortedTroves.first(), 0, "E41"); - assertEq(sortedTroves.last(), 0, "E42"); - assertFalse(sortedTroves.contains(_troveId), "E43"); + assertTrue(sortedTroves.empty(), "E38"); + assertEq(sortedTroves.size(), 0, "E39"); + assertEq(sortedTroves.first(), 0, "E40"); + assertEq(sortedTroves.last(), 0, "E41"); + assertFalse(sortedTroves.contains(_troveId), "E42"); // Check balances - assertApproxEqRel(collateralToken.balanceOf(address(troveManager)), _expectedCollateralAfterRedemption, 5e15, "E44"); // 0.5% - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E45"); - assertEq(collateralToken.balanceOf(address(userBorrower)), 0, "E46"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E47"); - assertEq(borrowToken.balanceOf(address(lender)), 0, "E48"); - assertEq(borrowToken.balanceOf(userBorrower), _amount, "E49"); + assertApproxEqRel(collateralToken.balanceOf(address(troveManager)), _expectedCollateralAfterRedemption, 5e15, "E43"); // 0.5% + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E44"); + assertEq(collateralToken.balanceOf(address(userBorrower)), 0, "E45"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E46"); + assertEq(borrowToken.balanceOf(address(lender)), 0, "E47"); + assertEq(borrowToken.balanceOf(userBorrower), _amount, "E48"); // Check global info - assertApproxEqAbs(troveManager.total_debt(), _expectedProfit, 2, "E50"); - assertEq(troveManager.total_weighted_debt(), _expectedProfit * DEFAULT_ANNUAL_INTEREST_RATE, "E51"); - assertApproxEqRel(troveManager.collateral_balance(), _expectedCollateralAfterRedemption, 5e15, "E52"); // 0.5% - assertEq(troveManager.zombie_trove_id(), _troveId, "E53"); + assertApproxEqAbs(troveManager.total_debt(), _expectedProfit, 2, "E49"); + assertEq(troveManager.total_weighted_debt(), _expectedProfit * DEFAULT_ANNUAL_INTEREST_RATE, "E50"); + assertApproxEqRel(troveManager.collateral_balance(), _expectedCollateralAfterRedemption, 5e15, "E51"); // 0.5% + assertEq(troveManager.zombie_trove_id(), _troveId, "E52"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E54"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E55"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E53"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E54"); } // Test that multiple auctions are created for concurrent redemptions diff --git a/test/LeverageZapper.t.sol b/test/LeverageZapper.t.sol index 2c891e5..6443d88 100644 --- a/test/LeverageZapper.t.sol +++ b/test/LeverageZapper.t.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.23; +import {AuctionTakerMock} from "./mocks/AuctionTakerMock.sol"; import {MockRouter} from "./mocks/MockRouter.sol"; import "./Base.sol"; @@ -9,8 +10,6 @@ contract LeverageZapperTests is Base { MockRouter public mockRouter; - address constant CRVUSD = 0xf939E0A03FB07F59A73314E73794Be0E57ac1b4E; - uint256 constant SLIPPAGE_BPS = 50; // 0.5% uint256 constant BPS = 10_000; @@ -23,9 +22,17 @@ contract LeverageZapperTests is Base { Base.setUp(); // Deploy mock router - mockRouter = new MockRouter(priceOracle, address(collateralToken), address(borrowToken), CRVUSD, SLIPPAGE_BPS); + mockRouter = new MockRouter(priceOracle, address(collateralToken), address(borrowToken), address(borrowToken), SLIPPAGE_BPS); vm.label(address(mockRouter), "MockRouter"); + // Endorse market in registry + vm.prank(deployerAddress); + daddy.execute(address(registry), abi.encodeWithSelector(IRegistry.endorse.selector, address(troveManager)), 0, true); + + // Whitelist mock router + vm.prank(deployerAddress); + daddy.execute(address(leverageZapper), abi.encodeWithSelector(ILeverageZapper.set_router.selector, address(mockRouter), true), 0, true); + // Set fuzz bounds maxCollateralFuzzAmount = 100 * COLLATERAL_TOKEN_PRECISION; minCollateralFuzzAmount = minimumDebt * BORROW_TOKEN_PRECISION * ORACLE_PRICE_SCALE / priceOracle.get_price() * 2; @@ -43,13 +50,13 @@ contract LeverageZapperTests is Base { uint256 additionalCollateral = _userCollateral * (_leverage - 1); uint256 baseDebt = additionalCollateral * priceOracle.get_price() / ORACLE_PRICE_SCALE; - uint256 flashLoanAmount = baseDebt * WAD / BORROW_TOKEN_PRECISION; + uint256 flashLoanAmount = baseDebt; - // Buffer debt to account for slippage on the debt swap (2x slippage to ensure surplus after rounding) + // Buffer debt to account for slippage on the collateral swap uint256 debtAmount = baseDebt * BPS / (BPS - 2 * SLIPPAGE_BPS); // Fund the lender - mintAndDepositIntoLender(userLender, debtAmount); + mintAndDepositIntoLender(userLender, debtAmount * 10); uint256 ownerIndex = block.timestamp; @@ -63,24 +70,111 @@ contract LeverageZapperTests is Base { ILeverageZapper.OpenLeveragedData({ owner: userBorrower, trove_manager: address(troveManager), + flash_loan_token: address(borrowToken), + auction_taker: address(0), owner_index: ownerIndex, flash_loan_amount: flashLoanAmount, collateral_amount: _userCollateral, debt_amount: debtAmount, prev_id: 0, next_id: 0, - annual_interest_rate: DEFAULT_ANNUAL_INTEREST_RATE, + annual_interest_rate: DEFAULT_ANNUAL_INTEREST_RATE * 2, max_upfront_fee: type(uint256).max, min_borrow_out: 0, min_collateral_out: 0, - collateral_swap: ILeverageZapper.SwapData({router: address(mockRouter), data: abi.encode(CRVUSD, address(collateralToken))}), - debt_swap: ILeverageZapper.SwapData({router: address(mockRouter), data: abi.encode(address(borrowToken), CRVUSD)}) + collateral_swap: ILeverageZapper.SwapData({ + router: address(mockRouter), data: abi.encode(address(borrowToken), address(collateralToken)) + }), + debt_swap: ILeverageZapper.SwapData({router: address(0), data: ""}) }) ); - // Accept ownership + // Verify trove + ITroveManager.Trove memory trove = troveManager.troves(troveId); + assertEq(trove.owner, userBorrower, "E0"); + assertEq(uint256(trove.status), uint256(ITroveManager.Status.active), "E1"); + assertGt(trove.debt, 0, "E2"); + + // Verify leverage: trove.collateral should be approximately _leverage * userCollateral + assertApproxEqRel(trove.collateral, _userCollateral * _leverage, 1e16, "E3"); // 1% tolerance + + // Verify zapper has no leftover tokens + assertEq(collateralToken.balanceOf(address(leverageZapper)), 0, "E4"); + assertEq(borrowToken.balanceOf(address(leverageZapper)), 0, "E5"); + + // Verify swept leftovers to borrower + assertEq(collateralToken.balanceOf(userBorrower), 0, "E6"); + assertGt(borrowToken.balanceOf(userBorrower), 0, "E7"); + + // Verify swap executor has no leftover tokens + assertEq(collateralToken.balanceOf(address(swapExecutor)), 0, "E8"); + assertEq(borrowToken.balanceOf(address(swapExecutor)), 0, "E9"); + + return troveId; + } + + function test_openLeveragedTroveWithCallback( + uint256 _userCollateral, + uint256 _leverage + ) public { + _userCollateral = bound(_userCollateral, minCollateralFuzzAmount, maxCollateralFuzzAmount); + _leverage = bound(_leverage, 2, maxLeverage); + + // Deploy auction taker mock + AuctionTakerMock auctionTaker = new AuctionTakerMock(); + vm.label(address(auctionTaker), "AuctionTakerMock"); + + // Whitelist auction taker + vm.prank(deployerAddress); + daddy.execute( + address(leverageZapper), abi.encodeWithSelector(ILeverageZapper.set_auction_taker.selector, address(auctionTaker), true), 0, true + ); + + airdrop(address(collateralToken), userBorrower, _userCollateral); + + uint256 additionalCollateral = _userCollateral * (_leverage - 1); + uint256 baseDebt = additionalCollateral * priceOracle.get_price() / ORACLE_PRICE_SCALE; + uint256 flashLoanAmount = baseDebt; + + // Buffer debt to account for slippage on the collateral swap + uint256 debtAmount = baseDebt * BPS / (BPS - 2 * SLIPPAGE_BPS); + + // Fund the lender with enough for both troves + mintAndDepositIntoLender(userLender, debtAmount); + + // Exhaust lender liquidity by opening a trove from another user + uint256 firstCollateral = + (debtAmount * DEFAULT_TARGET_COLLATERAL_RATIO / BORROW_TOKEN_PRECISION) * ORACLE_PRICE_SCALE / priceOracle.get_price(); + mintAndOpenTrove(anotherUserBorrower, firstCollateral, debtAmount, DEFAULT_ANNUAL_INTEREST_RATE); + + // Approve zapper to pull collateral vm.prank(userBorrower); - troveManager.accept_ownership(troveId); + collateralToken.approve(address(leverageZapper), _userCollateral); + + // Open leveraged trove with auction taker to take the kicked auction + vm.prank(userBorrower); + uint256 troveId = leverageZapper.open_leveraged_trove( + ILeverageZapper.OpenLeveragedData({ + owner: userBorrower, + trove_manager: address(troveManager), + flash_loan_token: address(borrowToken), + auction_taker: address(auctionTaker), + owner_index: block.timestamp, + flash_loan_amount: flashLoanAmount, + collateral_amount: _userCollateral, + debt_amount: debtAmount, + prev_id: 0, + next_id: 0, + annual_interest_rate: DEFAULT_ANNUAL_INTEREST_RATE * 2, // higher rate so we can redeem the first trove + max_upfront_fee: type(uint256).max, + min_borrow_out: 0, + min_collateral_out: 0, + collateral_swap: ILeverageZapper.SwapData({ + router: address(mockRouter), data: abi.encode(address(borrowToken), address(collateralToken)) + }), + debt_swap: ILeverageZapper.SwapData({router: address(0), data: ""}) + }) + ); // Verify trove ITroveManager.Trove memory trove = troveManager.troves(troveId); @@ -94,14 +188,14 @@ contract LeverageZapperTests is Base { // Verify zapper has no leftover tokens assertEq(collateralToken.balanceOf(address(leverageZapper)), 0, "E4"); assertEq(borrowToken.balanceOf(address(leverageZapper)), 0, "E5"); - assertEq(IERC20(CRVUSD).balanceOf(address(leverageZapper)), 0, "E6"); // Verify swept leftovers to borrower - assertEq(collateralToken.balanceOf(userBorrower), 0, "E7"); - assertEq(borrowToken.balanceOf(userBorrower), 0, "E8"); - assertGt(IERC20(CRVUSD).balanceOf(userBorrower), 0, "E9"); + assertEq(collateralToken.balanceOf(userBorrower), 0, "E6"); + assertGt(borrowToken.balanceOf(userBorrower), 0, "E7"); - return troveId; + // Verify swap executor has no leftover tokens + assertEq(collateralToken.balanceOf(address(swapExecutor)), 0, "E8"); + assertEq(borrowToken.balanceOf(address(swapExecutor)), 0, "E9"); } function test_closeLeveragedTrove( @@ -113,23 +207,25 @@ contract LeverageZapperTests is Base { // Get trove debt uint256 troveDebt = troveManager.get_trove_debt_after_interest(troveId); - // Flash loan crvUSD to cover the debt (2x slippage buffer to ensure surplus after rounding) - uint256 closeFlashLoanAmount = troveDebt * WAD / BORROW_TOKEN_PRECISION * BPS / (BPS - 2 * SLIPPAGE_BPS); + // Flash loan borrow token to cover the debt (with slippage buffer for collateral swap) + uint256 closeFlashLoanAmount = troveDebt * BPS / (BPS - 2 * SLIPPAGE_BPS); - // Transfer trove ownership to zapper + // Approve zapper to operate on behalf of the borrower vm.prank(userBorrower); - troveManager.transfer_ownership(troveId, address(leverageZapper)); + troveManager.approve(address(leverageZapper), true); // Close leveraged trove vm.prank(userBorrower); leverageZapper.close_leveraged_trove( ILeverageZapper.CloseLeveragedData({ - owner: userBorrower, trove_manager: address(troveManager), + flash_loan_token: address(borrowToken), trove_id: troveId, flash_loan_amount: closeFlashLoanAmount, - collateral_swap: ILeverageZapper.SwapData({router: address(mockRouter), data: abi.encode(address(collateralToken), CRVUSD)}), - debt_swap: ILeverageZapper.SwapData({router: address(mockRouter), data: abi.encode(CRVUSD, address(borrowToken))}) + collateral_swap: ILeverageZapper.SwapData({ + router: address(mockRouter), data: abi.encode(address(collateralToken), address(borrowToken)) + }), + debt_swap: ILeverageZapper.SwapData({router: address(0), data: ""}) }) ); @@ -142,12 +238,14 @@ contract LeverageZapperTests is Base { // Verify zapper has no leftover tokens assertEq(collateralToken.balanceOf(address(leverageZapper)), 0, "E3"); assertEq(borrowToken.balanceOf(address(leverageZapper)), 0, "E4"); - assertEq(IERC20(CRVUSD).balanceOf(address(leverageZapper)), 0, "E5"); - // Verify user received value back (leftovers from slippage buffer) - assertEq(collateralToken.balanceOf(userBorrower), 0, "E6"); - assertGt(borrowToken.balanceOf(userBorrower), 0, "E7"); - assertGt(IERC20(CRVUSD).balanceOf(userBorrower), 0, "E8"); + // Verify user received value back + assertEq(collateralToken.balanceOf(userBorrower), 0, "E5"); + assertGt(borrowToken.balanceOf(userBorrower), 0, "E6"); + + // Verify swap executor has no leftover tokens + assertEq(collateralToken.balanceOf(address(swapExecutor)), 0, "E7"); + assertEq(borrowToken.balanceOf(address(swapExecutor)), 0, "E8"); } function test_leverUpTrove( @@ -162,28 +260,29 @@ contract LeverageZapperTests is Base { // Record state before lever up ITroveManager.Trove memory troveBefore = troveManager.troves(troveId); - uint256 crvusdBalanceBefore = IERC20(CRVUSD).balanceOf(userBorrower); + uint256 borrowBalanceBefore = borrowToken.balanceOf(userBorrower); // Compute flash loan for additional leverage uint256 additionalDebtBase = _userCollateral * _additionalLeverage * priceOracle.get_price() / ORACLE_PRICE_SCALE; - uint256 flashLoanAmount = additionalDebtBase * WAD / BORROW_TOKEN_PRECISION; + uint256 flashLoanAmount = additionalDebtBase; - // Buffer debt to account for slippage on the debt swap + // Buffer debt to account for slippage on the collateral swap uint256 debtAmount = additionalDebtBase * BPS / (BPS - 2 * SLIPPAGE_BPS); // Fund the lender with additional debt mintAndDepositIntoLender(userLender, debtAmount); - // Transfer trove ownership to zapper + // Approve zapper to operate on behalf of the borrower vm.prank(userBorrower); - troveManager.transfer_ownership(troveId, address(leverageZapper)); + troveManager.approve(address(leverageZapper), true); // Lever up vm.prank(userBorrower); leverageZapper.lever_up_trove( ILeverageZapper.LeverUpData({ - owner: userBorrower, trove_manager: address(troveManager), + flash_loan_token: address(borrowToken), + auction_taker: address(0), trove_id: troveId, flash_loan_amount: flashLoanAmount, collateral_amount: 0, @@ -191,14 +290,94 @@ contract LeverageZapperTests is Base { max_upfront_fee: type(uint256).max, min_borrow_out: 0, min_collateral_out: 0, - collateral_swap: ILeverageZapper.SwapData({router: address(mockRouter), data: abi.encode(CRVUSD, address(collateralToken))}), - debt_swap: ILeverageZapper.SwapData({router: address(mockRouter), data: abi.encode(address(borrowToken), CRVUSD)}) + collateral_swap: ILeverageZapper.SwapData({ + router: address(mockRouter), data: abi.encode(address(borrowToken), address(collateralToken)) + }), + debt_swap: ILeverageZapper.SwapData({router: address(0), data: ""}) }) ); - // Accept ownership back + // Verify trove state + ITroveManager.Trove memory troveAfter = troveManager.troves(troveId); + assertEq(troveAfter.owner, userBorrower, "E0"); + assertApproxEqRel(troveAfter.collateral, _userCollateral * (2 + _additionalLeverage), 2e16, "E1"); // 2% tolerance + assertGt(troveAfter.debt, troveBefore.debt, "E2"); + + // Verify zapper has no leftover tokens + assertEq(collateralToken.balanceOf(address(leverageZapper)), 0, "E3"); + assertEq(borrowToken.balanceOf(address(leverageZapper)), 0, "E4"); + + // Verify user received borrow token leftovers from slippage buffer + assertGt(borrowToken.balanceOf(userBorrower), borrowBalanceBefore, "E5"); + + // Verify swap executor has no leftover tokens + assertEq(collateralToken.balanceOf(address(swapExecutor)), 0, "E6"); + assertEq(borrowToken.balanceOf(address(swapExecutor)), 0, "E7"); + } + + function test_leverUpTroveWithCallback( + uint256 _userCollateral, + uint256 _additionalLeverage + ) public { + _userCollateral = bound(_userCollateral, minCollateralFuzzAmount, maxCollateralFuzzAmount); + _additionalLeverage = bound(_additionalLeverage, 1, maxLeverage - 2); + + // Deploy auction taker mock + AuctionTakerMock auctionTaker = new AuctionTakerMock(); + vm.label(address(auctionTaker), "AuctionTakerMock"); + + // Whitelist auction taker + vm.prank(deployerAddress); + daddy.execute( + address(leverageZapper), abi.encodeWithSelector(ILeverageZapper.set_auction_taker.selector, address(auctionTaker), true), 0, true + ); + + // Open trove at 2x leverage + uint256 troveId = test_openLeveragedTrove(_userCollateral, 2); + + // Record state before lever up + ITroveManager.Trove memory troveBefore = troveManager.troves(troveId); + uint256 borrowBalanceBefore = borrowToken.balanceOf(userBorrower); + + // Compute flash loan for additional leverage + uint256 additionalDebtBase = _userCollateral * _additionalLeverage * priceOracle.get_price() / ORACLE_PRICE_SCALE; + uint256 flashLoanAmount = additionalDebtBase; + + // Buffer debt to account for slippage on the collateral swap + uint256 debtAmount = additionalDebtBase * BPS / (BPS - 2 * SLIPPAGE_BPS); + + // Exhaust lender liquidity by opening a trove from another user + uint256 idle = borrowToken.balanceOf(address(lender)); + if (idle > 0) { + uint256 extraCollateral = (idle * DEFAULT_TARGET_COLLATERAL_RATIO / BORROW_TOKEN_PRECISION) * ORACLE_PRICE_SCALE / priceOracle.get_price(); + mintAndOpenTrove(anotherUserBorrower, extraCollateral, idle, DEFAULT_ANNUAL_INTEREST_RATE); + } + assertEq(borrowToken.balanceOf(address(lender)), 0, "lender should have no idle liquidity"); + + // Approve zapper to operate on behalf of the borrower vm.prank(userBorrower); - troveManager.accept_ownership(troveId); + troveManager.approve(address(leverageZapper), true); + + // Lever up with auction taker to take the kicked auction + vm.prank(userBorrower); + leverageZapper.lever_up_trove( + ILeverageZapper.LeverUpData({ + trove_manager: address(troveManager), + flash_loan_token: address(borrowToken), + auction_taker: address(auctionTaker), + trove_id: troveId, + flash_loan_amount: flashLoanAmount, + collateral_amount: 0, + debt_amount: debtAmount, + max_upfront_fee: type(uint256).max, + min_borrow_out: 0, + min_collateral_out: 0, + collateral_swap: ILeverageZapper.SwapData({ + router: address(mockRouter), data: abi.encode(address(borrowToken), address(collateralToken)) + }), + debt_swap: ILeverageZapper.SwapData({router: address(0), data: ""}) + }) + ); // Verify trove state ITroveManager.Trove memory troveAfter = troveManager.troves(troveId); @@ -209,10 +388,13 @@ contract LeverageZapperTests is Base { // Verify zapper has no leftover tokens assertEq(collateralToken.balanceOf(address(leverageZapper)), 0, "E3"); assertEq(borrowToken.balanceOf(address(leverageZapper)), 0, "E4"); - assertEq(IERC20(CRVUSD).balanceOf(address(leverageZapper)), 0, "E5"); - // Verify user received crvUSD leftovers from slippage buffer - assertGt(IERC20(CRVUSD).balanceOf(userBorrower), crvusdBalanceBefore, "E6"); + // Verify user received borrow token leftovers from slippage buffer + assertGt(borrowToken.balanceOf(userBorrower), borrowBalanceBefore, "E5"); + + // Verify swap executor has no leftover tokens + assertEq(collateralToken.balanceOf(address(swapExecutor)), 0, "E6"); + assertEq(borrowToken.balanceOf(address(swapExecutor)), 0, "E7"); } function test_leverDownTrove( @@ -227,37 +409,34 @@ contract LeverageZapperTests is Base { // Record state before lever down ITroveManager.Trove memory troveBefore = troveManager.troves(troveId); - uint256 crvusdBalanceBefore = IERC20(CRVUSD).balanceOf(userBorrower); + uint256 borrowBalanceBefore = borrowToken.balanceOf(userBorrower); // Compute amounts for lever down uint256 collateralToRemove = _userCollateral * _leverageReduction; // Flash loan sized so that collateral sale covers it (with slippage buffer) - uint256 flashLoanAmount = - collateralToRemove * priceOracle.get_price() * WAD / (ORACLE_PRICE_SCALE * BORROW_TOKEN_PRECISION) * (BPS - 2 * SLIPPAGE_BPS) / BPS; + uint256 flashLoanAmount = collateralToRemove * priceOracle.get_price() / ORACLE_PRICE_SCALE * (BPS - 2 * SLIPPAGE_BPS) / BPS; - // Transfer trove ownership to zapper + // Approve zapper to operate on behalf of the borrower vm.prank(userBorrower); - troveManager.transfer_ownership(troveId, address(leverageZapper)); + troveManager.approve(address(leverageZapper), true); // Lever down vm.prank(userBorrower); leverageZapper.lever_down_trove( ILeverageZapper.LeverDownData({ - owner: userBorrower, trove_manager: address(troveManager), + flash_loan_token: address(borrowToken), trove_id: troveId, flash_loan_amount: flashLoanAmount, collateral_to_remove: collateralToRemove, - collateral_swap: ILeverageZapper.SwapData({router: address(mockRouter), data: abi.encode(address(collateralToken), CRVUSD)}), - debt_swap: ILeverageZapper.SwapData({router: address(mockRouter), data: abi.encode(CRVUSD, address(borrowToken))}) + collateral_swap: ILeverageZapper.SwapData({ + router: address(mockRouter), data: abi.encode(address(collateralToken), address(borrowToken)) + }), + debt_swap: ILeverageZapper.SwapData({router: address(0), data: ""}) }) ); - // Accept ownership back - vm.prank(userBorrower); - troveManager.accept_ownership(troveId); - // Verify trove state ITroveManager.Trove memory troveAfter = troveManager.troves(troveId); assertEq(troveAfter.owner, userBorrower, "E0"); @@ -268,12 +447,536 @@ contract LeverageZapperTests is Base { // Verify zapper has no leftover tokens assertEq(collateralToken.balanceOf(address(leverageZapper)), 0, "E4"); assertEq(borrowToken.balanceOf(address(leverageZapper)), 0, "E5"); - assertEq(IERC20(CRVUSD).balanceOf(address(leverageZapper)), 0, "E6"); // Verify user received leftovers from slippage buffer - assertEq(collateralToken.balanceOf(userBorrower), 0, "E7"); - assertGe(borrowToken.balanceOf(userBorrower), 0, "E8"); - assertGt(IERC20(CRVUSD).balanceOf(userBorrower), crvusdBalanceBefore, "E9"); + assertEq(collateralToken.balanceOf(userBorrower), 0, "E6"); + assertGt(borrowToken.balanceOf(userBorrower), borrowBalanceBefore, "E7"); + + // Verify swap executor has no leftover tokens + assertEq(collateralToken.balanceOf(address(swapExecutor)), 0, "E8"); + assertEq(borrowToken.balanceOf(address(swapExecutor)), 0, "E9"); + } + + function test_closeLeveragedTrove_unapproved_reverts( + uint256 _userCollateral, + uint256 _leverage, + address _caller + ) public { + vm.assume(_caller != userBorrower); + uint256 troveId = test_openLeveragedTrove(_userCollateral, _leverage); + + vm.prank(_caller); + vm.expectRevert("!owner"); + leverageZapper.close_leveraged_trove( + ILeverageZapper.CloseLeveragedData({ + trove_manager: address(troveManager), + flash_loan_token: address(borrowToken), + trove_id: troveId, + flash_loan_amount: 0, + collateral_swap: ILeverageZapper.SwapData({router: address(0), data: ""}), + debt_swap: ILeverageZapper.SwapData({router: address(0), data: ""}) + }) + ); + } + + function test_leverUpTrove_unapproved_reverts( + uint256 _userCollateral, + uint256 _leverage, + address _caller + ) public { + vm.assume(_caller != userBorrower); + uint256 troveId = test_openLeveragedTrove(_userCollateral, _leverage); + + vm.prank(_caller); + vm.expectRevert("!owner"); + leverageZapper.lever_up_trove( + ILeverageZapper.LeverUpData({ + trove_manager: address(troveManager), + flash_loan_token: address(borrowToken), + auction_taker: address(0), + trove_id: troveId, + flash_loan_amount: 0, + collateral_amount: 0, + debt_amount: 0, + max_upfront_fee: 0, + min_borrow_out: 0, + min_collateral_out: 0, + collateral_swap: ILeverageZapper.SwapData({router: address(0), data: ""}), + debt_swap: ILeverageZapper.SwapData({router: address(0), data: ""}) + }) + ); + } + + function test_leverDownTrove_unapproved_reverts( + uint256 _userCollateral, + uint256 _leverage, + address _caller + ) public { + vm.assume(_caller != userBorrower); + uint256 troveId = test_openLeveragedTrove(_userCollateral, _leverage); + + vm.prank(_caller); + vm.expectRevert("!owner"); + leverageZapper.lever_down_trove( + ILeverageZapper.LeverDownData({ + trove_manager: address(troveManager), + flash_loan_token: address(borrowToken), + trove_id: troveId, + flash_loan_amount: 0, + collateral_to_remove: 0, + collateral_swap: ILeverageZapper.SwapData({router: address(0), data: ""}), + debt_swap: ILeverageZapper.SwapData({router: address(0), data: ""}) + }) + ); + } + + function test_openLeveragedTrove_zeroOwner_reverts() public { + mintAndDepositIntoLender(userLender, troveManager.min_debt()); + + uint256 _collateral = + (troveManager.min_debt() * DEFAULT_TARGET_COLLATERAL_RATIO / BORROW_TOKEN_PRECISION) * ORACLE_PRICE_SCALE / priceOracle.get_price(); + airdrop(address(collateralToken), userBorrower, _collateral); + uint256 _debtAmount = troveManager.min_debt(); + + vm.startPrank(userBorrower); + collateralToken.approve(address(leverageZapper), _collateral); + vm.expectRevert("!owner"); + leverageZapper.open_leveraged_trove( + ILeverageZapper.OpenLeveragedData({ + owner: address(0), + trove_manager: address(troveManager), + flash_loan_token: address(borrowToken), + auction_taker: address(0), + owner_index: block.timestamp, + flash_loan_amount: _debtAmount, + collateral_amount: _collateral, + debt_amount: _debtAmount, + prev_id: 0, + next_id: 0, + annual_interest_rate: DEFAULT_ANNUAL_INTEREST_RATE, + max_upfront_fee: type(uint256).max, + min_borrow_out: 0, + min_collateral_out: 0, + collateral_swap: ILeverageZapper.SwapData({ + router: address(mockRouter), data: abi.encode(address(borrowToken), address(collateralToken)) + }), + debt_swap: ILeverageZapper.SwapData({router: address(0), data: ""}) + }) + ); + vm.stopPrank(); + } + + function test_openLeveragedTrove_troveManagerAsOwner_reverts() public { + mintAndDepositIntoLender(userLender, troveManager.min_debt()); + + uint256 _collateral = + (troveManager.min_debt() * DEFAULT_TARGET_COLLATERAL_RATIO / BORROW_TOKEN_PRECISION) * ORACLE_PRICE_SCALE / priceOracle.get_price(); + airdrop(address(collateralToken), userBorrower, _collateral); + uint256 _debtAmount = troveManager.min_debt(); + + vm.startPrank(userBorrower); + collateralToken.approve(address(leverageZapper), _collateral); + vm.expectRevert("!owner"); + leverageZapper.open_leveraged_trove( + ILeverageZapper.OpenLeveragedData({ + owner: address(troveManager), + trove_manager: address(troveManager), + flash_loan_token: address(borrowToken), + auction_taker: address(0), + owner_index: block.timestamp, + flash_loan_amount: _debtAmount, + collateral_amount: _collateral, + debt_amount: _debtAmount, + prev_id: 0, + next_id: 0, + annual_interest_rate: DEFAULT_ANNUAL_INTEREST_RATE, + max_upfront_fee: type(uint256).max, + min_borrow_out: 0, + min_collateral_out: 0, + collateral_swap: ILeverageZapper.SwapData({ + router: address(mockRouter), data: abi.encode(address(borrowToken), address(collateralToken)) + }), + debt_swap: ILeverageZapper.SwapData({router: address(0), data: ""}) + }) + ); + vm.stopPrank(); + } + + function test_closeLeveragedTrove_approvedOperator( + uint256 _userCollateral, + uint256 _leverage + ) public { + uint256 troveId = test_openLeveragedTrove(_userCollateral, _leverage); + + uint256 troveDebt = troveManager.get_trove_debt_after_interest(troveId); + uint256 closeFlashLoanAmount = troveDebt * BPS / (BPS - 2 * SLIPPAGE_BPS); + + // Owner approves both the operator and the zapper + vm.startPrank(userBorrower); + troveManager.approve(operator, true); + troveManager.approve(address(leverageZapper), true); + vm.stopPrank(); + + // Operator closes the trove on behalf of the owner + vm.prank(operator); + leverageZapper.close_leveraged_trove( + ILeverageZapper.CloseLeveragedData({ + trove_manager: address(troveManager), + flash_loan_token: address(borrowToken), + trove_id: troveId, + flash_loan_amount: closeFlashLoanAmount, + collateral_swap: ILeverageZapper.SwapData({ + router: address(mockRouter), data: abi.encode(address(collateralToken), address(borrowToken)) + }), + debt_swap: ILeverageZapper.SwapData({router: address(0), data: ""}) + }) + ); + + assertEq(uint256(troveManager.troves(troveId).status), uint256(ITroveManager.Status.closed), "E0"); + } + + function test_leverUpTrove_approvedOperator( + uint256 _userCollateral, + uint256 _additionalLeverage + ) public { + _userCollateral = bound(_userCollateral, minCollateralFuzzAmount, maxCollateralFuzzAmount); + _additionalLeverage = bound(_additionalLeverage, 1, maxLeverage - 2); + + uint256 troveId = test_openLeveragedTrove(_userCollateral, 2); + + ITroveManager.Trove memory troveBefore = troveManager.troves(troveId); + + uint256 additionalDebtBase = _userCollateral * _additionalLeverage * priceOracle.get_price() / ORACLE_PRICE_SCALE; + uint256 flashLoanAmount = additionalDebtBase; + uint256 debtAmount = additionalDebtBase * BPS / (BPS - 2 * SLIPPAGE_BPS); + + mintAndDepositIntoLender(userLender, debtAmount); + + // Owner approves both the operator and the zapper + vm.startPrank(userBorrower); + troveManager.approve(operator, true); + troveManager.approve(address(leverageZapper), true); + vm.stopPrank(); + + // Operator levers up on behalf of the owner + vm.prank(operator); + leverageZapper.lever_up_trove( + ILeverageZapper.LeverUpData({ + trove_manager: address(troveManager), + flash_loan_token: address(borrowToken), + auction_taker: address(0), + trove_id: troveId, + flash_loan_amount: flashLoanAmount, + collateral_amount: 0, + debt_amount: debtAmount, + max_upfront_fee: type(uint256).max, + min_borrow_out: 0, + min_collateral_out: 0, + collateral_swap: ILeverageZapper.SwapData({ + router: address(mockRouter), data: abi.encode(address(borrowToken), address(collateralToken)) + }), + debt_swap: ILeverageZapper.SwapData({router: address(0), data: ""}) + }) + ); + + assertGt(troveManager.troves(troveId).collateral, troveBefore.collateral, "E0"); + assertGt(troveManager.troves(troveId).debt, troveBefore.debt, "E1"); + } + + function test_leverDownTrove_approvedOperator( + uint256 _userCollateral, + uint256 _leverageReduction + ) public { + _userCollateral = bound(_userCollateral, minCollateralFuzzAmount, maxCollateralFuzzAmount); + _leverageReduction = bound(_leverageReduction, 1, maxLeverage - 2); + + uint256 troveId = test_openLeveragedTrove(_userCollateral, maxLeverage); + + ITroveManager.Trove memory troveBefore = troveManager.troves(troveId); + + uint256 collateralToRemove = _userCollateral * _leverageReduction; + uint256 flashLoanAmount = collateralToRemove * priceOracle.get_price() / ORACLE_PRICE_SCALE * (BPS - 2 * SLIPPAGE_BPS) / BPS; + + // Owner approves both the operator and the zapper + vm.startPrank(userBorrower); + troveManager.approve(operator, true); + troveManager.approve(address(leverageZapper), true); + vm.stopPrank(); + + // Operator levers down on behalf of the owner + vm.prank(operator); + leverageZapper.lever_down_trove( + ILeverageZapper.LeverDownData({ + trove_manager: address(troveManager), + flash_loan_token: address(borrowToken), + trove_id: troveId, + flash_loan_amount: flashLoanAmount, + collateral_to_remove: collateralToRemove, + collateral_swap: ILeverageZapper.SwapData({ + router: address(mockRouter), data: abi.encode(address(collateralToken), address(borrowToken)) + }), + debt_swap: ILeverageZapper.SwapData({router: address(0), data: ""}) + }) + ); + + assertLt(troveManager.troves(troveId).collateral, troveBefore.collateral, "E0"); + assertLt(troveManager.troves(troveId).debt, troveBefore.debt, "E1"); + } + + function test_setRouter( + address _router + ) public { + vm.assume(_router != address(0)); + assertFalse(leverageZapper.routers(_router), "E0"); + + vm.prank(deployerAddress); + daddy.execute(address(leverageZapper), abi.encodeWithSelector(ILeverageZapper.set_router.selector, _router, true), 0, true); + assertTrue(leverageZapper.routers(_router), "E1"); + + vm.prank(deployerAddress); + daddy.execute(address(leverageZapper), abi.encodeWithSelector(ILeverageZapper.set_router.selector, _router, false), 0, true); + assertFalse(leverageZapper.routers(_router), "E2"); + } + + function test_setRouter_notDaddy_reverts( + address _caller + ) public { + vm.assume(_caller != deployerAddress); + vm.prank(_caller); + vm.expectRevert(); + leverageZapper.set_router(address(1), true); + } + + function test_setAuctionTaker( + address _taker + ) public { + vm.assume(_taker != address(0)); + assertFalse(leverageZapper.auction_takers(_taker), "E0"); + + vm.prank(deployerAddress); + daddy.execute(address(leverageZapper), abi.encodeWithSelector(ILeverageZapper.set_auction_taker.selector, _taker, true), 0, true); + assertTrue(leverageZapper.auction_takers(_taker), "E1"); + + vm.prank(deployerAddress); + daddy.execute(address(leverageZapper), abi.encodeWithSelector(ILeverageZapper.set_auction_taker.selector, _taker, false), 0, true); + assertFalse(leverageZapper.auction_takers(_taker), "E2"); + } + + function test_setAuctionTaker_notDaddy_reverts( + address _caller + ) public { + vm.assume(_caller != deployerAddress); + vm.prank(_caller); + vm.expectRevert(); + leverageZapper.set_auction_taker(address(1), true); + } + + function test_openLeveragedTrove_unendorsedMarket_reverts() public { + // Deploy a new trove manager that is NOT endorsed + (, address _tm,,,) = catFactory.deploy( + ICatFactory.DeployParams({ + borrow_token: address(borrowToken), + collateral_token: address(collateralToken), + price_oracle: address(priceOracle), + minimum_debt: minimumDebt, + safe_collateral_ratio: safeCollateralRatio, + minimum_collateral_ratio: minimumCollateralRatio, + max_penalty_collateral_ratio: maxPenaltyCollateralRatio, + min_liquidation_fee: minLiquidationFee, + max_liquidation_fee: maxLiquidationFee, + upfront_interest_period: upfrontInterestPeriod, + interest_rate_adj_cooldown: interestRateAdjCooldown, + minimum_price_buffer_percentage: minimumPriceBufferPercentage, + starting_price_buffer_percentage: startingPriceBufferPercentage, + re_kick_starting_price_buffer_percentage: reKickStartingPriceBufferPercentage, + step_duration: stepDuration, + step_decay_rate: stepDecayRate, + auction_length: auctionLength, + salt: bytes32(uint256(999)) + }) + ); + + vm.prank(userBorrower); + vm.expectRevert("!endorsed"); + leverageZapper.open_leveraged_trove( + ILeverageZapper.OpenLeveragedData({ + owner: userBorrower, + trove_manager: _tm, + flash_loan_token: address(borrowToken), + auction_taker: address(0), + owner_index: block.timestamp, + flash_loan_amount: 0, + collateral_amount: 0, + debt_amount: 0, + prev_id: 0, + next_id: 0, + annual_interest_rate: 0, + max_upfront_fee: 0, + min_borrow_out: 0, + min_collateral_out: 0, + collateral_swap: ILeverageZapper.SwapData({router: address(mockRouter), data: ""}), + debt_swap: ILeverageZapper.SwapData({router: address(0), data: ""}) + }) + ); + } + + function test_openLeveragedTrove_unwhitelistedRouter_reverts() public { + address _badRouter = address(12345); + + vm.prank(userBorrower); + vm.expectRevert("!collateral_swap_router"); + leverageZapper.open_leveraged_trove( + ILeverageZapper.OpenLeveragedData({ + owner: userBorrower, + trove_manager: address(troveManager), + flash_loan_token: address(borrowToken), + auction_taker: address(0), + owner_index: block.timestamp, + flash_loan_amount: 0, + collateral_amount: 0, + debt_amount: 0, + prev_id: 0, + next_id: 0, + annual_interest_rate: 0, + max_upfront_fee: 0, + min_borrow_out: 0, + min_collateral_out: 0, + collateral_swap: ILeverageZapper.SwapData({router: _badRouter, data: "0x"}), + debt_swap: ILeverageZapper.SwapData({router: address(0), data: ""}) + }) + ); + } + + function test_openLeveragedTrove_unwhitelistedAuctionTaker_reverts() public { + address _badTaker = address(12345); + + vm.prank(userBorrower); + vm.expectRevert("!auction_taker"); + leverageZapper.open_leveraged_trove( + ILeverageZapper.OpenLeveragedData({ + owner: userBorrower, + trove_manager: address(troveManager), + flash_loan_token: address(borrowToken), + auction_taker: _badTaker, + owner_index: block.timestamp, + flash_loan_amount: 0, + collateral_amount: 0, + debt_amount: 0, + prev_id: 0, + next_id: 0, + annual_interest_rate: 0, + max_upfront_fee: 0, + min_borrow_out: 0, + min_collateral_out: 0, + collateral_swap: ILeverageZapper.SwapData({router: address(mockRouter), data: ""}), + debt_swap: ILeverageZapper.SwapData({router: address(0), data: ""}) + }) + ); + } + + function test_closeLeveragedTrove_unwhitelistedRouter_reverts( + uint256 _userCollateral, + uint256 _leverage + ) public { + uint256 troveId = test_openLeveragedTrove(_userCollateral, _leverage); + + vm.prank(userBorrower); + troveManager.approve(address(leverageZapper), true); + + vm.prank(userBorrower); + vm.expectRevert("!collateral_swap_router"); + leverageZapper.close_leveraged_trove( + ILeverageZapper.CloseLeveragedData({ + trove_manager: address(troveManager), + flash_loan_token: address(borrowToken), + trove_id: troveId, + flash_loan_amount: 0, + collateral_swap: ILeverageZapper.SwapData({router: address(12345), data: "0x"}), + debt_swap: ILeverageZapper.SwapData({router: address(0), data: ""}) + }) + ); + } + + function test_leverUpTrove_unwhitelistedRouter_reverts( + uint256 _userCollateral, + uint256 _leverage + ) public { + uint256 troveId = test_openLeveragedTrove(_userCollateral, _leverage); + + vm.prank(userBorrower); + troveManager.approve(address(leverageZapper), true); + + vm.prank(userBorrower); + vm.expectRevert("!collateral_swap_router"); + leverageZapper.lever_up_trove( + ILeverageZapper.LeverUpData({ + trove_manager: address(troveManager), + flash_loan_token: address(borrowToken), + auction_taker: address(0), + trove_id: troveId, + flash_loan_amount: 0, + collateral_amount: 0, + debt_amount: 0, + max_upfront_fee: 0, + min_borrow_out: 0, + min_collateral_out: 0, + collateral_swap: ILeverageZapper.SwapData({router: address(12345), data: "0x"}), + debt_swap: ILeverageZapper.SwapData({router: address(0), data: ""}) + }) + ); + } + + function test_leverUpTrove_unwhitelistedAuctionTaker_reverts( + uint256 _userCollateral, + uint256 _leverage + ) public { + uint256 troveId = test_openLeveragedTrove(_userCollateral, _leverage); + + vm.prank(userBorrower); + troveManager.approve(address(leverageZapper), true); + + vm.prank(userBorrower); + vm.expectRevert("!auction_taker"); + leverageZapper.lever_up_trove( + ILeverageZapper.LeverUpData({ + trove_manager: address(troveManager), + flash_loan_token: address(borrowToken), + auction_taker: address(12345), + trove_id: troveId, + flash_loan_amount: 0, + collateral_amount: 0, + debt_amount: 0, + max_upfront_fee: 0, + min_borrow_out: 0, + min_collateral_out: 0, + collateral_swap: ILeverageZapper.SwapData({router: address(mockRouter), data: ""}), + debt_swap: ILeverageZapper.SwapData({router: address(0), data: ""}) + }) + ); + } + + function test_leverDownTrove_unwhitelistedRouter_reverts( + uint256 _userCollateral, + uint256 _leverage + ) public { + uint256 troveId = test_openLeveragedTrove(_userCollateral, _leverage); + + vm.prank(userBorrower); + troveManager.approve(address(leverageZapper), true); + + vm.prank(userBorrower); + vm.expectRevert("!collateral_swap_router"); + leverageZapper.lever_down_trove( + ILeverageZapper.LeverDownData({ + trove_manager: address(troveManager), + flash_loan_token: address(borrowToken), + trove_id: troveId, + flash_loan_amount: 0, + collateral_to_remove: 0, + collateral_swap: ILeverageZapper.SwapData({router: address(12345), data: "0x"}), + debt_swap: ILeverageZapper.SwapData({router: address(0), data: ""}) + }) + ); } } diff --git a/test/Liquidate.t.sol b/test/Liquidate.t.sol index 8f1bb0c..dbcb027 100644 --- a/test/Liquidate.t.sol +++ b/test/Liquidate.t.sol @@ -51,38 +51,37 @@ contract LiquidateTests is Base { assertEq(_trove.last_debt_update_time, block.timestamp, "E3"); assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E4"); assertEq(_trove.owner, userBorrower, "E5"); - assertEq(_trove.pending_owner, address(0), "E6"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E7"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E6"); assertApproxEqRel( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO, 1e15, - "E8" + "E7" ); // 0.1% // Check sorted troves - assertFalse(sortedTroves.empty(), "E9"); - assertEq(sortedTroves.size(), 1, "E10"); - assertEq(sortedTroves.first(), _troveId, "E11"); - assertEq(sortedTroves.last(), _troveId, "E12"); - assertTrue(sortedTroves.contains(_troveId), "E13"); + assertFalse(sortedTroves.empty(), "E8"); + assertEq(sortedTroves.size(), 1, "E9"); + assertEq(sortedTroves.first(), _troveId, "E10"); + assertEq(sortedTroves.last(), _troveId, "E11"); + assertTrue(sortedTroves.contains(_troveId), "E12"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E14"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E15"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E16"); - assertEq(borrowToken.balanceOf(address(lender)), 0, "E17"); - assertEq(borrowToken.balanceOf(userBorrower), _amount, "E18"); + assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E13"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E14"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E15"); + assertEq(borrowToken.balanceOf(address(lender)), 0, "E16"); + assertEq(borrowToken.balanceOf(userBorrower), _amount, "E17"); // Check global info - assertEq(troveManager.total_debt(), _expectedDebt, "E19"); - assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E20"); - assertEq(troveManager.collateral_balance(), _collateralNeeded, "E21"); - assertEq(troveManager.zombie_trove_id(), 0, "E22"); + assertEq(troveManager.total_debt(), _expectedDebt, "E18"); + assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E19"); + assertEq(troveManager.collateral_balance(), _collateralNeeded, "E20"); + assertEq(troveManager.zombie_trove_id(), 0, "E21"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E23"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E24"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E22"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E23"); // CR = (collateral * price / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / debt // So price_at_MCR = MCR * debt * ORACLE_PRICE_SCALE / (collateral * BORROW_TOKEN_PRECISION) @@ -104,13 +103,13 @@ contract LiquidateTests is Base { vm.mockCall(address(priceOracle), abi.encodeWithSelector(IPriceOracleNotScaled.get_price.selector, false), abi.encode(_priceDropToBelowMCR18)); // Make sure price actually dropped - assertEq(priceOracle.get_price(), _priceDropToBelowMCR, "E25"); + assertEq(priceOracle.get_price(), _priceDropToBelowMCR, "E24"); // Calculate Trove's collateral ratio after price drop uint256 _troveCollateralRatioAfter = (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt; // Make sure Trove is below MCR - assertLt(_troveCollateralRatioAfter, troveManager.minimum_collateral_ratio(), "E26"); + assertLt(_troveCollateralRatioAfter, troveManager.minimum_collateral_ratio(), "E25"); // Calculate expected collateral to decrease uint256 _expectedCollateralToDecrease = @@ -121,48 +120,47 @@ contract LiquidateTests is Base { liquidate(_troveId); // Make sure lender got all the borrow tokens back - assertGe(borrowToken.balanceOf(address(lender)), _expectedDebt, "E27"); + assertGe(borrowToken.balanceOf(address(lender)), _expectedDebt, "E26"); // Make sure liquidator mock got the collateral - assertEq(collateralToken.balanceOf(address(liquidatorMock)), _expectedCollateralToDecrease, "E28"); + assertEq(collateralToken.balanceOf(address(liquidatorMock)), _expectedCollateralToDecrease, "E27"); // Check everything again // Check trove info _trove = troveManager.troves(_troveId); - assertEq(_trove.debt, 0, "E29"); - assertEq(_trove.collateral, 0, "E30"); - assertEq(_trove.annual_interest_rate, 0, "E31"); - assertEq(_trove.last_debt_update_time, 0, "E32"); - assertEq(_trove.last_interest_rate_adj_time, 0, "E33"); - assertEq(_trove.owner, address(0), "E34"); - assertEq(_trove.pending_owner, address(0), "E35"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.liquidated), "E36"); + assertEq(_trove.debt, 0, "E28"); + assertEq(_trove.collateral, 0, "E29"); + assertEq(_trove.annual_interest_rate, 0, "E30"); + assertEq(_trove.last_debt_update_time, 0, "E31"); + assertEq(_trove.last_interest_rate_adj_time, 0, "E32"); + assertEq(_trove.owner, address(0), "E33"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.liquidated), "E34"); // Check sorted troves - assertTrue(sortedTroves.empty(), "E37"); - assertEq(sortedTroves.size(), 0, "E38"); - assertEq(sortedTroves.first(), 0, "E39"); - assertEq(sortedTroves.last(), 0, "E40"); - assertFalse(sortedTroves.contains(_troveId), "E41"); + assertTrue(sortedTroves.empty(), "E35"); + assertEq(sortedTroves.size(), 0, "E36"); + assertEq(sortedTroves.first(), 0, "E37"); + assertEq(sortedTroves.last(), 0, "E38"); + assertFalse(sortedTroves.contains(_troveId), "E39"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), 0, "E42"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E43"); - assertEq(collateralToken.balanceOf(address(userBorrower)), _expectedRemainingCollateral, "E44"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E45"); - assertGe(borrowToken.balanceOf(address(lender)), _expectedDebt, "E46"); - assertEq(borrowToken.balanceOf(userBorrower), _amount, "E47"); + assertEq(collateralToken.balanceOf(address(troveManager)), 0, "E40"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E41"); + assertEq(collateralToken.balanceOf(address(userBorrower)), _expectedRemainingCollateral, "E42"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E43"); + assertGe(borrowToken.balanceOf(address(lender)), _expectedDebt, "E44"); + assertEq(borrowToken.balanceOf(userBorrower), _amount, "E45"); // Check global info - assertEq(troveManager.total_debt(), 0, "E48"); - assertEq(troveManager.total_weighted_debt(), 0, "E49"); - assertEq(troveManager.collateral_balance(), 0, "E50"); - assertEq(troveManager.zombie_trove_id(), 0, "E51"); + assertEq(troveManager.total_debt(), 0, "E46"); + assertEq(troveManager.total_weighted_debt(), 0, "E47"); + assertEq(troveManager.collateral_balance(), 0, "E48"); + assertEq(troveManager.zombie_trove_id(), 0, "E49"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E52"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E53"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E50"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E51"); } // 1. lend @@ -199,83 +197,81 @@ contract LiquidateTests is Base { assertEq(_trove.last_debt_update_time, block.timestamp, "E3"); assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E4"); assertEq(_trove.owner, userBorrower, "E5"); - assertEq(_trove.pending_owner, address(0), "E6"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E7"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E6"); assertApproxEqRel( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO, 1e15, - "E8" + "E7" ); // 0.1% // Check sorted troves - assertFalse(sortedTroves.empty(), "E9"); - assertEq(sortedTroves.size(), 1, "E10"); - assertEq(sortedTroves.first(), _troveId, "E11"); - assertEq(sortedTroves.last(), _troveId, "E12"); - assertTrue(sortedTroves.contains(_troveId), "E13"); + assertFalse(sortedTroves.empty(), "E8"); + assertEq(sortedTroves.size(), 1, "E9"); + assertEq(sortedTroves.first(), _troveId, "E10"); + assertEq(sortedTroves.last(), _troveId, "E11"); + assertTrue(sortedTroves.contains(_troveId), "E12"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E14"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E15"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E16"); - assertApproxEqAbs(borrowToken.balanceOf(address(lender)), _halfAmount, 1, "E17"); - assertEq(borrowToken.balanceOf(userBorrower), _halfAmount, "E18"); + assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E13"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E14"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E15"); + assertApproxEqAbs(borrowToken.balanceOf(address(lender)), _halfAmount, 1, "E16"); + assertEq(borrowToken.balanceOf(userBorrower), _halfAmount, "E17"); // Check global info - assertEq(troveManager.total_debt(), _expectedDebt, "E19"); - assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E20"); - assertEq(troveManager.collateral_balance(), _collateralNeeded, "E21"); - assertEq(troveManager.zombie_trove_id(), 0, "E22"); + assertEq(troveManager.total_debt(), _expectedDebt, "E18"); + assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E19"); + assertEq(troveManager.collateral_balance(), _collateralNeeded, "E20"); + assertEq(troveManager.zombie_trove_id(), 0, "E21"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E23"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E24"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E22"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E23"); // Open a trove for the second borrower uint256 _anotherTroveId = mintAndOpenTrove(anotherUserBorrower, _collateralNeeded, _halfAmount, DEFAULT_ANNUAL_INTEREST_RATE); // Check trove info _trove = troveManager.troves(_anotherTroveId); - assertEq(_trove.debt, _expectedDebt, "E25"); - assertEq(_trove.collateral, _collateralNeeded, "E26"); - assertEq(_trove.annual_interest_rate, DEFAULT_ANNUAL_INTEREST_RATE, "E27"); - assertEq(_trove.last_debt_update_time, block.timestamp, "E28"); - assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E29"); - assertEq(_trove.owner, anotherUserBorrower, "E30"); - assertEq(_trove.pending_owner, address(0), "E31"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E32"); + assertEq(_trove.debt, _expectedDebt, "E24"); + assertEq(_trove.collateral, _collateralNeeded, "E25"); + assertEq(_trove.annual_interest_rate, DEFAULT_ANNUAL_INTEREST_RATE, "E26"); + assertEq(_trove.last_debt_update_time, block.timestamp, "E27"); + assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E28"); + assertEq(_trove.owner, anotherUserBorrower, "E29"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E30"); assertApproxEqRel( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO, 1e15, - "E33" + "E31" ); // 0.1% // Check sorted troves - assertFalse(sortedTroves.empty(), "E34"); - assertEq(sortedTroves.size(), 2, "E35"); - assertEq(sortedTroves.first(), _troveId, "E36"); - assertEq(sortedTroves.last(), _anotherTroveId, "E37"); - assertTrue(sortedTroves.contains(_troveId), "E38"); - assertTrue(sortedTroves.contains(_anotherTroveId), "E39"); + assertFalse(sortedTroves.empty(), "E32"); + assertEq(sortedTroves.size(), 2, "E33"); + assertEq(sortedTroves.first(), _troveId, "E34"); + assertEq(sortedTroves.last(), _anotherTroveId, "E35"); + assertTrue(sortedTroves.contains(_troveId), "E36"); + assertTrue(sortedTroves.contains(_anotherTroveId), "E37"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded * 2, "E40"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E41"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E42"); - assertApproxEqAbs(borrowToken.balanceOf(address(lender)), 0, 1, "E43"); - assertEq(borrowToken.balanceOf(anotherUserBorrower), _halfAmount, "E44"); + assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded * 2, "E38"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E39"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E40"); + assertApproxEqAbs(borrowToken.balanceOf(address(lender)), 0, 1, "E41"); + assertEq(borrowToken.balanceOf(anotherUserBorrower), _halfAmount, "E42"); // Check global info - assertEq(troveManager.total_debt(), _expectedDebt * 2, "E45"); - assertEq(troveManager.total_weighted_debt(), _expectedDebt * 2 * DEFAULT_ANNUAL_INTEREST_RATE, "E46"); - assertEq(troveManager.collateral_balance(), _collateralNeeded * 2, "E47"); - assertEq(troveManager.zombie_trove_id(), 0, "E48"); + assertEq(troveManager.total_debt(), _expectedDebt * 2, "E43"); + assertEq(troveManager.total_weighted_debt(), _expectedDebt * 2 * DEFAULT_ANNUAL_INTEREST_RATE, "E44"); + assertEq(troveManager.collateral_balance(), _collateralNeeded * 2, "E45"); + assertEq(troveManager.zombie_trove_id(), 0, "E46"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E49"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E50"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E47"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E48"); // CR = (collateral * price / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / debt // So price_at_MCR = MCR * debt * ORACLE_PRICE_SCALE / (collateral * BORROW_TOKEN_PRECISION) @@ -297,13 +293,13 @@ contract LiquidateTests is Base { vm.mockCall(address(priceOracle), abi.encodeWithSelector(IPriceOracleNotScaled.get_price.selector, false), abi.encode(_priceDropToBelowMCR18)); // Make sure price actually dropped - assertEq(priceOracle.get_price(), _priceDropToBelowMCR, "E51"); + assertEq(priceOracle.get_price(), _priceDropToBelowMCR, "E49"); // Calculate Trove's collateral ratio after price drop uint256 _troveCollateralRatioAfter = (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt; // Make sure Trove is below MCR - assertLt(_troveCollateralRatioAfter, troveManager.minimum_collateral_ratio(), "E52"); + assertLt(_troveCollateralRatioAfter, troveManager.minimum_collateral_ratio(), "E50"); // Calculate expected collateral to decrease (same for both troves) uint256 _expectedCollateralToDecrease = @@ -315,86 +311,84 @@ contract LiquidateTests is Base { liquidate(_anotherTroveId); // Make sure lender got all the borrow tokens back - assertGe(borrowToken.balanceOf(address(lender)), _expectedDebt * 2, "E53"); + assertGe(borrowToken.balanceOf(address(lender)), _expectedDebt * 2, "E51"); // Make sure liquidator mock got the collateral - assertEq(collateralToken.balanceOf(address(liquidatorMock)), _expectedCollateralToDecrease * 2, "E54"); + assertEq(collateralToken.balanceOf(address(liquidatorMock)), _expectedCollateralToDecrease * 2, "E52"); // Check everything again // Check trove info _trove = troveManager.troves(_troveId); - assertEq(_trove.debt, 0, "E55"); - assertEq(_trove.collateral, 0, "E56"); - assertEq(_trove.annual_interest_rate, 0, "E57"); - assertEq(_trove.last_debt_update_time, 0, "E58"); - assertEq(_trove.last_interest_rate_adj_time, 0, "E59"); - assertEq(_trove.owner, address(0), "E60"); - assertEq(_trove.pending_owner, address(0), "E61"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.liquidated), "E62"); + assertEq(_trove.debt, 0, "E53"); + assertEq(_trove.collateral, 0, "E54"); + assertEq(_trove.annual_interest_rate, 0, "E55"); + assertEq(_trove.last_debt_update_time, 0, "E56"); + assertEq(_trove.last_interest_rate_adj_time, 0, "E57"); + assertEq(_trove.owner, address(0), "E58"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.liquidated), "E59"); // Check sorted troves - assertTrue(sortedTroves.empty(), "E63"); - assertEq(sortedTroves.size(), 0, "E64"); - assertEq(sortedTroves.first(), 0, "E65"); - assertEq(sortedTroves.last(), 0, "E66"); - assertFalse(sortedTroves.contains(_troveId), "E67"); + assertTrue(sortedTroves.empty(), "E60"); + assertEq(sortedTroves.size(), 0, "E61"); + assertEq(sortedTroves.first(), 0, "E62"); + assertEq(sortedTroves.last(), 0, "E63"); + assertFalse(sortedTroves.contains(_troveId), "E64"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), 0, "E68"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E69"); - assertEq(collateralToken.balanceOf(address(userBorrower)), _expectedRemainingCollateral, "E70"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E71"); - assertGe(borrowToken.balanceOf(address(lender)), _expectedDebt, "E72"); - assertEq(borrowToken.balanceOf(userBorrower), _halfAmount, "E73"); + assertEq(collateralToken.balanceOf(address(troveManager)), 0, "E65"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E66"); + assertEq(collateralToken.balanceOf(address(userBorrower)), _expectedRemainingCollateral, "E67"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E68"); + assertGe(borrowToken.balanceOf(address(lender)), _expectedDebt, "E69"); + assertEq(borrowToken.balanceOf(userBorrower), _halfAmount, "E70"); // Check global info - assertEq(troveManager.total_debt(), 0, "E74"); - assertEq(troveManager.total_weighted_debt(), 0, "E75"); - assertEq(troveManager.collateral_balance(), 0, "E76"); - assertEq(troveManager.zombie_trove_id(), 0, "E77"); + assertEq(troveManager.total_debt(), 0, "E71"); + assertEq(troveManager.total_weighted_debt(), 0, "E72"); + assertEq(troveManager.collateral_balance(), 0, "E73"); + assertEq(troveManager.zombie_trove_id(), 0, "E74"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E78"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E79"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E75"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E76"); // Check everything again for the second trove // Check trove info _trove = troveManager.troves(_anotherTroveId); - assertEq(_trove.debt, 0, "E80"); - assertEq(_trove.collateral, 0, "E81"); - assertEq(_trove.annual_interest_rate, 0, "E82"); - assertEq(_trove.last_debt_update_time, 0, "E83"); - assertEq(_trove.last_interest_rate_adj_time, 0, "E84"); - assertEq(_trove.owner, address(0), "E85"); - assertEq(_trove.pending_owner, address(0), "E86"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.liquidated), "E87"); + assertEq(_trove.debt, 0, "E77"); + assertEq(_trove.collateral, 0, "E78"); + assertEq(_trove.annual_interest_rate, 0, "E79"); + assertEq(_trove.last_debt_update_time, 0, "E80"); + assertEq(_trove.last_interest_rate_adj_time, 0, "E81"); + assertEq(_trove.owner, address(0), "E82"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.liquidated), "E83"); // Check sorted troves - assertTrue(sortedTroves.empty(), "E88"); - assertEq(sortedTroves.size(), 0, "E89"); - assertEq(sortedTroves.first(), 0, "E90"); - assertEq(sortedTroves.last(), 0, "E91"); - assertFalse(sortedTroves.contains(_anotherTroveId), "E92"); + assertTrue(sortedTroves.empty(), "E84"); + assertEq(sortedTroves.size(), 0, "E85"); + assertEq(sortedTroves.first(), 0, "E86"); + assertEq(sortedTroves.last(), 0, "E87"); + assertFalse(sortedTroves.contains(_anotherTroveId), "E88"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), 0, "E93"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E94"); - assertEq(collateralToken.balanceOf(address(userBorrower)), _expectedRemainingCollateral, "E95"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E96"); - assertGe(borrowToken.balanceOf(address(lender)), _expectedDebt, "E97"); - assertEq(borrowToken.balanceOf(userBorrower), _halfAmount, "E98"); + assertEq(collateralToken.balanceOf(address(troveManager)), 0, "E89"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E90"); + assertEq(collateralToken.balanceOf(address(userBorrower)), _expectedRemainingCollateral, "E91"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E92"); + assertGe(borrowToken.balanceOf(address(lender)), _expectedDebt, "E93"); + assertEq(borrowToken.balanceOf(userBorrower), _halfAmount, "E94"); // Check global info - assertEq(troveManager.total_debt(), 0, "E99"); - assertEq(troveManager.total_weighted_debt(), 0, "E100"); - assertEq(troveManager.collateral_balance(), 0, "E101"); - assertEq(troveManager.zombie_trove_id(), 0, "E102"); + assertEq(troveManager.total_debt(), 0, "E95"); + assertEq(troveManager.total_weighted_debt(), 0, "E96"); + assertEq(troveManager.collateral_balance(), 0, "E97"); + assertEq(troveManager.zombie_trove_id(), 0, "E98"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E103"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E104"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E99"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E100"); } // 1. lend @@ -731,6 +725,11 @@ contract LiquidateTests is Base { liquidatorMock.liquidate(_nonExistentTroveId, type(uint256).max); } + function test_liquidateTrove_zeroTroveId() public { + vm.expectRevert("!active or zombie"); + liquidatorMock.liquidate(0, type(uint256).max); + } + function test_liquidateTrove_aboveMCR( uint256 _amount ) public { diff --git a/test/OpenTrove.t.sol b/test/OpenTrove.t.sol index b9bfc24..0fc0804 100644 --- a/test/OpenTrove.t.sol +++ b/test/OpenTrove.t.sol @@ -39,34 +39,33 @@ contract OpenTroveTests is Base { assertEq(_trove.last_debt_update_time, block.timestamp, "E3"); assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E4"); assertEq(_trove.owner, userBorrower, "E5"); - assertEq(_trove.pending_owner, address(0), "E6"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E7"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E6"); assertApproxEqRel( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO, 1e15, - "E8" + "E7" ); // 0.1% // Check sorted troves - assertFalse(sortedTroves.empty(), "E9"); - assertEq(sortedTroves.size(), 1, "E10"); - assertEq(sortedTroves.first(), _troveId, "E11"); - assertEq(sortedTroves.last(), _troveId, "E12"); - assertTrue(sortedTroves.contains(_troveId), "E13"); + assertFalse(sortedTroves.empty(), "E8"); + assertEq(sortedTroves.size(), 1, "E9"); + assertEq(sortedTroves.first(), _troveId, "E10"); + assertEq(sortedTroves.last(), _troveId, "E11"); + assertTrue(sortedTroves.contains(_troveId), "E12"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E14"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E15"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E16"); - assertEq(borrowToken.balanceOf(address(lender)), _lendAmount - _borrowAmount, "E17"); - assertEq(borrowToken.balanceOf(userBorrower), _borrowAmount, "E18"); + assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E13"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E14"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E15"); + assertEq(borrowToken.balanceOf(address(lender)), _lendAmount - _borrowAmount, "E16"); + assertEq(borrowToken.balanceOf(userBorrower), _borrowAmount, "E17"); // Check global info - assertEq(troveManager.total_debt(), _expectedDebt, "E19"); - assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E20"); - assertEq(troveManager.collateral_balance(), _collateralNeeded, "E21"); - assertEq(troveManager.zombie_trove_id(), 0, "E22"); + assertEq(troveManager.total_debt(), _expectedDebt, "E18"); + assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E19"); + assertEq(troveManager.collateral_balance(), _collateralNeeded, "E20"); + assertEq(troveManager.zombie_trove_id(), 0, "E21"); } // 1. lend @@ -102,34 +101,33 @@ contract OpenTroveTests is Base { assertEq(_trove.last_debt_update_time, block.timestamp, "E3"); assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E4"); assertEq(_trove.owner, userBorrower, "E5"); - assertEq(_trove.pending_owner, address(0), "E6"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E7"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E6"); assertApproxEqRel( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO, 1e15, - "E8" + "E7" ); // 0.1% // Check sorted troves - assertFalse(sortedTroves.empty(), "E9"); - assertEq(sortedTroves.size(), 1, "E10"); - assertEq(sortedTroves.first(), _troveId, "E11"); - assertEq(sortedTroves.last(), _troveId, "E12"); - assertTrue(sortedTroves.contains(_troveId), "E13"); + assertFalse(sortedTroves.empty(), "E8"); + assertEq(sortedTroves.size(), 1, "E9"); + assertEq(sortedTroves.first(), _troveId, "E10"); + assertEq(sortedTroves.last(), _troveId, "E11"); + assertTrue(sortedTroves.contains(_troveId), "E12"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E14"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E15"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E16"); - assertEq(borrowToken.balanceOf(address(lender)), 0, "E17"); - assertEq(borrowToken.balanceOf(userBorrower), _availableLiquidity, "E18"); + assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E13"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E14"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E15"); + assertEq(borrowToken.balanceOf(address(lender)), 0, "E16"); + assertEq(borrowToken.balanceOf(userBorrower), _availableLiquidity, "E17"); // Check global info - assertEq(troveManager.total_debt(), _expectedDebt, "E19"); - assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E20"); - assertEq(troveManager.collateral_balance(), _collateralNeeded, "E21"); - assertEq(troveManager.zombie_trove_id(), 0, "E22"); + assertEq(troveManager.total_debt(), _expectedDebt, "E18"); + assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E19"); + assertEq(troveManager.collateral_balance(), _collateralNeeded, "E20"); + assertEq(troveManager.zombie_trove_id(), 0, "E21"); } // 1. lend @@ -203,46 +201,45 @@ contract OpenTroveTests is Base { assertEq(_trove.last_debt_update_time, _expectedTime, "E10"); assertEq(_trove.last_interest_rate_adj_time, _expectedTime, "E11"); assertEq(_trove.owner, anotherUserBorrower, "E12"); - assertEq(_trove.pending_owner, address(0), "E13"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.zombie), "E14"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.zombie), "E13"); // Check trove info of userBorrower _trove = troveManager.troves(_troveId); - assertEq(_trove.debt, _secondExpectedDebt, "E15"); - assertEq(_trove.collateral, _secondCollateralNeeded, "E16"); - assertEq(_trove.annual_interest_rate, DEFAULT_ANNUAL_INTEREST_RATE * 2, "E17"); - assertEq(_trove.last_debt_update_time, _expectedTime, "E18"); - assertEq(_trove.last_interest_rate_adj_time, _expectedTime, "E19"); - assertEq(_trove.owner, userBorrower, "E20"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E21"); + assertEq(_trove.debt, _secondExpectedDebt, "E14"); + assertEq(_trove.collateral, _secondCollateralNeeded, "E15"); + assertEq(_trove.annual_interest_rate, DEFAULT_ANNUAL_INTEREST_RATE * 2, "E16"); + assertEq(_trove.last_debt_update_time, _expectedTime, "E17"); + assertEq(_trove.last_interest_rate_adj_time, _expectedTime, "E18"); + assertEq(_trove.owner, userBorrower, "E19"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E20"); assertApproxEqRel( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO, 2e15, - "E22" + "E21" ); // 0.2% // Check sorted troves - assertFalse(sortedTroves.empty(), "E23"); - assertEq(sortedTroves.size(), 1, "E24"); - assertEq(sortedTroves.first(), _troveId, "E25"); - assertEq(sortedTroves.last(), _troveId, "E26"); - assertTrue(sortedTroves.contains(_troveId), "E27"); - assertFalse(sortedTroves.contains(_troveIdAnotherBorrower), "E28"); + assertFalse(sortedTroves.empty(), "E22"); + assertEq(sortedTroves.size(), 1, "E23"); + assertEq(sortedTroves.first(), _troveId, "E24"); + assertEq(sortedTroves.last(), _troveId, "E25"); + assertTrue(sortedTroves.contains(_troveId), "E26"); + assertFalse(sortedTroves.contains(_troveIdAnotherBorrower), "E27"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _secondCollateralNeeded + _expectedCollateralAfterRedemption, "E29"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E30"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E31"); - assertEq(borrowToken.balanceOf(address(lender)), 0, "E32"); - assertApproxEqRel(borrowToken.balanceOf(userBorrower), _secondAmount, 25e15, "E33"); // 2.5%. Pays slippage due to the redemption - assertEq(borrowToken.balanceOf(anotherUserBorrower), _amount, "E34"); + assertEq(collateralToken.balanceOf(address(troveManager)), _secondCollateralNeeded + _expectedCollateralAfterRedemption, "E28"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E29"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E30"); + assertEq(borrowToken.balanceOf(address(lender)), 0, "E31"); + assertApproxEqRel(borrowToken.balanceOf(userBorrower), _secondAmount, 25e15, "E32"); // 2.5%. Pays slippage due to the redemption + assertEq(borrowToken.balanceOf(anotherUserBorrower), _amount, "E33"); // Check global info - assertEq(troveManager.total_debt(), _secondExpectedDebt, "E35"); - assertEq(troveManager.total_weighted_debt(), _secondExpectedDebt * DEFAULT_ANNUAL_INTEREST_RATE * 2, "E36"); - assertEq(troveManager.collateral_balance(), _secondCollateralNeeded + _expectedCollateralAfterRedemption, "E37"); - assertEq(troveManager.zombie_trove_id(), 0, "E38"); + assertEq(troveManager.total_debt(), _secondExpectedDebt, "E34"); + assertEq(troveManager.total_weighted_debt(), _secondExpectedDebt * DEFAULT_ANNUAL_INTEREST_RATE * 2, "E35"); + assertEq(troveManager.collateral_balance(), _secondCollateralNeeded + _expectedCollateralAfterRedemption, "E36"); + assertEq(troveManager.zombie_trove_id(), 0, "E37"); // Check dutch desk is empty assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E39"); @@ -333,54 +330,53 @@ contract OpenTroveTests is Base { assertEq(_trove.last_debt_update_time, _expectedTime, "E11"); assertEq(_trove.last_interest_rate_adj_time, _expectedTime, "E12"); assertEq(_trove.owner, anotherUserBorrower, "E13"); - assertEq(_trove.pending_owner, address(0), "E14"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E15"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E14"); // Check trove info of userBorrower _trove = troveManager.troves(_troveId); - assertEq(_trove.debt, _secondExpectedDebt, "E16"); - assertEq(_trove.collateral, _secondCollateralNeeded, "E17"); - assertEq(_trove.annual_interest_rate, DEFAULT_ANNUAL_INTEREST_RATE * 2, "E18"); - assertEq(_trove.last_debt_update_time, _expectedTime, "E19"); - assertEq(_trove.last_interest_rate_adj_time, _expectedTime, "E20"); - assertEq(_trove.owner, userBorrower, "E21"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E22"); + assertEq(_trove.debt, _secondExpectedDebt, "E15"); + assertEq(_trove.collateral, _secondCollateralNeeded, "E16"); + assertEq(_trove.annual_interest_rate, DEFAULT_ANNUAL_INTEREST_RATE * 2, "E17"); + assertEq(_trove.last_debt_update_time, _expectedTime, "E18"); + assertEq(_trove.last_interest_rate_adj_time, _expectedTime, "E19"); + assertEq(_trove.owner, userBorrower, "E20"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E21"); assertApproxEqRel( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO, 2e15, - "E23" + "E22" ); // 0.2% // Check sorted troves - assertFalse(sortedTroves.empty(), "E24"); - assertEq(sortedTroves.size(), 2, "E25"); - assertEq(sortedTroves.first(), _troveId, "E26"); - assertEq(sortedTroves.last(), _troveIdAnotherBorrower, "E27"); - assertTrue(sortedTroves.contains(_troveId), "E28"); - assertTrue(sortedTroves.contains(_troveIdAnotherBorrower), "E29"); + assertFalse(sortedTroves.empty(), "E23"); + assertEq(sortedTroves.size(), 2, "E24"); + assertEq(sortedTroves.first(), _troveId, "E25"); + assertEq(sortedTroves.last(), _troveIdAnotherBorrower, "E26"); + assertTrue(sortedTroves.contains(_troveId), "E27"); + assertTrue(sortedTroves.contains(_troveIdAnotherBorrower), "E28"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _secondCollateralNeeded + _expectedCollateralAfterRedemption, "E30"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E31"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E32"); - assertEq(borrowToken.balanceOf(address(lender)), 0, "E33"); - assertApproxEqRel(borrowToken.balanceOf(userBorrower), _secondAmount, 25e15, "E34"); // 2.5%. Pays slippage due to the redemption - assertEq(borrowToken.balanceOf(anotherUserBorrower), _amount / 2, "E35"); + assertEq(collateralToken.balanceOf(address(troveManager)), _secondCollateralNeeded + _expectedCollateralAfterRedemption, "E29"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E30"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E31"); + assertEq(borrowToken.balanceOf(address(lender)), 0, "E32"); + assertApproxEqRel(borrowToken.balanceOf(userBorrower), _secondAmount, 25e15, "E33"); // 2.5%. Pays slippage due to the redemption + assertEq(borrowToken.balanceOf(anotherUserBorrower), _amount / 2, "E34"); // Check global info - assertEq(troveManager.total_debt(), _expectedDebt + _secondExpectedDebt, "E36"); + assertEq(troveManager.total_debt(), _expectedDebt + _secondExpectedDebt, "E35"); assertEq( troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE + _secondExpectedDebt * DEFAULT_ANNUAL_INTEREST_RATE * 2, - "E37" + "E36" ); - assertEq(troveManager.collateral_balance(), _secondCollateralNeeded + _expectedCollateralAfterRedemption, "E38"); - assertEq(troveManager.zombie_trove_id(), 0, "E39"); + assertEq(troveManager.collateral_balance(), _secondCollateralNeeded + _expectedCollateralAfterRedemption, "E37"); + assertEq(troveManager.zombie_trove_id(), 0, "E38"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E40"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E41"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E39"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E40"); } // 1. lend @@ -470,54 +466,53 @@ contract OpenTroveTests is Base { assertEq(_trove.last_debt_update_time, _expectedTime, "E11"); assertEq(_trove.last_interest_rate_adj_time, _expectedTime, "E12"); assertEq(_trove.owner, anotherUserBorrower, "E13"); - assertEq(_trove.pending_owner, address(0), "E14"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.zombie), "E15"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.zombie), "E14"); // Check trove info of userBorrower _trove = troveManager.troves(_troveId); - assertEq(_trove.debt, _secondExpectedDebt, "E16"); - assertEq(_trove.collateral, _secondCollateralNeeded, "E17"); - assertEq(_trove.annual_interest_rate, DEFAULT_ANNUAL_INTEREST_RATE * 2, "E18"); - assertEq(_trove.last_debt_update_time, _expectedTime, "E19"); - assertEq(_trove.last_interest_rate_adj_time, _expectedTime, "E20"); - assertEq(_trove.owner, userBorrower, "E21"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E22"); + assertEq(_trove.debt, _secondExpectedDebt, "E15"); + assertEq(_trove.collateral, _secondCollateralNeeded, "E16"); + assertEq(_trove.annual_interest_rate, DEFAULT_ANNUAL_INTEREST_RATE * 2, "E17"); + assertEq(_trove.last_debt_update_time, _expectedTime, "E18"); + assertEq(_trove.last_interest_rate_adj_time, _expectedTime, "E19"); + assertEq(_trove.owner, userBorrower, "E20"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E21"); assertApproxEqRel( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO, 2e15, - "E23" + "E22" ); // 0.2% // Check sorted troves - assertFalse(sortedTroves.empty(), "E24"); - assertEq(sortedTroves.size(), 1, "E25"); - assertEq(sortedTroves.first(), _troveId, "E26"); - assertEq(sortedTroves.last(), _troveId, "E27"); - assertTrue(sortedTroves.contains(_troveId), "E28"); - assertFalse(sortedTroves.contains(_troveIdAnotherBorrower), "E29"); + assertFalse(sortedTroves.empty(), "E23"); + assertEq(sortedTroves.size(), 1, "E24"); + assertEq(sortedTroves.first(), _troveId, "E25"); + assertEq(sortedTroves.last(), _troveId, "E26"); + assertTrue(sortedTroves.contains(_troveId), "E27"); + assertFalse(sortedTroves.contains(_troveIdAnotherBorrower), "E28"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _secondCollateralNeeded + _expectedCollateralAfterRedemption, "E30"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E31"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E32"); - assertEq(borrowToken.balanceOf(address(lender)), 0, "E33"); - assertApproxEqRel(borrowToken.balanceOf(userBorrower), _secondAmount, 25e15, "E34"); // 2.5%. Pays slippage due to the redemption - assertEq(borrowToken.balanceOf(anotherUserBorrower), _amount, "E35"); + assertEq(collateralToken.balanceOf(address(troveManager)), _secondCollateralNeeded + _expectedCollateralAfterRedemption, "E29"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E30"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E31"); + assertEq(borrowToken.balanceOf(address(lender)), 0, "E32"); + assertApproxEqRel(borrowToken.balanceOf(userBorrower), _secondAmount, 25e15, "E33"); // 2.5%. Pays slippage due to the redemption + assertEq(borrowToken.balanceOf(anotherUserBorrower), _amount, "E34"); // Check global info - assertEq(troveManager.total_debt(), _expectedDebt + _secondExpectedDebt, "E36"); + assertEq(troveManager.total_debt(), _expectedDebt + _secondExpectedDebt, "E35"); assertEq( troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE + _secondExpectedDebt * DEFAULT_ANNUAL_INTEREST_RATE * 2, - "E37" + "E36" ); - assertEq(troveManager.collateral_balance(), _secondCollateralNeeded + _expectedCollateralAfterRedemption, "E38"); - assertEq(troveManager.zombie_trove_id(), _troveIdAnotherBorrower, "E39"); + assertEq(troveManager.collateral_balance(), _secondCollateralNeeded + _expectedCollateralAfterRedemption, "E37"); + assertEq(troveManager.zombie_trove_id(), _troveIdAnotherBorrower, "E38"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E40"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E41"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E39"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E40"); } function test_openTrove_zeroCollateral() public { @@ -973,4 +968,44 @@ contract OpenTroveTests is Base { vm.stopPrank(); } + function test_openTrove_customOwner( + uint256 _amount, + address _owner + ) public { + _amount = bound(_amount, troveManager.min_debt(), maxFuzzAmount); + vm.assume(_owner != address(0) && _owner != address(troveManager)); + mintAndDepositIntoLender(userLender, _amount); + + uint256 _collateral = (_amount * DEFAULT_TARGET_COLLATERAL_RATIO / BORROW_TOKEN_PRECISION) * ORACLE_PRICE_SCALE / priceOracle.get_price(); + + airdrop(address(collateralToken), operator, _collateral); + + vm.startPrank(operator); + collateralToken.approve(address(troveManager), _collateral); + uint256 _troveId = + troveManager.open_trove(block.timestamp, _collateral, _amount, 0, 0, DEFAULT_ANNUAL_INTEREST_RATE, type(uint256).max, 0, 0, _owner); + vm.stopPrank(); + + ITroveManager.Trove memory _trove = troveManager.troves(_troveId); + assertEq(_trove.owner, _owner, "E0"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E1"); + assertGt(_trove.debt, 0, "E2"); + assertEq(_trove.collateral, _collateral, "E3"); + } + + function test_openTrove_zeroOwner_reverts() public { + vm.expectRevert("!owner"); + troveManager.open_trove(block.timestamp, 1, 1, 0, 0, DEFAULT_ANNUAL_INTEREST_RATE, type(uint256).max, 0, 0, address(0)); + } + + function test_openTrove_troveManagerAsOwner_reverts() public { + vm.expectRevert("!owner"); + troveManager.open_trove(block.timestamp, 1, 1, 0, 0, DEFAULT_ANNUAL_INTEREST_RATE, type(uint256).max, 0, 0, address(troveManager)); + } + + function test_openTrove_lenderAsOwner_reverts() public { + vm.expectRevert("!owner"); + troveManager.open_trove(block.timestamp, 1, 1, 0, 0, DEFAULT_ANNUAL_INTEREST_RATE, type(uint256).max, 0, 0, address(lender)); + } + } diff --git a/test/RemoveCollateral.t.sol b/test/RemoveCollateral.t.sol index cb46175..23877d1 100644 --- a/test/RemoveCollateral.t.sol +++ b/test/RemoveCollateral.t.sol @@ -46,38 +46,37 @@ contract RemoveCollateralTests is Base { assertEq(_trove.last_debt_update_time, block.timestamp, "E3"); assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E4"); assertEq(_trove.owner, userBorrower, "E5"); - assertEq(_trove.pending_owner, address(0), "E6"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E7"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E6"); assertApproxEqRel( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO, 1e15, - "E8" + "E7" ); // 0.1% // Check sorted troves - assertFalse(sortedTroves.empty(), "E9"); - assertEq(sortedTroves.size(), 1, "E10"); - assertEq(sortedTroves.first(), _troveId, "E11"); - assertEq(sortedTroves.last(), _troveId, "E12"); - assertTrue(sortedTroves.contains(_troveId), "E13"); + assertFalse(sortedTroves.empty(), "E8"); + assertEq(sortedTroves.size(), 1, "E9"); + assertEq(sortedTroves.first(), _troveId, "E10"); + assertEq(sortedTroves.last(), _troveId, "E11"); + assertTrue(sortedTroves.contains(_troveId), "E12"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E14"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E15"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E16"); - assertEq(borrowToken.balanceOf(address(lender)), 0, "E17"); - assertEq(borrowToken.balanceOf(userBorrower), _amount, "E18"); + assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E13"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E14"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E15"); + assertEq(borrowToken.balanceOf(address(lender)), 0, "E16"); + assertEq(borrowToken.balanceOf(userBorrower), _amount, "E17"); // Check global info - assertEq(troveManager.total_debt(), _expectedDebt, "E19"); - assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E20"); - assertEq(troveManager.collateral_balance(), _collateralNeeded, "E21"); - assertEq(troveManager.zombie_trove_id(), 0, "E22"); + assertEq(troveManager.total_debt(), _expectedDebt, "E18"); + assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E19"); + assertEq(troveManager.collateral_balance(), _collateralNeeded, "E20"); + assertEq(troveManager.zombie_trove_id(), 0, "E21"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E23"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E24"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E22"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E23"); // Finally remove collateral vm.prank(userBorrower); @@ -235,4 +234,45 @@ contract RemoveCollateralTests is Base { troveManager.remove_collateral(_troveId, _maxCollateralToRemove); } + function test_removeCollateral_approvedOperator( + uint256 _amount + ) public { + _amount = bound(_amount, troveManager.min_debt(), maxFuzzAmount); + + mintAndDepositIntoLender(userLender, _amount); + + uint256 _collateralNeeded = + (_amount * DEFAULT_TARGET_COLLATERAL_RATIO / BORROW_TOKEN_PRECISION) * ORACLE_PRICE_SCALE / priceOracle.get_price(); + uint256 _troveId = mintAndOpenTrove(userBorrower, _collateralNeeded, _amount, DEFAULT_ANNUAL_INTEREST_RATE); + + // Approve operator + vm.prank(userBorrower); + troveManager.approve(operator, true); + + // Operator removes a small amount of collateral + uint256 _collateralToRemove = _collateralNeeded / 100; // 1% + vm.prank(operator); + troveManager.remove_collateral(_troveId, _collateralToRemove); + + assertEq(troveManager.troves(_troveId).collateral, _collateralNeeded - _collateralToRemove, "E0"); + } + + function test_removeCollateral_unapprovedOperator_reverts( + uint256 _amount, + address _caller + ) public { + _amount = bound(_amount, troveManager.min_debt(), maxFuzzAmount); + vm.assume(_caller != userBorrower); + + mintAndDepositIntoLender(userLender, _amount); + + uint256 _collateralNeeded = + (_amount * DEFAULT_TARGET_COLLATERAL_RATIO / BORROW_TOKEN_PRECISION) * ORACLE_PRICE_SCALE / priceOracle.get_price(); + uint256 _troveId = mintAndOpenTrove(userBorrower, _collateralNeeded, _amount, DEFAULT_ANNUAL_INTEREST_RATE); + + vm.prank(_caller); + vm.expectRevert("!owner"); + troveManager.remove_collateral(_troveId, minFuzzAmount); + } + } diff --git a/test/Repay.t.sol b/test/Repay.t.sol index effeb87..5775660 100644 --- a/test/Repay.t.sol +++ b/test/Repay.t.sol @@ -40,38 +40,37 @@ contract RepayTests is Base { assertEq(_trove.last_debt_update_time, block.timestamp, "E3"); assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E4"); assertEq(_trove.owner, userBorrower, "E5"); - assertEq(_trove.pending_owner, address(0), "E6"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E7"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E6"); assertApproxEqRel( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO, 1e15, - "E8" + "E7" ); // 0.1% // Check sorted troves - assertFalse(sortedTroves.empty(), "E9"); - assertEq(sortedTroves.size(), 1, "E10"); - assertEq(sortedTroves.first(), _troveId, "E11"); - assertEq(sortedTroves.last(), _troveId, "E12"); - assertTrue(sortedTroves.contains(_troveId), "E13"); + assertFalse(sortedTroves.empty(), "E8"); + assertEq(sortedTroves.size(), 1, "E9"); + assertEq(sortedTroves.first(), _troveId, "E10"); + assertEq(sortedTroves.last(), _troveId, "E11"); + assertTrue(sortedTroves.contains(_troveId), "E12"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E14"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E15"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E16"); - assertEq(borrowToken.balanceOf(address(lender)), 0, "E17"); - assertEq(borrowToken.balanceOf(userBorrower), _amount, "E18"); + assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E13"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E14"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E15"); + assertEq(borrowToken.balanceOf(address(lender)), 0, "E16"); + assertEq(borrowToken.balanceOf(userBorrower), _amount, "E17"); // Check global info - assertEq(troveManager.total_debt(), _expectedDebt, "E19"); - assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E20"); - assertEq(troveManager.collateral_balance(), _collateralNeeded, "E21"); - assertEq(troveManager.zombie_trove_id(), 0, "E22"); + assertEq(troveManager.total_debt(), _expectedDebt, "E18"); + assertEq(troveManager.total_weighted_debt(), _expectedDebt * DEFAULT_ANNUAL_INTEREST_RATE, "E19"); + assertEq(troveManager.collateral_balance(), _collateralNeeded, "E20"); + assertEq(troveManager.zombie_trove_id(), 0, "E21"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E23"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E24"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E22"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E23"); // Finally repay the trove back down to min debt vm.startPrank(userBorrower); @@ -83,44 +82,43 @@ contract RepayTests is Base { // Check trove info _trove = troveManager.troves(_troveId); - assertEq(_trove.debt, _expectedDebt - _amountToRepay, "E25"); - assertEq(_trove.collateral, _collateralNeeded, "E26"); - assertEq(_trove.annual_interest_rate, DEFAULT_ANNUAL_INTEREST_RATE, "E27"); - assertEq(_trove.last_debt_update_time, block.timestamp, "E28"); - assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E29"); - assertEq(_trove.owner, userBorrower, "E30"); - assertEq(_trove.pending_owner, address(0), "E31"); - assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E32"); + assertEq(_trove.debt, _expectedDebt - _amountToRepay, "E24"); + assertEq(_trove.collateral, _collateralNeeded, "E25"); + assertEq(_trove.annual_interest_rate, DEFAULT_ANNUAL_INTEREST_RATE, "E26"); + assertEq(_trove.last_debt_update_time, block.timestamp, "E27"); + assertEq(_trove.last_interest_rate_adj_time, block.timestamp, "E28"); + assertEq(_trove.owner, userBorrower, "E29"); + assertEq(uint256(_trove.status), uint256(ITroveManager.Status.active), "E30"); assertGt( (_trove.collateral * priceOracle.get_price() / ORACLE_PRICE_SCALE) * BORROW_TOKEN_PRECISION / _trove.debt, DEFAULT_TARGET_COLLATERAL_RATIO, - "E33" + "E31" ); // Check sorted troves - assertFalse(sortedTroves.empty(), "E34"); - assertEq(sortedTroves.size(), 1, "E35"); - assertEq(sortedTroves.first(), _troveId, "E36"); - assertEq(sortedTroves.last(), _troveId, "E37"); - assertTrue(sortedTroves.contains(_troveId), "E38"); + assertFalse(sortedTroves.empty(), "E32"); + assertEq(sortedTroves.size(), 1, "E33"); + assertEq(sortedTroves.first(), _troveId, "E34"); + assertEq(sortedTroves.last(), _troveId, "E35"); + assertTrue(sortedTroves.contains(_troveId), "E36"); // Check balances - assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E39"); - assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E40"); - assertEq(collateralToken.balanceOf(address(userBorrower)), 0, "E41"); - assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E42"); - assertEq(borrowToken.balanceOf(address(lender)), _amountToRepay, "E43"); - assertEq(borrowToken.balanceOf(userBorrower), _amount - _amountToRepay, "E44"); + assertEq(collateralToken.balanceOf(address(troveManager)), _collateralNeeded, "E37"); + assertEq(collateralToken.balanceOf(address(troveManager)), troveManager.collateral_balance(), "E38"); + assertEq(collateralToken.balanceOf(address(userBorrower)), 0, "E39"); + assertEq(borrowToken.balanceOf(address(troveManager)), 0, "E40"); + assertEq(borrowToken.balanceOf(address(lender)), _amountToRepay, "E41"); + assertEq(borrowToken.balanceOf(userBorrower), _amount - _amountToRepay, "E42"); // Check global info - assertEq(troveManager.total_debt(), _expectedDebt - _amountToRepay, "E45"); - assertEq(troveManager.total_weighted_debt(), (_expectedDebt - _amountToRepay) * DEFAULT_ANNUAL_INTEREST_RATE, "E46"); - assertEq(troveManager.collateral_balance(), _collateralNeeded, "E47"); - assertEq(troveManager.zombie_trove_id(), 0, "E48"); + assertEq(troveManager.total_debt(), _expectedDebt - _amountToRepay, "E43"); + assertEq(troveManager.total_weighted_debt(), (_expectedDebt - _amountToRepay) * DEFAULT_ANNUAL_INTEREST_RATE, "E44"); + assertEq(troveManager.collateral_balance(), _collateralNeeded, "E45"); + assertEq(troveManager.zombie_trove_id(), 0, "E46"); // Check dutch desk is empty - assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E49"); - assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E50"); + assertEq(borrowToken.balanceOf(address(dutchDesk)), 0, "E47"); + assertEq(collateralToken.balanceOf(address(dutchDesk)), 0, "E48"); } function test_repay_zeroAmount( diff --git a/test/TransferOwnership.t.sol b/test/TransferOwnership.t.sol deleted file mode 100644 index c460718..0000000 --- a/test/TransferOwnership.t.sol +++ /dev/null @@ -1,75 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.23; - -import "./Base.sol"; - -contract TransferOwnershipTests is Base { - - function setUp() public override { - Base.setUp(); - } - - function test_transferOwnership( - uint256 _amount, - address _newOwner - ) public returns (uint256) { - _amount = bound(_amount, troveManager.min_debt(), maxFuzzAmount); - - // Lend some from lender - mintAndDepositIntoLender(userLender, _amount); - - // Calculate how much collateral is needed for the borrow amount - uint256 _collateralNeeded = - (_amount * DEFAULT_TARGET_COLLATERAL_RATIO / BORROW_TOKEN_PRECISION) * ORACLE_PRICE_SCALE / priceOracle.get_price(); - - // Open a trove - uint256 _troveId = mintAndOpenTrove(userBorrower, _collateralNeeded, _amount, DEFAULT_ANNUAL_INTEREST_RATE); - - // Check trove info - ITroveManager.Trove memory _trove = troveManager.troves(_troveId); - assertEq(_trove.owner, userBorrower, "E0"); - assertEq(_trove.pending_owner, address(0), "E1"); - - // Attempt to transfer ownership from a non-owner - vm.prank(userLender); - vm.expectRevert("!owner"); - troveManager.transfer_ownership(_troveId, userLender); - - // Transfer ownership - vm.prank(userBorrower); - troveManager.transfer_ownership(_troveId, _newOwner); - - // Check trove info again - _trove = troveManager.troves(_troveId); - assertEq(_trove.owner, userBorrower, "E2"); - assertEq(_trove.pending_owner, _newOwner, "E3"); - - return _troveId; - } - - function test_acceptOwnership( - uint256 _amount, - address _newOwner - ) public { - vm.assume(_newOwner != userLender); - _amount = bound(_amount, troveManager.min_debt(), maxFuzzAmount); - - // Start the ownership transfer process - uint256 _troveId = test_transferOwnership(_amount, _newOwner); - - // Attempt to accept ownership from a non-pending owner - vm.prank(userLender); - vm.expectRevert("!pending_owner"); - troveManager.accept_ownership(_troveId); - - // Accept ownership - vm.prank(_newOwner); - troveManager.accept_ownership(_troveId); - - // Check trove info - ITroveManager.Trove memory _trove = troveManager.troves(_troveId); - assertEq(_trove.owner, _newOwner, "E0"); - assertEq(_trove.pending_owner, address(0), "E1"); - } - -} diff --git a/test/TroveManager.t.sol b/test/TroveManager.t.sol index 02fd2f3..2bf4481 100644 --- a/test/TroveManager.t.sol +++ b/test/TroveManager.t.sol @@ -56,4 +56,19 @@ contract TroveManagerTests is Base { ); } + function test_approve( + address _operator + ) public { + vm.assume(_operator != address(0)); + assertFalse(troveManager.approved(userBorrower, _operator), "E0"); + + vm.prank(userBorrower); + troveManager.approve(_operator, true); + assertTrue(troveManager.approved(userBorrower, _operator), "E1"); + + vm.prank(userBorrower); + troveManager.approve(_operator, false); + assertFalse(troveManager.approved(userBorrower, _operator), "E2"); + } + } diff --git a/test/interfaces/IDutchDesk.sol b/test/interfaces/IDutchDesk.sol index 1e3632d..9d90d1e 100644 --- a/test/interfaces/IDutchDesk.sol +++ b/test/interfaces/IDutchDesk.sol @@ -12,7 +12,6 @@ interface IDutchDesk { address lender; address price_oracle; address auction; - address borrow_token; address collateral_token; uint256 minimum_price_buffer_percentage; uint256 starting_price_buffer_percentage; diff --git a/test/interfaces/ITroveManager.sol b/test/interfaces/ITroveManager.sol index 188a406..40941fa 100644 --- a/test/interfaces/ITroveManager.sol +++ b/test/interfaces/ITroveManager.sol @@ -31,7 +31,6 @@ interface ITroveManager { uint64 last_debt_update_time; uint64 last_interest_rate_adj_time; address owner; - address pending_owner; Status status; } @@ -90,6 +89,12 @@ interface ITroveManager { uint256 ) external view returns (Trove memory); + // Approvals + function approved( + address owner, + address operator + ) external view returns (bool); + // ============================================================================================ // Initialize // ============================================================================================ @@ -106,6 +111,11 @@ interface ITroveManager { uint256 debt_amount, uint256 annual_interest_rate ) external view returns (uint256); + function get_upfront_fee( + uint256 debt_amount, + uint256 annual_interest_rate, + bool is_existing_debt + ) external view returns (uint256); function get_trove_debt_after_interest( uint256 trove_id ) external view returns (uint256); @@ -117,15 +127,12 @@ interface ITroveManager { function sync_total_debt() external returns (uint256); // ============================================================================================ - // Ownership + // Approvals // ============================================================================================ - function transfer_ownership( - uint256 trove_id, - address new_owner - ) external; - function accept_ownership( - uint256 trove_id + function approve( + address operator, + bool _approved ) external; // ============================================================================================ @@ -143,6 +150,18 @@ interface ITroveManager { uint256 min_borrow_out, uint256 min_collateral_out ) external returns (uint256); + function open_trove( + uint256 owner_index, + uint256 collateral_amount, + uint256 debt_amount, + uint256 upper_hint, + uint256 lower_hint, + uint256 annual_interest_rate, + uint256 max_upfront_fee, + uint256 min_borrow_out, + uint256 min_collateral_out, + address owner + ) external returns (uint256); // ============================================================================================ // Adjust trove diff --git a/test/mocks/AuctionTakerMock.sol b/test/mocks/AuctionTakerMock.sol new file mode 100644 index 0000000..da1b50b --- /dev/null +++ b/test/mocks/AuctionTakerMock.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.23; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +import {IAuction} from "../interfaces/IAuction.sol"; + +import "forge-std/Test.sol"; + +contract AuctionTakerMock is Test { + + function takeAuction( + address _auction, + uint256 _auctionId + ) external { + address _buyToken = IAuction(_auction).buy_token(); + IAuction(_auction).take(_auctionId, type(uint256).max, address(this), abi.encode(_buyToken)); + } + + function takeCallback( + uint256, + address, + uint256, + uint256 _neededAmount, + bytes calldata _data + ) external { + address _buyToken = abi.decode(_data, (address)); + deal(_buyToken, address(this), _neededAmount); + IERC20(_buyToken).approve(msg.sender, _neededAmount); + } + +}