From 67cc18ac2b0d8a351caf1bd1f1282e5ac61b6e36 Mon Sep 17 00:00:00 2001 From: Cho Young-Hwi Date: Sun, 22 Mar 2026 10:15:38 +0000 Subject: [PATCH 1/2] [#243] Add ZapPlotLinkV2: multi-token support, mainnet deploy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Re-forked from MintPad ZapUniV4MCV2 with PlotLink adaptations: - Multi-token input: ETH, USDC, HUNT (+ PLOT direct) - Two-hop path: fromToken → PLOT (Uniswap V4) → storyline token (MCV2) - Owner-updatable PLOT token via setPlotToken() - Uses Universal Router pattern (not PoolManager.unlock) - Non-view estimate functions (estimateMint, estimateMintReverse) - Owner functions: setPlotToken, transferOwnership, rescueTokens, rescueETH - No MerkleTree support (MT in reference was a token, not MerkleTree) Deployed to Base mainnet: 0x504365bd15E79F04a8457c798A07d20BD59AD0F8 Verified on Sourcify. Note: Uniswap V4 pools for fromToken/PLOT pairs do not exist yet. The contract is deployed but swaps will revert until pools are created and seeded with liquidity. This is an operator-gated step. Fixes #243 Co-Authored-By: Claude Opus 4.6 (1M context) --- .gitmodules | 3 + .../8453/run-1774174513582.json | 155 +++++++ .../8453/run-latest.json | 155 +++++++ lib/openzeppelin-contracts | 1 + remappings.txt | 1 + script/DeployZapPlotLinkV2.s.sol | 25 ++ src/ZapPlotLinkV2.sol | 425 ++++++++++++++++++ src/interfaces/IZapInterfaces.sol | 94 ++++ 8 files changed, 859 insertions(+) create mode 100644 broadcast/DeployZapPlotLinkV2.s.sol/8453/run-1774174513582.json create mode 100644 broadcast/DeployZapPlotLinkV2.s.sol/8453/run-latest.json create mode 160000 lib/openzeppelin-contracts create mode 100644 script/DeployZapPlotLinkV2.s.sol create mode 100644 src/ZapPlotLinkV2.sol create mode 100644 src/interfaces/IZapInterfaces.sol diff --git a/.gitmodules b/.gitmodules index 2451d17..5d08dbd 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,6 @@ [submodule "lib/v4-periphery"] path = lib/v4-periphery url = https://github.com/Uniswap/v4-periphery +[submodule "lib/openzeppelin-contracts"] + path = lib/openzeppelin-contracts + url = https://github.com/OpenZeppelin/openzeppelin-contracts diff --git a/broadcast/DeployZapPlotLinkV2.s.sol/8453/run-1774174513582.json b/broadcast/DeployZapPlotLinkV2.s.sol/8453/run-1774174513582.json new file mode 100644 index 0000000..dcdc141 --- /dev/null +++ b/broadcast/DeployZapPlotLinkV2.s.sol/8453/run-1774174513582.json @@ -0,0 +1,155 @@ +{ + "transactions": [ + { + "hash": "0x81318a9853ba886e1133d8daf2e08372423dd0a3ab7530132f86196471c6b88e", + "transactionType": "CREATE", + "contractName": "ZapPlotLinkV2", + "contractAddress": "0x504365bd15e79f04a8457c798a07d20bd59ad0f8", + "function": null, + "arguments": [ + "0xF8A2C39111FCEB9C950aAf28A9E34EBaD99b85C1" + ], + "transaction": { + "from": "0x017596303ee2f3c1250aa67d2d33dbae1d1c4dbf", + "gas": "0x44008b", + "value": "0x0", + "input": "0x608060405234801561000f575f5ffd5b50604051613e7b380380613e7b83398181016040528101906100319190610476565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610096576040517f644865b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373c5a076cad94176c2996b32d8466be1ce757faa277fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016101849291906104c8565b6020604051808303815f875af11580156101a0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101c49190610524565b508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373492c412369db76c9cdd9939e6c521579301473a37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016102349291906104c8565b6020604051808303815f875af1158015610250573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102749190610524565b5061029873833589fcd6edb6e08f4c7c32d4f71b54bda029136102c160201b60201c565b6102bb7337f0c2915cecc7e977183b8543fc0864d03e064c6102c160201b60201c565b506105c1565b8073ffffffffffffffffffffffffffffffffffffffff1663095ea7b36e22d473030f116ddee9f6b43ac78ba37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161032b9291906104c8565b6020604051808303815f875af1158015610347573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036b9190610524565b506e22d473030f116ddee9f6b43ac78ba373ffffffffffffffffffffffffffffffffffffffff166387517c4582736ff5693b99212da76ad316178a184ab56d299b4373ffffffffffffffffffffffffffffffffffffffff65ffffffffffff6040518563ffffffff1660e01b81526004016103e8949392919061057e565b5f604051808303815f87803b1580156103ff575f5ffd5b505af1158015610411573d5f5f3e3d5ffd5b5050505050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6104458261041c565b9050919050565b6104558161043b565b811461045f575f5ffd5b50565b5f815190506104708161044c565b92915050565b5f6020828403121561048b5761048a610418565b5b5f61049884828501610462565b91505092915050565b6104aa8161043b565b82525050565b5f819050919050565b6104c2816104b0565b82525050565b5f6040820190506104db5f8301856104a1565b6104e860208301846104b9565b9392505050565b5f8115159050919050565b610503816104ef565b811461050d575f5ffd5b50565b5f8151905061051e816104fa565b92915050565b5f6020828403121561053957610538610418565b5b5f61054684828501610510565b91505092915050565b6105588161041c565b82525050565b5f65ffffffffffff82169050919050565b6105788161055e565b82525050565b5f6080820190506105915f8301876104a1565b61059e60208301866104a1565b6105ab604083018561054f565b6105b8606083018461056f565b95945050505050565b6138ad806105ce5f395ff3fe608060405260043610610122575f3560e01c8063b3f1c93d1161009f578063cefa892211610063578063cefa8922146103bc578063d87e4bd1146103e6578063dd1b9c4a14610423578063e8dd7fc31461044d578063f2fde38b1461047757610129565b8063b3f1c93d146102e8578063b9703ded14610318578063c1c1d21814610342578063cb7588241461036c578063cea9d26f1461039457610129565b8063814ac84f116100e6578063814ac84f1461021057806389a30271146102405780638da5cb5b1461026a5780638dae88c214610294578063a734f06e146102be57610129565b806301c2553a1461012d57806304824e701461016a578063161a226e1461019257806346ca626b146101bc5780636afdd850146101e657610129565b3661012957005b5f5ffd5b348015610138575f5ffd5b50610153600480360381019061014e9190612b3a565b61049f565b604051610161929190612b99565b60405180910390f35b348015610175575f5ffd5b50610190600480360381019061018b9190612bfb565b610634565b005b34801561019d575f5ffd5b506101a661072e565b6040516101b39190612c35565b60405180910390f35b3480156101c7575f5ffd5b506101d0610753565b6040516101dd9190612c69565b60405180910390f35b3480156101f1575f5ffd5b506101fa610758565b6040516102079190612c35565b60405180910390f35b61022a60048036038101906102259190612c82565b61076b565b6040516102379190612ce6565b60405180910390f35b34801561024b575f5ffd5b506102546109f9565b6040516102619190612c35565b60405180910390f35b348015610275575f5ffd5b5061027e610a11565b60405161028b9190612c35565b60405180910390f35b34801561029f575f5ffd5b506102a8610a35565b6040516102b59190612d5a565b60405180910390f35b3480156102c9575f5ffd5b506102d2610a4d565b6040516102df9190612c35565b60405180910390f35b61030260048036038101906102fd9190612c82565b610a51565b60405161030f9190612ce6565b60405180910390f35b348015610323575f5ffd5b5061032c610dc1565b6040516103399190612d93565b60405180910390f35b34801561034d575f5ffd5b50610356610dd9565b6040516103639190612dcc565b60405180910390f35b348015610377575f5ffd5b50610392600480360381019061038d9190612de5565b610df1565b005b34801561039f575f5ffd5b506103ba60048036038101906103b59190612b3a565b61121e565b005b3480156103c7575f5ffd5b506103d06112d3565b6040516103dd9190612c35565b60405180910390f35b3480156103f1575f5ffd5b5061040c60048036038101906104079190612b3a565b6112eb565b60405161041a929190612b99565b60405180910390f35b34801561042e575f5ffd5b5061043761147e565b6040516104449190612e2d565b60405180910390f35b348015610458575f5ffd5b50610461611484565b60405161046e9190612e66565b60405180910390f35b348015610482575f5ffd5b5061049d60048036038101906104989190612de5565b61149c565b005b5f5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036104fd57829050610598565b730d5e0f971ed27fbff6c2837bf31316121532048d73ffffffffffffffffffffffffffffffffffffffff1663aa9d21cb6105378786611647565b6040518263ffffffff1660e01b81526004016105539190613047565b60408051808303815f875af115801561056e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610592919061307b565b50809150505b73492c412369db76c9cdd9939e6c521579301473a373ffffffffffffffffffffffffffffffffffffffff1663fb55dbe185835f6040518463ffffffff1660e01b81526004016105e9939291906130c8565b6040805180830381865afa158015610603573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106279190613111565b5080925050935093915050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106b9576040517f086a6b8600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8173ffffffffffffffffffffffffffffffffffffffff16476040516106de9061317c565b5f6040518083038185875af1925050503d805f8114610718576040519150601f19603f3d011682016040523d82523d5f602084013e61071d565b606091505b505090508061072a575f5ffd5b5050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b603c81565b6e22d473030f116ddee9f6b43ac78ba381565b5f5f83036107a5576040517ff4fb71d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603610889575f3414610833576040517f6256698900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61088133308660015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661179b909392919063ffffffff16565b8390506108a0565b61089386856117f0565b61089d8685611995565b90505b73492c412369db76c9cdd9939e6c521579301473a373ffffffffffffffffffffffffffffffffffffffff16630144c5f3868386336040518563ffffffff1660e01b81526004016108f39493929190613190565b6020604051808303815f875af192505050801561092e57506040513d601f19601f8201168201806040525081019061092b91906131d3565b60015b610964576040517f12c0f6d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80925050610970611d46565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f27830bca1834346b6287fed7ebd6791d80a5a6d4b190a1f8b01c09a07786a1a68588866040516109e8939291906131fe565b60405180910390a450949350505050565b73833589fcd6edb6e08f4c7c32d4f71b54bda0291381565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b730d5e0f971ed27fbff6c2837bf31316121532048d81565b5f81565b5f5f8303610a8b576040517ff4fb71d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73c5a076cad94176c2996b32d8466be1ce757faa2773ffffffffffffffffffffffffffffffffffffffff166376a9864b86866040518363ffffffff1660e01b8152600401610adb929190613233565b6040805180830381865afa158015610af5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b19919061307b565b50905060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603610c39575f3414610ba9576040517f6256698900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82811115610be3576040517f12c0f6d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c3133308360015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661179b909392919063ffffffff16565b809150610c66565b610c4386846117f0565b610c4e868285611e3a565b9150610c65868385610c609190613287565b612306565b5b5f73c5a076cad94176c2996b32d8466be1ce757faa2773ffffffffffffffffffffffffffffffffffffffff1663f74bfe8e878785336040518563ffffffff1660e01b8152600401610cba9493929190613190565b6020604051808303815f875af1925050508015610cf557506040513d601f19601f82011682018060405250810190610cf291906131d3565b60015b610d2b576040517f12c0f6d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80915050610d37611d46565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f3b90f0b1565b6e9dac462a873af5d46d5d6177d0096ddc2ddcf38de8ddb5d8fa888786604051610daf939291906131fe565b60405180910390a45050949350505050565b73492c412369db76c9cdd9939e6c521579301473a381565b73c5a076cad94176c2996b32d8466be1ce757faa2781565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e76576040517f086a6b8600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610edb576040517f644865b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373c5a076cad94176c2996b32d8466be1ce757faa275f6040518363ffffffff1660e01b8152600401610f4f9291906132f3565b6020604051808303815f875af1158015610f6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f8f9190613344565b508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373492c412369db76c9cdd9939e6c521579301473a35f6040518363ffffffff1660e01b8152600401610fdf9291906132f3565b6020604051808303815f875af1158015610ffb573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061101f9190613344565b508160015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff1663095ea7b373c5a076cad94176c2996b32d8466be1ce757faa277fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016110cf929190613233565b6020604051808303815f875af11580156110eb573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061110f9190613344565b508173ffffffffffffffffffffffffffffffffffffffff1663095ea7b373492c412369db76c9cdd9939e6c521579301473a37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161117f929190613233565b6020604051808303815f875af115801561119b573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111bf9190613344565b508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f5a1a9bb5f826487cf43e61548d79ffa19cc00e1a554bd9962825f51fa9c767d160405160405180910390a35050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112a3576040517f086a6b8600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112ce82828573ffffffffffffffffffffffffffffffffffffffff166124209092919063ffffffff16565b505050565b7337f0c2915cecc7e977183b8543fc0864d03e064c81565b5f5f73c5a076cad94176c2996b32d8466be1ce757faa2773ffffffffffffffffffffffffffffffffffffffff166376a9864b85856040518363ffffffff1660e01b815260040161133c929190613233565b6040805180830381865afa158015611356573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061137a919061307b565b508091505060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036113db57809150611476565b730d5e0f971ed27fbff6c2837bf31316121532048d73ffffffffffffffffffffffffffffffffffffffff1663587330736114158784611647565b6040518263ffffffff1660e01b81526004016114319190613047565b60408051808303815f875af115801561144c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611470919061307b565b50809250505b935093915050565b610bb881565b736ff5693b99212da76ad316178a184ab56d299b4381565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611521576040517f086a6b8600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611586576040517f644865b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61164f6129f5565b5f5f5f5f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146116ae5760015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16865f6116d4565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660015b92509250925060405180608001604052806040518060a001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001610bb862ffffff168152602001603c60020b81526020015f73ffffffffffffffffffffffffffffffffffffffff1681525081526020018215158152602001866fffffffffffffffffffffffffffffffff16815260200160405180602001604052805f815250815250935050505092915050565b6117a9848484846001612473565b6117ea57836040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016117e19190612c35565b60405180910390fd5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118615780341461185c576040517f6256698900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611991565b73833589fcd6edb6e08f4c7c32d4f71b54bda0291373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806118ee57507337f0c2915cecc7e977183b8543fc0864d03e064c73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b1561195e575f341461192c576040517f6256698900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119593330838573ffffffffffffffffffffffffffffffffffffffff1661179b909392919063ffffffff16565b611990565b6040517f84e3aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5050565b5f5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016119f19190612c35565b602060405180830381865afa158015611a0c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3091906131d3565b90505f5f5f5f73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614611a915760015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16875f611ab7565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660015b9250925092505f6010604051602001611ad091906133af565b60405160208183030381529060405290505f600167ffffffffffffffff811115611afd57611afc6133c9565b5b604051908082528060200260200182016040528015611b3057816020015b6060815260200190600190039081611b1b5790505b509050611b3f8585858b6124e4565b815f81518110611b5257611b516133f6565b5b60200260200101819052505f73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1603611c1557736ff5693b99212da76ad316178a184ab56d299b4373ffffffffffffffffffffffffffffffffffffffff16633593564c898484426040518563ffffffff1660e01b8152600401611be293929190613526565b5f604051808303818588803b158015611bf9575f5ffd5b505af1158015611c0b573d5f5f3e3d5ffd5b5050505050611c94565b736ff5693b99212da76ad316178a184ab56d299b4373ffffffffffffffffffffffffffffffffffffffff16633593564c8383426040518463ffffffff1660e01b8152600401611c6693929190613526565b5f604051808303815f87803b158015611c7d575f5ffd5b505af1158015611c8f573d5f5f3e3d5ffd5b505050505b8560015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611cef9190612c35565b602060405180830381865afa158015611d0a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d2e91906131d3565b611d389190613287565b965050505050505092915050565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611da19190612c35565b602060405180830381865afa158015611dbc573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de091906131d3565b90505f811115611e3757611e36338260015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166124209092919063ffffffff16565b5b50565b5f5f5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614611eec578473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611ea89190612c35565b602060405180830381865afa158015611ec3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ee791906131d3565b611eee565b475b90505f5f5f5f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614611f4f5760015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16885f611f75565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660015b9250925092505f611f898484848b8b61273b565b90505f73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1603612120575f60106004604051602001611fd4929190613569565b60405160208183030381529060405290505f600267ffffffffffffffff811115612001576120006133c9565b5b60405190808252806020026020018201604052801561203457816020015b606081526020019060019003908161201f5790505b50905082815f8151811061204b5761204a6133f6565b5b60200260200101819052505f305f60405160200161206b939291906135c4565b6040516020818303038152906040528160018151811061208e5761208d6133f6565b5b6020026020010181905250736ff5693b99212da76ad316178a184ab56d299b4373ffffffffffffffffffffffffffffffffffffffff16633593564c8a8484426040518563ffffffff1660e01b81526004016120eb93929190613526565b5f604051808303818588803b158015612102575f5ffd5b505af1158015612114573d5f5f3e3d5ffd5b50505050505050612236565b5f601060405160200161213391906133af565b60405160208183030381529060405290505f600167ffffffffffffffff8111156121605761215f6133c9565b5b60405190808252806020026020018201604052801561219357816020015b606081526020019060019003908161217e5790505b50905082815f815181106121aa576121a96133f6565b5b6020026020010181905250736ff5693b99212da76ad316178a184ab56d299b4373ffffffffffffffffffffffffffffffffffffffff16633593564c8383426040518463ffffffff1660e01b815260040161220693929190613526565b5f604051808303815f87803b15801561221d575f5ffd5b505af115801561222f573d5f5f3e3d5ffd5b5050505050505b5f5f73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146122e7578973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016122a39190612c35565b602060405180830381865afa1580156122be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122e291906131d3565b6122e9565b475b905080866122f79190613287565b96505050505050509392505050565b5f81031561241c575f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036123ef575f3373ffffffffffffffffffffffffffffffffffffffff16826040516123669061317c565b5f6040518083038185875af1925050503d805f81146123a0576040519150601f19603f3d011682016040523d82523d5f602084013e6123a5565b606091505b50509050806123e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e090613653565b60405180910390fd5b5061241b565b61241a33828473ffffffffffffffffffffffffffffffffffffffff166124209092919063ffffffff16565b5b5b5050565b61242d8383836001612993565b61246e57826040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016124659190612c35565b60405180910390fd5b505050565b5f5f6323b872dd60e01b9050604051815f525f1960601c87166004525f1960601c86166024528460445260205f60645f5f8c5af1925060015f511483166124d15783831516156124c5573d5f823e3d81fd5b5f883b113d1516831692505b806040525f606052505095945050505050565b60605f6006600c600e6040516020016124ff93929190613671565b60405160208183030381529060405290505f600367ffffffffffffffff81111561252c5761252b6133c9565b5b60405190808252806020026020018201604052801561255f57816020015b606081526020019060019003908161254a5790505b5090505f6040518060a001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff168152602001610bb862ffffff168152602001603c60020b81526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090505f5f876125e757888a6125ea565b89895b915091506040518060a001604052808481526020018915158152602001886fffffffffffffffffffffffffffffffff1681526020015f6fffffffffffffffffffffffffffffffff16815260200160405180602001604052805f8152508152506040516020016126599190613722565b604051602081830303815290604052845f8151811061267b5761267a6133f6565b5b60200260200101819052508187604051602001612699929190613751565b604051602081830303815290604052846001815181106126bc576126bb6133f6565b5b602002602001018190525080305f6040516020016126dc93929190613778565b604051602081830303815290604052846002815181106126ff576126fe6133f6565b5b6020026020010181905250848460405160200161271d9291906137ad565b60405160208183030381529060405295505050505050949350505050565b60605f6008600c600e60405160200161275693929190613671565b60405160208183030381529060405290505f600367ffffffffffffffff811115612783576127826133c9565b5b6040519080825280602002602001820160405280156127b657816020015b60608152602001906001900390816127a15790505b5090505f6040518060a001604052808a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff168152602001610bb862ffffff168152602001603c60020b81526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090505f5f8861283e57898b612841565b8a8a5b915091506040518060a001604052808481526020018a15158152602001896fffffffffffffffffffffffffffffffff168152602001886fffffffffffffffffffffffffffffffff16815260200160405180602001604052805f8152508152506040516020016128b09190613857565b604051602081830303815290604052845f815181106128d2576128d16133f6565b5b602002602001018190525081876040516020016128f0929190613751565b60405160208183030381529060405284600181518110612913576129126133f6565b5b602002602001018190525080305f60405160200161293393929190613778565b60405160208183030381529060405284600281518110612956576129556133f6565b5b602002602001018190525084846040516020016129749291906137ad565b6040516020818303038152906040529550505050505095945050505050565b5f5f63a9059cbb60e01b9050604051815f525f1960601c86166004528460245260205f60445f5f8b5af1925060015f511483166129e75783831516156129db573d5f823e3d81fd5b5f873b113d1516831692505b806040525050949350505050565b6040518060800160405280612a08612a35565b81526020015f151581526020015f6fffffffffffffffffffffffffffffffff168152602001606081525090565b6040518060a001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f62ffffff1681526020015f60020b81526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612ad682612aad565b9050919050565b612ae681612acc565b8114612af0575f5ffd5b50565b5f81359050612b0181612add565b92915050565b5f819050919050565b612b1981612b07565b8114612b23575f5ffd5b50565b5f81359050612b3481612b10565b92915050565b5f5f5f60608486031215612b5157612b50612aa9565b5b5f612b5e86828701612af3565b9350506020612b6f86828701612af3565b9250506040612b8086828701612b26565b9150509250925092565b612b9381612b07565b82525050565b5f604082019050612bac5f830185612b8a565b612bb96020830184612b8a565b9392505050565b5f612bca82612aad565b9050919050565b612bda81612bc0565b8114612be4575f5ffd5b50565b5f81359050612bf581612bd1565b92915050565b5f60208284031215612c1057612c0f612aa9565b5b5f612c1d84828501612be7565b91505092915050565b612c2f81612acc565b82525050565b5f602082019050612c485f830184612c26565b92915050565b5f8160020b9050919050565b612c6381612c4e565b82525050565b5f602082019050612c7c5f830184612c5a565b92915050565b5f5f5f5f60808587031215612c9a57612c99612aa9565b5b5f612ca787828801612af3565b9450506020612cb887828801612af3565b9350506040612cc987828801612b26565b9250506060612cda87828801612b26565b91505092959194509250565b5f602082019050612cf95f830184612b8a565b92915050565b5f819050919050565b5f612d22612d1d612d1884612aad565b612cff565b612aad565b9050919050565b5f612d3382612d08565b9050919050565b5f612d4482612d29565b9050919050565b612d5481612d3a565b82525050565b5f602082019050612d6d5f830184612d4b565b92915050565b5f612d7d82612d29565b9050919050565b612d8d81612d73565b82525050565b5f602082019050612da65f830184612d84565b92915050565b5f612db682612d29565b9050919050565b612dc681612dac565b82525050565b5f602082019050612ddf5f830184612dbd565b92915050565b5f60208284031215612dfa57612df9612aa9565b5b5f612e0784828501612af3565b91505092915050565b5f62ffffff82169050919050565b612e2781612e10565b82525050565b5f602082019050612e405f830184612e1e565b92915050565b5f612e5082612d29565b9050919050565b612e6081612e46565b82525050565b5f602082019050612e795f830184612e57565b92915050565b612e8881612acc565b82525050565b612e9781612e10565b82525050565b612ea681612c4e565b82525050565b5f612eb682612d29565b9050919050565b612ec681612eac565b82525050565b60a082015f820151612ee05f850182612e7f565b506020820151612ef36020850182612e7f565b506040820151612f066040850182612e8e565b506060820151612f196060850182612e9d565b506080820151612f2c6080850182612ebd565b50505050565b5f8115159050919050565b612f4681612f32565b82525050565b5f6fffffffffffffffffffffffffffffffff82169050919050565b612f7081612f4c565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612fb882612f76565b612fc28185612f80565b9350612fd2818560208601612f90565b612fdb81612f9e565b840191505092915050565b5f61010083015f830151612ffc5f860182612ecc565b50602083015161300f60a0860182612f3d565b50604083015161302260c0860182612f67565b50606083015184820360e086015261303a8282612fae565b9150508091505092915050565b5f6020820190508181035f83015261305f8184612fe6565b905092915050565b5f8151905061307581612b10565b92915050565b5f5f6040838503121561309157613090612aa9565b5b5f61309e85828601613067565b92505060206130af85828601613067565b9150509250929050565b6130c281612f32565b82525050565b5f6060820190506130db5f830186612c26565b6130e86020830185612b8a565b6130f560408301846130b9565b949350505050565b5f8151905061310b81612add565b92915050565b5f5f6040838503121561312757613126612aa9565b5b5f61313485828601613067565b9250506020613145858286016130fd565b9150509250929050565b5f81905092915050565b50565b5f6131675f8361314f565b915061317282613159565b5f82019050919050565b5f6131868261315c565b9150819050919050565b5f6080820190506131a35f830187612c26565b6131b06020830186612b8a565b6131bd6040830185612b8a565b6131ca6060830184612c26565b95945050505050565b5f602082840312156131e8576131e7612aa9565b5b5f6131f584828501613067565b91505092915050565b5f6060820190506132115f830186612b8a565b61321e6020830185612b8a565b61322b6040830184612b8a565b949350505050565b5f6040820190506132465f830185612c26565b6132536020830184612b8a565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61329182612b07565b915061329c83612b07565b92508282039050818111156132b4576132b361325a565b5b92915050565b5f819050919050565b5f6132dd6132d86132d3846132ba565b612cff565b612b07565b9050919050565b6132ed816132c3565b82525050565b5f6040820190506133065f830185612c26565b61331360208301846132e4565b9392505050565b61332381612f32565b811461332d575f5ffd5b50565b5f8151905061333e8161331a565b92915050565b5f6020828403121561335957613358612aa9565b5b5f61336684828501613330565b91505092915050565b5f60ff82169050919050565b5f8160f81b9050919050565b5f6133918261337b565b9050919050565b6133a96133a48261336f565b613387565b82525050565b5f6133ba8284613398565b60018201915081905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82825260208201905092915050565b5f61343d82612f76565b6134478185613423565b9350613457818560208601612f90565b61346081612f9e565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f61349f8383612fae565b905092915050565b5f602082019050919050565b5f6134bd8261346b565b6134c78185613475565b9350836020820285016134d985613485565b805f5b8581101561351457848403895281516134f58582613494565b9450613500836134a7565b925060208a019950506001810190506134dc565b50829750879550505050505092915050565b5f6060820190508181035f83015261353e8186613433565b9050818103602083015261355281856134b3565b90506135616040830184612b8a565b949350505050565b5f6135748285613398565b6001820191506135848284613398565b6001820191508190509392505050565b5f6135ae6135a96135a4846132ba565b612cff565b61336f565b9050919050565b6135be81613594565b82525050565b5f6060820190506135d75f830186612c26565b6135e46020830185612c26565b6135f160408301846135b5565b949350505050565b5f82825260208201905092915050565b7f45544820726566756e64206661696c65640000000000000000000000000000005f82015250565b5f61363d6011836135f9565b915061364882613609565b602082019050919050565b5f6020820190508181035f83015261366a81613631565b9050919050565b5f61367c8286613398565b60018201915061368c8285613398565b60018201915061369c8284613398565b600182019150819050949350505050565b5f61012083015f8301516136c35f860182612ecc565b5060208301516136d660a0860182612f3d565b5060408301516136e960c0860182612f67565b5060608301516136fc60e0860182612f67565b5060808301518482036101008601526137158282612fae565b9150508091505092915050565b5f6020820190508181035f83015261373a81846136ad565b905092915050565b61374b81612f4c565b82525050565b5f6040820190506137645f830185612c26565b6137716020830184613742565b9392505050565b5f60608201905061378b5f830186612c26565b6137986020830185612c26565b6137a56040830184612b8a565b949350505050565b5f6040820190508181035f8301526137c58185613433565b905081810360208301526137d981846134b3565b90509392505050565b5f61012083015f8301516137f85f860182612ecc565b50602083015161380b60a0860182612f3d565b50604083015161381e60c0860182612f67565b50606083015161383160e0860182612f67565b50608083015184820361010086015261384a8282612fae565b9150508091505092915050565b5f6020820190508181035f83015261386f81846137e2565b90509291505056fea264697066735822122094db1f96e4557dcbb1302e671d7625d41d66c65ec7be39a2ff7668a83493156664736f6c634300081c0033000000000000000000000000f8a2c39111fceb9c950aaf28a9e34ebad99b85c1", + "nonce": "0x1b2", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x1466cae", + "logs": [ + { + "address": "0xf8a2c39111fceb9c950aaf28a9e34ebad99b85c1", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000504365bd15e79f04a8457c798a07d20bd59ad0f8", + "0x000000000000000000000000c5a076cad94176c2996b32d8466be1ce757faa27" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x29ab228", + "blockTimestamp": "0x69bfc133", + "transactionHash": "0x81318a9853ba886e1133d8daf2e08372423dd0a3ab7530132f86196471c6b88e", + "transactionIndex": "0x48", + "logIndex": "0x5b6", + "removed": false + }, + { + "address": "0xf8a2c39111fceb9c950aaf28a9e34ebad99b85c1", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000504365bd15e79f04a8457c798a07d20bd59ad0f8", + "0x000000000000000000000000492c412369db76c9cdd9939e6c521579301473a3" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x29ab228", + "blockTimestamp": "0x69bfc133", + "transactionHash": "0x81318a9853ba886e1133d8daf2e08372423dd0a3ab7530132f86196471c6b88e", + "transactionIndex": "0x48", + "logIndex": "0x5b7", + "removed": false + }, + { + "address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000504365bd15e79f04a8457c798a07d20bd59ad0f8", + "0x000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba3" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x29ab228", + "blockTimestamp": "0x69bfc133", + "transactionHash": "0x81318a9853ba886e1133d8daf2e08372423dd0a3ab7530132f86196471c6b88e", + "transactionIndex": "0x48", + "logIndex": "0x5b8", + "removed": false + }, + { + "address": "0x000000000022d473030f116ddee9f6b43ac78ba3", + "topics": [ + "0xda9fa7c1b00402c17d0161b249b1ab8bbec047c5a52207b9c112deffd817036b", + "0x000000000000000000000000504365bd15e79f04a8457c798a07d20bd59ad0f8", + "0x000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913", + "0x0000000000000000000000006ff5693b99212da76ad316178a184ab56d299b43" + ], + "data": "0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000ffffffffffff", + "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x29ab228", + "blockTimestamp": "0x69bfc133", + "transactionHash": "0x81318a9853ba886e1133d8daf2e08372423dd0a3ab7530132f86196471c6b88e", + "transactionIndex": "0x48", + "logIndex": "0x5b9", + "removed": false + }, + { + "address": "0x37f0c2915cecc7e977183b8543fc0864d03e064c", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000504365bd15e79f04a8457c798a07d20bd59ad0f8", + "0x000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba3" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x29ab228", + "blockTimestamp": "0x69bfc133", + "transactionHash": "0x81318a9853ba886e1133d8daf2e08372423dd0a3ab7530132f86196471c6b88e", + "transactionIndex": "0x48", + "logIndex": "0x5ba", + "removed": false + }, + { + "address": "0x000000000022d473030f116ddee9f6b43ac78ba3", + "topics": [ + "0xda9fa7c1b00402c17d0161b249b1ab8bbec047c5a52207b9c112deffd817036b", + "0x000000000000000000000000504365bd15e79f04a8457c798a07d20bd59ad0f8", + "0x00000000000000000000000037f0c2915cecc7e977183b8543fc0864d03e064c", + "0x0000000000000000000000006ff5693b99212da76ad316178a184ab56d299b43" + ], + "data": "0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000ffffffffffff", + "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x29ab228", + "blockTimestamp": "0x69bfc133", + "transactionHash": "0x81318a9853ba886e1133d8daf2e08372423dd0a3ab7530132f86196471c6b88e", + "transactionIndex": "0x48", + "logIndex": "0x5bb", + "removed": false + } + ], + "logsBloom": "0x00010000000000020000000000000000000000000000000000000020000000000000000000000000000000000000104000000000800000000000100000280000000002000000040000005000000000000000000000080800000000000000000000800000000000000080000000000000010000000000000000000000000040000020000000020000400000000000000002000000000000000000000000000000020000100000000000002000800000081000000000100000000000080000000000000000000000000000000000000000200000000000000040000000040000000010000000000000000000000000040000000000000000000200000001000400", + "type": "0x2", + "transactionHash": "0x81318a9853ba886e1133d8daf2e08372423dd0a3ab7530132f86196471c6b88e", + "transactionIndex": "0x48", + "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x29ab228", + "gasUsed": "0x344f30", + "effectiveGasPrice": "0x4dd1e0", + "blobGasUsed": "0xc3e8f", + "from": "0x017596303ee2f3c1250aa67d2d33dbae1d1c4dbf", + "to": null, + "contractAddress": "0x504365bd15e79f04a8457c798a07d20bd59ad0f8", + "daFootprintGasScalar": "0x8b", + "l1BaseFeeScalar": "0x8dd", + "l1BlobBaseFee": "0x25c5f8", + "l1BlobBaseFeeScalar": "0x101c12", + "l1Fee": "0x18e52908", + "l1GasPrice": "0x29101b8", + "l1GasUsed": "0x168d9" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1774174513582, + "chain": 8453, + "commit": "a782326" +} \ No newline at end of file diff --git a/broadcast/DeployZapPlotLinkV2.s.sol/8453/run-latest.json b/broadcast/DeployZapPlotLinkV2.s.sol/8453/run-latest.json new file mode 100644 index 0000000..dcdc141 --- /dev/null +++ b/broadcast/DeployZapPlotLinkV2.s.sol/8453/run-latest.json @@ -0,0 +1,155 @@ +{ + "transactions": [ + { + "hash": "0x81318a9853ba886e1133d8daf2e08372423dd0a3ab7530132f86196471c6b88e", + "transactionType": "CREATE", + "contractName": "ZapPlotLinkV2", + "contractAddress": "0x504365bd15e79f04a8457c798a07d20bd59ad0f8", + "function": null, + "arguments": [ + "0xF8A2C39111FCEB9C950aAf28A9E34EBaD99b85C1" + ], + "transaction": { + "from": "0x017596303ee2f3c1250aa67d2d33dbae1d1c4dbf", + "gas": "0x44008b", + "value": "0x0", + "input": "0x608060405234801561000f575f5ffd5b50604051613e7b380380613e7b83398181016040528101906100319190610476565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610096576040517f644865b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373c5a076cad94176c2996b32d8466be1ce757faa277fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016101849291906104c8565b6020604051808303815f875af11580156101a0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101c49190610524565b508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373492c412369db76c9cdd9939e6c521579301473a37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016102349291906104c8565b6020604051808303815f875af1158015610250573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102749190610524565b5061029873833589fcd6edb6e08f4c7c32d4f71b54bda029136102c160201b60201c565b6102bb7337f0c2915cecc7e977183b8543fc0864d03e064c6102c160201b60201c565b506105c1565b8073ffffffffffffffffffffffffffffffffffffffff1663095ea7b36e22d473030f116ddee9f6b43ac78ba37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161032b9291906104c8565b6020604051808303815f875af1158015610347573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036b9190610524565b506e22d473030f116ddee9f6b43ac78ba373ffffffffffffffffffffffffffffffffffffffff166387517c4582736ff5693b99212da76ad316178a184ab56d299b4373ffffffffffffffffffffffffffffffffffffffff65ffffffffffff6040518563ffffffff1660e01b81526004016103e8949392919061057e565b5f604051808303815f87803b1580156103ff575f5ffd5b505af1158015610411573d5f5f3e3d5ffd5b5050505050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6104458261041c565b9050919050565b6104558161043b565b811461045f575f5ffd5b50565b5f815190506104708161044c565b92915050565b5f6020828403121561048b5761048a610418565b5b5f61049884828501610462565b91505092915050565b6104aa8161043b565b82525050565b5f819050919050565b6104c2816104b0565b82525050565b5f6040820190506104db5f8301856104a1565b6104e860208301846104b9565b9392505050565b5f8115159050919050565b610503816104ef565b811461050d575f5ffd5b50565b5f8151905061051e816104fa565b92915050565b5f6020828403121561053957610538610418565b5b5f61054684828501610510565b91505092915050565b6105588161041c565b82525050565b5f65ffffffffffff82169050919050565b6105788161055e565b82525050565b5f6080820190506105915f8301876104a1565b61059e60208301866104a1565b6105ab604083018561054f565b6105b8606083018461056f565b95945050505050565b6138ad806105ce5f395ff3fe608060405260043610610122575f3560e01c8063b3f1c93d1161009f578063cefa892211610063578063cefa8922146103bc578063d87e4bd1146103e6578063dd1b9c4a14610423578063e8dd7fc31461044d578063f2fde38b1461047757610129565b8063b3f1c93d146102e8578063b9703ded14610318578063c1c1d21814610342578063cb7588241461036c578063cea9d26f1461039457610129565b8063814ac84f116100e6578063814ac84f1461021057806389a30271146102405780638da5cb5b1461026a5780638dae88c214610294578063a734f06e146102be57610129565b806301c2553a1461012d57806304824e701461016a578063161a226e1461019257806346ca626b146101bc5780636afdd850146101e657610129565b3661012957005b5f5ffd5b348015610138575f5ffd5b50610153600480360381019061014e9190612b3a565b61049f565b604051610161929190612b99565b60405180910390f35b348015610175575f5ffd5b50610190600480360381019061018b9190612bfb565b610634565b005b34801561019d575f5ffd5b506101a661072e565b6040516101b39190612c35565b60405180910390f35b3480156101c7575f5ffd5b506101d0610753565b6040516101dd9190612c69565b60405180910390f35b3480156101f1575f5ffd5b506101fa610758565b6040516102079190612c35565b60405180910390f35b61022a60048036038101906102259190612c82565b61076b565b6040516102379190612ce6565b60405180910390f35b34801561024b575f5ffd5b506102546109f9565b6040516102619190612c35565b60405180910390f35b348015610275575f5ffd5b5061027e610a11565b60405161028b9190612c35565b60405180910390f35b34801561029f575f5ffd5b506102a8610a35565b6040516102b59190612d5a565b60405180910390f35b3480156102c9575f5ffd5b506102d2610a4d565b6040516102df9190612c35565b60405180910390f35b61030260048036038101906102fd9190612c82565b610a51565b60405161030f9190612ce6565b60405180910390f35b348015610323575f5ffd5b5061032c610dc1565b6040516103399190612d93565b60405180910390f35b34801561034d575f5ffd5b50610356610dd9565b6040516103639190612dcc565b60405180910390f35b348015610377575f5ffd5b50610392600480360381019061038d9190612de5565b610df1565b005b34801561039f575f5ffd5b506103ba60048036038101906103b59190612b3a565b61121e565b005b3480156103c7575f5ffd5b506103d06112d3565b6040516103dd9190612c35565b60405180910390f35b3480156103f1575f5ffd5b5061040c60048036038101906104079190612b3a565b6112eb565b60405161041a929190612b99565b60405180910390f35b34801561042e575f5ffd5b5061043761147e565b6040516104449190612e2d565b60405180910390f35b348015610458575f5ffd5b50610461611484565b60405161046e9190612e66565b60405180910390f35b348015610482575f5ffd5b5061049d60048036038101906104989190612de5565b61149c565b005b5f5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036104fd57829050610598565b730d5e0f971ed27fbff6c2837bf31316121532048d73ffffffffffffffffffffffffffffffffffffffff1663aa9d21cb6105378786611647565b6040518263ffffffff1660e01b81526004016105539190613047565b60408051808303815f875af115801561056e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610592919061307b565b50809150505b73492c412369db76c9cdd9939e6c521579301473a373ffffffffffffffffffffffffffffffffffffffff1663fb55dbe185835f6040518463ffffffff1660e01b81526004016105e9939291906130c8565b6040805180830381865afa158015610603573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106279190613111565b5080925050935093915050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106b9576040517f086a6b8600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8173ffffffffffffffffffffffffffffffffffffffff16476040516106de9061317c565b5f6040518083038185875af1925050503d805f8114610718576040519150601f19603f3d011682016040523d82523d5f602084013e61071d565b606091505b505090508061072a575f5ffd5b5050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b603c81565b6e22d473030f116ddee9f6b43ac78ba381565b5f5f83036107a5576040517ff4fb71d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603610889575f3414610833576040517f6256698900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61088133308660015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661179b909392919063ffffffff16565b8390506108a0565b61089386856117f0565b61089d8685611995565b90505b73492c412369db76c9cdd9939e6c521579301473a373ffffffffffffffffffffffffffffffffffffffff16630144c5f3868386336040518563ffffffff1660e01b81526004016108f39493929190613190565b6020604051808303815f875af192505050801561092e57506040513d601f19601f8201168201806040525081019061092b91906131d3565b60015b610964576040517f12c0f6d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80925050610970611d46565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f27830bca1834346b6287fed7ebd6791d80a5a6d4b190a1f8b01c09a07786a1a68588866040516109e8939291906131fe565b60405180910390a450949350505050565b73833589fcd6edb6e08f4c7c32d4f71b54bda0291381565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b730d5e0f971ed27fbff6c2837bf31316121532048d81565b5f81565b5f5f8303610a8b576040517ff4fb71d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73c5a076cad94176c2996b32d8466be1ce757faa2773ffffffffffffffffffffffffffffffffffffffff166376a9864b86866040518363ffffffff1660e01b8152600401610adb929190613233565b6040805180830381865afa158015610af5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b19919061307b565b50905060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603610c39575f3414610ba9576040517f6256698900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82811115610be3576040517f12c0f6d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c3133308360015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661179b909392919063ffffffff16565b809150610c66565b610c4386846117f0565b610c4e868285611e3a565b9150610c65868385610c609190613287565b612306565b5b5f73c5a076cad94176c2996b32d8466be1ce757faa2773ffffffffffffffffffffffffffffffffffffffff1663f74bfe8e878785336040518563ffffffff1660e01b8152600401610cba9493929190613190565b6020604051808303815f875af1925050508015610cf557506040513d601f19601f82011682018060405250810190610cf291906131d3565b60015b610d2b576040517f12c0f6d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80915050610d37611d46565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f3b90f0b1565b6e9dac462a873af5d46d5d6177d0096ddc2ddcf38de8ddb5d8fa888786604051610daf939291906131fe565b60405180910390a45050949350505050565b73492c412369db76c9cdd9939e6c521579301473a381565b73c5a076cad94176c2996b32d8466be1ce757faa2781565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e76576040517f086a6b8600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610edb576040517f644865b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373c5a076cad94176c2996b32d8466be1ce757faa275f6040518363ffffffff1660e01b8152600401610f4f9291906132f3565b6020604051808303815f875af1158015610f6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f8f9190613344565b508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373492c412369db76c9cdd9939e6c521579301473a35f6040518363ffffffff1660e01b8152600401610fdf9291906132f3565b6020604051808303815f875af1158015610ffb573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061101f9190613344565b508160015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff1663095ea7b373c5a076cad94176c2996b32d8466be1ce757faa277fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016110cf929190613233565b6020604051808303815f875af11580156110eb573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061110f9190613344565b508173ffffffffffffffffffffffffffffffffffffffff1663095ea7b373492c412369db76c9cdd9939e6c521579301473a37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161117f929190613233565b6020604051808303815f875af115801561119b573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111bf9190613344565b508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f5a1a9bb5f826487cf43e61548d79ffa19cc00e1a554bd9962825f51fa9c767d160405160405180910390a35050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112a3576040517f086a6b8600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112ce82828573ffffffffffffffffffffffffffffffffffffffff166124209092919063ffffffff16565b505050565b7337f0c2915cecc7e977183b8543fc0864d03e064c81565b5f5f73c5a076cad94176c2996b32d8466be1ce757faa2773ffffffffffffffffffffffffffffffffffffffff166376a9864b85856040518363ffffffff1660e01b815260040161133c929190613233565b6040805180830381865afa158015611356573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061137a919061307b565b508091505060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036113db57809150611476565b730d5e0f971ed27fbff6c2837bf31316121532048d73ffffffffffffffffffffffffffffffffffffffff1663587330736114158784611647565b6040518263ffffffff1660e01b81526004016114319190613047565b60408051808303815f875af115801561144c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611470919061307b565b50809250505b935093915050565b610bb881565b736ff5693b99212da76ad316178a184ab56d299b4381565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611521576040517f086a6b8600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611586576040517f644865b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61164f6129f5565b5f5f5f5f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146116ae5760015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16865f6116d4565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660015b92509250925060405180608001604052806040518060a001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001610bb862ffffff168152602001603c60020b81526020015f73ffffffffffffffffffffffffffffffffffffffff1681525081526020018215158152602001866fffffffffffffffffffffffffffffffff16815260200160405180602001604052805f815250815250935050505092915050565b6117a9848484846001612473565b6117ea57836040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016117e19190612c35565b60405180910390fd5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118615780341461185c576040517f6256698900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611991565b73833589fcd6edb6e08f4c7c32d4f71b54bda0291373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806118ee57507337f0c2915cecc7e977183b8543fc0864d03e064c73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b1561195e575f341461192c576040517f6256698900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119593330838573ffffffffffffffffffffffffffffffffffffffff1661179b909392919063ffffffff16565b611990565b6040517f84e3aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5050565b5f5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016119f19190612c35565b602060405180830381865afa158015611a0c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3091906131d3565b90505f5f5f5f73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614611a915760015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16875f611ab7565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660015b9250925092505f6010604051602001611ad091906133af565b60405160208183030381529060405290505f600167ffffffffffffffff811115611afd57611afc6133c9565b5b604051908082528060200260200182016040528015611b3057816020015b6060815260200190600190039081611b1b5790505b509050611b3f8585858b6124e4565b815f81518110611b5257611b516133f6565b5b60200260200101819052505f73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1603611c1557736ff5693b99212da76ad316178a184ab56d299b4373ffffffffffffffffffffffffffffffffffffffff16633593564c898484426040518563ffffffff1660e01b8152600401611be293929190613526565b5f604051808303818588803b158015611bf9575f5ffd5b505af1158015611c0b573d5f5f3e3d5ffd5b5050505050611c94565b736ff5693b99212da76ad316178a184ab56d299b4373ffffffffffffffffffffffffffffffffffffffff16633593564c8383426040518463ffffffff1660e01b8152600401611c6693929190613526565b5f604051808303815f87803b158015611c7d575f5ffd5b505af1158015611c8f573d5f5f3e3d5ffd5b505050505b8560015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611cef9190612c35565b602060405180830381865afa158015611d0a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d2e91906131d3565b611d389190613287565b965050505050505092915050565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611da19190612c35565b602060405180830381865afa158015611dbc573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de091906131d3565b90505f811115611e3757611e36338260015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166124209092919063ffffffff16565b5b50565b5f5f5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614611eec578473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611ea89190612c35565b602060405180830381865afa158015611ec3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ee791906131d3565b611eee565b475b90505f5f5f5f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614611f4f5760015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16885f611f75565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660015b9250925092505f611f898484848b8b61273b565b90505f73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1603612120575f60106004604051602001611fd4929190613569565b60405160208183030381529060405290505f600267ffffffffffffffff811115612001576120006133c9565b5b60405190808252806020026020018201604052801561203457816020015b606081526020019060019003908161201f5790505b50905082815f8151811061204b5761204a6133f6565b5b60200260200101819052505f305f60405160200161206b939291906135c4565b6040516020818303038152906040528160018151811061208e5761208d6133f6565b5b6020026020010181905250736ff5693b99212da76ad316178a184ab56d299b4373ffffffffffffffffffffffffffffffffffffffff16633593564c8a8484426040518563ffffffff1660e01b81526004016120eb93929190613526565b5f604051808303818588803b158015612102575f5ffd5b505af1158015612114573d5f5f3e3d5ffd5b50505050505050612236565b5f601060405160200161213391906133af565b60405160208183030381529060405290505f600167ffffffffffffffff8111156121605761215f6133c9565b5b60405190808252806020026020018201604052801561219357816020015b606081526020019060019003908161217e5790505b50905082815f815181106121aa576121a96133f6565b5b6020026020010181905250736ff5693b99212da76ad316178a184ab56d299b4373ffffffffffffffffffffffffffffffffffffffff16633593564c8383426040518463ffffffff1660e01b815260040161220693929190613526565b5f604051808303815f87803b15801561221d575f5ffd5b505af115801561222f573d5f5f3e3d5ffd5b5050505050505b5f5f73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146122e7578973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016122a39190612c35565b602060405180830381865afa1580156122be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122e291906131d3565b6122e9565b475b905080866122f79190613287565b96505050505050509392505050565b5f81031561241c575f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036123ef575f3373ffffffffffffffffffffffffffffffffffffffff16826040516123669061317c565b5f6040518083038185875af1925050503d805f81146123a0576040519150601f19603f3d011682016040523d82523d5f602084013e6123a5565b606091505b50509050806123e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e090613653565b60405180910390fd5b5061241b565b61241a33828473ffffffffffffffffffffffffffffffffffffffff166124209092919063ffffffff16565b5b5b5050565b61242d8383836001612993565b61246e57826040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016124659190612c35565b60405180910390fd5b505050565b5f5f6323b872dd60e01b9050604051815f525f1960601c87166004525f1960601c86166024528460445260205f60645f5f8c5af1925060015f511483166124d15783831516156124c5573d5f823e3d81fd5b5f883b113d1516831692505b806040525f606052505095945050505050565b60605f6006600c600e6040516020016124ff93929190613671565b60405160208183030381529060405290505f600367ffffffffffffffff81111561252c5761252b6133c9565b5b60405190808252806020026020018201604052801561255f57816020015b606081526020019060019003908161254a5790505b5090505f6040518060a001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff168152602001610bb862ffffff168152602001603c60020b81526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090505f5f876125e757888a6125ea565b89895b915091506040518060a001604052808481526020018915158152602001886fffffffffffffffffffffffffffffffff1681526020015f6fffffffffffffffffffffffffffffffff16815260200160405180602001604052805f8152508152506040516020016126599190613722565b604051602081830303815290604052845f8151811061267b5761267a6133f6565b5b60200260200101819052508187604051602001612699929190613751565b604051602081830303815290604052846001815181106126bc576126bb6133f6565b5b602002602001018190525080305f6040516020016126dc93929190613778565b604051602081830303815290604052846002815181106126ff576126fe6133f6565b5b6020026020010181905250848460405160200161271d9291906137ad565b60405160208183030381529060405295505050505050949350505050565b60605f6008600c600e60405160200161275693929190613671565b60405160208183030381529060405290505f600367ffffffffffffffff811115612783576127826133c9565b5b6040519080825280602002602001820160405280156127b657816020015b60608152602001906001900390816127a15790505b5090505f6040518060a001604052808a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff168152602001610bb862ffffff168152602001603c60020b81526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090505f5f8861283e57898b612841565b8a8a5b915091506040518060a001604052808481526020018a15158152602001896fffffffffffffffffffffffffffffffff168152602001886fffffffffffffffffffffffffffffffff16815260200160405180602001604052805f8152508152506040516020016128b09190613857565b604051602081830303815290604052845f815181106128d2576128d16133f6565b5b602002602001018190525081876040516020016128f0929190613751565b60405160208183030381529060405284600181518110612913576129126133f6565b5b602002602001018190525080305f60405160200161293393929190613778565b60405160208183030381529060405284600281518110612956576129556133f6565b5b602002602001018190525084846040516020016129749291906137ad565b6040516020818303038152906040529550505050505095945050505050565b5f5f63a9059cbb60e01b9050604051815f525f1960601c86166004528460245260205f60445f5f8b5af1925060015f511483166129e75783831516156129db573d5f823e3d81fd5b5f873b113d1516831692505b806040525050949350505050565b6040518060800160405280612a08612a35565b81526020015f151581526020015f6fffffffffffffffffffffffffffffffff168152602001606081525090565b6040518060a001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f62ffffff1681526020015f60020b81526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612ad682612aad565b9050919050565b612ae681612acc565b8114612af0575f5ffd5b50565b5f81359050612b0181612add565b92915050565b5f819050919050565b612b1981612b07565b8114612b23575f5ffd5b50565b5f81359050612b3481612b10565b92915050565b5f5f5f60608486031215612b5157612b50612aa9565b5b5f612b5e86828701612af3565b9350506020612b6f86828701612af3565b9250506040612b8086828701612b26565b9150509250925092565b612b9381612b07565b82525050565b5f604082019050612bac5f830185612b8a565b612bb96020830184612b8a565b9392505050565b5f612bca82612aad565b9050919050565b612bda81612bc0565b8114612be4575f5ffd5b50565b5f81359050612bf581612bd1565b92915050565b5f60208284031215612c1057612c0f612aa9565b5b5f612c1d84828501612be7565b91505092915050565b612c2f81612acc565b82525050565b5f602082019050612c485f830184612c26565b92915050565b5f8160020b9050919050565b612c6381612c4e565b82525050565b5f602082019050612c7c5f830184612c5a565b92915050565b5f5f5f5f60808587031215612c9a57612c99612aa9565b5b5f612ca787828801612af3565b9450506020612cb887828801612af3565b9350506040612cc987828801612b26565b9250506060612cda87828801612b26565b91505092959194509250565b5f602082019050612cf95f830184612b8a565b92915050565b5f819050919050565b5f612d22612d1d612d1884612aad565b612cff565b612aad565b9050919050565b5f612d3382612d08565b9050919050565b5f612d4482612d29565b9050919050565b612d5481612d3a565b82525050565b5f602082019050612d6d5f830184612d4b565b92915050565b5f612d7d82612d29565b9050919050565b612d8d81612d73565b82525050565b5f602082019050612da65f830184612d84565b92915050565b5f612db682612d29565b9050919050565b612dc681612dac565b82525050565b5f602082019050612ddf5f830184612dbd565b92915050565b5f60208284031215612dfa57612df9612aa9565b5b5f612e0784828501612af3565b91505092915050565b5f62ffffff82169050919050565b612e2781612e10565b82525050565b5f602082019050612e405f830184612e1e565b92915050565b5f612e5082612d29565b9050919050565b612e6081612e46565b82525050565b5f602082019050612e795f830184612e57565b92915050565b612e8881612acc565b82525050565b612e9781612e10565b82525050565b612ea681612c4e565b82525050565b5f612eb682612d29565b9050919050565b612ec681612eac565b82525050565b60a082015f820151612ee05f850182612e7f565b506020820151612ef36020850182612e7f565b506040820151612f066040850182612e8e565b506060820151612f196060850182612e9d565b506080820151612f2c6080850182612ebd565b50505050565b5f8115159050919050565b612f4681612f32565b82525050565b5f6fffffffffffffffffffffffffffffffff82169050919050565b612f7081612f4c565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612fb882612f76565b612fc28185612f80565b9350612fd2818560208601612f90565b612fdb81612f9e565b840191505092915050565b5f61010083015f830151612ffc5f860182612ecc565b50602083015161300f60a0860182612f3d565b50604083015161302260c0860182612f67565b50606083015184820360e086015261303a8282612fae565b9150508091505092915050565b5f6020820190508181035f83015261305f8184612fe6565b905092915050565b5f8151905061307581612b10565b92915050565b5f5f6040838503121561309157613090612aa9565b5b5f61309e85828601613067565b92505060206130af85828601613067565b9150509250929050565b6130c281612f32565b82525050565b5f6060820190506130db5f830186612c26565b6130e86020830185612b8a565b6130f560408301846130b9565b949350505050565b5f8151905061310b81612add565b92915050565b5f5f6040838503121561312757613126612aa9565b5b5f61313485828601613067565b9250506020613145858286016130fd565b9150509250929050565b5f81905092915050565b50565b5f6131675f8361314f565b915061317282613159565b5f82019050919050565b5f6131868261315c565b9150819050919050565b5f6080820190506131a35f830187612c26565b6131b06020830186612b8a565b6131bd6040830185612b8a565b6131ca6060830184612c26565b95945050505050565b5f602082840312156131e8576131e7612aa9565b5b5f6131f584828501613067565b91505092915050565b5f6060820190506132115f830186612b8a565b61321e6020830185612b8a565b61322b6040830184612b8a565b949350505050565b5f6040820190506132465f830185612c26565b6132536020830184612b8a565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61329182612b07565b915061329c83612b07565b92508282039050818111156132b4576132b361325a565b5b92915050565b5f819050919050565b5f6132dd6132d86132d3846132ba565b612cff565b612b07565b9050919050565b6132ed816132c3565b82525050565b5f6040820190506133065f830185612c26565b61331360208301846132e4565b9392505050565b61332381612f32565b811461332d575f5ffd5b50565b5f8151905061333e8161331a565b92915050565b5f6020828403121561335957613358612aa9565b5b5f61336684828501613330565b91505092915050565b5f60ff82169050919050565b5f8160f81b9050919050565b5f6133918261337b565b9050919050565b6133a96133a48261336f565b613387565b82525050565b5f6133ba8284613398565b60018201915081905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82825260208201905092915050565b5f61343d82612f76565b6134478185613423565b9350613457818560208601612f90565b61346081612f9e565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f61349f8383612fae565b905092915050565b5f602082019050919050565b5f6134bd8261346b565b6134c78185613475565b9350836020820285016134d985613485565b805f5b8581101561351457848403895281516134f58582613494565b9450613500836134a7565b925060208a019950506001810190506134dc565b50829750879550505050505092915050565b5f6060820190508181035f83015261353e8186613433565b9050818103602083015261355281856134b3565b90506135616040830184612b8a565b949350505050565b5f6135748285613398565b6001820191506135848284613398565b6001820191508190509392505050565b5f6135ae6135a96135a4846132ba565b612cff565b61336f565b9050919050565b6135be81613594565b82525050565b5f6060820190506135d75f830186612c26565b6135e46020830185612c26565b6135f160408301846135b5565b949350505050565b5f82825260208201905092915050565b7f45544820726566756e64206661696c65640000000000000000000000000000005f82015250565b5f61363d6011836135f9565b915061364882613609565b602082019050919050565b5f6020820190508181035f83015261366a81613631565b9050919050565b5f61367c8286613398565b60018201915061368c8285613398565b60018201915061369c8284613398565b600182019150819050949350505050565b5f61012083015f8301516136c35f860182612ecc565b5060208301516136d660a0860182612f3d565b5060408301516136e960c0860182612f67565b5060608301516136fc60e0860182612f67565b5060808301518482036101008601526137158282612fae565b9150508091505092915050565b5f6020820190508181035f83015261373a81846136ad565b905092915050565b61374b81612f4c565b82525050565b5f6040820190506137645f830185612c26565b6137716020830184613742565b9392505050565b5f60608201905061378b5f830186612c26565b6137986020830185612c26565b6137a56040830184612b8a565b949350505050565b5f6040820190508181035f8301526137c58185613433565b905081810360208301526137d981846134b3565b90509392505050565b5f61012083015f8301516137f85f860182612ecc565b50602083015161380b60a0860182612f3d565b50604083015161381e60c0860182612f67565b50606083015161383160e0860182612f67565b50608083015184820361010086015261384a8282612fae565b9150508091505092915050565b5f6020820190508181035f83015261386f81846137e2565b90509291505056fea264697066735822122094db1f96e4557dcbb1302e671d7625d41d66c65ec7be39a2ff7668a83493156664736f6c634300081c0033000000000000000000000000f8a2c39111fceb9c950aaf28a9e34ebad99b85c1", + "nonce": "0x1b2", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x1466cae", + "logs": [ + { + "address": "0xf8a2c39111fceb9c950aaf28a9e34ebad99b85c1", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000504365bd15e79f04a8457c798a07d20bd59ad0f8", + "0x000000000000000000000000c5a076cad94176c2996b32d8466be1ce757faa27" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x29ab228", + "blockTimestamp": "0x69bfc133", + "transactionHash": "0x81318a9853ba886e1133d8daf2e08372423dd0a3ab7530132f86196471c6b88e", + "transactionIndex": "0x48", + "logIndex": "0x5b6", + "removed": false + }, + { + "address": "0xf8a2c39111fceb9c950aaf28a9e34ebad99b85c1", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000504365bd15e79f04a8457c798a07d20bd59ad0f8", + "0x000000000000000000000000492c412369db76c9cdd9939e6c521579301473a3" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x29ab228", + "blockTimestamp": "0x69bfc133", + "transactionHash": "0x81318a9853ba886e1133d8daf2e08372423dd0a3ab7530132f86196471c6b88e", + "transactionIndex": "0x48", + "logIndex": "0x5b7", + "removed": false + }, + { + "address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000504365bd15e79f04a8457c798a07d20bd59ad0f8", + "0x000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba3" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x29ab228", + "blockTimestamp": "0x69bfc133", + "transactionHash": "0x81318a9853ba886e1133d8daf2e08372423dd0a3ab7530132f86196471c6b88e", + "transactionIndex": "0x48", + "logIndex": "0x5b8", + "removed": false + }, + { + "address": "0x000000000022d473030f116ddee9f6b43ac78ba3", + "topics": [ + "0xda9fa7c1b00402c17d0161b249b1ab8bbec047c5a52207b9c112deffd817036b", + "0x000000000000000000000000504365bd15e79f04a8457c798a07d20bd59ad0f8", + "0x000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913", + "0x0000000000000000000000006ff5693b99212da76ad316178a184ab56d299b43" + ], + "data": "0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000ffffffffffff", + "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x29ab228", + "blockTimestamp": "0x69bfc133", + "transactionHash": "0x81318a9853ba886e1133d8daf2e08372423dd0a3ab7530132f86196471c6b88e", + "transactionIndex": "0x48", + "logIndex": "0x5b9", + "removed": false + }, + { + "address": "0x37f0c2915cecc7e977183b8543fc0864d03e064c", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000504365bd15e79f04a8457c798a07d20bd59ad0f8", + "0x000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba3" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x29ab228", + "blockTimestamp": "0x69bfc133", + "transactionHash": "0x81318a9853ba886e1133d8daf2e08372423dd0a3ab7530132f86196471c6b88e", + "transactionIndex": "0x48", + "logIndex": "0x5ba", + "removed": false + }, + { + "address": "0x000000000022d473030f116ddee9f6b43ac78ba3", + "topics": [ + "0xda9fa7c1b00402c17d0161b249b1ab8bbec047c5a52207b9c112deffd817036b", + "0x000000000000000000000000504365bd15e79f04a8457c798a07d20bd59ad0f8", + "0x00000000000000000000000037f0c2915cecc7e977183b8543fc0864d03e064c", + "0x0000000000000000000000006ff5693b99212da76ad316178a184ab56d299b43" + ], + "data": "0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000ffffffffffff", + "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x29ab228", + "blockTimestamp": "0x69bfc133", + "transactionHash": "0x81318a9853ba886e1133d8daf2e08372423dd0a3ab7530132f86196471c6b88e", + "transactionIndex": "0x48", + "logIndex": "0x5bb", + "removed": false + } + ], + "logsBloom": "0x00010000000000020000000000000000000000000000000000000020000000000000000000000000000000000000104000000000800000000000100000280000000002000000040000005000000000000000000000080800000000000000000000800000000000000080000000000000010000000000000000000000000040000020000000020000400000000000000002000000000000000000000000000000020000100000000000002000800000081000000000100000000000080000000000000000000000000000000000000000200000000000000040000000040000000010000000000000000000000000040000000000000000000200000001000400", + "type": "0x2", + "transactionHash": "0x81318a9853ba886e1133d8daf2e08372423dd0a3ab7530132f86196471c6b88e", + "transactionIndex": "0x48", + "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x29ab228", + "gasUsed": "0x344f30", + "effectiveGasPrice": "0x4dd1e0", + "blobGasUsed": "0xc3e8f", + "from": "0x017596303ee2f3c1250aa67d2d33dbae1d1c4dbf", + "to": null, + "contractAddress": "0x504365bd15e79f04a8457c798a07d20bd59ad0f8", + "daFootprintGasScalar": "0x8b", + "l1BaseFeeScalar": "0x8dd", + "l1BlobBaseFee": "0x25c5f8", + "l1BlobBaseFeeScalar": "0x101c12", + "l1Fee": "0x18e52908", + "l1GasPrice": "0x29101b8", + "l1GasUsed": "0x168d9" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1774174513582, + "chain": 8453, + "commit": "a782326" +} \ No newline at end of file diff --git a/lib/openzeppelin-contracts b/lib/openzeppelin-contracts new file mode 160000 index 0000000..5fd1781 --- /dev/null +++ b/lib/openzeppelin-contracts @@ -0,0 +1 @@ +Subproject commit 5fd1781b1454fd1ef8e722282f86f9293cacf256 diff --git a/remappings.txt b/remappings.txt index c8754a5..c47cf80 100644 --- a/remappings.txt +++ b/remappings.txt @@ -4,3 +4,4 @@ v4-core/=lib/v4-core/src/ v4-periphery/=lib/v4-periphery/src/ solmate/=lib/v4-core/lib/solmate/ openzeppelin-contracts/=lib/v4-core/lib/openzeppelin-contracts/ +@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/ diff --git a/script/DeployZapPlotLinkV2.s.sol b/script/DeployZapPlotLinkV2.s.sol new file mode 100644 index 0000000..6c51e08 --- /dev/null +++ b/script/DeployZapPlotLinkV2.s.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +import {Script, console} from "forge-std/Script.sol"; +import {ZapPlotLinkV2} from "../src/ZapPlotLinkV2.sol"; + +/// @title DeployZapPlotLinkV2 — Deploy ZapPlotLink v2 to Base Mainnet +contract DeployZapPlotLinkV2 is Script { + // PLOT token on Base mainnet + address constant PLOT_TOKEN = 0xF8A2C39111FCEB9C950aAf28A9E34EBaD99b85C1; + + function run() external { + uint256 deployerKey = vm.envUint("DEPLOYER_PRIVATE_KEY"); + + vm.startBroadcast(deployerKey); + + ZapPlotLinkV2 zap = new ZapPlotLinkV2(PLOT_TOKEN); + + vm.stopBroadcast(); + + console.log("ZapPlotLinkV2 deployed at:", address(zap)); + console.log("PLOT token:", PLOT_TOKEN); + console.log("Owner:", vm.addr(deployerKey)); + } +} diff --git a/src/ZapPlotLinkV2.sol b/src/ZapPlotLinkV2.sol new file mode 100644 index 0000000..b88fbbf --- /dev/null +++ b/src/ZapPlotLinkV2.sol @@ -0,0 +1,425 @@ +// SPDX-License-Identifier: BSD-3-Clause +pragma solidity ^0.8.28; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import { + IUniversalRouter, + IAllowanceTransfer, + IHooks, + PoolKey, + ExactInputSingleParams, + ExactOutputSingleParams, + QuoteExactSingleParams, + IV4Quoter, + IMCV2_BondFull, + IMCV2_BondPeripheryFull, + Commands, + Actions, + ActionConstants +} from "./interfaces/IZapInterfaces.sol"; + +/// @title ZapPlotLinkV2 +/// @notice Zap contract to mint storyline tokens on PlotLink (MCV2) using various input tokens. +/// @dev Supports PLOT (direct), ETH, USDC, and HUNT as input tokens via Uniswap V4 swaps. +/// Two-hop path: fromToken → PLOT (Uniswap V4) → storyline token (MCV2_Bond). +/// Forked from MintPad ZapUniV4MCV2 with PlotLink adaptations. +contract ZapPlotLinkV2 { + using SafeERC20 for IERC20; + + // ============ Token Addresses (Base Mainnet) ============ + address public constant USDC = 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913; + address public constant HUNT = 0x37f0c2915CeCC7e977183B8543Fc0864d03E064C; + address public constant ETH_ADDRESS = address(0); + + // ============ Uniswap V4 Pool Parameters (0.3% fee) ============ + uint24 public constant POOL_FEE = 3000; + int24 public constant TICK_SPACING = 60; + + // ============ External Contracts (Base Mainnet) ============ + IUniversalRouter public constant UNIVERSAL_ROUTER = IUniversalRouter(0x6fF5693b99212Da76ad316178A184AB56D299b43); + address public constant PERMIT2 = 0x000000000022D473030F116dDEE9F6B43aC78BA3; + IV4Quoter public constant QUOTER = IV4Quoter(0x0d5e0F971ED27FBfF6c2837bf31316121532048D); + IMCV2_BondFull public constant BOND = IMCV2_BondFull(0xc5a076cad94176c2996B32d8466Be1cE757FAa27); + IMCV2_BondPeripheryFull public constant BOND_PERIPHERY = + IMCV2_BondPeripheryFull(0x492C412369Db76C9cdD9939e6C521579301473a3); + + // ============ Owner-updatable state ============ + address public owner; + address public plotToken; + + // ============ Errors ============ + error ZapPlotLink__UnsupportedToken(); + error ZapPlotLink__InvalidAmount(); + error ZapPlotLink__SlippageExceeded(); + error ZapPlotLink__InsufficientPlotReceived(); + error ZapPlotLink__InvalidETHAmount(); + error ZapPlotLink__OnlyOwner(); + error ZapPlotLink__ZeroAddress(); + + // ============ Events ============ + event Minted( + address indexed user, + address indexed fromToken, + address indexed storylineToken, + uint256 storylineAmount, + uint256 fromTokenUsed, + uint256 plotUsed + ); + + event MintedReverse( + address indexed user, + address indexed fromToken, + address indexed storylineToken, + uint256 storylineAmount, + uint256 fromTokenUsed, + uint256 plotUsed + ); + + event PlotTokenUpdated(address indexed oldToken, address indexed newToken); + event OwnershipTransferred(address indexed oldOwner, address indexed newOwner); + + // ============ Modifiers ============ + modifier onlyOwner() { + if (msg.sender != owner) revert ZapPlotLink__OnlyOwner(); + _; + } + + // ============ Constructor ============ + constructor(address _plotToken) { + if (_plotToken == address(0)) revert ZapPlotLink__ZeroAddress(); + owner = msg.sender; + plotToken = _plotToken; + + // Approve PLOT for Bond and BondPeriphery contracts + IERC20(_plotToken).approve(address(BOND), type(uint256).max); + IERC20(_plotToken).approve(address(BOND_PERIPHERY), type(uint256).max); + + // Setup Permit2 approvals for swap input tokens + _setupPermit2Approval(USDC); + _setupPermit2Approval(HUNT); + } + + receive() external payable {} + + // ============ Owner Functions ============ + + /// @notice Update the PLOT token address + function setPlotToken(address newPlotToken) external onlyOwner { + if (newPlotToken == address(0)) revert ZapPlotLink__ZeroAddress(); + address old = plotToken; + + // Revoke old approvals + IERC20(old).approve(address(BOND), 0); + IERC20(old).approve(address(BOND_PERIPHERY), 0); + + plotToken = newPlotToken; + + // Approve new token + IERC20(newPlotToken).approve(address(BOND), type(uint256).max); + IERC20(newPlotToken).approve(address(BOND_PERIPHERY), type(uint256).max); + + emit PlotTokenUpdated(old, newPlotToken); + } + + /// @notice Transfer ownership + function transferOwnership(address newOwner) external onlyOwner { + if (newOwner == address(0)) revert ZapPlotLink__ZeroAddress(); + address old = owner; + owner = newOwner; + emit OwnershipTransferred(old, newOwner); + } + + /// @notice Rescue stuck tokens + function rescueTokens(address token, address to, uint256 amount) external onlyOwner { + IERC20(token).safeTransfer(to, amount); + } + + /// @notice Rescue stuck ETH + function rescueETH(address payable to) external onlyOwner { + (bool ok,) = to.call{value: address(this).balance}(""); + require(ok); + } + + // ============ External Mint Functions ============ + + /// @notice Mint exact amount of storyline tokens using various input tokens + /// @param fromToken Input token (PLOT, USDC, HUNT, or address(0) for ETH) + /// @param storylineToken The storyline token to mint + /// @param storylineAmount Exact amount of storyline tokens to mint + /// @param maxFromTokenAmount Maximum fromToken to spend (slippage protection) + /// @return fromTokenUsed Actual fromToken spent + function mint(address fromToken, address storylineToken, uint256 storylineAmount, uint256 maxFromTokenAmount) + external + payable + returns (uint256 fromTokenUsed) + { + if (storylineAmount == 0) revert ZapPlotLink__InvalidAmount(); + + // getReserveForToken returns (reserveAmount, royalty) where reserveAmount already includes royalty + (uint256 plotRequired,) = BOND.getReserveForToken(storylineToken, storylineAmount); + + if (fromToken == plotToken) { + if (msg.value != 0) revert ZapPlotLink__InvalidETHAmount(); + if (plotRequired > maxFromTokenAmount) revert ZapPlotLink__SlippageExceeded(); + IERC20(plotToken).safeTransferFrom(msg.sender, address(this), plotRequired); + fromTokenUsed = plotRequired; + } else { + _validateAndTransferInput(fromToken, maxFromTokenAmount); + fromTokenUsed = _executeV4SwapExactOutput(fromToken, plotRequired, maxFromTokenAmount); + _refundToken(fromToken, maxFromTokenAmount - fromTokenUsed); + } + + uint256 plotUsed; + try BOND.mint(storylineToken, storylineAmount, plotRequired, msg.sender) returns (uint256 actualPlotUsed) { + plotUsed = actualPlotUsed; + } catch { + revert ZapPlotLink__SlippageExceeded(); + } + + _refundPlot(); + emit Minted(msg.sender, fromToken, storylineToken, storylineAmount, fromTokenUsed, plotUsed); + } + + /// @notice Mint storyline tokens by specifying exact input amount + /// @param fromToken Input token (PLOT, USDC, HUNT, or address(0) for ETH) + /// @param storylineToken The storyline token to mint + /// @param fromTokenAmount Exact fromToken to spend + /// @param minStorylineAmount Minimum storyline tokens to receive (slippage protection) + /// @return storylineAmount Actual storyline tokens minted + function mintReverse(address fromToken, address storylineToken, uint256 fromTokenAmount, uint256 minStorylineAmount) + external + payable + returns (uint256 storylineAmount) + { + if (fromTokenAmount == 0) revert ZapPlotLink__InvalidAmount(); + + uint256 plotAmount; + if (fromToken == plotToken) { + if (msg.value != 0) revert ZapPlotLink__InvalidETHAmount(); + IERC20(plotToken).safeTransferFrom(msg.sender, address(this), fromTokenAmount); + plotAmount = fromTokenAmount; + } else { + _validateAndTransferInput(fromToken, fromTokenAmount); + plotAmount = _executeV4Swap(fromToken, fromTokenAmount); + } + + try BOND_PERIPHERY.mintWithReserveAmount(storylineToken, plotAmount, minStorylineAmount, msg.sender) returns ( + uint256 minted + ) { + storylineAmount = minted; + } catch { + revert ZapPlotLink__SlippageExceeded(); + } + + _refundPlot(); + emit MintedReverse(msg.sender, fromToken, storylineToken, storylineAmount, fromTokenAmount, plotAmount); + } + + // ============ Estimation Functions (call via eth_call) ============ + + /// @notice Estimate fromToken amount needed to mint exact storylineAmount + /// @dev Not view — call via staticcall/eth_call + function estimateMint(address fromToken, address storylineToken, uint256 storylineAmount) + external + returns (uint256 fromTokenAmount, uint256 totalPlotRequired) + { + (totalPlotRequired,) = BOND.getReserveForToken(storylineToken, storylineAmount); + + if (fromToken == plotToken) { + fromTokenAmount = totalPlotRequired; + } else { + (fromTokenAmount,) = QUOTER.quoteExactOutputSingle(_buildQuoteParams(fromToken, uint128(totalPlotRequired))); + } + } + + /// @notice Estimate storylineAmount received for exact fromTokenAmount + /// @dev Not view — call via staticcall/eth_call + function estimateMintReverse(address fromToken, address storylineToken, uint256 fromTokenAmount) + external + returns (uint256 storylineAmount, uint256 plotAmount) + { + if (fromToken == plotToken) { + plotAmount = fromTokenAmount; + } else { + (plotAmount,) = QUOTER.quoteExactInputSingle(_buildQuoteParams(fromToken, uint128(fromTokenAmount))); + } + + (storylineAmount,) = BOND_PERIPHERY.getTokensForReserve(storylineToken, plotAmount, false); + } + + // ============ Internal Functions ============ + + function _buildQuoteParams(address fromToken, uint128 amount) private view returns (QuoteExactSingleParams memory) { + (address currency0, address currency1, bool zeroForOne) = + fromToken == ETH_ADDRESS ? (ETH_ADDRESS, plotToken, true) : (plotToken, fromToken, false); + + return QuoteExactSingleParams({ + poolKey: PoolKey({ + currency0: currency0, + currency1: currency1, + fee: POOL_FEE, + tickSpacing: TICK_SPACING, + hooks: IHooks(address(0)) + }), + zeroForOne: zeroForOne, + exactAmount: amount, + hookData: bytes("") + }); + } + + function _setupPermit2Approval(address token) private { + IERC20(token).approve(PERMIT2, type(uint256).max); + IAllowanceTransfer(PERMIT2).approve(token, address(UNIVERSAL_ROUTER), type(uint160).max, type(uint48).max); + } + + function _validateAndTransferInput(address fromToken, uint256 amount) private { + if (fromToken == ETH_ADDRESS) { + if (msg.value != amount) revert ZapPlotLink__InvalidETHAmount(); + } else if (fromToken == USDC || fromToken == HUNT) { + if (msg.value != 0) revert ZapPlotLink__InvalidETHAmount(); + IERC20(fromToken).safeTransferFrom(msg.sender, address(this), amount); + } else { + revert ZapPlotLink__UnsupportedToken(); + } + } + + /// @notice Execute V4 exactInput swap to PLOT (used by mintReverse) + function _executeV4Swap(address fromToken, uint256 amountIn) private returns (uint256 plotReceived) { + uint256 plotBefore = IERC20(plotToken).balanceOf(address(this)); + + (address currency0, address currency1, bool zeroForOne) = + fromToken == ETH_ADDRESS ? (ETH_ADDRESS, plotToken, true) : (plotToken, fromToken, false); + + bytes memory commands = abi.encodePacked(uint8(Commands.V4_SWAP)); + bytes[] memory inputs = new bytes[](1); + inputs[0] = _buildV4SwapInputExactIn(currency0, currency1, zeroForOne, uint128(amountIn)); + + if (fromToken == ETH_ADDRESS) { + UNIVERSAL_ROUTER.execute{value: amountIn}(commands, inputs, block.timestamp); + } else { + UNIVERSAL_ROUTER.execute(commands, inputs, block.timestamp); + } + + plotReceived = IERC20(plotToken).balanceOf(address(this)) - plotBefore; + } + + /// @notice Execute V4 exactOutput swap to get exact PLOT amount (used by mint) + function _executeV4SwapExactOutput(address fromToken, uint256 plotAmountOut, uint256 amountInMax) + private + returns (uint256 amountIn) + { + uint256 balanceBefore = + fromToken == ETH_ADDRESS ? address(this).balance : IERC20(fromToken).balanceOf(address(this)); + + (address currency0, address currency1, bool zeroForOne) = + fromToken == ETH_ADDRESS ? (ETH_ADDRESS, plotToken, true) : (plotToken, fromToken, false); + + bytes memory swapInput = + _buildV4SwapInputExactOut(currency0, currency1, zeroForOne, uint128(plotAmountOut), uint128(amountInMax)); + + if (fromToken == ETH_ADDRESS) { + bytes memory commands = abi.encodePacked(uint8(Commands.V4_SWAP), uint8(Commands.SWEEP)); + bytes[] memory inputs = new bytes[](2); + inputs[0] = swapInput; + inputs[1] = abi.encode(ETH_ADDRESS, address(this), 0); + UNIVERSAL_ROUTER.execute{value: amountInMax}(commands, inputs, block.timestamp); + } else { + bytes memory commands = abi.encodePacked(uint8(Commands.V4_SWAP)); + bytes[] memory inputs = new bytes[](1); + inputs[0] = swapInput; + UNIVERSAL_ROUTER.execute(commands, inputs, block.timestamp); + } + + uint256 balanceAfter = + fromToken == ETH_ADDRESS ? address(this).balance : IERC20(fromToken).balanceOf(address(this)); + amountIn = balanceBefore - balanceAfter; + } + + function _refundPlot() private { + uint256 balance = IERC20(plotToken).balanceOf(address(this)); + if (balance > 0) { + IERC20(plotToken).safeTransfer(msg.sender, balance); + } + } + + function _refundToken(address token, uint256 amount) private { + if (amount == 0) return; + if (token == ETH_ADDRESS) { + (bool success,) = msg.sender.call{value: amount}(""); + require(success, "ETH refund failed"); + } else { + IERC20(token).safeTransfer(msg.sender, amount); + } + } + + function _buildV4SwapInputExactIn(address currency0, address currency1, bool zeroForOne, uint128 amountIn) + private + view + returns (bytes memory) + { + bytes memory actions = abi.encodePacked( + uint8(Actions.SWAP_EXACT_IN_SINGLE), uint8(Actions.SETTLE_ALL), uint8(Actions.TAKE) + ); + + bytes[] memory params = new bytes[](3); + + PoolKey memory poolKey = PoolKey({ + currency0: currency0, + currency1: currency1, + fee: POOL_FEE, + tickSpacing: TICK_SPACING, + hooks: IHooks(address(0)) + }); + + (address settleToken, address takeToken) = zeroForOne ? (currency0, currency1) : (currency1, currency0); + + params[0] = abi.encode( + ExactInputSingleParams({ + poolKey: poolKey, zeroForOne: zeroForOne, amountIn: amountIn, amountOutMinimum: 0, hookData: bytes("") + }) + ); + params[1] = abi.encode(settleToken, amountIn); + params[2] = abi.encode(takeToken, address(this), ActionConstants.OPEN_DELTA); + + return abi.encode(actions, params); + } + + function _buildV4SwapInputExactOut( + address currency0, + address currency1, + bool zeroForOne, + uint128 amountOut, + uint128 amountInMax + ) private view returns (bytes memory) { + bytes memory actions = abi.encodePacked( + uint8(Actions.SWAP_EXACT_OUT_SINGLE), uint8(Actions.SETTLE_ALL), uint8(Actions.TAKE) + ); + + bytes[] memory params = new bytes[](3); + + PoolKey memory poolKey = PoolKey({ + currency0: currency0, + currency1: currency1, + fee: POOL_FEE, + tickSpacing: TICK_SPACING, + hooks: IHooks(address(0)) + }); + + (address settleToken, address takeToken) = zeroForOne ? (currency0, currency1) : (currency1, currency0); + + params[0] = abi.encode( + ExactOutputSingleParams({ + poolKey: poolKey, + zeroForOne: zeroForOne, + amountOut: amountOut, + amountInMaximum: amountInMax, + hookData: bytes("") + }) + ); + params[1] = abi.encode(settleToken, amountInMax); + params[2] = abi.encode(takeToken, address(this), ActionConstants.OPEN_DELTA); + + return abi.encode(actions, params); + } +} diff --git a/src/interfaces/IZapInterfaces.sol b/src/interfaces/IZapInterfaces.sol new file mode 100644 index 0000000..9610ead --- /dev/null +++ b/src/interfaces/IZapInterfaces.sol @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +// ============ Uniswap V4 Interfaces ============ +interface IUniversalRouter { + function execute(bytes calldata commands, bytes[] calldata inputs, uint256 deadline) external payable; +} + +interface IAllowanceTransfer { + function approve(address token, address spender, uint160 amount, uint48 expiration) external; +} + +interface IHooks {} + +struct PoolKey { + address currency0; + address currency1; + uint24 fee; + int24 tickSpacing; + IHooks hooks; +} + +struct ExactInputSingleParams { + PoolKey poolKey; + bool zeroForOne; + uint128 amountIn; + uint128 amountOutMinimum; + bytes hookData; +} + +struct ExactOutputSingleParams { + PoolKey poolKey; + bool zeroForOne; + uint128 amountOut; + uint128 amountInMaximum; + bytes hookData; +} + +struct QuoteExactSingleParams { + PoolKey poolKey; + bool zeroForOne; + uint128 exactAmount; + bytes hookData; +} + +interface IV4Quoter { + function quoteExactInputSingle(QuoteExactSingleParams memory params) + external + returns (uint256 amountOut, uint256 gasEstimate); + + function quoteExactOutputSingle(QuoteExactSingleParams memory params) + external + returns (uint256 amountIn, uint256 gasEstimate); +} + +// ============ Mint Club V2 Interfaces ============ +interface IMCV2_BondFull { + function mint(address token, uint256 tokensToMint, uint256 maxReserveAmount, address receiver) + external + returns (uint256); + + function getReserveForToken(address token, uint256 tokensToMint) + external + view + returns (uint256 reserveAmount, uint256 royalty); +} + +interface IMCV2_BondPeripheryFull { + function mintWithReserveAmount(address token, uint256 reserveAmount, uint256 minTokensToMint, address receiver) + external + returns (uint256 tokensMinted); + + function getTokensForReserve(address tokenAddress, uint256 reserveAmount, bool useCeilDivision) + external + view + returns (uint256 tokensToMint, address reserveAddress); +} + +// ============ Constants ============ +library Commands { + uint256 constant SWEEP = 0x04; + uint256 constant V4_SWAP = 0x10; +} + +library Actions { + uint256 constant SWAP_EXACT_IN_SINGLE = 0x06; + uint256 constant SWAP_EXACT_OUT_SINGLE = 0x08; + uint256 constant SETTLE_ALL = 0x0c; + uint256 constant TAKE = 0x0e; +} + +library ActionConstants { + uint256 constant OPEN_DELTA = 0; +} From 22cfa1c1b2ebf890e55494e7e8a9ebc15cd1e889 Mon Sep 17 00:00:00 2001 From: Cho Young-Hwi Date: Sun, 22 Mar 2026 10:19:05 +0000 Subject: [PATCH 2/2] [#243] Fix pool key sorting, add setPoolKey(), redeploy Addresses T2a review feedback: - Fix PoolKey sorting: properly sort fromToken/plotToken by address to ensure canonical V4 pool ordering (currency0 < currency1) - Add _sortPoolKey() helper for dynamic sorting - Add setPoolKey(fee, tickSpacing) owner function as required by spec - Make poolFee and poolTickSpacing owner-updatable state variables Redeployed: 0xEF6a8640c836b16Eb8cCD8016Ead4C8517aC3033 Verified on Sourcify. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../8453/run-1774174729845.json | 155 ++++++++++++++++++ .../8453/run-latest.json | 112 ++++++------- src/ZapPlotLinkV2.sol | 59 +++++-- 3 files changed, 255 insertions(+), 71 deletions(-) create mode 100644 broadcast/DeployZapPlotLinkV2.s.sol/8453/run-1774174729845.json diff --git a/broadcast/DeployZapPlotLinkV2.s.sol/8453/run-1774174729845.json b/broadcast/DeployZapPlotLinkV2.s.sol/8453/run-1774174729845.json new file mode 100644 index 0000000..d406dd1 --- /dev/null +++ b/broadcast/DeployZapPlotLinkV2.s.sol/8453/run-1774174729845.json @@ -0,0 +1,155 @@ +{ + "transactions": [ + { + "hash": "0xca9f0cf3999e192d1f851453b8e2c07b6f481059813b82f709016377a1944ea8", + "transactionType": "CREATE", + "contractName": "ZapPlotLinkV2", + "contractAddress": "0xef6a8640c836b16eb8ccd8016ead4c8517ac3033", + "function": null, + "arguments": [ + "0xF8A2C39111FCEB9C950aAf28A9E34EBaD99b85C1" + ], + "transaction": { + "from": "0x017596303ee2f3c1250aa67d2d33dbae1d1c4dbf", + "gas": "0x45e016", + "value": "0x0", + "input": "0x6080604052610bb85f5f6101000a81548162ffffff021916908362ffffff160217905550603c5f60036101000a81548162ffffff021916908360020b62ffffff160217905550348015610050575f5ffd5b5060405161406c38038061406c833981810160405281019061007291906104b8565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100d7576040517f644865b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f60066101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373c5a076cad94176c2996b32d8466be1ce757faa277fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016101c692919061050a565b6020604051808303815f875af11580156101e2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102069190610566565b508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373492c412369db76c9cdd9939e6c521579301473a37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161027692919061050a565b6020604051808303815f875af1158015610292573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102b69190610566565b506102da73833589fcd6edb6e08f4c7c32d4f71b54bda0291361030360201b60201c565b6102fd7337f0c2915cecc7e977183b8543fc0864d03e064c61030360201b60201c565b50610603565b8073ffffffffffffffffffffffffffffffffffffffff1663095ea7b36e22d473030f116ddee9f6b43ac78ba37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161036d92919061050a565b6020604051808303815f875af1158015610389573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103ad9190610566565b506e22d473030f116ddee9f6b43ac78ba373ffffffffffffffffffffffffffffffffffffffff166387517c4582736ff5693b99212da76ad316178a184ab56d299b4373ffffffffffffffffffffffffffffffffffffffff65ffffffffffff6040518563ffffffff1660e01b815260040161042a94939291906105c0565b5f604051808303815f87803b158015610441575f5ffd5b505af1158015610453573d5f5f3e3d5ffd5b5050505050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6104878261045e565b9050919050565b6104978161047d565b81146104a1575f5ffd5b50565b5f815190506104b28161048e565b92915050565b5f602082840312156104cd576104cc61045a565b5b5f6104da848285016104a4565b91505092915050565b6104ec8161047d565b82525050565b5f819050919050565b610504816104f2565b82525050565b5f60408201905061051d5f8301856104e3565b61052a60208301846104fb565b9392505050565b5f8115159050919050565b61054581610531565b811461054f575f5ffd5b50565b5f815190506105608161053c565b92915050565b5f6020828403121561057b5761057a61045a565b5b5f61058884828501610552565b91505092915050565b61059a8161045e565b82525050565b5f65ffffffffffff82169050919050565b6105ba816105a0565b82525050565b5f6080820190506105d35f8301876104e3565b6105e060208301866104e3565b6105ed6040830185610591565b6105fa60608301846105b1565b95945050505050565b613a5c806106105f395ff3fe60806040526004361061012d575f3560e01c8063a734f06e116100aa578063cb7588241161006e578063cb758824146103c9578063cea9d26f146103f1578063cefa892214610419578063d87e4bd114610443578063e8dd7fc314610480578063f2fde38b146104aa57610134565b8063a734f06e146102f3578063b3f1c93d1461031d578063b7d1abbc1461034d578063b9703ded14610375578063c1c1d2181461039f57610134565b80637164cf9b116100f15780637164cf9b1461021b578063814ac84f1461024557806389a30271146102755780638da5cb5b1461029f5780638dae88c2146102c957610134565b806301c2553a1461013857806304824e7014610175578063089fe6aa1461019d578063161a226e146101c75780636afdd850146101f157610134565b3661013457005b5f5ffd5b348015610143575f5ffd5b5061015e60048036038101906101599190612c57565b6104d2565b60405161016c929190612cb6565b60405180910390f35b348015610180575f5ffd5b5061019b60048036038101906101969190612d18565b610667565b005b3480156101a8575f5ffd5b506101b1610762565b6040516101be9190612d60565b60405180910390f35b3480156101d2575f5ffd5b506101db610775565b6040516101e89190612d88565b60405180910390f35b3480156101fc575f5ffd5b5061020561079a565b6040516102129190612d88565b60405180910390f35b348015610226575f5ffd5b5061022f6107ad565b60405161023c9190612dbc565b60405180910390f35b61025f600480360381019061025a9190612dd5565b6107bf565b60405161026c9190612e39565b60405180910390f35b348015610280575f5ffd5b50610289610a4d565b6040516102969190612d88565b60405180910390f35b3480156102aa575f5ffd5b506102b3610a65565b6040516102c09190612d88565b60405180910390f35b3480156102d4575f5ffd5b506102dd610a8a565b6040516102ea9190612ead565b60405180910390f35b3480156102fe575f5ffd5b50610307610aa2565b6040516103149190612d88565b60405180910390f35b61033760048036038101906103329190612dd5565b610aa6565b6040516103449190612e39565b60405180910390f35b348015610358575f5ffd5b50610373600480360381019061036e9190612f1a565b610e16565b005b348015610380575f5ffd5b50610389610ede565b6040516103969190612f78565b60405180910390f35b3480156103aa575f5ffd5b506103b3610ef6565b6040516103c09190612fb1565b60405180910390f35b3480156103d4575f5ffd5b506103ef60048036038101906103ea9190612fca565b610f0e565b005b3480156103fc575f5ffd5b5061041760048036038101906104129190612c57565b61133c565b005b348015610424575f5ffd5b5061042d6113f2565b60405161043a9190612d88565b60405180910390f35b34801561044e575f5ffd5b5061046960048036038101906104649190612c57565b61140a565b604051610477929190612cb6565b60405180910390f35b34801561048b575f5ffd5b5061049461159d565b6040516104a19190613015565b60405180910390f35b3480156104b5575f5ffd5b506104d060048036038101906104cb9190612fca565b6115b5565b005b5f5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610530578290506105cb565b730d5e0f971ed27fbff6c2837bf31316121532048d73ffffffffffffffffffffffffffffffffffffffff1663aa9d21cb61056a8786611763565b6040518263ffffffff1660e01b815260040161058691906131f6565b60408051808303815f875af11580156105a1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105c5919061322a565b50809150505b73492c412369db76c9cdd9939e6c521579301473a373ffffffffffffffffffffffffffffffffffffffff1663fb55dbe185835f6040518463ffffffff1660e01b815260040161061c93929190613277565b6040805180830381865afa158015610636573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061065a91906132c0565b5080925050935093915050565b5f60069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106ed576040517f086a6b8600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8173ffffffffffffffffffffffffffffffffffffffff16476040516107129061332b565b5f6040518083038185875af1925050503d805f811461074c576040519150601f19603f3d011682016040523d82523d5f602084013e610751565b606091505b505090508061075e575f5ffd5b5050565b5f5f9054906101000a900462ffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6e22d473030f116ddee9f6b43ac78ba381565b5f60039054906101000a900460020b81565b5f5f83036107f9576040517ff4fb71d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16036108dd575f3414610887576040517f6256698900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108d533308660015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611858909392919063ffffffff16565b8390506108f4565b6108e786856118ad565b6108f18685611a52565b90505b73492c412369db76c9cdd9939e6c521579301473a373ffffffffffffffffffffffffffffffffffffffff16630144c5f3868386336040518563ffffffff1660e01b8152600401610947949392919061333f565b6020604051808303815f875af192505050801561098257506040513d601f19601f8201168201806040525081019061097f9190613382565b60015b6109b8576040517f12c0f6d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b809250506109c4611d8a565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f27830bca1834346b6287fed7ebd6791d80a5a6d4b190a1f8b01c09a07786a1a6858886604051610a3c939291906133ad565b60405180910390a450949350505050565b73833589fcd6edb6e08f4c7c32d4f71b54bda0291381565b5f60069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b730d5e0f971ed27fbff6c2837bf31316121532048d81565b5f81565b5f5f8303610ae0576040517ff4fb71d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73c5a076cad94176c2996b32d8466be1ce757faa2773ffffffffffffffffffffffffffffffffffffffff166376a9864b86866040518363ffffffff1660e01b8152600401610b309291906133e2565b6040805180830381865afa158015610b4a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6e919061322a565b50905060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603610c8e575f3414610bfe576040517f6256698900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82811115610c38576040517f12c0f6d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c8633308360015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611858909392919063ffffffff16565b809150610cbb565b610c9886846118ad565b610ca3868285611e7e565b9150610cba868385610cb59190613436565b6122d1565b5b5f73c5a076cad94176c2996b32d8466be1ce757faa2773ffffffffffffffffffffffffffffffffffffffff1663f74bfe8e878785336040518563ffffffff1660e01b8152600401610d0f949392919061333f565b6020604051808303815f875af1925050508015610d4a57506040513d601f19601f82011682018060405250810190610d479190613382565b60015b610d80576040517f12c0f6d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80915050610d8c611d8a565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f3b90f0b1565b6e9dac462a873af5d46d5d6177d0096ddc2ddcf38de8ddb5d8fa888786604051610e04939291906133ad565b60405180910390a45050949350505050565b5f60069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e9c576040517f086a6b8600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f5f6101000a81548162ffffff021916908362ffffff160217905550805f60036101000a81548162ffffff021916908360020b62ffffff1602179055505050565b73492c412369db76c9cdd9939e6c521579301473a381565b73c5a076cad94176c2996b32d8466be1ce757faa2781565b5f60069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f94576040517f086a6b8600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ff9576040517f644865b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373c5a076cad94176c2996b32d8466be1ce757faa275f6040518363ffffffff1660e01b815260040161106d9291906134a2565b6020604051808303815f875af1158015611089573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110ad91906134f3565b508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373492c412369db76c9cdd9939e6c521579301473a35f6040518363ffffffff1660e01b81526004016110fd9291906134a2565b6020604051808303815f875af1158015611119573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113d91906134f3565b508160015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff1663095ea7b373c5a076cad94176c2996b32d8466be1ce757faa277fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016111ed9291906133e2565b6020604051808303815f875af1158015611209573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061122d91906134f3565b508173ffffffffffffffffffffffffffffffffffffffff1663095ea7b373492c412369db76c9cdd9939e6c521579301473a37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161129d9291906133e2565b6020604051808303815f875af11580156112b9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112dd91906134f3565b508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f5a1a9bb5f826487cf43e61548d79ffa19cc00e1a554bd9962825f51fa9c767d160405160405180910390a35050565b5f60069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113c2576040517f086a6b8600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113ed82828573ffffffffffffffffffffffffffffffffffffffff166123eb9092919063ffffffff16565b505050565b7337f0c2915cecc7e977183b8543fc0864d03e064c81565b5f5f73c5a076cad94176c2996b32d8466be1ce757faa2773ffffffffffffffffffffffffffffffffffffffff166376a9864b85856040518363ffffffff1660e01b815260040161145b9291906133e2565b6040805180830381865afa158015611475573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611499919061322a565b508091505060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036114fa57809150611595565b730d5e0f971ed27fbff6c2837bf31316121532048d73ffffffffffffffffffffffffffffffffffffffff1663587330736115348784611763565b6040518263ffffffff1660e01b815260040161155091906131f6565b60408051808303815f875af115801561156b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061158f919061322a565b50809250505b935093915050565b736ff5693b99212da76ad316178a184ab56d299b4381565b5f60069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461163b576040517f086a6b8600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036116a0576040517f644865b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60069054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f60066101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61176b612b12565b5f5f5f6117778661243e565b92509250925060405180608001604052806040518060a001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020015f5f9054906101000a900462ffffff1662ffffff1681526020015f60039054906101000a900460020b60020b81526020015f73ffffffffffffffffffffffffffffffffffffffff1681525081526020018215158152602001866fffffffffffffffffffffffffffffffff16815260200160405180602001604052805f815250815250935050505092915050565b61186684848484600161255c565b6118a757836040517f5274afe700000000000000000000000000000000000000000000000000000000815260040161189e9190612d88565b60405180910390fd5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361191e57803414611919576040517f6256698900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a4e565b73833589fcd6edb6e08f4c7c32d4f71b54bda0291373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806119ab57507337f0c2915cecc7e977183b8543fc0864d03e064c73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b15611a1b575f34146119e9576040517f6256698900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a163330838573ffffffffffffffffffffffffffffffffffffffff16611858909392919063ffffffff16565b611a4d565b6040517f84e3aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5050565b5f5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611aae9190612d88565b602060405180830381865afa158015611ac9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aed9190613382565b90505f5f5f611afb8761243e565b9250925092505f6010604051602001611b14919061355e565b60405160208183030381529060405290505f600167ffffffffffffffff811115611b4157611b40613578565b5b604051908082528060200260200182016040528015611b7457816020015b6060815260200190600190039081611b5f5790505b509050611b838585858b6125cd565b815f81518110611b9657611b956135a5565b5b60200260200101819052505f73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1603611c5957736ff5693b99212da76ad316178a184ab56d299b4373ffffffffffffffffffffffffffffffffffffffff16633593564c898484426040518563ffffffff1660e01b8152600401611c26939291906136d5565b5f604051808303818588803b158015611c3d575f5ffd5b505af1158015611c4f573d5f5f3e3d5ffd5b5050505050611cd8565b736ff5693b99212da76ad316178a184ab56d299b4373ffffffffffffffffffffffffffffffffffffffff16633593564c8383426040518463ffffffff1660e01b8152600401611caa939291906136d5565b5f604051808303815f87803b158015611cc1575f5ffd5b505af1158015611cd3573d5f5f3e3d5ffd5b505050505b8560015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611d339190612d88565b602060405180830381865afa158015611d4e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d729190613382565b611d7c9190613436565b965050505050505092915050565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611de59190612d88565b602060405180830381865afa158015611e00573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e249190613382565b90505f811115611e7b57611e7a338260015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166123eb9092919063ffffffff16565b5b50565b5f5f5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614611f30578473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611eec9190612d88565b602060405180830381865afa158015611f07573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f2b9190613382565b611f32565b475b90505f5f5f611f408861243e565b9250925092505f611f548484848b8b61283e565b90505f73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16036120eb575f60106004604051602001611f9f929190613718565b60405160208183030381529060405290505f600267ffffffffffffffff811115611fcc57611fcb613578565b5b604051908082528060200260200182016040528015611fff57816020015b6060815260200190600190039081611fea5790505b50905082815f81518110612016576120156135a5565b5b60200260200101819052505f305f60405160200161203693929190613773565b60405160208183030381529060405281600181518110612059576120586135a5565b5b6020026020010181905250736ff5693b99212da76ad316178a184ab56d299b4373ffffffffffffffffffffffffffffffffffffffff16633593564c8a8484426040518563ffffffff1660e01b81526004016120b6939291906136d5565b5f604051808303818588803b1580156120cd575f5ffd5b505af11580156120df573d5f5f3e3d5ffd5b50505050505050612201565b5f60106040516020016120fe919061355e565b60405160208183030381529060405290505f600167ffffffffffffffff81111561212b5761212a613578565b5b60405190808252806020026020018201604052801561215e57816020015b60608152602001906001900390816121495790505b50905082815f81518110612175576121746135a5565b5b6020026020010181905250736ff5693b99212da76ad316178a184ab56d299b4373ffffffffffffffffffffffffffffffffffffffff16633593564c8383426040518463ffffffff1660e01b81526004016121d1939291906136d5565b5f604051808303815f87803b1580156121e8575f5ffd5b505af11580156121fa573d5f5f3e3d5ffd5b5050505050505b5f5f73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146122b2578973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161226e9190612d88565b602060405180830381865afa158015612289573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122ad9190613382565b6122b4565b475b905080866122c29190613436565b96505050505050509392505050565b5f8103156123e7575f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036123ba575f3373ffffffffffffffffffffffffffffffffffffffff16826040516123319061332b565b5f6040518083038185875af1925050503d805f811461236b576040519150601f19603f3d011682016040523d82523d5f602084013e612370565b606091505b50509050806123b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ab90613802565b60405180910390fd5b506123e6565b6123e533828473ffffffffffffffffffffffffffffffffffffffff166123eb9092919063ffffffff16565b5b5b5050565b6123f88383836001612ab0565b61243957826040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016124309190612d88565b60405180910390fd5b505050565b5f5f5f5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036124a4575f925060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915060019050612555565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610156125295783925060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915060019050612554565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692508391505f90505b5b9193909250565b5f5f6323b872dd60e01b9050604051815f525f1960601c87166004525f1960601c86166024528460445260205f60645f5f8c5af1925060015f511483166125ba5783831516156125ae573d5f823e3d81fd5b5f883b113d1516831692505b806040525f606052505095945050505050565b60605f6006600c600e6040516020016125e893929190613820565b60405160208183030381529060405290505f600367ffffffffffffffff81111561261557612614613578565b5b60405190808252806020026020018201604052801561264857816020015b60608152602001906001900390816126335790505b5090505f6040518060a001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1681526020015f5f9054906101000a900462ffffff1662ffffff1681526020015f60039054906101000a900460020b60020b81526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090505f5f876126ea57888a6126ed565b89895b915091506040518060a001604052808481526020018915158152602001886fffffffffffffffffffffffffffffffff1681526020015f6fffffffffffffffffffffffffffffffff16815260200160405180602001604052805f81525081525060405160200161275c91906138d1565b604051602081830303815290604052845f8151811061277e5761277d6135a5565b5b6020026020010181905250818760405160200161279c929190613900565b604051602081830303815290604052846001815181106127bf576127be6135a5565b5b602002602001018190525080305f6040516020016127df93929190613927565b60405160208183030381529060405284600281518110612802576128016135a5565b5b6020026020010181905250848460405160200161282092919061395c565b60405160208183030381529060405295505050505050949350505050565b60605f6008600c600e60405160200161285993929190613820565b60405160208183030381529060405290505f600367ffffffffffffffff81111561288657612885613578565b5b6040519080825280602002602001820160405280156128b957816020015b60608152602001906001900390816128a45790505b5090505f6040518060a001604052808a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020015f5f9054906101000a900462ffffff1662ffffff1681526020015f60039054906101000a900460020b60020b81526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090505f5f8861295b57898b61295e565b8a8a5b915091506040518060a001604052808481526020018a15158152602001896fffffffffffffffffffffffffffffffff168152602001886fffffffffffffffffffffffffffffffff16815260200160405180602001604052805f8152508152506040516020016129cd9190613a06565b604051602081830303815290604052845f815181106129ef576129ee6135a5565b5b60200260200101819052508187604051602001612a0d929190613900565b60405160208183030381529060405284600181518110612a3057612a2f6135a5565b5b602002602001018190525080305f604051602001612a5093929190613927565b60405160208183030381529060405284600281518110612a7357612a726135a5565b5b60200260200101819052508484604051602001612a9192919061395c565b6040516020818303038152906040529550505050505095945050505050565b5f5f63a9059cbb60e01b9050604051815f525f1960601c86166004528460245260205f60445f5f8b5af1925060015f51148316612b04578383151615612af8573d5f823e3d81fd5b5f873b113d1516831692505b806040525050949350505050565b6040518060800160405280612b25612b52565b81526020015f151581526020015f6fffffffffffffffffffffffffffffffff168152602001606081525090565b6040518060a001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f62ffffff1681526020015f60020b81526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612bf382612bca565b9050919050565b612c0381612be9565b8114612c0d575f5ffd5b50565b5f81359050612c1e81612bfa565b92915050565b5f819050919050565b612c3681612c24565b8114612c40575f5ffd5b50565b5f81359050612c5181612c2d565b92915050565b5f5f5f60608486031215612c6e57612c6d612bc6565b5b5f612c7b86828701612c10565b9350506020612c8c86828701612c10565b9250506040612c9d86828701612c43565b9150509250925092565b612cb081612c24565b82525050565b5f604082019050612cc95f830185612ca7565b612cd66020830184612ca7565b9392505050565b5f612ce782612bca565b9050919050565b612cf781612cdd565b8114612d01575f5ffd5b50565b5f81359050612d1281612cee565b92915050565b5f60208284031215612d2d57612d2c612bc6565b5b5f612d3a84828501612d04565b91505092915050565b5f62ffffff82169050919050565b612d5a81612d43565b82525050565b5f602082019050612d735f830184612d51565b92915050565b612d8281612be9565b82525050565b5f602082019050612d9b5f830184612d79565b92915050565b5f8160020b9050919050565b612db681612da1565b82525050565b5f602082019050612dcf5f830184612dad565b92915050565b5f5f5f5f60808587031215612ded57612dec612bc6565b5b5f612dfa87828801612c10565b9450506020612e0b87828801612c10565b9350506040612e1c87828801612c43565b9250506060612e2d87828801612c43565b91505092959194509250565b5f602082019050612e4c5f830184612ca7565b92915050565b5f819050919050565b5f612e75612e70612e6b84612bca565b612e52565b612bca565b9050919050565b5f612e8682612e5b565b9050919050565b5f612e9782612e7c565b9050919050565b612ea781612e8d565b82525050565b5f602082019050612ec05f830184612e9e565b92915050565b612ecf81612d43565b8114612ed9575f5ffd5b50565b5f81359050612eea81612ec6565b92915050565b612ef981612da1565b8114612f03575f5ffd5b50565b5f81359050612f1481612ef0565b92915050565b5f5f60408385031215612f3057612f2f612bc6565b5b5f612f3d85828601612edc565b9250506020612f4e85828601612f06565b9150509250929050565b5f612f6282612e7c565b9050919050565b612f7281612f58565b82525050565b5f602082019050612f8b5f830184612f69565b92915050565b5f612f9b82612e7c565b9050919050565b612fab81612f91565b82525050565b5f602082019050612fc45f830184612fa2565b92915050565b5f60208284031215612fdf57612fde612bc6565b5b5f612fec84828501612c10565b91505092915050565b5f612fff82612e7c565b9050919050565b61300f81612ff5565b82525050565b5f6020820190506130285f830184613006565b92915050565b61303781612be9565b82525050565b61304681612d43565b82525050565b61305581612da1565b82525050565b5f61306582612e7c565b9050919050565b6130758161305b565b82525050565b60a082015f82015161308f5f85018261302e565b5060208201516130a2602085018261302e565b5060408201516130b5604085018261303d565b5060608201516130c8606085018261304c565b5060808201516130db608085018261306c565b50505050565b5f8115159050919050565b6130f5816130e1565b82525050565b5f6fffffffffffffffffffffffffffffffff82169050919050565b61311f816130fb565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61316782613125565b613171818561312f565b935061318181856020860161313f565b61318a8161314d565b840191505092915050565b5f61010083015f8301516131ab5f86018261307b565b5060208301516131be60a08601826130ec565b5060408301516131d160c0860182613116565b50606083015184820360e08601526131e9828261315d565b9150508091505092915050565b5f6020820190508181035f83015261320e8184613195565b905092915050565b5f8151905061322481612c2d565b92915050565b5f5f604083850312156132405761323f612bc6565b5b5f61324d85828601613216565b925050602061325e85828601613216565b9150509250929050565b613271816130e1565b82525050565b5f60608201905061328a5f830186612d79565b6132976020830185612ca7565b6132a46040830184613268565b949350505050565b5f815190506132ba81612bfa565b92915050565b5f5f604083850312156132d6576132d5612bc6565b5b5f6132e385828601613216565b92505060206132f4858286016132ac565b9150509250929050565b5f81905092915050565b50565b5f6133165f836132fe565b915061332182613308565b5f82019050919050565b5f6133358261330b565b9150819050919050565b5f6080820190506133525f830187612d79565b61335f6020830186612ca7565b61336c6040830185612ca7565b6133796060830184612d79565b95945050505050565b5f6020828403121561339757613396612bc6565b5b5f6133a484828501613216565b91505092915050565b5f6060820190506133c05f830186612ca7565b6133cd6020830185612ca7565b6133da6040830184612ca7565b949350505050565b5f6040820190506133f55f830185612d79565b6134026020830184612ca7565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61344082612c24565b915061344b83612c24565b925082820390508181111561346357613462613409565b5b92915050565b5f819050919050565b5f61348c61348761348284613469565b612e52565b612c24565b9050919050565b61349c81613472565b82525050565b5f6040820190506134b55f830185612d79565b6134c26020830184613493565b9392505050565b6134d2816130e1565b81146134dc575f5ffd5b50565b5f815190506134ed816134c9565b92915050565b5f6020828403121561350857613507612bc6565b5b5f613515848285016134df565b91505092915050565b5f60ff82169050919050565b5f8160f81b9050919050565b5f6135408261352a565b9050919050565b6135586135538261351e565b613536565b82525050565b5f6135698284613547565b60018201915081905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82825260208201905092915050565b5f6135ec82613125565b6135f681856135d2565b935061360681856020860161313f565b61360f8161314d565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f61364e838361315d565b905092915050565b5f602082019050919050565b5f61366c8261361a565b6136768185613624565b93508360208202850161368885613634565b805f5b858110156136c357848403895281516136a48582613643565b94506136af83613656565b925060208a0199505060018101905061368b565b50829750879550505050505092915050565b5f6060820190508181035f8301526136ed81866135e2565b905081810360208301526137018185613662565b90506137106040830184612ca7565b949350505050565b5f6137238285613547565b6001820191506137338284613547565b6001820191508190509392505050565b5f61375d61375861375384613469565b612e52565b61351e565b9050919050565b61376d81613743565b82525050565b5f6060820190506137865f830186612d79565b6137936020830185612d79565b6137a06040830184613764565b949350505050565b5f82825260208201905092915050565b7f45544820726566756e64206661696c65640000000000000000000000000000005f82015250565b5f6137ec6011836137a8565b91506137f7826137b8565b602082019050919050565b5f6020820190508181035f830152613819816137e0565b9050919050565b5f61382b8286613547565b60018201915061383b8285613547565b60018201915061384b8284613547565b600182019150819050949350505050565b5f61012083015f8301516138725f86018261307b565b50602083015161388560a08601826130ec565b50604083015161389860c0860182613116565b5060608301516138ab60e0860182613116565b5060808301518482036101008601526138c4828261315d565b9150508091505092915050565b5f6020820190508181035f8301526138e9818461385c565b905092915050565b6138fa816130fb565b82525050565b5f6040820190506139135f830185612d79565b61392060208301846138f1565b9392505050565b5f60608201905061393a5f830186612d79565b6139476020830185612d79565b6139546040830184612ca7565b949350505050565b5f6040820190508181035f83015261397481856135e2565b905081810360208301526139888184613662565b90509392505050565b5f61012083015f8301516139a75f86018261307b565b5060208301516139ba60a08601826130ec565b5060408301516139cd60c0860182613116565b5060608301516139e060e0860182613116565b5060808301518482036101008601526139f9828261315d565b9150508091505092915050565b5f6020820190508181035f830152613a1e8184613991565b90509291505056fea26469706673582212204ca2d84f730e0788530214fefc2fa01fd173a7ae3c2c677078322e641cf50d0264736f6c634300081c0033000000000000000000000000f8a2c39111fceb9c950aaf28a9e34ebad99b85c1", + "nonce": "0x1b3", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x158a862", + "logs": [ + { + "address": "0xf8a2c39111fceb9c950aaf28a9e34ebad99b85c1", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000ef6a8640c836b16eb8ccd8016ead4c8517ac3033", + "0x000000000000000000000000c5a076cad94176c2996b32d8466be1ce757faa27" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x29ab294", + "blockTimestamp": "0x69bfc20b", + "transactionHash": "0xca9f0cf3999e192d1f851453b8e2c07b6f481059813b82f709016377a1944ea8", + "transactionIndex": "0x5e", + "logIndex": "0x258", + "removed": false + }, + { + "address": "0xf8a2c39111fceb9c950aaf28a9e34ebad99b85c1", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000ef6a8640c836b16eb8ccd8016ead4c8517ac3033", + "0x000000000000000000000000492c412369db76c9cdd9939e6c521579301473a3" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x29ab294", + "blockTimestamp": "0x69bfc20b", + "transactionHash": "0xca9f0cf3999e192d1f851453b8e2c07b6f481059813b82f709016377a1944ea8", + "transactionIndex": "0x5e", + "logIndex": "0x259", + "removed": false + }, + { + "address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000ef6a8640c836b16eb8ccd8016ead4c8517ac3033", + "0x000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba3" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x29ab294", + "blockTimestamp": "0x69bfc20b", + "transactionHash": "0xca9f0cf3999e192d1f851453b8e2c07b6f481059813b82f709016377a1944ea8", + "transactionIndex": "0x5e", + "logIndex": "0x25a", + "removed": false + }, + { + "address": "0x000000000022d473030f116ddee9f6b43ac78ba3", + "topics": [ + "0xda9fa7c1b00402c17d0161b249b1ab8bbec047c5a52207b9c112deffd817036b", + "0x000000000000000000000000ef6a8640c836b16eb8ccd8016ead4c8517ac3033", + "0x000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913", + "0x0000000000000000000000006ff5693b99212da76ad316178a184ab56d299b43" + ], + "data": "0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000ffffffffffff", + "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x29ab294", + "blockTimestamp": "0x69bfc20b", + "transactionHash": "0xca9f0cf3999e192d1f851453b8e2c07b6f481059813b82f709016377a1944ea8", + "transactionIndex": "0x5e", + "logIndex": "0x25b", + "removed": false + }, + { + "address": "0x37f0c2915cecc7e977183b8543fc0864d03e064c", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000ef6a8640c836b16eb8ccd8016ead4c8517ac3033", + "0x000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba3" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x29ab294", + "blockTimestamp": "0x69bfc20b", + "transactionHash": "0xca9f0cf3999e192d1f851453b8e2c07b6f481059813b82f709016377a1944ea8", + "transactionIndex": "0x5e", + "logIndex": "0x25c", + "removed": false + }, + { + "address": "0x000000000022d473030f116ddee9f6b43ac78ba3", + "topics": [ + "0xda9fa7c1b00402c17d0161b249b1ab8bbec047c5a52207b9c112deffd817036b", + "0x000000000000000000000000ef6a8640c836b16eb8ccd8016ead4c8517ac3033", + "0x00000000000000000000000037f0c2915cecc7e977183b8543fc0864d03e064c", + "0x0000000000000000000000006ff5693b99212da76ad316178a184ab56d299b43" + ], + "data": "0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000ffffffffffff", + "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x29ab294", + "blockTimestamp": "0x69bfc20b", + "transactionHash": "0xca9f0cf3999e192d1f851453b8e2c07b6f481059813b82f709016377a1944ea8", + "transactionIndex": "0x5e", + "logIndex": "0x25d", + "removed": false + } + ], + "logsBloom": "0x00010000000000020000000000000000000000000000000000000000000000000000000000000000000000000000104000000000800000000000100000280000000002000000040000005000000000000000000000080800000000001000000000800000000000000080000000000000010040000000000000000000000048000020000000000000400000000000000002000000000000000000000000000000020000100000000000000000800000081000000000100000000000080000000000000000000000000000000000000000200000000000000040000000040000000010000000000000000000000000040000000000000000000200000001000400", + "type": "0x2", + "transactionHash": "0xca9f0cf3999e192d1f851453b8e2c07b6f481059813b82f709016377a1944ea8", + "transactionIndex": "0x5e", + "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x29ab294", + "gasUsed": "0x35c011", + "effectiveGasPrice": "0x4c4b72", + "blobGasUsed": "0xcac3d", + "from": "0x017596303ee2f3c1250aa67d2d33dbae1d1c4dbf", + "to": null, + "contractAddress": "0xef6a8640c836b16eb8ccd8016ead4c8517ac3033", + "daFootprintGasScalar": "0x8b", + "l1BaseFeeScalar": "0x8dd", + "l1BlobBaseFee": "0x21c3df", + "l1BlobBaseFeeScalar": "0x101c12", + "l1Fee": "0x16ee45cc", + "l1GasPrice": "0x27b0c5f", + "l1GasUsed": "0x17573" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1774174729845, + "chain": 8453, + "commit": "67cc18a" +} \ No newline at end of file diff --git a/broadcast/DeployZapPlotLinkV2.s.sol/8453/run-latest.json b/broadcast/DeployZapPlotLinkV2.s.sol/8453/run-latest.json index dcdc141..d406dd1 100644 --- a/broadcast/DeployZapPlotLinkV2.s.sol/8453/run-latest.json +++ b/broadcast/DeployZapPlotLinkV2.s.sol/8453/run-latest.json @@ -1,20 +1,20 @@ { "transactions": [ { - "hash": "0x81318a9853ba886e1133d8daf2e08372423dd0a3ab7530132f86196471c6b88e", + "hash": "0xca9f0cf3999e192d1f851453b8e2c07b6f481059813b82f709016377a1944ea8", "transactionType": "CREATE", "contractName": "ZapPlotLinkV2", - "contractAddress": "0x504365bd15e79f04a8457c798a07d20bd59ad0f8", + "contractAddress": "0xef6a8640c836b16eb8ccd8016ead4c8517ac3033", "function": null, "arguments": [ "0xF8A2C39111FCEB9C950aAf28A9E34EBaD99b85C1" ], "transaction": { "from": "0x017596303ee2f3c1250aa67d2d33dbae1d1c4dbf", - "gas": "0x44008b", + "gas": "0x45e016", "value": "0x0", - "input": "0x608060405234801561000f575f5ffd5b50604051613e7b380380613e7b83398181016040528101906100319190610476565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610096576040517f644865b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373c5a076cad94176c2996b32d8466be1ce757faa277fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016101849291906104c8565b6020604051808303815f875af11580156101a0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101c49190610524565b508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373492c412369db76c9cdd9939e6c521579301473a37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016102349291906104c8565b6020604051808303815f875af1158015610250573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102749190610524565b5061029873833589fcd6edb6e08f4c7c32d4f71b54bda029136102c160201b60201c565b6102bb7337f0c2915cecc7e977183b8543fc0864d03e064c6102c160201b60201c565b506105c1565b8073ffffffffffffffffffffffffffffffffffffffff1663095ea7b36e22d473030f116ddee9f6b43ac78ba37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161032b9291906104c8565b6020604051808303815f875af1158015610347573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036b9190610524565b506e22d473030f116ddee9f6b43ac78ba373ffffffffffffffffffffffffffffffffffffffff166387517c4582736ff5693b99212da76ad316178a184ab56d299b4373ffffffffffffffffffffffffffffffffffffffff65ffffffffffff6040518563ffffffff1660e01b81526004016103e8949392919061057e565b5f604051808303815f87803b1580156103ff575f5ffd5b505af1158015610411573d5f5f3e3d5ffd5b5050505050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6104458261041c565b9050919050565b6104558161043b565b811461045f575f5ffd5b50565b5f815190506104708161044c565b92915050565b5f6020828403121561048b5761048a610418565b5b5f61049884828501610462565b91505092915050565b6104aa8161043b565b82525050565b5f819050919050565b6104c2816104b0565b82525050565b5f6040820190506104db5f8301856104a1565b6104e860208301846104b9565b9392505050565b5f8115159050919050565b610503816104ef565b811461050d575f5ffd5b50565b5f8151905061051e816104fa565b92915050565b5f6020828403121561053957610538610418565b5b5f61054684828501610510565b91505092915050565b6105588161041c565b82525050565b5f65ffffffffffff82169050919050565b6105788161055e565b82525050565b5f6080820190506105915f8301876104a1565b61059e60208301866104a1565b6105ab604083018561054f565b6105b8606083018461056f565b95945050505050565b6138ad806105ce5f395ff3fe608060405260043610610122575f3560e01c8063b3f1c93d1161009f578063cefa892211610063578063cefa8922146103bc578063d87e4bd1146103e6578063dd1b9c4a14610423578063e8dd7fc31461044d578063f2fde38b1461047757610129565b8063b3f1c93d146102e8578063b9703ded14610318578063c1c1d21814610342578063cb7588241461036c578063cea9d26f1461039457610129565b8063814ac84f116100e6578063814ac84f1461021057806389a30271146102405780638da5cb5b1461026a5780638dae88c214610294578063a734f06e146102be57610129565b806301c2553a1461012d57806304824e701461016a578063161a226e1461019257806346ca626b146101bc5780636afdd850146101e657610129565b3661012957005b5f5ffd5b348015610138575f5ffd5b50610153600480360381019061014e9190612b3a565b61049f565b604051610161929190612b99565b60405180910390f35b348015610175575f5ffd5b50610190600480360381019061018b9190612bfb565b610634565b005b34801561019d575f5ffd5b506101a661072e565b6040516101b39190612c35565b60405180910390f35b3480156101c7575f5ffd5b506101d0610753565b6040516101dd9190612c69565b60405180910390f35b3480156101f1575f5ffd5b506101fa610758565b6040516102079190612c35565b60405180910390f35b61022a60048036038101906102259190612c82565b61076b565b6040516102379190612ce6565b60405180910390f35b34801561024b575f5ffd5b506102546109f9565b6040516102619190612c35565b60405180910390f35b348015610275575f5ffd5b5061027e610a11565b60405161028b9190612c35565b60405180910390f35b34801561029f575f5ffd5b506102a8610a35565b6040516102b59190612d5a565b60405180910390f35b3480156102c9575f5ffd5b506102d2610a4d565b6040516102df9190612c35565b60405180910390f35b61030260048036038101906102fd9190612c82565b610a51565b60405161030f9190612ce6565b60405180910390f35b348015610323575f5ffd5b5061032c610dc1565b6040516103399190612d93565b60405180910390f35b34801561034d575f5ffd5b50610356610dd9565b6040516103639190612dcc565b60405180910390f35b348015610377575f5ffd5b50610392600480360381019061038d9190612de5565b610df1565b005b34801561039f575f5ffd5b506103ba60048036038101906103b59190612b3a565b61121e565b005b3480156103c7575f5ffd5b506103d06112d3565b6040516103dd9190612c35565b60405180910390f35b3480156103f1575f5ffd5b5061040c60048036038101906104079190612b3a565b6112eb565b60405161041a929190612b99565b60405180910390f35b34801561042e575f5ffd5b5061043761147e565b6040516104449190612e2d565b60405180910390f35b348015610458575f5ffd5b50610461611484565b60405161046e9190612e66565b60405180910390f35b348015610482575f5ffd5b5061049d60048036038101906104989190612de5565b61149c565b005b5f5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036104fd57829050610598565b730d5e0f971ed27fbff6c2837bf31316121532048d73ffffffffffffffffffffffffffffffffffffffff1663aa9d21cb6105378786611647565b6040518263ffffffff1660e01b81526004016105539190613047565b60408051808303815f875af115801561056e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610592919061307b565b50809150505b73492c412369db76c9cdd9939e6c521579301473a373ffffffffffffffffffffffffffffffffffffffff1663fb55dbe185835f6040518463ffffffff1660e01b81526004016105e9939291906130c8565b6040805180830381865afa158015610603573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106279190613111565b5080925050935093915050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106b9576040517f086a6b8600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8173ffffffffffffffffffffffffffffffffffffffff16476040516106de9061317c565b5f6040518083038185875af1925050503d805f8114610718576040519150601f19603f3d011682016040523d82523d5f602084013e61071d565b606091505b505090508061072a575f5ffd5b5050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b603c81565b6e22d473030f116ddee9f6b43ac78ba381565b5f5f83036107a5576040517ff4fb71d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603610889575f3414610833576040517f6256698900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61088133308660015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661179b909392919063ffffffff16565b8390506108a0565b61089386856117f0565b61089d8685611995565b90505b73492c412369db76c9cdd9939e6c521579301473a373ffffffffffffffffffffffffffffffffffffffff16630144c5f3868386336040518563ffffffff1660e01b81526004016108f39493929190613190565b6020604051808303815f875af192505050801561092e57506040513d601f19601f8201168201806040525081019061092b91906131d3565b60015b610964576040517f12c0f6d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80925050610970611d46565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f27830bca1834346b6287fed7ebd6791d80a5a6d4b190a1f8b01c09a07786a1a68588866040516109e8939291906131fe565b60405180910390a450949350505050565b73833589fcd6edb6e08f4c7c32d4f71b54bda0291381565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b730d5e0f971ed27fbff6c2837bf31316121532048d81565b5f81565b5f5f8303610a8b576040517ff4fb71d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73c5a076cad94176c2996b32d8466be1ce757faa2773ffffffffffffffffffffffffffffffffffffffff166376a9864b86866040518363ffffffff1660e01b8152600401610adb929190613233565b6040805180830381865afa158015610af5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b19919061307b565b50905060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603610c39575f3414610ba9576040517f6256698900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82811115610be3576040517f12c0f6d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c3133308360015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661179b909392919063ffffffff16565b809150610c66565b610c4386846117f0565b610c4e868285611e3a565b9150610c65868385610c609190613287565b612306565b5b5f73c5a076cad94176c2996b32d8466be1ce757faa2773ffffffffffffffffffffffffffffffffffffffff1663f74bfe8e878785336040518563ffffffff1660e01b8152600401610cba9493929190613190565b6020604051808303815f875af1925050508015610cf557506040513d601f19601f82011682018060405250810190610cf291906131d3565b60015b610d2b576040517f12c0f6d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80915050610d37611d46565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f3b90f0b1565b6e9dac462a873af5d46d5d6177d0096ddc2ddcf38de8ddb5d8fa888786604051610daf939291906131fe565b60405180910390a45050949350505050565b73492c412369db76c9cdd9939e6c521579301473a381565b73c5a076cad94176c2996b32d8466be1ce757faa2781565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e76576040517f086a6b8600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610edb576040517f644865b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373c5a076cad94176c2996b32d8466be1ce757faa275f6040518363ffffffff1660e01b8152600401610f4f9291906132f3565b6020604051808303815f875af1158015610f6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f8f9190613344565b508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373492c412369db76c9cdd9939e6c521579301473a35f6040518363ffffffff1660e01b8152600401610fdf9291906132f3565b6020604051808303815f875af1158015610ffb573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061101f9190613344565b508160015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff1663095ea7b373c5a076cad94176c2996b32d8466be1ce757faa277fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016110cf929190613233565b6020604051808303815f875af11580156110eb573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061110f9190613344565b508173ffffffffffffffffffffffffffffffffffffffff1663095ea7b373492c412369db76c9cdd9939e6c521579301473a37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161117f929190613233565b6020604051808303815f875af115801561119b573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111bf9190613344565b508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f5a1a9bb5f826487cf43e61548d79ffa19cc00e1a554bd9962825f51fa9c767d160405160405180910390a35050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112a3576040517f086a6b8600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112ce82828573ffffffffffffffffffffffffffffffffffffffff166124209092919063ffffffff16565b505050565b7337f0c2915cecc7e977183b8543fc0864d03e064c81565b5f5f73c5a076cad94176c2996b32d8466be1ce757faa2773ffffffffffffffffffffffffffffffffffffffff166376a9864b85856040518363ffffffff1660e01b815260040161133c929190613233565b6040805180830381865afa158015611356573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061137a919061307b565b508091505060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036113db57809150611476565b730d5e0f971ed27fbff6c2837bf31316121532048d73ffffffffffffffffffffffffffffffffffffffff1663587330736114158784611647565b6040518263ffffffff1660e01b81526004016114319190613047565b60408051808303815f875af115801561144c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611470919061307b565b50809250505b935093915050565b610bb881565b736ff5693b99212da76ad316178a184ab56d299b4381565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611521576040517f086a6b8600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611586576040517f644865b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61164f6129f5565b5f5f5f5f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146116ae5760015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16865f6116d4565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660015b92509250925060405180608001604052806040518060a001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001610bb862ffffff168152602001603c60020b81526020015f73ffffffffffffffffffffffffffffffffffffffff1681525081526020018215158152602001866fffffffffffffffffffffffffffffffff16815260200160405180602001604052805f815250815250935050505092915050565b6117a9848484846001612473565b6117ea57836040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016117e19190612c35565b60405180910390fd5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118615780341461185c576040517f6256698900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611991565b73833589fcd6edb6e08f4c7c32d4f71b54bda0291373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806118ee57507337f0c2915cecc7e977183b8543fc0864d03e064c73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b1561195e575f341461192c576040517f6256698900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119593330838573ffffffffffffffffffffffffffffffffffffffff1661179b909392919063ffffffff16565b611990565b6040517f84e3aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5050565b5f5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016119f19190612c35565b602060405180830381865afa158015611a0c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3091906131d3565b90505f5f5f5f73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614611a915760015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16875f611ab7565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660015b9250925092505f6010604051602001611ad091906133af565b60405160208183030381529060405290505f600167ffffffffffffffff811115611afd57611afc6133c9565b5b604051908082528060200260200182016040528015611b3057816020015b6060815260200190600190039081611b1b5790505b509050611b3f8585858b6124e4565b815f81518110611b5257611b516133f6565b5b60200260200101819052505f73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1603611c1557736ff5693b99212da76ad316178a184ab56d299b4373ffffffffffffffffffffffffffffffffffffffff16633593564c898484426040518563ffffffff1660e01b8152600401611be293929190613526565b5f604051808303818588803b158015611bf9575f5ffd5b505af1158015611c0b573d5f5f3e3d5ffd5b5050505050611c94565b736ff5693b99212da76ad316178a184ab56d299b4373ffffffffffffffffffffffffffffffffffffffff16633593564c8383426040518463ffffffff1660e01b8152600401611c6693929190613526565b5f604051808303815f87803b158015611c7d575f5ffd5b505af1158015611c8f573d5f5f3e3d5ffd5b505050505b8560015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611cef9190612c35565b602060405180830381865afa158015611d0a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d2e91906131d3565b611d389190613287565b965050505050505092915050565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611da19190612c35565b602060405180830381865afa158015611dbc573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de091906131d3565b90505f811115611e3757611e36338260015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166124209092919063ffffffff16565b5b50565b5f5f5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614611eec578473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611ea89190612c35565b602060405180830381865afa158015611ec3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ee791906131d3565b611eee565b475b90505f5f5f5f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614611f4f5760015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16885f611f75565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660015b9250925092505f611f898484848b8b61273b565b90505f73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1603612120575f60106004604051602001611fd4929190613569565b60405160208183030381529060405290505f600267ffffffffffffffff811115612001576120006133c9565b5b60405190808252806020026020018201604052801561203457816020015b606081526020019060019003908161201f5790505b50905082815f8151811061204b5761204a6133f6565b5b60200260200101819052505f305f60405160200161206b939291906135c4565b6040516020818303038152906040528160018151811061208e5761208d6133f6565b5b6020026020010181905250736ff5693b99212da76ad316178a184ab56d299b4373ffffffffffffffffffffffffffffffffffffffff16633593564c8a8484426040518563ffffffff1660e01b81526004016120eb93929190613526565b5f604051808303818588803b158015612102575f5ffd5b505af1158015612114573d5f5f3e3d5ffd5b50505050505050612236565b5f601060405160200161213391906133af565b60405160208183030381529060405290505f600167ffffffffffffffff8111156121605761215f6133c9565b5b60405190808252806020026020018201604052801561219357816020015b606081526020019060019003908161217e5790505b50905082815f815181106121aa576121a96133f6565b5b6020026020010181905250736ff5693b99212da76ad316178a184ab56d299b4373ffffffffffffffffffffffffffffffffffffffff16633593564c8383426040518463ffffffff1660e01b815260040161220693929190613526565b5f604051808303815f87803b15801561221d575f5ffd5b505af115801561222f573d5f5f3e3d5ffd5b5050505050505b5f5f73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146122e7578973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016122a39190612c35565b602060405180830381865afa1580156122be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122e291906131d3565b6122e9565b475b905080866122f79190613287565b96505050505050509392505050565b5f81031561241c575f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036123ef575f3373ffffffffffffffffffffffffffffffffffffffff16826040516123669061317c565b5f6040518083038185875af1925050503d805f81146123a0576040519150601f19603f3d011682016040523d82523d5f602084013e6123a5565b606091505b50509050806123e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e090613653565b60405180910390fd5b5061241b565b61241a33828473ffffffffffffffffffffffffffffffffffffffff166124209092919063ffffffff16565b5b5b5050565b61242d8383836001612993565b61246e57826040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016124659190612c35565b60405180910390fd5b505050565b5f5f6323b872dd60e01b9050604051815f525f1960601c87166004525f1960601c86166024528460445260205f60645f5f8c5af1925060015f511483166124d15783831516156124c5573d5f823e3d81fd5b5f883b113d1516831692505b806040525f606052505095945050505050565b60605f6006600c600e6040516020016124ff93929190613671565b60405160208183030381529060405290505f600367ffffffffffffffff81111561252c5761252b6133c9565b5b60405190808252806020026020018201604052801561255f57816020015b606081526020019060019003908161254a5790505b5090505f6040518060a001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff168152602001610bb862ffffff168152602001603c60020b81526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090505f5f876125e757888a6125ea565b89895b915091506040518060a001604052808481526020018915158152602001886fffffffffffffffffffffffffffffffff1681526020015f6fffffffffffffffffffffffffffffffff16815260200160405180602001604052805f8152508152506040516020016126599190613722565b604051602081830303815290604052845f8151811061267b5761267a6133f6565b5b60200260200101819052508187604051602001612699929190613751565b604051602081830303815290604052846001815181106126bc576126bb6133f6565b5b602002602001018190525080305f6040516020016126dc93929190613778565b604051602081830303815290604052846002815181106126ff576126fe6133f6565b5b6020026020010181905250848460405160200161271d9291906137ad565b60405160208183030381529060405295505050505050949350505050565b60605f6008600c600e60405160200161275693929190613671565b60405160208183030381529060405290505f600367ffffffffffffffff811115612783576127826133c9565b5b6040519080825280602002602001820160405280156127b657816020015b60608152602001906001900390816127a15790505b5090505f6040518060a001604052808a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff168152602001610bb862ffffff168152602001603c60020b81526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090505f5f8861283e57898b612841565b8a8a5b915091506040518060a001604052808481526020018a15158152602001896fffffffffffffffffffffffffffffffff168152602001886fffffffffffffffffffffffffffffffff16815260200160405180602001604052805f8152508152506040516020016128b09190613857565b604051602081830303815290604052845f815181106128d2576128d16133f6565b5b602002602001018190525081876040516020016128f0929190613751565b60405160208183030381529060405284600181518110612913576129126133f6565b5b602002602001018190525080305f60405160200161293393929190613778565b60405160208183030381529060405284600281518110612956576129556133f6565b5b602002602001018190525084846040516020016129749291906137ad565b6040516020818303038152906040529550505050505095945050505050565b5f5f63a9059cbb60e01b9050604051815f525f1960601c86166004528460245260205f60445f5f8b5af1925060015f511483166129e75783831516156129db573d5f823e3d81fd5b5f873b113d1516831692505b806040525050949350505050565b6040518060800160405280612a08612a35565b81526020015f151581526020015f6fffffffffffffffffffffffffffffffff168152602001606081525090565b6040518060a001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f62ffffff1681526020015f60020b81526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612ad682612aad565b9050919050565b612ae681612acc565b8114612af0575f5ffd5b50565b5f81359050612b0181612add565b92915050565b5f819050919050565b612b1981612b07565b8114612b23575f5ffd5b50565b5f81359050612b3481612b10565b92915050565b5f5f5f60608486031215612b5157612b50612aa9565b5b5f612b5e86828701612af3565b9350506020612b6f86828701612af3565b9250506040612b8086828701612b26565b9150509250925092565b612b9381612b07565b82525050565b5f604082019050612bac5f830185612b8a565b612bb96020830184612b8a565b9392505050565b5f612bca82612aad565b9050919050565b612bda81612bc0565b8114612be4575f5ffd5b50565b5f81359050612bf581612bd1565b92915050565b5f60208284031215612c1057612c0f612aa9565b5b5f612c1d84828501612be7565b91505092915050565b612c2f81612acc565b82525050565b5f602082019050612c485f830184612c26565b92915050565b5f8160020b9050919050565b612c6381612c4e565b82525050565b5f602082019050612c7c5f830184612c5a565b92915050565b5f5f5f5f60808587031215612c9a57612c99612aa9565b5b5f612ca787828801612af3565b9450506020612cb887828801612af3565b9350506040612cc987828801612b26565b9250506060612cda87828801612b26565b91505092959194509250565b5f602082019050612cf95f830184612b8a565b92915050565b5f819050919050565b5f612d22612d1d612d1884612aad565b612cff565b612aad565b9050919050565b5f612d3382612d08565b9050919050565b5f612d4482612d29565b9050919050565b612d5481612d3a565b82525050565b5f602082019050612d6d5f830184612d4b565b92915050565b5f612d7d82612d29565b9050919050565b612d8d81612d73565b82525050565b5f602082019050612da65f830184612d84565b92915050565b5f612db682612d29565b9050919050565b612dc681612dac565b82525050565b5f602082019050612ddf5f830184612dbd565b92915050565b5f60208284031215612dfa57612df9612aa9565b5b5f612e0784828501612af3565b91505092915050565b5f62ffffff82169050919050565b612e2781612e10565b82525050565b5f602082019050612e405f830184612e1e565b92915050565b5f612e5082612d29565b9050919050565b612e6081612e46565b82525050565b5f602082019050612e795f830184612e57565b92915050565b612e8881612acc565b82525050565b612e9781612e10565b82525050565b612ea681612c4e565b82525050565b5f612eb682612d29565b9050919050565b612ec681612eac565b82525050565b60a082015f820151612ee05f850182612e7f565b506020820151612ef36020850182612e7f565b506040820151612f066040850182612e8e565b506060820151612f196060850182612e9d565b506080820151612f2c6080850182612ebd565b50505050565b5f8115159050919050565b612f4681612f32565b82525050565b5f6fffffffffffffffffffffffffffffffff82169050919050565b612f7081612f4c565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612fb882612f76565b612fc28185612f80565b9350612fd2818560208601612f90565b612fdb81612f9e565b840191505092915050565b5f61010083015f830151612ffc5f860182612ecc565b50602083015161300f60a0860182612f3d565b50604083015161302260c0860182612f67565b50606083015184820360e086015261303a8282612fae565b9150508091505092915050565b5f6020820190508181035f83015261305f8184612fe6565b905092915050565b5f8151905061307581612b10565b92915050565b5f5f6040838503121561309157613090612aa9565b5b5f61309e85828601613067565b92505060206130af85828601613067565b9150509250929050565b6130c281612f32565b82525050565b5f6060820190506130db5f830186612c26565b6130e86020830185612b8a565b6130f560408301846130b9565b949350505050565b5f8151905061310b81612add565b92915050565b5f5f6040838503121561312757613126612aa9565b5b5f61313485828601613067565b9250506020613145858286016130fd565b9150509250929050565b5f81905092915050565b50565b5f6131675f8361314f565b915061317282613159565b5f82019050919050565b5f6131868261315c565b9150819050919050565b5f6080820190506131a35f830187612c26565b6131b06020830186612b8a565b6131bd6040830185612b8a565b6131ca6060830184612c26565b95945050505050565b5f602082840312156131e8576131e7612aa9565b5b5f6131f584828501613067565b91505092915050565b5f6060820190506132115f830186612b8a565b61321e6020830185612b8a565b61322b6040830184612b8a565b949350505050565b5f6040820190506132465f830185612c26565b6132536020830184612b8a565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61329182612b07565b915061329c83612b07565b92508282039050818111156132b4576132b361325a565b5b92915050565b5f819050919050565b5f6132dd6132d86132d3846132ba565b612cff565b612b07565b9050919050565b6132ed816132c3565b82525050565b5f6040820190506133065f830185612c26565b61331360208301846132e4565b9392505050565b61332381612f32565b811461332d575f5ffd5b50565b5f8151905061333e8161331a565b92915050565b5f6020828403121561335957613358612aa9565b5b5f61336684828501613330565b91505092915050565b5f60ff82169050919050565b5f8160f81b9050919050565b5f6133918261337b565b9050919050565b6133a96133a48261336f565b613387565b82525050565b5f6133ba8284613398565b60018201915081905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82825260208201905092915050565b5f61343d82612f76565b6134478185613423565b9350613457818560208601612f90565b61346081612f9e565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f61349f8383612fae565b905092915050565b5f602082019050919050565b5f6134bd8261346b565b6134c78185613475565b9350836020820285016134d985613485565b805f5b8581101561351457848403895281516134f58582613494565b9450613500836134a7565b925060208a019950506001810190506134dc565b50829750879550505050505092915050565b5f6060820190508181035f83015261353e8186613433565b9050818103602083015261355281856134b3565b90506135616040830184612b8a565b949350505050565b5f6135748285613398565b6001820191506135848284613398565b6001820191508190509392505050565b5f6135ae6135a96135a4846132ba565b612cff565b61336f565b9050919050565b6135be81613594565b82525050565b5f6060820190506135d75f830186612c26565b6135e46020830185612c26565b6135f160408301846135b5565b949350505050565b5f82825260208201905092915050565b7f45544820726566756e64206661696c65640000000000000000000000000000005f82015250565b5f61363d6011836135f9565b915061364882613609565b602082019050919050565b5f6020820190508181035f83015261366a81613631565b9050919050565b5f61367c8286613398565b60018201915061368c8285613398565b60018201915061369c8284613398565b600182019150819050949350505050565b5f61012083015f8301516136c35f860182612ecc565b5060208301516136d660a0860182612f3d565b5060408301516136e960c0860182612f67565b5060608301516136fc60e0860182612f67565b5060808301518482036101008601526137158282612fae565b9150508091505092915050565b5f6020820190508181035f83015261373a81846136ad565b905092915050565b61374b81612f4c565b82525050565b5f6040820190506137645f830185612c26565b6137716020830184613742565b9392505050565b5f60608201905061378b5f830186612c26565b6137986020830185612c26565b6137a56040830184612b8a565b949350505050565b5f6040820190508181035f8301526137c58185613433565b905081810360208301526137d981846134b3565b90509392505050565b5f61012083015f8301516137f85f860182612ecc565b50602083015161380b60a0860182612f3d565b50604083015161381e60c0860182612f67565b50606083015161383160e0860182612f67565b50608083015184820361010086015261384a8282612fae565b9150508091505092915050565b5f6020820190508181035f83015261386f81846137e2565b90509291505056fea264697066735822122094db1f96e4557dcbb1302e671d7625d41d66c65ec7be39a2ff7668a83493156664736f6c634300081c0033000000000000000000000000f8a2c39111fceb9c950aaf28a9e34ebad99b85c1", - "nonce": "0x1b2", + "input": "0x6080604052610bb85f5f6101000a81548162ffffff021916908362ffffff160217905550603c5f60036101000a81548162ffffff021916908360020b62ffffff160217905550348015610050575f5ffd5b5060405161406c38038061406c833981810160405281019061007291906104b8565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100d7576040517f644865b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f60066101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373c5a076cad94176c2996b32d8466be1ce757faa277fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016101c692919061050a565b6020604051808303815f875af11580156101e2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102069190610566565b508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373492c412369db76c9cdd9939e6c521579301473a37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161027692919061050a565b6020604051808303815f875af1158015610292573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102b69190610566565b506102da73833589fcd6edb6e08f4c7c32d4f71b54bda0291361030360201b60201c565b6102fd7337f0c2915cecc7e977183b8543fc0864d03e064c61030360201b60201c565b50610603565b8073ffffffffffffffffffffffffffffffffffffffff1663095ea7b36e22d473030f116ddee9f6b43ac78ba37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161036d92919061050a565b6020604051808303815f875af1158015610389573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103ad9190610566565b506e22d473030f116ddee9f6b43ac78ba373ffffffffffffffffffffffffffffffffffffffff166387517c4582736ff5693b99212da76ad316178a184ab56d299b4373ffffffffffffffffffffffffffffffffffffffff65ffffffffffff6040518563ffffffff1660e01b815260040161042a94939291906105c0565b5f604051808303815f87803b158015610441575f5ffd5b505af1158015610453573d5f5f3e3d5ffd5b5050505050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6104878261045e565b9050919050565b6104978161047d565b81146104a1575f5ffd5b50565b5f815190506104b28161048e565b92915050565b5f602082840312156104cd576104cc61045a565b5b5f6104da848285016104a4565b91505092915050565b6104ec8161047d565b82525050565b5f819050919050565b610504816104f2565b82525050565b5f60408201905061051d5f8301856104e3565b61052a60208301846104fb565b9392505050565b5f8115159050919050565b61054581610531565b811461054f575f5ffd5b50565b5f815190506105608161053c565b92915050565b5f6020828403121561057b5761057a61045a565b5b5f61058884828501610552565b91505092915050565b61059a8161045e565b82525050565b5f65ffffffffffff82169050919050565b6105ba816105a0565b82525050565b5f6080820190506105d35f8301876104e3565b6105e060208301866104e3565b6105ed6040830185610591565b6105fa60608301846105b1565b95945050505050565b613a5c806106105f395ff3fe60806040526004361061012d575f3560e01c8063a734f06e116100aa578063cb7588241161006e578063cb758824146103c9578063cea9d26f146103f1578063cefa892214610419578063d87e4bd114610443578063e8dd7fc314610480578063f2fde38b146104aa57610134565b8063a734f06e146102f3578063b3f1c93d1461031d578063b7d1abbc1461034d578063b9703ded14610375578063c1c1d2181461039f57610134565b80637164cf9b116100f15780637164cf9b1461021b578063814ac84f1461024557806389a30271146102755780638da5cb5b1461029f5780638dae88c2146102c957610134565b806301c2553a1461013857806304824e7014610175578063089fe6aa1461019d578063161a226e146101c75780636afdd850146101f157610134565b3661013457005b5f5ffd5b348015610143575f5ffd5b5061015e60048036038101906101599190612c57565b6104d2565b60405161016c929190612cb6565b60405180910390f35b348015610180575f5ffd5b5061019b60048036038101906101969190612d18565b610667565b005b3480156101a8575f5ffd5b506101b1610762565b6040516101be9190612d60565b60405180910390f35b3480156101d2575f5ffd5b506101db610775565b6040516101e89190612d88565b60405180910390f35b3480156101fc575f5ffd5b5061020561079a565b6040516102129190612d88565b60405180910390f35b348015610226575f5ffd5b5061022f6107ad565b60405161023c9190612dbc565b60405180910390f35b61025f600480360381019061025a9190612dd5565b6107bf565b60405161026c9190612e39565b60405180910390f35b348015610280575f5ffd5b50610289610a4d565b6040516102969190612d88565b60405180910390f35b3480156102aa575f5ffd5b506102b3610a65565b6040516102c09190612d88565b60405180910390f35b3480156102d4575f5ffd5b506102dd610a8a565b6040516102ea9190612ead565b60405180910390f35b3480156102fe575f5ffd5b50610307610aa2565b6040516103149190612d88565b60405180910390f35b61033760048036038101906103329190612dd5565b610aa6565b6040516103449190612e39565b60405180910390f35b348015610358575f5ffd5b50610373600480360381019061036e9190612f1a565b610e16565b005b348015610380575f5ffd5b50610389610ede565b6040516103969190612f78565b60405180910390f35b3480156103aa575f5ffd5b506103b3610ef6565b6040516103c09190612fb1565b60405180910390f35b3480156103d4575f5ffd5b506103ef60048036038101906103ea9190612fca565b610f0e565b005b3480156103fc575f5ffd5b5061041760048036038101906104129190612c57565b61133c565b005b348015610424575f5ffd5b5061042d6113f2565b60405161043a9190612d88565b60405180910390f35b34801561044e575f5ffd5b5061046960048036038101906104649190612c57565b61140a565b604051610477929190612cb6565b60405180910390f35b34801561048b575f5ffd5b5061049461159d565b6040516104a19190613015565b60405180910390f35b3480156104b5575f5ffd5b506104d060048036038101906104cb9190612fca565b6115b5565b005b5f5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610530578290506105cb565b730d5e0f971ed27fbff6c2837bf31316121532048d73ffffffffffffffffffffffffffffffffffffffff1663aa9d21cb61056a8786611763565b6040518263ffffffff1660e01b815260040161058691906131f6565b60408051808303815f875af11580156105a1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105c5919061322a565b50809150505b73492c412369db76c9cdd9939e6c521579301473a373ffffffffffffffffffffffffffffffffffffffff1663fb55dbe185835f6040518463ffffffff1660e01b815260040161061c93929190613277565b6040805180830381865afa158015610636573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061065a91906132c0565b5080925050935093915050565b5f60069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106ed576040517f086a6b8600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8173ffffffffffffffffffffffffffffffffffffffff16476040516107129061332b565b5f6040518083038185875af1925050503d805f811461074c576040519150601f19603f3d011682016040523d82523d5f602084013e610751565b606091505b505090508061075e575f5ffd5b5050565b5f5f9054906101000a900462ffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6e22d473030f116ddee9f6b43ac78ba381565b5f60039054906101000a900460020b81565b5f5f83036107f9576040517ff4fb71d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16036108dd575f3414610887576040517f6256698900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108d533308660015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611858909392919063ffffffff16565b8390506108f4565b6108e786856118ad565b6108f18685611a52565b90505b73492c412369db76c9cdd9939e6c521579301473a373ffffffffffffffffffffffffffffffffffffffff16630144c5f3868386336040518563ffffffff1660e01b8152600401610947949392919061333f565b6020604051808303815f875af192505050801561098257506040513d601f19601f8201168201806040525081019061097f9190613382565b60015b6109b8576040517f12c0f6d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b809250506109c4611d8a565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f27830bca1834346b6287fed7ebd6791d80a5a6d4b190a1f8b01c09a07786a1a6858886604051610a3c939291906133ad565b60405180910390a450949350505050565b73833589fcd6edb6e08f4c7c32d4f71b54bda0291381565b5f60069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b730d5e0f971ed27fbff6c2837bf31316121532048d81565b5f81565b5f5f8303610ae0576040517ff4fb71d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73c5a076cad94176c2996b32d8466be1ce757faa2773ffffffffffffffffffffffffffffffffffffffff166376a9864b86866040518363ffffffff1660e01b8152600401610b309291906133e2565b6040805180830381865afa158015610b4a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6e919061322a565b50905060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603610c8e575f3414610bfe576040517f6256698900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82811115610c38576040517f12c0f6d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c8633308360015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611858909392919063ffffffff16565b809150610cbb565b610c9886846118ad565b610ca3868285611e7e565b9150610cba868385610cb59190613436565b6122d1565b5b5f73c5a076cad94176c2996b32d8466be1ce757faa2773ffffffffffffffffffffffffffffffffffffffff1663f74bfe8e878785336040518563ffffffff1660e01b8152600401610d0f949392919061333f565b6020604051808303815f875af1925050508015610d4a57506040513d601f19601f82011682018060405250810190610d479190613382565b60015b610d80576040517f12c0f6d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80915050610d8c611d8a565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f3b90f0b1565b6e9dac462a873af5d46d5d6177d0096ddc2ddcf38de8ddb5d8fa888786604051610e04939291906133ad565b60405180910390a45050949350505050565b5f60069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e9c576040517f086a6b8600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f5f6101000a81548162ffffff021916908362ffffff160217905550805f60036101000a81548162ffffff021916908360020b62ffffff1602179055505050565b73492c412369db76c9cdd9939e6c521579301473a381565b73c5a076cad94176c2996b32d8466be1ce757faa2781565b5f60069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f94576040517f086a6b8600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ff9576040517f644865b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373c5a076cad94176c2996b32d8466be1ce757faa275f6040518363ffffffff1660e01b815260040161106d9291906134a2565b6020604051808303815f875af1158015611089573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110ad91906134f3565b508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373492c412369db76c9cdd9939e6c521579301473a35f6040518363ffffffff1660e01b81526004016110fd9291906134a2565b6020604051808303815f875af1158015611119573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113d91906134f3565b508160015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff1663095ea7b373c5a076cad94176c2996b32d8466be1ce757faa277fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016111ed9291906133e2565b6020604051808303815f875af1158015611209573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061122d91906134f3565b508173ffffffffffffffffffffffffffffffffffffffff1663095ea7b373492c412369db76c9cdd9939e6c521579301473a37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161129d9291906133e2565b6020604051808303815f875af11580156112b9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112dd91906134f3565b508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f5a1a9bb5f826487cf43e61548d79ffa19cc00e1a554bd9962825f51fa9c767d160405160405180910390a35050565b5f60069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113c2576040517f086a6b8600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113ed82828573ffffffffffffffffffffffffffffffffffffffff166123eb9092919063ffffffff16565b505050565b7337f0c2915cecc7e977183b8543fc0864d03e064c81565b5f5f73c5a076cad94176c2996b32d8466be1ce757faa2773ffffffffffffffffffffffffffffffffffffffff166376a9864b85856040518363ffffffff1660e01b815260040161145b9291906133e2565b6040805180830381865afa158015611475573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611499919061322a565b508091505060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036114fa57809150611595565b730d5e0f971ed27fbff6c2837bf31316121532048d73ffffffffffffffffffffffffffffffffffffffff1663587330736115348784611763565b6040518263ffffffff1660e01b815260040161155091906131f6565b60408051808303815f875af115801561156b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061158f919061322a565b50809250505b935093915050565b736ff5693b99212da76ad316178a184ab56d299b4381565b5f60069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461163b576040517f086a6b8600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036116a0576040517f644865b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60069054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f60066101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61176b612b12565b5f5f5f6117778661243e565b92509250925060405180608001604052806040518060a001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020015f5f9054906101000a900462ffffff1662ffffff1681526020015f60039054906101000a900460020b60020b81526020015f73ffffffffffffffffffffffffffffffffffffffff1681525081526020018215158152602001866fffffffffffffffffffffffffffffffff16815260200160405180602001604052805f815250815250935050505092915050565b61186684848484600161255c565b6118a757836040517f5274afe700000000000000000000000000000000000000000000000000000000815260040161189e9190612d88565b60405180910390fd5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361191e57803414611919576040517f6256698900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a4e565b73833589fcd6edb6e08f4c7c32d4f71b54bda0291373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806119ab57507337f0c2915cecc7e977183b8543fc0864d03e064c73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b15611a1b575f34146119e9576040517f6256698900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a163330838573ffffffffffffffffffffffffffffffffffffffff16611858909392919063ffffffff16565b611a4d565b6040517f84e3aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5050565b5f5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611aae9190612d88565b602060405180830381865afa158015611ac9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aed9190613382565b90505f5f5f611afb8761243e565b9250925092505f6010604051602001611b14919061355e565b60405160208183030381529060405290505f600167ffffffffffffffff811115611b4157611b40613578565b5b604051908082528060200260200182016040528015611b7457816020015b6060815260200190600190039081611b5f5790505b509050611b838585858b6125cd565b815f81518110611b9657611b956135a5565b5b60200260200101819052505f73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1603611c5957736ff5693b99212da76ad316178a184ab56d299b4373ffffffffffffffffffffffffffffffffffffffff16633593564c898484426040518563ffffffff1660e01b8152600401611c26939291906136d5565b5f604051808303818588803b158015611c3d575f5ffd5b505af1158015611c4f573d5f5f3e3d5ffd5b5050505050611cd8565b736ff5693b99212da76ad316178a184ab56d299b4373ffffffffffffffffffffffffffffffffffffffff16633593564c8383426040518463ffffffff1660e01b8152600401611caa939291906136d5565b5f604051808303815f87803b158015611cc1575f5ffd5b505af1158015611cd3573d5f5f3e3d5ffd5b505050505b8560015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611d339190612d88565b602060405180830381865afa158015611d4e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d729190613382565b611d7c9190613436565b965050505050505092915050565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611de59190612d88565b602060405180830381865afa158015611e00573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e249190613382565b90505f811115611e7b57611e7a338260015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166123eb9092919063ffffffff16565b5b50565b5f5f5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614611f30578473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611eec9190612d88565b602060405180830381865afa158015611f07573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f2b9190613382565b611f32565b475b90505f5f5f611f408861243e565b9250925092505f611f548484848b8b61283e565b90505f73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16036120eb575f60106004604051602001611f9f929190613718565b60405160208183030381529060405290505f600267ffffffffffffffff811115611fcc57611fcb613578565b5b604051908082528060200260200182016040528015611fff57816020015b6060815260200190600190039081611fea5790505b50905082815f81518110612016576120156135a5565b5b60200260200101819052505f305f60405160200161203693929190613773565b60405160208183030381529060405281600181518110612059576120586135a5565b5b6020026020010181905250736ff5693b99212da76ad316178a184ab56d299b4373ffffffffffffffffffffffffffffffffffffffff16633593564c8a8484426040518563ffffffff1660e01b81526004016120b6939291906136d5565b5f604051808303818588803b1580156120cd575f5ffd5b505af11580156120df573d5f5f3e3d5ffd5b50505050505050612201565b5f60106040516020016120fe919061355e565b60405160208183030381529060405290505f600167ffffffffffffffff81111561212b5761212a613578565b5b60405190808252806020026020018201604052801561215e57816020015b60608152602001906001900390816121495790505b50905082815f81518110612175576121746135a5565b5b6020026020010181905250736ff5693b99212da76ad316178a184ab56d299b4373ffffffffffffffffffffffffffffffffffffffff16633593564c8383426040518463ffffffff1660e01b81526004016121d1939291906136d5565b5f604051808303815f87803b1580156121e8575f5ffd5b505af11580156121fa573d5f5f3e3d5ffd5b5050505050505b5f5f73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146122b2578973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161226e9190612d88565b602060405180830381865afa158015612289573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122ad9190613382565b6122b4565b475b905080866122c29190613436565b96505050505050509392505050565b5f8103156123e7575f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036123ba575f3373ffffffffffffffffffffffffffffffffffffffff16826040516123319061332b565b5f6040518083038185875af1925050503d805f811461236b576040519150601f19603f3d011682016040523d82523d5f602084013e612370565b606091505b50509050806123b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ab90613802565b60405180910390fd5b506123e6565b6123e533828473ffffffffffffffffffffffffffffffffffffffff166123eb9092919063ffffffff16565b5b5b5050565b6123f88383836001612ab0565b61243957826040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016124309190612d88565b60405180910390fd5b505050565b5f5f5f5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036124a4575f925060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915060019050612555565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610156125295783925060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915060019050612554565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692508391505f90505b5b9193909250565b5f5f6323b872dd60e01b9050604051815f525f1960601c87166004525f1960601c86166024528460445260205f60645f5f8c5af1925060015f511483166125ba5783831516156125ae573d5f823e3d81fd5b5f883b113d1516831692505b806040525f606052505095945050505050565b60605f6006600c600e6040516020016125e893929190613820565b60405160208183030381529060405290505f600367ffffffffffffffff81111561261557612614613578565b5b60405190808252806020026020018201604052801561264857816020015b60608152602001906001900390816126335790505b5090505f6040518060a001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1681526020015f5f9054906101000a900462ffffff1662ffffff1681526020015f60039054906101000a900460020b60020b81526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090505f5f876126ea57888a6126ed565b89895b915091506040518060a001604052808481526020018915158152602001886fffffffffffffffffffffffffffffffff1681526020015f6fffffffffffffffffffffffffffffffff16815260200160405180602001604052805f81525081525060405160200161275c91906138d1565b604051602081830303815290604052845f8151811061277e5761277d6135a5565b5b6020026020010181905250818760405160200161279c929190613900565b604051602081830303815290604052846001815181106127bf576127be6135a5565b5b602002602001018190525080305f6040516020016127df93929190613927565b60405160208183030381529060405284600281518110612802576128016135a5565b5b6020026020010181905250848460405160200161282092919061395c565b60405160208183030381529060405295505050505050949350505050565b60605f6008600c600e60405160200161285993929190613820565b60405160208183030381529060405290505f600367ffffffffffffffff81111561288657612885613578565b5b6040519080825280602002602001820160405280156128b957816020015b60608152602001906001900390816128a45790505b5090505f6040518060a001604052808a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020015f5f9054906101000a900462ffffff1662ffffff1681526020015f60039054906101000a900460020b60020b81526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090505f5f8861295b57898b61295e565b8a8a5b915091506040518060a001604052808481526020018a15158152602001896fffffffffffffffffffffffffffffffff168152602001886fffffffffffffffffffffffffffffffff16815260200160405180602001604052805f8152508152506040516020016129cd9190613a06565b604051602081830303815290604052845f815181106129ef576129ee6135a5565b5b60200260200101819052508187604051602001612a0d929190613900565b60405160208183030381529060405284600181518110612a3057612a2f6135a5565b5b602002602001018190525080305f604051602001612a5093929190613927565b60405160208183030381529060405284600281518110612a7357612a726135a5565b5b60200260200101819052508484604051602001612a9192919061395c565b6040516020818303038152906040529550505050505095945050505050565b5f5f63a9059cbb60e01b9050604051815f525f1960601c86166004528460245260205f60445f5f8b5af1925060015f51148316612b04578383151615612af8573d5f823e3d81fd5b5f873b113d1516831692505b806040525050949350505050565b6040518060800160405280612b25612b52565b81526020015f151581526020015f6fffffffffffffffffffffffffffffffff168152602001606081525090565b6040518060a001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f62ffffff1681526020015f60020b81526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612bf382612bca565b9050919050565b612c0381612be9565b8114612c0d575f5ffd5b50565b5f81359050612c1e81612bfa565b92915050565b5f819050919050565b612c3681612c24565b8114612c40575f5ffd5b50565b5f81359050612c5181612c2d565b92915050565b5f5f5f60608486031215612c6e57612c6d612bc6565b5b5f612c7b86828701612c10565b9350506020612c8c86828701612c10565b9250506040612c9d86828701612c43565b9150509250925092565b612cb081612c24565b82525050565b5f604082019050612cc95f830185612ca7565b612cd66020830184612ca7565b9392505050565b5f612ce782612bca565b9050919050565b612cf781612cdd565b8114612d01575f5ffd5b50565b5f81359050612d1281612cee565b92915050565b5f60208284031215612d2d57612d2c612bc6565b5b5f612d3a84828501612d04565b91505092915050565b5f62ffffff82169050919050565b612d5a81612d43565b82525050565b5f602082019050612d735f830184612d51565b92915050565b612d8281612be9565b82525050565b5f602082019050612d9b5f830184612d79565b92915050565b5f8160020b9050919050565b612db681612da1565b82525050565b5f602082019050612dcf5f830184612dad565b92915050565b5f5f5f5f60808587031215612ded57612dec612bc6565b5b5f612dfa87828801612c10565b9450506020612e0b87828801612c10565b9350506040612e1c87828801612c43565b9250506060612e2d87828801612c43565b91505092959194509250565b5f602082019050612e4c5f830184612ca7565b92915050565b5f819050919050565b5f612e75612e70612e6b84612bca565b612e52565b612bca565b9050919050565b5f612e8682612e5b565b9050919050565b5f612e9782612e7c565b9050919050565b612ea781612e8d565b82525050565b5f602082019050612ec05f830184612e9e565b92915050565b612ecf81612d43565b8114612ed9575f5ffd5b50565b5f81359050612eea81612ec6565b92915050565b612ef981612da1565b8114612f03575f5ffd5b50565b5f81359050612f1481612ef0565b92915050565b5f5f60408385031215612f3057612f2f612bc6565b5b5f612f3d85828601612edc565b9250506020612f4e85828601612f06565b9150509250929050565b5f612f6282612e7c565b9050919050565b612f7281612f58565b82525050565b5f602082019050612f8b5f830184612f69565b92915050565b5f612f9b82612e7c565b9050919050565b612fab81612f91565b82525050565b5f602082019050612fc45f830184612fa2565b92915050565b5f60208284031215612fdf57612fde612bc6565b5b5f612fec84828501612c10565b91505092915050565b5f612fff82612e7c565b9050919050565b61300f81612ff5565b82525050565b5f6020820190506130285f830184613006565b92915050565b61303781612be9565b82525050565b61304681612d43565b82525050565b61305581612da1565b82525050565b5f61306582612e7c565b9050919050565b6130758161305b565b82525050565b60a082015f82015161308f5f85018261302e565b5060208201516130a2602085018261302e565b5060408201516130b5604085018261303d565b5060608201516130c8606085018261304c565b5060808201516130db608085018261306c565b50505050565b5f8115159050919050565b6130f5816130e1565b82525050565b5f6fffffffffffffffffffffffffffffffff82169050919050565b61311f816130fb565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61316782613125565b613171818561312f565b935061318181856020860161313f565b61318a8161314d565b840191505092915050565b5f61010083015f8301516131ab5f86018261307b565b5060208301516131be60a08601826130ec565b5060408301516131d160c0860182613116565b50606083015184820360e08601526131e9828261315d565b9150508091505092915050565b5f6020820190508181035f83015261320e8184613195565b905092915050565b5f8151905061322481612c2d565b92915050565b5f5f604083850312156132405761323f612bc6565b5b5f61324d85828601613216565b925050602061325e85828601613216565b9150509250929050565b613271816130e1565b82525050565b5f60608201905061328a5f830186612d79565b6132976020830185612ca7565b6132a46040830184613268565b949350505050565b5f815190506132ba81612bfa565b92915050565b5f5f604083850312156132d6576132d5612bc6565b5b5f6132e385828601613216565b92505060206132f4858286016132ac565b9150509250929050565b5f81905092915050565b50565b5f6133165f836132fe565b915061332182613308565b5f82019050919050565b5f6133358261330b565b9150819050919050565b5f6080820190506133525f830187612d79565b61335f6020830186612ca7565b61336c6040830185612ca7565b6133796060830184612d79565b95945050505050565b5f6020828403121561339757613396612bc6565b5b5f6133a484828501613216565b91505092915050565b5f6060820190506133c05f830186612ca7565b6133cd6020830185612ca7565b6133da6040830184612ca7565b949350505050565b5f6040820190506133f55f830185612d79565b6134026020830184612ca7565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61344082612c24565b915061344b83612c24565b925082820390508181111561346357613462613409565b5b92915050565b5f819050919050565b5f61348c61348761348284613469565b612e52565b612c24565b9050919050565b61349c81613472565b82525050565b5f6040820190506134b55f830185612d79565b6134c26020830184613493565b9392505050565b6134d2816130e1565b81146134dc575f5ffd5b50565b5f815190506134ed816134c9565b92915050565b5f6020828403121561350857613507612bc6565b5b5f613515848285016134df565b91505092915050565b5f60ff82169050919050565b5f8160f81b9050919050565b5f6135408261352a565b9050919050565b6135586135538261351e565b613536565b82525050565b5f6135698284613547565b60018201915081905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82825260208201905092915050565b5f6135ec82613125565b6135f681856135d2565b935061360681856020860161313f565b61360f8161314d565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f61364e838361315d565b905092915050565b5f602082019050919050565b5f61366c8261361a565b6136768185613624565b93508360208202850161368885613634565b805f5b858110156136c357848403895281516136a48582613643565b94506136af83613656565b925060208a0199505060018101905061368b565b50829750879550505050505092915050565b5f6060820190508181035f8301526136ed81866135e2565b905081810360208301526137018185613662565b90506137106040830184612ca7565b949350505050565b5f6137238285613547565b6001820191506137338284613547565b6001820191508190509392505050565b5f61375d61375861375384613469565b612e52565b61351e565b9050919050565b61376d81613743565b82525050565b5f6060820190506137865f830186612d79565b6137936020830185612d79565b6137a06040830184613764565b949350505050565b5f82825260208201905092915050565b7f45544820726566756e64206661696c65640000000000000000000000000000005f82015250565b5f6137ec6011836137a8565b91506137f7826137b8565b602082019050919050565b5f6020820190508181035f830152613819816137e0565b9050919050565b5f61382b8286613547565b60018201915061383b8285613547565b60018201915061384b8284613547565b600182019150819050949350505050565b5f61012083015f8301516138725f86018261307b565b50602083015161388560a08601826130ec565b50604083015161389860c0860182613116565b5060608301516138ab60e0860182613116565b5060808301518482036101008601526138c4828261315d565b9150508091505092915050565b5f6020820190508181035f8301526138e9818461385c565b905092915050565b6138fa816130fb565b82525050565b5f6040820190506139135f830185612d79565b61392060208301846138f1565b9392505050565b5f60608201905061393a5f830186612d79565b6139476020830185612d79565b6139546040830184612ca7565b949350505050565b5f6040820190508181035f83015261397481856135e2565b905081810360208301526139888184613662565b90509392505050565b5f61012083015f8301516139a75f86018261307b565b5060208301516139ba60a08601826130ec565b5060408301516139cd60c0860182613116565b5060608301516139e060e0860182613116565b5060808301518482036101008601526139f9828261315d565b9150508091505092915050565b5f6020820190508181035f830152613a1e8184613991565b90509291505056fea26469706673582212204ca2d84f730e0788530214fefc2fa01fd173a7ae3c2c677078322e641cf50d0264736f6c634300081c0033000000000000000000000000f8a2c39111fceb9c950aaf28a9e34ebad99b85c1", + "nonce": "0x1b3", "chainId": "0x2105" }, "additionalContracts": [], @@ -24,132 +24,132 @@ "receipts": [ { "status": "0x1", - "cumulativeGasUsed": "0x1466cae", + "cumulativeGasUsed": "0x158a862", "logs": [ { "address": "0xf8a2c39111fceb9c950aaf28a9e34ebad99b85c1", "topics": [ "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", - "0x000000000000000000000000504365bd15e79f04a8457c798a07d20bd59ad0f8", + "0x000000000000000000000000ef6a8640c836b16eb8ccd8016ead4c8517ac3033", "0x000000000000000000000000c5a076cad94176c2996b32d8466be1ce757faa27" ], "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "blockNumber": "0x29ab228", - "blockTimestamp": "0x69bfc133", - "transactionHash": "0x81318a9853ba886e1133d8daf2e08372423dd0a3ab7530132f86196471c6b88e", - "transactionIndex": "0x48", - "logIndex": "0x5b6", + "blockNumber": "0x29ab294", + "blockTimestamp": "0x69bfc20b", + "transactionHash": "0xca9f0cf3999e192d1f851453b8e2c07b6f481059813b82f709016377a1944ea8", + "transactionIndex": "0x5e", + "logIndex": "0x258", "removed": false }, { "address": "0xf8a2c39111fceb9c950aaf28a9e34ebad99b85c1", "topics": [ "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", - "0x000000000000000000000000504365bd15e79f04a8457c798a07d20bd59ad0f8", + "0x000000000000000000000000ef6a8640c836b16eb8ccd8016ead4c8517ac3033", "0x000000000000000000000000492c412369db76c9cdd9939e6c521579301473a3" ], "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "blockNumber": "0x29ab228", - "blockTimestamp": "0x69bfc133", - "transactionHash": "0x81318a9853ba886e1133d8daf2e08372423dd0a3ab7530132f86196471c6b88e", - "transactionIndex": "0x48", - "logIndex": "0x5b7", + "blockNumber": "0x29ab294", + "blockTimestamp": "0x69bfc20b", + "transactionHash": "0xca9f0cf3999e192d1f851453b8e2c07b6f481059813b82f709016377a1944ea8", + "transactionIndex": "0x5e", + "logIndex": "0x259", "removed": false }, { "address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", "topics": [ "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", - "0x000000000000000000000000504365bd15e79f04a8457c798a07d20bd59ad0f8", + "0x000000000000000000000000ef6a8640c836b16eb8ccd8016ead4c8517ac3033", "0x000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba3" ], "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "blockNumber": "0x29ab228", - "blockTimestamp": "0x69bfc133", - "transactionHash": "0x81318a9853ba886e1133d8daf2e08372423dd0a3ab7530132f86196471c6b88e", - "transactionIndex": "0x48", - "logIndex": "0x5b8", + "blockNumber": "0x29ab294", + "blockTimestamp": "0x69bfc20b", + "transactionHash": "0xca9f0cf3999e192d1f851453b8e2c07b6f481059813b82f709016377a1944ea8", + "transactionIndex": "0x5e", + "logIndex": "0x25a", "removed": false }, { "address": "0x000000000022d473030f116ddee9f6b43ac78ba3", "topics": [ "0xda9fa7c1b00402c17d0161b249b1ab8bbec047c5a52207b9c112deffd817036b", - "0x000000000000000000000000504365bd15e79f04a8457c798a07d20bd59ad0f8", + "0x000000000000000000000000ef6a8640c836b16eb8ccd8016ead4c8517ac3033", "0x000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913", "0x0000000000000000000000006ff5693b99212da76ad316178a184ab56d299b43" ], "data": "0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000ffffffffffff", "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "blockNumber": "0x29ab228", - "blockTimestamp": "0x69bfc133", - "transactionHash": "0x81318a9853ba886e1133d8daf2e08372423dd0a3ab7530132f86196471c6b88e", - "transactionIndex": "0x48", - "logIndex": "0x5b9", + "blockNumber": "0x29ab294", + "blockTimestamp": "0x69bfc20b", + "transactionHash": "0xca9f0cf3999e192d1f851453b8e2c07b6f481059813b82f709016377a1944ea8", + "transactionIndex": "0x5e", + "logIndex": "0x25b", "removed": false }, { "address": "0x37f0c2915cecc7e977183b8543fc0864d03e064c", "topics": [ "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", - "0x000000000000000000000000504365bd15e79f04a8457c798a07d20bd59ad0f8", + "0x000000000000000000000000ef6a8640c836b16eb8ccd8016ead4c8517ac3033", "0x000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba3" ], "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "blockNumber": "0x29ab228", - "blockTimestamp": "0x69bfc133", - "transactionHash": "0x81318a9853ba886e1133d8daf2e08372423dd0a3ab7530132f86196471c6b88e", - "transactionIndex": "0x48", - "logIndex": "0x5ba", + "blockNumber": "0x29ab294", + "blockTimestamp": "0x69bfc20b", + "transactionHash": "0xca9f0cf3999e192d1f851453b8e2c07b6f481059813b82f709016377a1944ea8", + "transactionIndex": "0x5e", + "logIndex": "0x25c", "removed": false }, { "address": "0x000000000022d473030f116ddee9f6b43ac78ba3", "topics": [ "0xda9fa7c1b00402c17d0161b249b1ab8bbec047c5a52207b9c112deffd817036b", - "0x000000000000000000000000504365bd15e79f04a8457c798a07d20bd59ad0f8", + "0x000000000000000000000000ef6a8640c836b16eb8ccd8016ead4c8517ac3033", "0x00000000000000000000000037f0c2915cecc7e977183b8543fc0864d03e064c", "0x0000000000000000000000006ff5693b99212da76ad316178a184ab56d299b43" ], "data": "0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000ffffffffffff", "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "blockNumber": "0x29ab228", - "blockTimestamp": "0x69bfc133", - "transactionHash": "0x81318a9853ba886e1133d8daf2e08372423dd0a3ab7530132f86196471c6b88e", - "transactionIndex": "0x48", - "logIndex": "0x5bb", + "blockNumber": "0x29ab294", + "blockTimestamp": "0x69bfc20b", + "transactionHash": "0xca9f0cf3999e192d1f851453b8e2c07b6f481059813b82f709016377a1944ea8", + "transactionIndex": "0x5e", + "logIndex": "0x25d", "removed": false } ], - "logsBloom": "0x00010000000000020000000000000000000000000000000000000020000000000000000000000000000000000000104000000000800000000000100000280000000002000000040000005000000000000000000000080800000000000000000000800000000000000080000000000000010000000000000000000000000040000020000000020000400000000000000002000000000000000000000000000000020000100000000000002000800000081000000000100000000000080000000000000000000000000000000000000000200000000000000040000000040000000010000000000000000000000000040000000000000000000200000001000400", + "logsBloom": "0x00010000000000020000000000000000000000000000000000000000000000000000000000000000000000000000104000000000800000000000100000280000000002000000040000005000000000000000000000080800000000001000000000800000000000000080000000000000010040000000000000000000000048000020000000000000400000000000000002000000000000000000000000000000020000100000000000000000800000081000000000100000000000080000000000000000000000000000000000000000200000000000000040000000040000000010000000000000000000000000040000000000000000000200000001000400", "type": "0x2", - "transactionHash": "0x81318a9853ba886e1133d8daf2e08372423dd0a3ab7530132f86196471c6b88e", - "transactionIndex": "0x48", + "transactionHash": "0xca9f0cf3999e192d1f851453b8e2c07b6f481059813b82f709016377a1944ea8", + "transactionIndex": "0x5e", "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "blockNumber": "0x29ab228", - "gasUsed": "0x344f30", - "effectiveGasPrice": "0x4dd1e0", - "blobGasUsed": "0xc3e8f", + "blockNumber": "0x29ab294", + "gasUsed": "0x35c011", + "effectiveGasPrice": "0x4c4b72", + "blobGasUsed": "0xcac3d", "from": "0x017596303ee2f3c1250aa67d2d33dbae1d1c4dbf", "to": null, - "contractAddress": "0x504365bd15e79f04a8457c798a07d20bd59ad0f8", + "contractAddress": "0xef6a8640c836b16eb8ccd8016ead4c8517ac3033", "daFootprintGasScalar": "0x8b", "l1BaseFeeScalar": "0x8dd", - "l1BlobBaseFee": "0x25c5f8", + "l1BlobBaseFee": "0x21c3df", "l1BlobBaseFeeScalar": "0x101c12", - "l1Fee": "0x18e52908", - "l1GasPrice": "0x29101b8", - "l1GasUsed": "0x168d9" + "l1Fee": "0x16ee45cc", + "l1GasPrice": "0x27b0c5f", + "l1GasUsed": "0x17573" } ], "libraries": [], "pending": [], "returns": {}, - "timestamp": 1774174513582, + "timestamp": 1774174729845, "chain": 8453, - "commit": "a782326" + "commit": "67cc18a" } \ No newline at end of file diff --git a/src/ZapPlotLinkV2.sol b/src/ZapPlotLinkV2.sol index b88fbbf..404a004 100644 --- a/src/ZapPlotLinkV2.sol +++ b/src/ZapPlotLinkV2.sol @@ -32,9 +32,9 @@ contract ZapPlotLinkV2 { address public constant HUNT = 0x37f0c2915CeCC7e977183B8543Fc0864d03E064C; address public constant ETH_ADDRESS = address(0); - // ============ Uniswap V4 Pool Parameters (0.3% fee) ============ - uint24 public constant POOL_FEE = 3000; - int24 public constant TICK_SPACING = 60; + // ============ Uniswap V4 Pool Parameters (owner-updatable) ============ + uint24 public poolFee = 3000; + int24 public poolTickSpacing = 60; // ============ External Contracts (Base Mainnet) ============ IUniversalRouter public constant UNIVERSAL_ROUTER = IUniversalRouter(0x6fF5693b99212Da76ad316178A184AB56D299b43); @@ -141,6 +141,12 @@ contract ZapPlotLinkV2 { require(ok); } + /// @notice Update pool fee and tick spacing (e.g., if migrating to a different pool tier) + function setPoolKey(uint24 newFee, int24 newTickSpacing) external onlyOwner { + poolFee = newFee; + poolTickSpacing = newTickSpacing; + } + // ============ External Mint Functions ============ /// @notice Mint exact amount of storyline tokens using various input tokens @@ -248,18 +254,43 @@ contract ZapPlotLinkV2 { (storylineAmount,) = BOND_PERIPHERY.getTokensForReserve(storylineToken, plotAmount, false); } + // ============ Pool Key Sorting ============ + + /// @dev Sort fromToken and plotToken into canonical V4 pool key order. + /// currency0 < currency1 is required by Uniswap V4. + /// zeroForOne = true means we're swapping currency0 for currency1. + function _sortPoolKey(address fromToken) + private + view + returns (address currency0, address currency1, bool zeroForOne) + { + if (fromToken == ETH_ADDRESS) { + // ETH (address(0)) is always the lowest + currency0 = ETH_ADDRESS; + currency1 = plotToken; + zeroForOne = true; // swapping ETH (currency0) for PLOT (currency1) + } else if (uint160(fromToken) < uint160(plotToken)) { + currency0 = fromToken; + currency1 = plotToken; + zeroForOne = true; // swapping fromToken (currency0) for PLOT (currency1) + } else { + currency0 = plotToken; + currency1 = fromToken; + zeroForOne = false; // swapping fromToken (currency1) for PLOT (currency0) + } + } + // ============ Internal Functions ============ function _buildQuoteParams(address fromToken, uint128 amount) private view returns (QuoteExactSingleParams memory) { - (address currency0, address currency1, bool zeroForOne) = - fromToken == ETH_ADDRESS ? (ETH_ADDRESS, plotToken, true) : (plotToken, fromToken, false); + (address currency0, address currency1, bool zeroForOne) = _sortPoolKey(fromToken); return QuoteExactSingleParams({ poolKey: PoolKey({ currency0: currency0, currency1: currency1, - fee: POOL_FEE, - tickSpacing: TICK_SPACING, + fee: poolFee, + tickSpacing: poolTickSpacing, hooks: IHooks(address(0)) }), zeroForOne: zeroForOne, @@ -288,8 +319,7 @@ contract ZapPlotLinkV2 { function _executeV4Swap(address fromToken, uint256 amountIn) private returns (uint256 plotReceived) { uint256 plotBefore = IERC20(plotToken).balanceOf(address(this)); - (address currency0, address currency1, bool zeroForOne) = - fromToken == ETH_ADDRESS ? (ETH_ADDRESS, plotToken, true) : (plotToken, fromToken, false); + (address currency0, address currency1, bool zeroForOne) = _sortPoolKey(fromToken); bytes memory commands = abi.encodePacked(uint8(Commands.V4_SWAP)); bytes[] memory inputs = new bytes[](1); @@ -312,8 +342,7 @@ contract ZapPlotLinkV2 { uint256 balanceBefore = fromToken == ETH_ADDRESS ? address(this).balance : IERC20(fromToken).balanceOf(address(this)); - (address currency0, address currency1, bool zeroForOne) = - fromToken == ETH_ADDRESS ? (ETH_ADDRESS, plotToken, true) : (plotToken, fromToken, false); + (address currency0, address currency1, bool zeroForOne) = _sortPoolKey(fromToken); bytes memory swapInput = _buildV4SwapInputExactOut(currency0, currency1, zeroForOne, uint128(plotAmountOut), uint128(amountInMax)); @@ -367,8 +396,8 @@ contract ZapPlotLinkV2 { PoolKey memory poolKey = PoolKey({ currency0: currency0, currency1: currency1, - fee: POOL_FEE, - tickSpacing: TICK_SPACING, + fee: poolFee, + tickSpacing: poolTickSpacing, hooks: IHooks(address(0)) }); @@ -401,8 +430,8 @@ contract ZapPlotLinkV2 { PoolKey memory poolKey = PoolKey({ currency0: currency0, currency1: currency1, - fee: POOL_FEE, - tickSpacing: TICK_SPACING, + fee: poolFee, + tickSpacing: poolTickSpacing, hooks: IHooks(address(0)) });