From c153a2aaf8fb15612ee0b54e0c3ca1c4d08c8cf9 Mon Sep 17 00:00:00 2001 From: wighawag Date: Wed, 13 Sep 2023 11:13:44 +0200 Subject: [PATCH] deploy to sepolia --- contracts/deployments/sepolia/.chainId | 1 + contracts/deployments/sepolia/Gems.json | 12044 ++++++++++++++++ .../sepolia/Gems_Implementation.json | 987 ++ contracts/deployments/sepolia/Gems_Proxy.json | 197 + contracts/deployments/sepolia/Stratagems.json | 2008 +++ .../sepolia/Stratagems_Implementation.json | 2008 +++ .../Stratagems_Implementation_Router.json | 89 + ...gems_Implementation_Router_Core_Route.json | 1324 ++ ...ems_Implementation_Router_Debug_Route.json | 1092 ++ ...ms_Implementation_Router_ERC721_Route.json | 1411 ++ .../deployments/sepolia/Stratagems_Proxy.json | 197 + contracts/deployments/sepolia/TestTokens.json | 984 ++ 12 files changed, 22342 insertions(+) create mode 100644 contracts/deployments/sepolia/.chainId create mode 100644 contracts/deployments/sepolia/Gems.json create mode 100644 contracts/deployments/sepolia/Gems_Implementation.json create mode 100644 contracts/deployments/sepolia/Gems_Proxy.json create mode 100644 contracts/deployments/sepolia/Stratagems.json create mode 100644 contracts/deployments/sepolia/Stratagems_Implementation.json create mode 100644 contracts/deployments/sepolia/Stratagems_Implementation_Router.json create mode 100644 contracts/deployments/sepolia/Stratagems_Implementation_Router_Core_Route.json create mode 100644 contracts/deployments/sepolia/Stratagems_Implementation_Router_Debug_Route.json create mode 100644 contracts/deployments/sepolia/Stratagems_Implementation_Router_ERC721_Route.json create mode 100644 contracts/deployments/sepolia/Stratagems_Proxy.json create mode 100644 contracts/deployments/sepolia/TestTokens.json diff --git a/contracts/deployments/sepolia/.chainId b/contracts/deployments/sepolia/.chainId new file mode 100644 index 00000000..bd8d1cd4 --- /dev/null +++ b/contracts/deployments/sepolia/.chainId @@ -0,0 +1 @@ +11155111 \ No newline at end of file diff --git a/contracts/deployments/sepolia/Gems.json b/contracts/deployments/sepolia/Gems.json new file mode 100644 index 00000000..7cf19974 --- /dev/null +++ b/contracts/deployments/sepolia/Gems.json @@ -0,0 +1,12044 @@ +{ + "address": "0xbe1a691b55b37763fefd3058bada0016028bffe0", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "DeadlineOver", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "name": "InvalidAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "provided", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "InvalidMsgValue", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "provided", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "InvalidTotalAmount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentAllowance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "NotAuthorizedAllowance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "NotEnoughTokens", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "approveAndCall", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable[]", + "name": "tos", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "totalAmount", + "type": "uint256" + } + ], + "name": "distributeAlongWithETH", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "eip712Domain", + "outputs": [ + { + "internalType": "bytes1", + "name": "fields", + "type": "bytes1" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + }, + { + "internalType": "uint256", + "name": "chainID", + "type": "uint256" + }, + { + "internalType": "address", + "name": "verifyingContract", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256[]", + "name": "extensions", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferAlongWithETH", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "transferAndCall", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "transferFromAndCall", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "forAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "transferOnBehalfAndCall", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "contractName": "Gems", + "sourceName": "src/token/Gems.sol", + "bytecode": "0x60e060405234801562000010575f80fd5b5060405162001a5a38038062001a5a8339810160408190526200003391620001aa565b4660808190523090819081156200004b57816200004d565b305b6001600160a01b031660c08190526200006890829062000084565b60a052506200007c91508390508262000121565b505062000203565b5f7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866620000c860408051808201909152600481526347656d7360e01b602082015290565b80516020918201206040516200010293928791879101938452602084019290925260408301526001600160a01b0316606082015260800190565b6040516020818303038152906040528051906020012090505b92915050565b805f80828254620001339190620001e3565b90915550506001600160a01b0382165f908152600160205260408120805483929062000161908490620001e3565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b5f8060408385031215620001bc575f80fd5b82516001600160a01b0381168114620001d3575f80fd5b6020939093015192949293505050565b808201808211156200011b57634e487b7160e01b5f52601160045260245ffd5b60805160a05160c051611825620002355f395f8181610799015261100501525f61103001525f610fda01526118255ff3fe60806040526004361061013d575f3560e01c806370a08231116100bb578063c1d34b8911610071578063d505accf11610057578063d505accf146103d1578063dd62ed3e146103f2578063e7fcb06514610411575f80fd5b8063c1d34b8914610393578063cae9ca51146103b2575f80fd5b806384b0196e116100a157806384b0196e1461030557806395d89b411461032c578063a9059cbb14610374575f80fd5b806370a08231146102835780637ecebe00146102c4575f80fd5b806323b872dd116101105780633644e515116100f65780633644e515146102315780634000aea01461024557806365520efa14610264575f80fd5b806323b872dd146101f7578063313ce56714610216575f80fd5b806306fdde0314610141578063095ea7b3146101985780630e02df54146101c757806318160ddd146101da575b5f80fd5b34801561014c575f80fd5b5060408051808201909152600481527f47656d730000000000000000000000000000000000000000000000000000000060208201525b60405161018f91906111b3565b60405180910390f35b3480156101a3575f80fd5b506101b76101b23660046111f0565b610424565b604051901515815260200161018f565b6101b76101d5366004611257565b61043a565b3480156101e5575f80fd5b505f545b60405190815260200161018f565b348015610202575f80fd5b506101b761021136600461133b565b6105c7565b348015610221575f80fd5b506040516012815260200161018f565b34801561023c575f80fd5b506101e96105dd565b348015610250575f80fd5b506101b761025f3660046113be565b6105e6565b34801561026f575f80fd5b506101b761027e366004611416565b610693565b34801561028e575f80fd5b506101e961029d366004611484565b73ffffffffffffffffffffffffffffffffffffffff165f9081526001602052604090205490565b3480156102cf575f80fd5b506101e96102de366004611484565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b348015610310575f80fd5b50610319610743565b60405161018f979695949392919061149f565b348015610337575f80fd5b506101826040518060400160405280600381526020017f47454d000000000000000000000000000000000000000000000000000000000081525081565b34801561037f575f80fd5b506101b761038e3660046111f0565b6107c3565b34801561039e575f80fd5b506101b76103ad366004611416565b6107cf565b3480156103bd575f80fd5b506101b76103cc3660046113be565b610833565b3480156103dc575f80fd5b506103f06103eb36600461155c565b610895565b005b3480156103fd575f80fd5b506101e961040c3660046115cd565b610b58565b6101b761041f3660046111f0565b610bd5565b5f610430338484610c20565b5060015b92915050565b5f808351346104499190611631565b90508351816104589190611669565b34146104ac573484518261046c9190611669565b6040517f1f89f671000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044015b60405180910390fd5b5f8451846104ba9190611631565b90508451816104c99190611669565b841461051857838551826104dd9190611669565b6040517fe93890a2000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016104a3565b5f5b85518110156105b6576105473387838151811061053957610539611680565b602002602001015184610cfd565b85818151811061055957610559611680565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166108fc8490811502906040515f60405180830381858888f193505050501580156105a3573d5f803e3d5ffd5b50806105ae816116ad565b91505061051a565b50600195945050505050565b905090565b5f6105d3848484610ead565b5060019392505050565b5f6105c2610fd6565b5f6105f2338686610cfd565b6040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063a4c0ed369061064a90339088908890889060040161172b565b6020604051808303815f875af1158015610666573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061068a9190611760565b95945050505050565b5f61069f338686610cfd565b6040517f2eedcb7100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861690632eedcb71906106f99033908a9089908990899060040161177f565b6020604051808303815f875af1158015610715573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107399190611760565b9695505050505050565b7f0d000000000000000000000000000000000000000000000000000000000000006060805f808083610773611056565b60408051602080820183525f8083528351818152918201909352999a92999098504697507f0000000000000000000000000000000000000000000000000000000000000000965090945092509050565b5f610430338484610cfd565b5f6107db868686610ead565b6040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063a4c0ed36906106f990899088908890889060040161172b565b5f61083f338686610c20565b6040517eba451f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169062ba451f9061064a90339088908890889060040161172b565b73ffffffffffffffffffffffffffffffffffffffff87166108e4576040517f8e4c8aa60000000000000000000000000000000000000000000000000000000081525f60048201526024016104a3565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260036020526040812054906109126105dd565b604080517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9602082015273ffffffffffffffffffffffffffffffffffffffff808d1692820192909252908a1660608201526080810189905260a0810184905260c0810188905260e001604051602081830303815290604052805190602001206040516020016109d39291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f845290830180835281905260ff8816918301919091526060820186905260808201859052915060019060a0016020604051602081039080840390855afa158015610a56573d5f803e3d5ffd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614610ac4576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8515801590610ad257508542115b15610b12576040517fdd6b219a000000000000000000000000000000000000000000000000000000008152426004820152602481018790526044016104a3565b610b1d8260016117c9565b73ffffffffffffffffffffffffffffffffffffffff8a165f90815260036020526040902055610b4d898989610c20565b505050505050505050565b5f3073ffffffffffffffffffffffffffffffffffffffff841603610b9d57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610434565b5073ffffffffffffffffffffffffffffffffffffffff9182165f90815260026020908152604080832093909416825291909152205490565b5f610be1338484610cfd565b60405173ffffffffffffffffffffffffffffffffffffffff8416903480156108fc02915f818181858888f193505050501580156105d3573d5f803e3d5ffd5b73ffffffffffffffffffffffffffffffffffffffff83161580610c57575073ffffffffffffffffffffffffffffffffffffffff8216155b15610c90576040517f8e4c8aa60000000000000000000000000000000000000000000000000000000081525f60048201526024016104a3565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff82161580610d35575073ffffffffffffffffffffffffffffffffffffffff821630145b15610d84576040517f8e4c8aa600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016104a3565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526001602052604090205481811015610ded576040517f6584853f00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016104a3565b610df782826117dc565b73ffffffffffffffffffffffffffffffffffffffff8086165f908152600160205260408082209390935590851681529081208054849290610e399084906117c9565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e9f91815260200190565b60405180910390a350505050565b3373ffffffffffffffffffffffffffffffffffffffff841614801590610ee9575073ffffffffffffffffffffffffffffffffffffffff83163014155b15610fc65773ffffffffffffffffffffffffffffffffffffffff83165f9081526002602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610fc45781811015610f89576040517f95fcd25400000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016104a3565b610f9382826117dc565b73ffffffffffffffffffffffffffffffffffffffff85165f9081526002602090815260408083203384529091529020555b505b610fd1838383610cfd565b505050565b5f467f0000000000000000000000000000000000000000000000000000000000000000811461102e57611029817f0000000000000000000000000000000000000000000000000000000000000000611092565b611050565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b60606105c260408051808201909152600481527f47656d7300000000000000000000000000000000000000000000000000000000602082015290565b5f7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666110ee60408051808201909152600481527f47656d7300000000000000000000000000000000000000000000000000000000602082015290565b8051602091820120604051611134939287918791019384526020840192909252604083015273ffffffffffffffffffffffffffffffffffffffff16606082015260800190565b60405160208183030381529060405280519060200120905092915050565b5f81518084525f5b818110156111765760208185018101518683018201520161115a565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6111c56020830184611152565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146111ed575f80fd5b50565b5f8060408385031215611201575f80fd5b823561120c816111cc565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b8035611252816111cc565b919050565b5f8060408385031215611268575f80fd5b823567ffffffffffffffff8082111561127f575f80fd5b818501915085601f830112611292575f80fd5b81356020828211156112a6576112a661121a565b8160051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811086821117156112e9576112e961121a565b604052928352818301935084810182019289841115611306575f80fd5b948201945b8386101561132b5761131c86611247565b8552948201949382019361130b565b9997909101359750505050505050565b5f805f6060848603121561134d575f80fd5b8335611358816111cc565b92506020840135611368816111cc565b929592945050506040919091013590565b5f8083601f840112611389575f80fd5b50813567ffffffffffffffff8111156113a0575f80fd5b6020830191508360208285010111156113b7575f80fd5b9250929050565b5f805f80606085870312156113d1575f80fd5b84356113dc816111cc565b935060208501359250604085013567ffffffffffffffff8111156113fe575f80fd5b61140a87828801611379565b95989497509550505050565b5f805f805f6080868803121561142a575f80fd5b8535611435816111cc565b94506020860135611445816111cc565b935060408601359250606086013567ffffffffffffffff811115611467575f80fd5b61147388828901611379565b969995985093965092949392505050565b5f60208284031215611494575f80fd5b81356111c5816111cc565b7fff00000000000000000000000000000000000000000000000000000000000000881681525f602060e0818401526114da60e084018a611152565b83810360408501526114ec818a611152565b6060850189905273ffffffffffffffffffffffffffffffffffffffff8816608086015260a0850187905284810360c086015285518082528387019250908301905f5b8181101561154a5783518352928401929184019160010161152e565b50909c9b505050505050505050505050565b5f805f805f805f60e0888a031215611572575f80fd5b873561157d816111cc565b9650602088013561158d816111cc565b95506040880135945060608801359350608088013560ff811681146115b0575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156115de575f80fd5b82356115e9816111cc565b915060208301356115f9816111cc565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f82611664577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b808202811582820484141761043457610434611604565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036116dd576116dd611604565b5060010190565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6107396060830184866116e4565b5f60208284031215611770575f80fd5b815180151581146111c5575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff8088168352808716602084015250846040830152608060608301526117be6080830184866116e4565b979650505050505050565b8082018082111561043457610434611604565b818103818111156104345761043461160456fea2646970667358221220176888c253ea62d60e8b85116aad0a658dd29f3cc3d4c183633dc0d94e9023d564736f6c63430008140033", + "deployedBytecode": "0x60806040526004361061013d575f3560e01c806370a08231116100bb578063c1d34b8911610071578063d505accf11610057578063d505accf146103d1578063dd62ed3e146103f2578063e7fcb06514610411575f80fd5b8063c1d34b8914610393578063cae9ca51146103b2575f80fd5b806384b0196e116100a157806384b0196e1461030557806395d89b411461032c578063a9059cbb14610374575f80fd5b806370a08231146102835780637ecebe00146102c4575f80fd5b806323b872dd116101105780633644e515116100f65780633644e515146102315780634000aea01461024557806365520efa14610264575f80fd5b806323b872dd146101f7578063313ce56714610216575f80fd5b806306fdde0314610141578063095ea7b3146101985780630e02df54146101c757806318160ddd146101da575b5f80fd5b34801561014c575f80fd5b5060408051808201909152600481527f47656d730000000000000000000000000000000000000000000000000000000060208201525b60405161018f91906111b3565b60405180910390f35b3480156101a3575f80fd5b506101b76101b23660046111f0565b610424565b604051901515815260200161018f565b6101b76101d5366004611257565b61043a565b3480156101e5575f80fd5b505f545b60405190815260200161018f565b348015610202575f80fd5b506101b761021136600461133b565b6105c7565b348015610221575f80fd5b506040516012815260200161018f565b34801561023c575f80fd5b506101e96105dd565b348015610250575f80fd5b506101b761025f3660046113be565b6105e6565b34801561026f575f80fd5b506101b761027e366004611416565b610693565b34801561028e575f80fd5b506101e961029d366004611484565b73ffffffffffffffffffffffffffffffffffffffff165f9081526001602052604090205490565b3480156102cf575f80fd5b506101e96102de366004611484565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b348015610310575f80fd5b50610319610743565b60405161018f979695949392919061149f565b348015610337575f80fd5b506101826040518060400160405280600381526020017f47454d000000000000000000000000000000000000000000000000000000000081525081565b34801561037f575f80fd5b506101b761038e3660046111f0565b6107c3565b34801561039e575f80fd5b506101b76103ad366004611416565b6107cf565b3480156103bd575f80fd5b506101b76103cc3660046113be565b610833565b3480156103dc575f80fd5b506103f06103eb36600461155c565b610895565b005b3480156103fd575f80fd5b506101e961040c3660046115cd565b610b58565b6101b761041f3660046111f0565b610bd5565b5f610430338484610c20565b5060015b92915050565b5f808351346104499190611631565b90508351816104589190611669565b34146104ac573484518261046c9190611669565b6040517f1f89f671000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044015b60405180910390fd5b5f8451846104ba9190611631565b90508451816104c99190611669565b841461051857838551826104dd9190611669565b6040517fe93890a2000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016104a3565b5f5b85518110156105b6576105473387838151811061053957610539611680565b602002602001015184610cfd565b85818151811061055957610559611680565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166108fc8490811502906040515f60405180830381858888f193505050501580156105a3573d5f803e3d5ffd5b50806105ae816116ad565b91505061051a565b50600195945050505050565b905090565b5f6105d3848484610ead565b5060019392505050565b5f6105c2610fd6565b5f6105f2338686610cfd565b6040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063a4c0ed369061064a90339088908890889060040161172b565b6020604051808303815f875af1158015610666573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061068a9190611760565b95945050505050565b5f61069f338686610cfd565b6040517f2eedcb7100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861690632eedcb71906106f99033908a9089908990899060040161177f565b6020604051808303815f875af1158015610715573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107399190611760565b9695505050505050565b7f0d000000000000000000000000000000000000000000000000000000000000006060805f808083610773611056565b60408051602080820183525f8083528351818152918201909352999a92999098504697507f0000000000000000000000000000000000000000000000000000000000000000965090945092509050565b5f610430338484610cfd565b5f6107db868686610ead565b6040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063a4c0ed36906106f990899088908890889060040161172b565b5f61083f338686610c20565b6040517eba451f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169062ba451f9061064a90339088908890889060040161172b565b73ffffffffffffffffffffffffffffffffffffffff87166108e4576040517f8e4c8aa60000000000000000000000000000000000000000000000000000000081525f60048201526024016104a3565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260036020526040812054906109126105dd565b604080517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9602082015273ffffffffffffffffffffffffffffffffffffffff808d1692820192909252908a1660608201526080810189905260a0810184905260c0810188905260e001604051602081830303815290604052805190602001206040516020016109d39291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f845290830180835281905260ff8816918301919091526060820186905260808201859052915060019060a0016020604051602081039080840390855afa158015610a56573d5f803e3d5ffd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614610ac4576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8515801590610ad257508542115b15610b12576040517fdd6b219a000000000000000000000000000000000000000000000000000000008152426004820152602481018790526044016104a3565b610b1d8260016117c9565b73ffffffffffffffffffffffffffffffffffffffff8a165f90815260036020526040902055610b4d898989610c20565b505050505050505050565b5f3073ffffffffffffffffffffffffffffffffffffffff841603610b9d57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610434565b5073ffffffffffffffffffffffffffffffffffffffff9182165f90815260026020908152604080832093909416825291909152205490565b5f610be1338484610cfd565b60405173ffffffffffffffffffffffffffffffffffffffff8416903480156108fc02915f818181858888f193505050501580156105d3573d5f803e3d5ffd5b73ffffffffffffffffffffffffffffffffffffffff83161580610c57575073ffffffffffffffffffffffffffffffffffffffff8216155b15610c90576040517f8e4c8aa60000000000000000000000000000000000000000000000000000000081525f60048201526024016104a3565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff82161580610d35575073ffffffffffffffffffffffffffffffffffffffff821630145b15610d84576040517f8e4c8aa600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016104a3565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526001602052604090205481811015610ded576040517f6584853f00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016104a3565b610df782826117dc565b73ffffffffffffffffffffffffffffffffffffffff8086165f908152600160205260408082209390935590851681529081208054849290610e399084906117c9565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e9f91815260200190565b60405180910390a350505050565b3373ffffffffffffffffffffffffffffffffffffffff841614801590610ee9575073ffffffffffffffffffffffffffffffffffffffff83163014155b15610fc65773ffffffffffffffffffffffffffffffffffffffff83165f9081526002602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610fc45781811015610f89576040517f95fcd25400000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016104a3565b610f9382826117dc565b73ffffffffffffffffffffffffffffffffffffffff85165f9081526002602090815260408083203384529091529020555b505b610fd1838383610cfd565b505050565b5f467f0000000000000000000000000000000000000000000000000000000000000000811461102e57611029817f0000000000000000000000000000000000000000000000000000000000000000611092565b611050565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b60606105c260408051808201909152600481527f47656d7300000000000000000000000000000000000000000000000000000000602082015290565b5f7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666110ee60408051808201909152600481527f47656d7300000000000000000000000000000000000000000000000000000000602082015290565b8051602091820120604051611134939287918791019384526020840192909252604083015273ffffffffffffffffffffffffffffffffffffffff16606082015260800190565b60405160208183030381529060405280519060200120905092915050565b5f81518084525f5b818110156111765760208185018101518683018201520161115a565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6111c56020830184611152565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146111ed575f80fd5b50565b5f8060408385031215611201575f80fd5b823561120c816111cc565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b8035611252816111cc565b919050565b5f8060408385031215611268575f80fd5b823567ffffffffffffffff8082111561127f575f80fd5b818501915085601f830112611292575f80fd5b81356020828211156112a6576112a661121a565b8160051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811086821117156112e9576112e961121a565b604052928352818301935084810182019289841115611306575f80fd5b948201945b8386101561132b5761131c86611247565b8552948201949382019361130b565b9997909101359750505050505050565b5f805f6060848603121561134d575f80fd5b8335611358816111cc565b92506020840135611368816111cc565b929592945050506040919091013590565b5f8083601f840112611389575f80fd5b50813567ffffffffffffffff8111156113a0575f80fd5b6020830191508360208285010111156113b7575f80fd5b9250929050565b5f805f80606085870312156113d1575f80fd5b84356113dc816111cc565b935060208501359250604085013567ffffffffffffffff8111156113fe575f80fd5b61140a87828801611379565b95989497509550505050565b5f805f805f6080868803121561142a575f80fd5b8535611435816111cc565b94506020860135611445816111cc565b935060408601359250606086013567ffffffffffffffff811115611467575f80fd5b61147388828901611379565b969995985093965092949392505050565b5f60208284031215611494575f80fd5b81356111c5816111cc565b7fff00000000000000000000000000000000000000000000000000000000000000881681525f602060e0818401526114da60e084018a611152565b83810360408501526114ec818a611152565b6060850189905273ffffffffffffffffffffffffffffffffffffffff8816608086015260a0850187905284810360c086015285518082528387019250908301905f5b8181101561154a5783518352928401929184019160010161152e565b50909c9b505050505050505050505050565b5f805f805f805f60e0888a031215611572575f80fd5b873561157d816111cc565b9650602088013561158d816111cc565b95506040880135945060608801359350608088013560ff811681146115b0575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156115de575f80fd5b82356115e9816111cc565b915060208301356115f9816111cc565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f82611664577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b808202811582820484141761043457610434611604565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036116dd576116dd611604565b5060010190565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6107396060830184866116e4565b5f60208284031215611770575f80fd5b815180151581146111c5575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff8088168352808716602084015250846040830152608060608301526117be6080830184866116e4565b979650505050505050565b8082018082111561043457610434611604565b818103818111156104345761043461160456fea2646970667358221220176888c253ea62d60e8b85116aad0a658dd29f3cc3d4c183633dc0d94e9023d564736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {}, + "devdoc": { + "author": "Ronan Sandford", + "errors": { + "DeadlineOver(uint256,uint256)": [ + { + "params": { + "currentTime": "time at which the error happen", + "deadline": "the deadline" + } + } + ], + "InvalidAddress(address)": [ + { + "params": { + "addr": "invalid address" + } + } + ], + "InvalidMsgValue(uint256,uint256)": [ + { + "params": { + "expected": "value expected", + "provided": "msg.value amount provided" + } + } + ], + "InvalidTotalAmount(uint256,uint256)": [ + { + "params": { + "expected": "value expected", + "provided": "msg.value amount provided" + } + } + ], + "NotAuthorizedAllowance(uint256,uint256)": [ + { + "params": { + "currentAllowance": "the current allowance", + "expected": "amount expected" + } + } + ], + "NotEnoughTokens(uint256,uint256)": [ + { + "params": { + "currentBalance": "the current balance", + "expected": "amount expected" + } + } + ] + }, + "events": { + "Approval(address,address,uint256)": { + "params": { + "owner": "the account approving the `spender`", + "spender": "the account allowed to spend", + "value": "the amount granted" + } + }, + "Transfer(address,address,uint256)": { + "params": { + "from": "the account the tokens are sent from", + "to": "the account the tokens are sent to", + "value": "number of tokens sent" + } + } + }, + "kind": "dev", + "methods": { + "approveAndCall(address,uint256,bytes)": { + "params": { + "amount": "number of token to transfer", + "data": "extra data", + "spender": "account to send the token for" + }, + "returns": { + "_0": "success" + } + }, + "eip712Domain()": { + "returns": { + "chainID": "EIP-712 chainID", + "extensions": "A list of EIP numbers that specify additional fields in the domain. The method to obtain the value for each of these additional fields and any conditions for inclusion are expected to be specified in the respective EIP. The value of fields does not affect their inclusion.", + "fields": "A bit map where bit i is set to 1 if and only if domain field i is present (0 ≤ i ≤ 4). Bits are read from least significant to most significant, and fields are indexed in the order that is specified by EIP-712, identical to the order in which they are listed in the function type.", + "name": "EIP-712 name", + "salt": "EIP-712 salt", + "verifyingContract": "EIP-712 name verifyingContract", + "version": "EIP-712 version" + } + }, + "nonces(address)": { + "params": { + "owner": "address queried" + }, + "returns": { + "_0": "nonce value" + } + }, + "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": { + "params": { + "deadline": "timestamp in seconds after which the permit is not valid.", + "owner": "owner of the tokens", + "r": "signature part r", + "s": "signature part s", + "spender": "address allowed to spend on behalf of the owner.", + "v": "signature part v", + "value": "amount of token allowed to be spent" + } + }, + "transferAndCall(address,uint256,bytes)": { + "params": { + "amount": "number of token to transfer", + "data": "extra data", + "to": "account to receive the tokens" + }, + "returns": { + "_0": "success" + } + }, + "transferFromAndCall(address,address,uint256,bytes)": { + "params": { + "amount": "number of token to transfer", + "data": "extra data", + "from": "account to send the token from", + "to": "account to receive the tokens" + }, + "returns": { + "_0": "success" + } + }, + "transferOnBehalfAndCall(address,address,uint256,bytes)": { + "params": { + "amount": "number of token to transfer", + "data": "extra data", + "forAddress": "account to send the token for", + "to": "account to receive the tokens" + }, + "returns": { + "_0": "success" + } + } + }, + "title": "Gems Tokens", + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": { + "@_1293": { + "entryPoint": null, + "id": 1293, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@_1501": { + "entryPoint": null, + "id": 1501, + "parameterSlots": 2, + "returnSlots": 0 + }, + "@_168": { + "entryPoint": null, + "id": 168, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@_calculateDomainSeparator_1402": { + "entryPoint": 132, + "id": 1402, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@_mint_883": { + "entryPoint": 289, + "id": 883, + "parameterSlots": 2, + "returnSlots": 0 + }, + "@name_1515": { + "entryPoint": null, + "id": 1515, + "parameterSlots": 0, + "returnSlots": 1 + }, + "abi_decode_tuple_t_addresst_uint256_fromMemory": { + "entryPoint": 426, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_encode_tuple_t_bytes32_t_bytes32_t_uint256_t_address__to_t_bytes32_t_bytes32_t_uint256_t_address__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 5, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "checked_add_t_uint256": { + "entryPoint": 483, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + } + }, + "generatedSources": [ + { + "ast": { + "nodeType": "YulBlock", + "src": "0:1198:17", + "statements": [ + { + "nodeType": "YulBlock", + "src": "6:3:17", + "statements": [] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "112:253:17", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "158:16:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "167:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "170:1:17", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "160:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "160:12:17" + }, + "nodeType": "YulExpressionStatement", + "src": "160:12:17" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "133:7:17" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "142:9:17" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "129:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "129:23:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "154:2:17", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "125:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "125:32:17" + }, + "nodeType": "YulIf", + "src": "122:52:17" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "183:29:17", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "202:9:17" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "196:5:17" + }, + "nodeType": "YulFunctionCall", + "src": "196:16:17" + }, + "variables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "187:5:17", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "275:16:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "284:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "287:1:17", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "277:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "277:12:17" + }, + "nodeType": "YulExpressionStatement", + "src": "277:12:17" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "234:5:17" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "245:5:17" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "260:3:17", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "265:1:17", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nodeType": "YulIdentifier", + "src": "256:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "256:11:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "269:1:17", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "252:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "252:19:17" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "241:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "241:31:17" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "231:2:17" + }, + "nodeType": "YulFunctionCall", + "src": "231:42:17" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "224:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "224:50:17" + }, + "nodeType": "YulIf", + "src": "221:70:17" + }, + { + "nodeType": "YulAssignment", + "src": "300:15:17", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "310:5:17" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "300:6:17" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "324:35:17", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "344:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "355:2:17", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "340:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "340:18:17" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "334:5:17" + }, + "nodeType": "YulFunctionCall", + "src": "334:25:17" + }, + "variableNames": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "324:6:17" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_addresst_uint256_fromMemory", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "70:9:17", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "81:7:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "93:6:17", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "101:6:17", + "type": "" + } + ], + "src": "14:351:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "555:232:17", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "565:27:17", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "577:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "588:3:17", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "573:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "573:19:17" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "565:4:17" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "608:9:17" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "619:6:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "601:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "601:25:17" + }, + "nodeType": "YulExpressionStatement", + "src": "601:25:17" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "646:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "657:2:17", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "642:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "642:18:17" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "662:6:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "635:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "635:34:17" + }, + "nodeType": "YulExpressionStatement", + "src": "635:34:17" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "689:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "700:2:17", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "685:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "685:18:17" + }, + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "705:6:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "678:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "678:34:17" + }, + "nodeType": "YulExpressionStatement", + "src": "678:34:17" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "732:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "743:2:17", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "728:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "728:18:17" + }, + { + "arguments": [ + { + "name": "value3", + "nodeType": "YulIdentifier", + "src": "752:6:17" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "768:3:17", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "773:1:17", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nodeType": "YulIdentifier", + "src": "764:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "764:11:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "777:1:17", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "760:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "760:19:17" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "748:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "748:32:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "721:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "721:60:17" + }, + "nodeType": "YulExpressionStatement", + "src": "721:60:17" + } + ] + }, + "name": "abi_encode_tuple_t_bytes32_t_bytes32_t_uint256_t_address__to_t_bytes32_t_bytes32_t_uint256_t_address__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "500:9:17", + "type": "" + }, + { + "name": "value3", + "nodeType": "YulTypedName", + "src": "511:6:17", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "519:6:17", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "527:6:17", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "535:6:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "546:4:17", + "type": "" + } + ], + "src": "370:417:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "840:174:17", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "850:16:17", + "value": { + "arguments": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "861:1:17" + }, + { + "name": "y", + "nodeType": "YulIdentifier", + "src": "864:1:17" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "857:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "857:9:17" + }, + "variableNames": [ + { + "name": "sum", + "nodeType": "YulIdentifier", + "src": "850:3:17" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "897:111:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "918:1:17", + "type": "", + "value": "0" + }, + { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "925:3:17", + "type": "", + "value": "224" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "930:10:17", + "type": "", + "value": "0x4e487b71" + } + ], + "functionName": { + "name": "shl", + "nodeType": "YulIdentifier", + "src": "921:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "921:20:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "911:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "911:31:17" + }, + "nodeType": "YulExpressionStatement", + "src": "911:31:17" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "962:1:17", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "965:4:17", + "type": "", + "value": "0x11" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "955:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "955:15:17" + }, + "nodeType": "YulExpressionStatement", + "src": "955:15:17" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "990:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "993:4:17", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "983:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "983:15:17" + }, + "nodeType": "YulExpressionStatement", + "src": "983:15:17" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "881:1:17" + }, + { + "name": "sum", + "nodeType": "YulIdentifier", + "src": "884:3:17" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "878:2:17" + }, + "nodeType": "YulFunctionCall", + "src": "878:10:17" + }, + "nodeType": "YulIf", + "src": "875:133:17" + } + ] + }, + "name": "checked_add_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "x", + "nodeType": "YulTypedName", + "src": "823:1:17", + "type": "" + }, + { + "name": "y", + "nodeType": "YulTypedName", + "src": "826:1:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "sum", + "nodeType": "YulTypedName", + "src": "832:3:17", + "type": "" + } + ], + "src": "792:222:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1120:76:17", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1130:26:17", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1142:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1153:2:17", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1138:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "1138:18:17" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "1130:4:17" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1172:9:17" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1183:6:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1165:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "1165:25:17" + }, + "nodeType": "YulExpressionStatement", + "src": "1165:25:17" + } + ] + }, + "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1089:9:17", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "1100:6:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "1111:4:17", + "type": "" + } + ], + "src": "1019:177:17" + } + ] + }, + "contents": "{\n { }\n function abi_decode_tuple_t_addresst_uint256_fromMemory(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n value0 := value\n value1 := mload(add(headStart, 32))\n }\n function abi_encode_tuple_t_bytes32_t_bytes32_t_uint256_t_address__to_t_bytes32_t_bytes32_t_uint256_t_address__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 128)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), and(value3, sub(shl(160, 1), 1)))\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n sum := add(x, y)\n if gt(x, sum)\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n}", + "id": 17, + "language": "Yul", + "name": "#utility.yul" + } + ], + "linkReferences": {}, + "object": "60e060405234801562000010575f80fd5b5060405162001a5a38038062001a5a8339810160408190526200003391620001aa565b4660808190523090819081156200004b57816200004d565b305b6001600160a01b031660c08190526200006890829062000084565b60a052506200007c91508390508262000121565b505062000203565b5f7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866620000c860408051808201909152600481526347656d7360e01b602082015290565b80516020918201206040516200010293928791879101938452602084019290925260408301526001600160a01b0316606082015260800190565b6040516020818303038152906040528051906020012090505b92915050565b805f80828254620001339190620001e3565b90915550506001600160a01b0382165f908152600160205260408120805483929062000161908490620001e3565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b5f8060408385031215620001bc575f80fd5b82516001600160a01b0381168114620001d3575f80fd5b6020939093015192949293505050565b808201808211156200011b57634e487b7160e01b5f52601160045260245ffd5b60805160a05160c051611825620002355f395f8181610799015261100501525f61103001525f610fda01526118255ff3fe60806040526004361061013d575f3560e01c806370a08231116100bb578063c1d34b8911610071578063d505accf11610057578063d505accf146103d1578063dd62ed3e146103f2578063e7fcb06514610411575f80fd5b8063c1d34b8914610393578063cae9ca51146103b2575f80fd5b806384b0196e116100a157806384b0196e1461030557806395d89b411461032c578063a9059cbb14610374575f80fd5b806370a08231146102835780637ecebe00146102c4575f80fd5b806323b872dd116101105780633644e515116100f65780633644e515146102315780634000aea01461024557806365520efa14610264575f80fd5b806323b872dd146101f7578063313ce56714610216575f80fd5b806306fdde0314610141578063095ea7b3146101985780630e02df54146101c757806318160ddd146101da575b5f80fd5b34801561014c575f80fd5b5060408051808201909152600481527f47656d730000000000000000000000000000000000000000000000000000000060208201525b60405161018f91906111b3565b60405180910390f35b3480156101a3575f80fd5b506101b76101b23660046111f0565b610424565b604051901515815260200161018f565b6101b76101d5366004611257565b61043a565b3480156101e5575f80fd5b505f545b60405190815260200161018f565b348015610202575f80fd5b506101b761021136600461133b565b6105c7565b348015610221575f80fd5b506040516012815260200161018f565b34801561023c575f80fd5b506101e96105dd565b348015610250575f80fd5b506101b761025f3660046113be565b6105e6565b34801561026f575f80fd5b506101b761027e366004611416565b610693565b34801561028e575f80fd5b506101e961029d366004611484565b73ffffffffffffffffffffffffffffffffffffffff165f9081526001602052604090205490565b3480156102cf575f80fd5b506101e96102de366004611484565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b348015610310575f80fd5b50610319610743565b60405161018f979695949392919061149f565b348015610337575f80fd5b506101826040518060400160405280600381526020017f47454d000000000000000000000000000000000000000000000000000000000081525081565b34801561037f575f80fd5b506101b761038e3660046111f0565b6107c3565b34801561039e575f80fd5b506101b76103ad366004611416565b6107cf565b3480156103bd575f80fd5b506101b76103cc3660046113be565b610833565b3480156103dc575f80fd5b506103f06103eb36600461155c565b610895565b005b3480156103fd575f80fd5b506101e961040c3660046115cd565b610b58565b6101b761041f3660046111f0565b610bd5565b5f610430338484610c20565b5060015b92915050565b5f808351346104499190611631565b90508351816104589190611669565b34146104ac573484518261046c9190611669565b6040517f1f89f671000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044015b60405180910390fd5b5f8451846104ba9190611631565b90508451816104c99190611669565b841461051857838551826104dd9190611669565b6040517fe93890a2000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016104a3565b5f5b85518110156105b6576105473387838151811061053957610539611680565b602002602001015184610cfd565b85818151811061055957610559611680565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166108fc8490811502906040515f60405180830381858888f193505050501580156105a3573d5f803e3d5ffd5b50806105ae816116ad565b91505061051a565b50600195945050505050565b905090565b5f6105d3848484610ead565b5060019392505050565b5f6105c2610fd6565b5f6105f2338686610cfd565b6040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063a4c0ed369061064a90339088908890889060040161172b565b6020604051808303815f875af1158015610666573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061068a9190611760565b95945050505050565b5f61069f338686610cfd565b6040517f2eedcb7100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861690632eedcb71906106f99033908a9089908990899060040161177f565b6020604051808303815f875af1158015610715573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107399190611760565b9695505050505050565b7f0d000000000000000000000000000000000000000000000000000000000000006060805f808083610773611056565b60408051602080820183525f8083528351818152918201909352999a92999098504697507f0000000000000000000000000000000000000000000000000000000000000000965090945092509050565b5f610430338484610cfd565b5f6107db868686610ead565b6040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063a4c0ed36906106f990899088908890889060040161172b565b5f61083f338686610c20565b6040517eba451f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169062ba451f9061064a90339088908890889060040161172b565b73ffffffffffffffffffffffffffffffffffffffff87166108e4576040517f8e4c8aa60000000000000000000000000000000000000000000000000000000081525f60048201526024016104a3565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260036020526040812054906109126105dd565b604080517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9602082015273ffffffffffffffffffffffffffffffffffffffff808d1692820192909252908a1660608201526080810189905260a0810184905260c0810188905260e001604051602081830303815290604052805190602001206040516020016109d39291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f845290830180835281905260ff8816918301919091526060820186905260808201859052915060019060a0016020604051602081039080840390855afa158015610a56573d5f803e3d5ffd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614610ac4576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8515801590610ad257508542115b15610b12576040517fdd6b219a000000000000000000000000000000000000000000000000000000008152426004820152602481018790526044016104a3565b610b1d8260016117c9565b73ffffffffffffffffffffffffffffffffffffffff8a165f90815260036020526040902055610b4d898989610c20565b505050505050505050565b5f3073ffffffffffffffffffffffffffffffffffffffff841603610b9d57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610434565b5073ffffffffffffffffffffffffffffffffffffffff9182165f90815260026020908152604080832093909416825291909152205490565b5f610be1338484610cfd565b60405173ffffffffffffffffffffffffffffffffffffffff8416903480156108fc02915f818181858888f193505050501580156105d3573d5f803e3d5ffd5b73ffffffffffffffffffffffffffffffffffffffff83161580610c57575073ffffffffffffffffffffffffffffffffffffffff8216155b15610c90576040517f8e4c8aa60000000000000000000000000000000000000000000000000000000081525f60048201526024016104a3565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff82161580610d35575073ffffffffffffffffffffffffffffffffffffffff821630145b15610d84576040517f8e4c8aa600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016104a3565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526001602052604090205481811015610ded576040517f6584853f00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016104a3565b610df782826117dc565b73ffffffffffffffffffffffffffffffffffffffff8086165f908152600160205260408082209390935590851681529081208054849290610e399084906117c9565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e9f91815260200190565b60405180910390a350505050565b3373ffffffffffffffffffffffffffffffffffffffff841614801590610ee9575073ffffffffffffffffffffffffffffffffffffffff83163014155b15610fc65773ffffffffffffffffffffffffffffffffffffffff83165f9081526002602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610fc45781811015610f89576040517f95fcd25400000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016104a3565b610f9382826117dc565b73ffffffffffffffffffffffffffffffffffffffff85165f9081526002602090815260408083203384529091529020555b505b610fd1838383610cfd565b505050565b5f467f0000000000000000000000000000000000000000000000000000000000000000811461102e57611029817f0000000000000000000000000000000000000000000000000000000000000000611092565b611050565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b60606105c260408051808201909152600481527f47656d7300000000000000000000000000000000000000000000000000000000602082015290565b5f7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666110ee60408051808201909152600481527f47656d7300000000000000000000000000000000000000000000000000000000602082015290565b8051602091820120604051611134939287918791019384526020840192909252604083015273ffffffffffffffffffffffffffffffffffffffff16606082015260800190565b60405160208183030381529060405280519060200120905092915050565b5f81518084525f5b818110156111765760208185018101518683018201520161115a565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6111c56020830184611152565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146111ed575f80fd5b50565b5f8060408385031215611201575f80fd5b823561120c816111cc565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b8035611252816111cc565b919050565b5f8060408385031215611268575f80fd5b823567ffffffffffffffff8082111561127f575f80fd5b818501915085601f830112611292575f80fd5b81356020828211156112a6576112a661121a565b8160051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811086821117156112e9576112e961121a565b604052928352818301935084810182019289841115611306575f80fd5b948201945b8386101561132b5761131c86611247565b8552948201949382019361130b565b9997909101359750505050505050565b5f805f6060848603121561134d575f80fd5b8335611358816111cc565b92506020840135611368816111cc565b929592945050506040919091013590565b5f8083601f840112611389575f80fd5b50813567ffffffffffffffff8111156113a0575f80fd5b6020830191508360208285010111156113b7575f80fd5b9250929050565b5f805f80606085870312156113d1575f80fd5b84356113dc816111cc565b935060208501359250604085013567ffffffffffffffff8111156113fe575f80fd5b61140a87828801611379565b95989497509550505050565b5f805f805f6080868803121561142a575f80fd5b8535611435816111cc565b94506020860135611445816111cc565b935060408601359250606086013567ffffffffffffffff811115611467575f80fd5b61147388828901611379565b969995985093965092949392505050565b5f60208284031215611494575f80fd5b81356111c5816111cc565b7fff00000000000000000000000000000000000000000000000000000000000000881681525f602060e0818401526114da60e084018a611152565b83810360408501526114ec818a611152565b6060850189905273ffffffffffffffffffffffffffffffffffffffff8816608086015260a0850187905284810360c086015285518082528387019250908301905f5b8181101561154a5783518352928401929184019160010161152e565b50909c9b505050505050505050505050565b5f805f805f805f60e0888a031215611572575f80fd5b873561157d816111cc565b9650602088013561158d816111cc565b95506040880135945060608801359350608088013560ff811681146115b0575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156115de575f80fd5b82356115e9816111cc565b915060208301356115f9816111cc565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f82611664577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b808202811582820484141761043457610434611604565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036116dd576116dd611604565b5060010190565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6107396060830184866116e4565b5f60208284031215611770575f80fd5b815180151581146111c5575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff8088168352808716602084015250846040830152608060608301526117be6080830184866116e4565b979650505050505050565b8082018082111561043457610434611604565b818103818111156104345761043461160456fea2646970667358221220176888c253ea62d60e8b85116aad0a658dd29f3cc3d4c183633dc0d94e9023d564736f6c63430008140033", + "opcodes": "PUSH1 0xE0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x10 JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x1A5A CODESIZE SUB DUP1 PUSH3 0x1A5A DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x33 SWAP2 PUSH3 0x1AA JUMP JUMPDEST CHAINID PUSH1 0x80 DUP2 SWAP1 MSTORE ADDRESS SWAP1 DUP2 SWAP1 DUP2 ISZERO PUSH3 0x4B JUMPI DUP2 PUSH3 0x4D JUMP JUMPDEST ADDRESS JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0xC0 DUP2 SWAP1 MSTORE PUSH3 0x68 SWAP1 DUP3 SWAP1 PUSH3 0x84 JUMP JUMPDEST PUSH1 0xA0 MSTORE POP PUSH3 0x7C SWAP2 POP DUP4 SWAP1 POP DUP3 PUSH3 0x121 JUMP JUMPDEST POP POP PUSH3 0x203 JUMP JUMPDEST PUSH0 PUSH32 0x8CAD95687BA82C2CE50E74F7B754645E5117C3A5BEC8151C0726D5857980A866 PUSH3 0xC8 PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH4 0x47656D73 PUSH1 0xE0 SHL PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH3 0x102 SWAP4 SWAP3 DUP8 SWAP2 DUP8 SWAP2 ADD SWAP4 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 PUSH0 DUP1 DUP3 DUP3 SLOAD PUSH3 0x133 SWAP2 SWAP1 PUSH3 0x1E3 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH3 0x161 SWAP1 DUP5 SWAP1 PUSH3 0x1E3 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x40 MLOAD DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 PUSH0 SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH3 0x1BC JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0x1D3 JUMPI PUSH0 DUP1 REVERT JUMPDEST PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD MLOAD SWAP3 SWAP5 SWAP3 SWAP4 POP POP POP JUMP JUMPDEST DUP1 DUP3 ADD DUP1 DUP3 GT ISZERO PUSH3 0x11B JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH0 REVERT JUMPDEST PUSH1 0x80 MLOAD PUSH1 0xA0 MLOAD PUSH1 0xC0 MLOAD PUSH2 0x1825 PUSH3 0x235 PUSH0 CODECOPY PUSH0 DUP2 DUP2 PUSH2 0x799 ADD MSTORE PUSH2 0x1005 ADD MSTORE PUSH0 PUSH2 0x1030 ADD MSTORE PUSH0 PUSH2 0xFDA ADD MSTORE PUSH2 0x1825 PUSH0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x13D JUMPI PUSH0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x70A08231 GT PUSH2 0xBB JUMPI DUP1 PUSH4 0xC1D34B89 GT PUSH2 0x71 JUMPI DUP1 PUSH4 0xD505ACCF GT PUSH2 0x57 JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0x3D1 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x3F2 JUMPI DUP1 PUSH4 0xE7FCB065 EQ PUSH2 0x411 JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xC1D34B89 EQ PUSH2 0x393 JUMPI DUP1 PUSH4 0xCAE9CA51 EQ PUSH2 0x3B2 JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x84B0196E GT PUSH2 0xA1 JUMPI DUP1 PUSH4 0x84B0196E EQ PUSH2 0x305 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x32C JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x374 JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x70A08231 EQ PUSH2 0x283 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x2C4 JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x23B872DD GT PUSH2 0x110 JUMPI DUP1 PUSH4 0x3644E515 GT PUSH2 0xF6 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x231 JUMPI DUP1 PUSH4 0x4000AEA0 EQ PUSH2 0x245 JUMPI DUP1 PUSH4 0x65520EFA EQ PUSH2 0x264 JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1F7 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x216 JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x141 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x198 JUMPI DUP1 PUSH4 0xE02DF54 EQ PUSH2 0x1C7 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x1DA JUMPI JUMPDEST PUSH0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x14C JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH32 0x47656D7300000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x18F SWAP2 SWAP1 PUSH2 0x11B3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A3 JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B7 PUSH2 0x1B2 CALLDATASIZE PUSH1 0x4 PUSH2 0x11F0 JUMP JUMPDEST PUSH2 0x424 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x18F JUMP JUMPDEST PUSH2 0x1B7 PUSH2 0x1D5 CALLDATASIZE PUSH1 0x4 PUSH2 0x1257 JUMP JUMPDEST PUSH2 0x43A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E5 JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH0 SLOAD JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x18F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x202 JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B7 PUSH2 0x211 CALLDATASIZE PUSH1 0x4 PUSH2 0x133B JUMP JUMPDEST PUSH2 0x5C7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x221 JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x12 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x18F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x23C JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E9 PUSH2 0x5DD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x250 JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B7 PUSH2 0x25F CALLDATASIZE PUSH1 0x4 PUSH2 0x13BE JUMP JUMPDEST PUSH2 0x5E6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x26F JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B7 PUSH2 0x27E CALLDATASIZE PUSH1 0x4 PUSH2 0x1416 JUMP JUMPDEST PUSH2 0x693 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x28E JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E9 PUSH2 0x29D CALLDATASIZE PUSH1 0x4 PUSH2 0x1484 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2CF JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E9 PUSH2 0x2DE CALLDATASIZE PUSH1 0x4 PUSH2 0x1484 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x310 JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH2 0x319 PUSH2 0x743 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x18F SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x149F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x337 JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH2 0x182 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x3 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x47454D0000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x37F JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B7 PUSH2 0x38E CALLDATASIZE PUSH1 0x4 PUSH2 0x11F0 JUMP JUMPDEST PUSH2 0x7C3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x39E JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B7 PUSH2 0x3AD CALLDATASIZE PUSH1 0x4 PUSH2 0x1416 JUMP JUMPDEST PUSH2 0x7CF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3BD JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B7 PUSH2 0x3CC CALLDATASIZE PUSH1 0x4 PUSH2 0x13BE JUMP JUMPDEST PUSH2 0x833 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3DC JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH2 0x3F0 PUSH2 0x3EB CALLDATASIZE PUSH1 0x4 PUSH2 0x155C JUMP JUMPDEST PUSH2 0x895 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3FD JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E9 PUSH2 0x40C CALLDATASIZE PUSH1 0x4 PUSH2 0x15CD JUMP JUMPDEST PUSH2 0xB58 JUMP JUMPDEST PUSH2 0x1B7 PUSH2 0x41F CALLDATASIZE PUSH1 0x4 PUSH2 0x11F0 JUMP JUMPDEST PUSH2 0xBD5 JUMP JUMPDEST PUSH0 PUSH2 0x430 CALLER DUP5 DUP5 PUSH2 0xC20 JUMP JUMPDEST POP PUSH1 0x1 JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH0 DUP1 DUP4 MLOAD CALLVALUE PUSH2 0x449 SWAP2 SWAP1 PUSH2 0x1631 JUMP JUMPDEST SWAP1 POP DUP4 MLOAD DUP2 PUSH2 0x458 SWAP2 SWAP1 PUSH2 0x1669 JUMP JUMPDEST CALLVALUE EQ PUSH2 0x4AC JUMPI CALLVALUE DUP5 MLOAD DUP3 PUSH2 0x46C SWAP2 SWAP1 PUSH2 0x1669 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x1F89F67100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH0 DUP5 MLOAD DUP5 PUSH2 0x4BA SWAP2 SWAP1 PUSH2 0x1631 JUMP JUMPDEST SWAP1 POP DUP5 MLOAD DUP2 PUSH2 0x4C9 SWAP2 SWAP1 PUSH2 0x1669 JUMP JUMPDEST DUP5 EQ PUSH2 0x518 JUMPI DUP4 DUP6 MLOAD DUP3 PUSH2 0x4DD SWAP2 SWAP1 PUSH2 0x1669 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xE93890A200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 ADD PUSH2 0x4A3 JUMP JUMPDEST PUSH0 JUMPDEST DUP6 MLOAD DUP2 LT ISZERO PUSH2 0x5B6 JUMPI PUSH2 0x547 CALLER DUP8 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x539 JUMPI PUSH2 0x539 PUSH2 0x1680 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP5 PUSH2 0xCFD JUMP JUMPDEST DUP6 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x559 JUMPI PUSH2 0x559 PUSH2 0x1680 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x8FC DUP5 SWAP1 DUP2 ISZERO MUL SWAP1 PUSH1 0x40 MLOAD PUSH0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x5A3 JUMPI RETURNDATASIZE PUSH0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH0 REVERT JUMPDEST POP DUP1 PUSH2 0x5AE DUP2 PUSH2 0x16AD JUMP JUMPDEST SWAP2 POP POP PUSH2 0x51A JUMP JUMPDEST POP PUSH1 0x1 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH0 PUSH2 0x5D3 DUP5 DUP5 DUP5 PUSH2 0xEAD JUMP JUMPDEST POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH0 PUSH2 0x5C2 PUSH2 0xFD6 JUMP JUMPDEST PUSH0 PUSH2 0x5F2 CALLER DUP7 DUP7 PUSH2 0xCFD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA4C0ED3600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP1 PUSH4 0xA4C0ED36 SWAP1 PUSH2 0x64A SWAP1 CALLER SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x172B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x666 JUMPI RETURNDATASIZE PUSH0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x68A SWAP2 SWAP1 PUSH2 0x1760 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH0 PUSH2 0x69F CALLER DUP7 DUP7 PUSH2 0xCFD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x2EEDCB7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP1 PUSH4 0x2EEDCB71 SWAP1 PUSH2 0x6F9 SWAP1 CALLER SWAP1 DUP11 SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x177F JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x715 JUMPI RETURNDATASIZE PUSH0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x739 SWAP2 SWAP1 PUSH2 0x1760 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH32 0xD00000000000000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP1 PUSH0 DUP1 DUP1 DUP4 PUSH2 0x773 PUSH2 0x1056 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 ADD DUP4 MSTORE PUSH0 DUP1 DUP4 MSTORE DUP4 MLOAD DUP2 DUP2 MSTORE SWAP2 DUP3 ADD SWAP1 SWAP4 MSTORE SWAP10 SWAP11 SWAP3 SWAP10 SWAP1 SWAP9 POP CHAINID SWAP8 POP PUSH32 0x0 SWAP7 POP SWAP1 SWAP5 POP SWAP3 POP SWAP1 POP JUMP JUMPDEST PUSH0 PUSH2 0x430 CALLER DUP5 DUP5 PUSH2 0xCFD JUMP JUMPDEST PUSH0 PUSH2 0x7DB DUP7 DUP7 DUP7 PUSH2 0xEAD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA4C0ED3600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP1 PUSH4 0xA4C0ED36 SWAP1 PUSH2 0x6F9 SWAP1 DUP10 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x172B JUMP JUMPDEST PUSH0 PUSH2 0x83F CALLER DUP7 DUP7 PUSH2 0xC20 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH31 0xBA451F00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP1 PUSH3 0xBA451F SWAP1 PUSH2 0x64A SWAP1 CALLER SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x172B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH2 0x8E4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8E4C8AA600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH0 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 ADD PUSH2 0x4A3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP1 PUSH2 0x912 PUSH2 0x5DD JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 PUSH1 0x20 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP14 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 DUP11 AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 DUP2 ADD DUP10 SWAP1 MSTORE PUSH1 0xA0 DUP2 ADD DUP5 SWAP1 MSTORE PUSH1 0xC0 DUP2 ADD DUP9 SWAP1 MSTORE PUSH1 0xE0 ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x9D3 SWAP3 SWAP2 SWAP1 PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x2 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x22 DUP3 ADD MSTORE PUSH1 0x42 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE DUP3 DUP3 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD KECCAK256 PUSH0 DUP5 MSTORE SWAP1 DUP4 ADD DUP1 DUP4 MSTORE DUP2 SWAP1 MSTORE PUSH1 0xFF DUP9 AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP3 ADD DUP7 SWAP1 MSTORE PUSH1 0x80 DUP3 ADD DUP6 SWAP1 MSTORE SWAP2 POP PUSH1 0x1 SWAP1 PUSH1 0xA0 ADD PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xA56 JUMPI RETURNDATASIZE PUSH0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xAC4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8BAA579F00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP6 ISZERO DUP1 ISZERO SWAP1 PUSH2 0xAD2 JUMPI POP DUP6 TIMESTAMP GT JUMPDEST ISZERO PUSH2 0xB12 JUMPI PUSH1 0x40 MLOAD PUSH32 0xDD6B219A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE TIMESTAMP PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP8 SWAP1 MSTORE PUSH1 0x44 ADD PUSH2 0x4A3 JUMP JUMPDEST PUSH2 0xB1D DUP3 PUSH1 0x1 PUSH2 0x17C9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH2 0xB4D DUP10 DUP10 DUP10 PUSH2 0xC20 JUMP JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SUB PUSH2 0xB9D JUMPI POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x434 JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH0 PUSH2 0xBE1 CALLER DUP5 DUP5 PUSH2 0xCFD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 CALLVALUE DUP1 ISZERO PUSH2 0x8FC MUL SWAP2 PUSH0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x5D3 JUMPI RETURNDATASIZE PUSH0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO DUP1 PUSH2 0xC57 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO JUMPDEST ISZERO PUSH2 0xC90 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8E4C8AA600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH0 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 ADD PUSH2 0x4A3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE SWAP1 MLOAD DUP5 DUP2 MSTORE PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO DUP1 PUSH2 0xD35 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ADDRESS EQ JUMPDEST ISZERO PUSH2 0xD84 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8E4C8AA600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 ADD PUSH2 0x4A3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 DUP2 LT ISZERO PUSH2 0xDED JUMPI PUSH1 0x40 MLOAD PUSH32 0x6584853F00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x24 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x44 ADD PUSH2 0x4A3 JUMP JUMPDEST PUSH2 0xDF7 DUP3 DUP3 PUSH2 0x17DC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP6 AND DUP2 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP5 SWAP3 SWAP1 PUSH2 0xE39 SWAP1 DUP5 SWAP1 PUSH2 0x17C9 JUMP JUMPDEST SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD PUSH2 0xE9F SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND EQ DUP1 ISZERO SWAP1 PUSH2 0xEE9 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ADDRESS EQ ISZERO JUMPDEST ISZERO PUSH2 0xFC6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 EQ PUSH2 0xFC4 JUMPI DUP2 DUP2 LT ISZERO PUSH2 0xF89 JUMPI PUSH1 0x40 MLOAD PUSH32 0x95FCD25400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x24 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x44 ADD PUSH2 0x4A3 JUMP JUMPDEST PUSH2 0xF93 DUP3 DUP3 PUSH2 0x17DC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SSTORE JUMPDEST POP JUMPDEST PUSH2 0xFD1 DUP4 DUP4 DUP4 PUSH2 0xCFD JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH0 CHAINID PUSH32 0x0 DUP2 EQ PUSH2 0x102E JUMPI PUSH2 0x1029 DUP2 PUSH32 0x0 PUSH2 0x1092 JUMP JUMPDEST PUSH2 0x1050 JUMP JUMPDEST PUSH32 0x0 JUMPDEST SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x5C2 PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH32 0x47656D7300000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH0 PUSH32 0x8CAD95687BA82C2CE50E74F7B754645E5117C3A5BEC8151C0726D5857980A866 PUSH2 0x10EE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH32 0x47656D7300000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH2 0x1134 SWAP4 SWAP3 DUP8 SWAP2 DUP8 SWAP2 ADD SWAP4 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1176 JUMPI PUSH1 0x20 DUP2 DUP6 ADD DUP2 ADD MLOAD DUP7 DUP4 ADD DUP3 ADD MSTORE ADD PUSH2 0x115A JUMP JUMPDEST POP PUSH0 PUSH1 0x20 DUP3 DUP7 ADD ADD MSTORE PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP4 ADD AND DUP6 ADD ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH0 PUSH2 0x11C5 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1152 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x11ED JUMPI PUSH0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1201 JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x120C DUP2 PUSH2 0x11CC JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH0 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x1252 DUP2 PUSH2 0x11CC JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1268 JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x127F JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1292 JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0x20 DUP3 DUP3 GT ISZERO PUSH2 0x12A6 JUMPI PUSH2 0x12A6 PUSH2 0x121A JUMP JUMPDEST DUP2 PUSH1 0x5 SHL PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x3F DUP4 ADD AND DUP2 ADD DUP2 DUP2 LT DUP7 DUP3 GT OR ISZERO PUSH2 0x12E9 JUMPI PUSH2 0x12E9 PUSH2 0x121A JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP3 DUP4 MSTORE DUP2 DUP4 ADD SWAP4 POP DUP5 DUP2 ADD DUP3 ADD SWAP3 DUP10 DUP5 GT ISZERO PUSH2 0x1306 JUMPI PUSH0 DUP1 REVERT JUMPDEST SWAP5 DUP3 ADD SWAP5 JUMPDEST DUP4 DUP7 LT ISZERO PUSH2 0x132B JUMPI PUSH2 0x131C DUP7 PUSH2 0x1247 JUMP JUMPDEST DUP6 MSTORE SWAP5 DUP3 ADD SWAP5 SWAP4 DUP3 ADD SWAP4 PUSH2 0x130B JUMP JUMPDEST SWAP10 SWAP8 SWAP1 SWAP2 ADD CALLDATALOAD SWAP8 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH0 DUP1 PUSH0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x134D JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x1358 DUP2 PUSH2 0x11CC JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x1368 DUP2 PUSH2 0x11CC JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1389 JUMPI PUSH0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x13A0 JUMPI PUSH0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x13B7 JUMPI PUSH0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH0 DUP1 PUSH0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x13D1 JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x13DC DUP2 PUSH2 0x11CC JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x13FE JUMPI PUSH0 DUP1 REVERT JUMPDEST PUSH2 0x140A DUP8 DUP3 DUP9 ADD PUSH2 0x1379 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH0 DUP1 PUSH0 DUP1 PUSH0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x142A JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x1435 DUP2 PUSH2 0x11CC JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x1445 DUP2 PUSH2 0x11CC JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1467 JUMPI PUSH0 DUP1 REVERT JUMPDEST PUSH2 0x1473 DUP9 DUP3 DUP10 ADD PUSH2 0x1379 JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1494 JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x11C5 DUP2 PUSH2 0x11CC JUMP JUMPDEST PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 DUP9 AND DUP2 MSTORE PUSH0 PUSH1 0x20 PUSH1 0xE0 DUP2 DUP5 ADD MSTORE PUSH2 0x14DA PUSH1 0xE0 DUP5 ADD DUP11 PUSH2 0x1152 JUMP JUMPDEST DUP4 DUP2 SUB PUSH1 0x40 DUP6 ADD MSTORE PUSH2 0x14EC DUP2 DUP11 PUSH2 0x1152 JUMP JUMPDEST PUSH1 0x60 DUP6 ADD DUP10 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x80 DUP7 ADD MSTORE PUSH1 0xA0 DUP6 ADD DUP8 SWAP1 MSTORE DUP5 DUP2 SUB PUSH1 0xC0 DUP7 ADD MSTORE DUP6 MLOAD DUP1 DUP3 MSTORE DUP4 DUP8 ADD SWAP3 POP SWAP1 DUP4 ADD SWAP1 PUSH0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x154A JUMPI DUP4 MLOAD DUP4 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x152E JUMP JUMPDEST POP SWAP1 SWAP13 SWAP12 POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH0 DUP1 PUSH0 DUP1 PUSH0 DUP1 PUSH0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x1572 JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP8 CALLDATALOAD PUSH2 0x157D DUP2 PUSH2 0x11CC JUMP JUMPDEST SWAP7 POP PUSH1 0x20 DUP9 ADD CALLDATALOAD PUSH2 0x158D DUP2 PUSH2 0x11CC JUMP JUMPDEST SWAP6 POP PUSH1 0x40 DUP9 ADD CALLDATALOAD SWAP5 POP PUSH1 0x60 DUP9 ADD CALLDATALOAD SWAP4 POP PUSH1 0x80 DUP9 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x15B0 JUMPI PUSH0 DUP1 REVERT JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 SWAP3 SWAP6 SWAP5 PUSH1 0xA0 DUP5 ADD CALLDATALOAD SWAP5 POP PUSH1 0xC0 SWAP1 SWAP4 ADD CALLDATALOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x15DE JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x15E9 DUP2 PUSH2 0x11CC JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x15F9 DUP2 PUSH2 0x11CC JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH0 REVERT JUMPDEST PUSH0 DUP3 PUSH2 0x1664 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH0 REVERT JUMPDEST POP DIV SWAP1 JUMP JUMPDEST DUP1 DUP3 MUL DUP2 ISZERO DUP3 DUP3 DIV DUP5 EQ OR PUSH2 0x434 JUMPI PUSH2 0x434 PUSH2 0x1604 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH0 REVERT JUMPDEST PUSH0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x16DD JUMPI PUSH2 0x16DD PUSH2 0x1604 JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST DUP2 DUP4 MSTORE DUP2 DUP2 PUSH1 0x20 DUP6 ADD CALLDATACOPY POP PUSH0 PUSH1 0x20 DUP3 DUP5 ADD ADD MSTORE PUSH0 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND DUP5 ADD ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP2 MSTORE DUP4 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x60 PUSH1 0x40 DUP3 ADD MSTORE PUSH0 PUSH2 0x739 PUSH1 0x60 DUP4 ADD DUP5 DUP7 PUSH2 0x16E4 JUMP JUMPDEST PUSH0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1770 JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x11C5 JUMPI PUSH0 DUP1 REVERT JUMPDEST PUSH0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP9 AND DUP4 MSTORE DUP1 DUP8 AND PUSH1 0x20 DUP5 ADD MSTORE POP DUP5 PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x17BE PUSH1 0x80 DUP4 ADD DUP5 DUP7 PUSH2 0x16E4 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST DUP1 DUP3 ADD DUP1 DUP3 GT ISZERO PUSH2 0x434 JUMPI PUSH2 0x434 PUSH2 0x1604 JUMP JUMPDEST DUP2 DUP2 SUB DUP2 DUP2 GT ISZERO PUSH2 0x434 JUMPI PUSH2 0x434 PUSH2 0x1604 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 OR PUSH9 0x88C253EA62D60E8B85 GT PUSH11 0xAD0A658DD29F3CC3D4C183 PUSH4 0x3DC0D94E SWAP1 0x23 0xD5 PUSH5 0x736F6C6343 STOP ADDMOD EQ STOP CALLER ", + "sourceMap": "355:314:16:-:0;;;416:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;532:9:12;549:28;;;;494:4:16;;;;602:31:12;;:67;;652:17;602:67;;;644:4;602:67;-1:-1:-1;;;;;581:88:12;;;;;702:54;;728:7;;702:25;:54::i;:::-;673:83;;-1:-1:-1;505:17:16::1;::::0;-1:-1:-1;511:2:16;;-1:-1:-1;515:6:16;505:5:::1;:17::i;:::-;416:110:::0;;355:314;;2073:320:12;2174:7;2229:80;2332:6;650:13:16;;;;;;;;;;;;-1:-1:-1;;;650:13:16;;;;;570:97;2332:6:12;2316:24;;;;;;;2212:172;;;;;2347:7;;2361:17;;2212:172;601:25:17;;;657:2;642:18;;635:34;;;;700:2;685:18;;678:34;-1:-1:-1;;;;;748:32:17;743:2;728:18;;721:60;588:3;573:19;;370:417;2212:172:12;;;;;;;;;;;;;2197:192;;;;;;2187:202;;2073:320;;;;;:::o;5604:159:3:-;5685:6;5669:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;5695:13:3;;;;;;:9;:13;;;;;:23;;5712:6;;5695:13;:23;;5712:6;;5695:23;:::i;:::-;;;;-1:-1:-1;;5727:32:3;;1165:25:17;;;-1:-1:-1;;;;;5727:32:3;;;5744:1;;5727:32;;1153:2:17;1138:18;5727:32:3;;;;;;;5604:159;;:::o;14:351:17:-;93:6;101;154:2;142:9;133:7;129:23;125:32;122:52;;;170:1;167;160:12;122:52;196:16;;-1:-1:-1;;;;;241:31:17;;231:42;;221:70;;287:1;284;277:12;221:70;355:2;340:18;;;;334:25;310:5;;334:25;;-1:-1:-1;;;14:351:17:o;792:222::-;857:9;;;878:10;;;875:133;;;930:10;925:3;921:20;918:1;911:31;965:4;962:1;955:15;993:4;990:1;983:15;1019:177;355:314:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "@DOMAIN_SEPARATOR_179": { + "entryPoint": 1501, + "id": 179, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_approveFor_685": { + "entryPoint": 3104, + "id": 685, + "parameterSlots": 3, + "returnSlots": 0 + }, + "@_calculateDomainSeparator_1402": { + "entryPoint": 4242, + "id": 1402, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@_currentDomainSeparator_1373": { + "entryPoint": 4054, + "id": 1373, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_internal_totalSupply_638": { + "entryPoint": null, + "id": 638, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_name_1353": { + "entryPoint": 4182, + "id": 1353, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_transferFrom_753": { + "entryPoint": 3757, + "id": 753, + "parameterSlots": 3, + "returnSlots": 0 + }, + "@_transfer_818": { + "entryPoint": 3325, + "id": 818, + "parameterSlots": 3, + "returnSlots": 0 + }, + "@allowance_310": { + "entryPoint": 2904, + "id": 310, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@approveAndCall_629": { + "entryPoint": 2099, + "id": 629, + "parameterSlots": 4, + "returnSlots": 1 + }, + "@approve_599": { + "entryPoint": 1060, + "id": 599, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@balanceOf_278": { + "entryPoint": null, + "id": 278, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@decimals_323": { + "entryPoint": null, + "id": 323, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@distributeAlongWithETH_463": { + "entryPoint": 1082, + "id": 463, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@eip712Domain_1344": { + "entryPoint": 1859, + "id": 1344, + "parameterSlots": 0, + "returnSlots": 7 + }, + "@name_1515": { + "entryPoint": null, + "id": 1515, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@nonces_35": { + "entryPoint": null, + "id": 35, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@permit_150": { + "entryPoint": 2197, + "id": 150, + "parameterSlots": 7, + "returnSlots": 0 + }, + "@symbol_1504": { + "entryPoint": null, + "id": 1504, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@totalSupply_264": { + "entryPoint": null, + "id": 264, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@transferAlongWithETH_371": { + "entryPoint": 3029, + "id": 371, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@transferAndCall_493": { + "entryPoint": 1510, + "id": 493, + "parameterSlots": 4, + "returnSlots": 1 + }, + "@transferFromAndCall_523": { + "entryPoint": 1999, + "id": 523, + "parameterSlots": 5, + "returnSlots": 1 + }, + "@transferFrom_578": { + "entryPoint": 1479, + "id": 578, + "parameterSlots": 3, + "returnSlots": 1 + }, + "@transferOnBehalfAndCall_556": { + "entryPoint": 1683, + "id": 556, + "parameterSlots": 5, + "returnSlots": 1 + }, + "@transfer_344": { + "entryPoint": 1987, + "id": 344, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_address_payable": { + "entryPoint": 4679, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_decode_bytes_calldata": { + "entryPoint": 4985, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_tuple_t_address": { + "entryPoint": 5252, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_address_payablet_uint256": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_tuple_t_addresst_address": { + "entryPoint": 5581, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_tuple_t_addresst_addresst_uint256": { + "entryPoint": 4923, + "id": null, + "parameterSlots": 2, + "returnSlots": 3 + }, + "abi_decode_tuple_t_addresst_addresst_uint256t_bytes_calldata_ptr": { + "entryPoint": 5142, + "id": null, + "parameterSlots": 2, + "returnSlots": 5 + }, + "abi_decode_tuple_t_addresst_addresst_uint256t_uint256t_uint8t_bytes32t_bytes32": { + "entryPoint": 5468, + "id": null, + "parameterSlots": 2, + "returnSlots": 7 + }, + "abi_decode_tuple_t_addresst_uint256": { + "entryPoint": 4592, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_tuple_t_addresst_uint256t_bytes_calldata_ptr": { + "entryPoint": 5054, + "id": null, + "parameterSlots": 2, + "returnSlots": 4 + }, + "abi_decode_tuple_t_array$_t_address_payable_$dyn_memory_ptrt_uint256": { + "entryPoint": 4695, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_tuple_t_bool_fromMemory": { + "entryPoint": 5984, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_bytes_calldata": { + "entryPoint": 5860, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_string": { + "entryPoint": 4434, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_packed_t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541_t_bytes32_t_bytes32__to_t_string_memory_ptr_t_bytes32_t_bytes32__nonPadded_inplace_fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_address__to_t_address__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_address_t_address_t_uint256_t_bytes_calldata_ptr__to_t_address_t_address_t_uint256_t_bytes_memory_ptr__fromStack_reversed": { + "entryPoint": 6015, + "id": null, + "parameterSlots": 6, + "returnSlots": 1 + }, + "abi_encode_tuple_t_address_t_uint256_t_bytes_calldata_ptr__to_t_address_t_uint256_t_bytes_memory_ptr__fromStack_reversed": { + "entryPoint": 5931, + "id": null, + "parameterSlots": 5, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes1_t_string_memory_ptr_t_string_memory_ptr_t_uint256_t_address_t_bytes32_t_array$_t_uint256_$dyn_memory_ptr__to_t_bytes1_t_string_memory_ptr_t_string_memory_ptr_t_uint256_t_address_t_bytes32_t_array$_t_uint256_$dyn_memory_ptr__fromStack_reversed": { + "entryPoint": 5279, + "id": null, + "parameterSlots": 8, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32_t_address_t_address_t_uint256_t_uint256_t_uint256__to_t_bytes32_t_address_t_address_t_uint256_t_uint256_t_uint256__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 7, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32_t_bytes32_t_uint256_t_address__to_t_bytes32_t_bytes32_t_uint256_t_address__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 5, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 5, + "returnSlots": 1 + }, + "abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed": { + "entryPoint": 4531, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "checked_add_t_uint256": { + "entryPoint": 6089, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "checked_div_t_uint256": { + "entryPoint": 5681, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "checked_mul_t_uint256": { + "entryPoint": 5737, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "checked_sub_t_uint256": { + "entryPoint": 6108, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "increment_t_uint256": { + "entryPoint": 5805, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "panic_error_0x11": { + "entryPoint": 5636, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "panic_error_0x32": { + "entryPoint": 5760, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "panic_error_0x41": { + "entryPoint": 4634, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "validator_revert_address": { + "entryPoint": 4556, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + } + }, + "generatedSources": [ + { + "ast": { + "nodeType": "YulBlock", + "src": "0:14178:17", + "statements": [ + { + "nodeType": "YulBlock", + "src": "6:3:17", + "statements": [] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "64:432:17", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "74:26:17", + "value": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "94:5:17" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "88:5:17" + }, + "nodeType": "YulFunctionCall", + "src": "88:12:17" + }, + "variables": [ + { + "name": "length", + "nodeType": "YulTypedName", + "src": "78:6:17", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "116:3:17" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "121:6:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "109:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "109:19:17" + }, + "nodeType": "YulExpressionStatement", + "src": "109:19:17" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "137:10:17", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "146:1:17", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "i", + "nodeType": "YulTypedName", + "src": "141:1:17", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "208:110:17", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "222:14:17", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "232:4:17", + "type": "", + "value": "0x20" + }, + "variables": [ + { + "name": "_1", + "nodeType": "YulTypedName", + "src": "226:2:17", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "264:3:17" + }, + { + "name": "i", + "nodeType": "YulIdentifier", + "src": "269:1:17" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "260:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "260:11:17" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "273:2:17" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "256:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "256:20:17" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "292:5:17" + }, + { + "name": "i", + "nodeType": "YulIdentifier", + "src": "299:1:17" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "288:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "288:13:17" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "303:2:17" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "284:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "284:22:17" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "278:5:17" + }, + "nodeType": "YulFunctionCall", + "src": "278:29:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "249:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "249:59:17" + }, + "nodeType": "YulExpressionStatement", + "src": "249:59:17" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "i", + "nodeType": "YulIdentifier", + "src": "167:1:17" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "170:6:17" + } + ], + "functionName": { + "name": "lt", + "nodeType": "YulIdentifier", + "src": "164:2:17" + }, + "nodeType": "YulFunctionCall", + "src": "164:13:17" + }, + "nodeType": "YulForLoop", + "post": { + "nodeType": "YulBlock", + "src": "178:21:17", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "180:17:17", + "value": { + "arguments": [ + { + "name": "i", + "nodeType": "YulIdentifier", + "src": "189:1:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "192:4:17", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "185:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "185:12:17" + }, + "variableNames": [ + { + "name": "i", + "nodeType": "YulIdentifier", + "src": "180:1:17" + } + ] + } + ] + }, + "pre": { + "nodeType": "YulBlock", + "src": "160:3:17", + "statements": [] + }, + "src": "156:162:17" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "342:3:17" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "347:6:17" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "338:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "338:16:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "356:4:17", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "334:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "334:27:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "363:1:17", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "327:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "327:38:17" + }, + "nodeType": "YulExpressionStatement", + "src": "327:38:17" + }, + { + "nodeType": "YulAssignment", + "src": "374:116:17", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "389:3:17" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "402:6:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "410:2:17", + "type": "", + "value": "31" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "398:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "398:15:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "415:66:17", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "394:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "394:88:17" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "385:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "385:98:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "485:4:17", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "381:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "381:109:17" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "374:3:17" + } + ] + } + ] + }, + "name": "abi_encode_string", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "41:5:17", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "48:3:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "56:3:17", + "type": "" + } + ], + "src": "14:482:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "622:99:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "639:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "650:2:17", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "632:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "632:21:17" + }, + "nodeType": "YulExpressionStatement", + "src": "632:21:17" + }, + { + "nodeType": "YulAssignment", + "src": "662:53:17", + "value": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "688:6:17" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "700:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "711:2:17", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "696:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "696:18:17" + } + ], + "functionName": { + "name": "abi_encode_string", + "nodeType": "YulIdentifier", + "src": "670:17:17" + }, + "nodeType": "YulFunctionCall", + "src": "670:45:17" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "662:4:17" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "591:9:17", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "602:6:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "613:4:17", + "type": "" + } + ], + "src": "501:220:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "771:109:17", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "858:16:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "867:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "870:1:17", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "860:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "860:12:17" + }, + "nodeType": "YulExpressionStatement", + "src": "860:12:17" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "794:5:17" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "805:5:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "812:42:17", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "801:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "801:54:17" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "791:2:17" + }, + "nodeType": "YulFunctionCall", + "src": "791:65:17" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "784:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "784:73:17" + }, + "nodeType": "YulIf", + "src": "781:93:17" + } + ] + }, + "name": "validator_revert_address", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "760:5:17", + "type": "" + } + ], + "src": "726:154:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "972:228:17", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "1018:16:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1027:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1030:1:17", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "1020:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "1020:12:17" + }, + "nodeType": "YulExpressionStatement", + "src": "1020:12:17" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "993:7:17" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1002:9:17" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "989:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "989:23:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1014:2:17", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "985:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "985:32:17" + }, + "nodeType": "YulIf", + "src": "982:52:17" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "1043:36:17", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1069:9:17" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "1056:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "1056:23:17" + }, + "variables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "1047:5:17", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "1113:5:17" + } + ], + "functionName": { + "name": "validator_revert_address", + "nodeType": "YulIdentifier", + "src": "1088:24:17" + }, + "nodeType": "YulFunctionCall", + "src": "1088:31:17" + }, + "nodeType": "YulExpressionStatement", + "src": "1088:31:17" + }, + { + "nodeType": "YulAssignment", + "src": "1128:15:17", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "1138:5:17" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1128:6:17" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "1152:42:17", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1179:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1190:2:17", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1175:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "1175:18:17" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "1162:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "1162:32:17" + }, + "variableNames": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "1152:6:17" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_addresst_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "930:9:17", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "941:7:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "953:6:17", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "961:6:17", + "type": "" + } + ], + "src": "885:315:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1300:92:17", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1310:26:17", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1322:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1333:2:17", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1318:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "1318:18:17" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "1310:4:17" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1352:9:17" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1377:6:17" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "1370:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "1370:14:17" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "1363:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "1363:22:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1345:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "1345:41:17" + }, + "nodeType": "YulExpressionStatement", + "src": "1345:41:17" + } + ] + }, + "name": "abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1269:9:17", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "1280:6:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "1291:4:17", + "type": "" + } + ], + "src": "1205:187:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1429:152:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1446:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1449:77:17", + "type": "", + "value": "35408467139433450592217433187231851964531694900788300625387963629091585785856" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1439:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "1439:88:17" + }, + "nodeType": "YulExpressionStatement", + "src": "1439:88:17" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1543:1:17", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1546:4:17", + "type": "", + "value": "0x41" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1536:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "1536:15:17" + }, + "nodeType": "YulExpressionStatement", + "src": "1536:15:17" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1567:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1570:4:17", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "1560:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "1560:15:17" + }, + "nodeType": "YulExpressionStatement", + "src": "1560:15:17" + } + ] + }, + "name": "panic_error_0x41", + "nodeType": "YulFunctionDefinition", + "src": "1397:184:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1643:85:17", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1653:29:17", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "1675:6:17" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "1662:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "1662:20:17" + }, + "variableNames": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "1653:5:17" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "1716:5:17" + } + ], + "functionName": { + "name": "validator_revert_address", + "nodeType": "YulIdentifier", + "src": "1691:24:17" + }, + "nodeType": "YulFunctionCall", + "src": "1691:31:17" + }, + "nodeType": "YulExpressionStatement", + "src": "1691:31:17" + } + ] + }, + "name": "abi_decode_address_payable", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "1622:6:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "1633:5:17", + "type": "" + } + ], + "src": "1586:142:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1853:1146:17", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "1899:16:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1908:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1911:1:17", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "1901:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "1901:12:17" + }, + "nodeType": "YulExpressionStatement", + "src": "1901:12:17" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1874:7:17" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1883:9:17" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "1870:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "1870:23:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1895:2:17", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "1866:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "1866:32:17" + }, + "nodeType": "YulIf", + "src": "1863:52:17" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "1924:37:17", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1951:9:17" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "1938:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "1938:23:17" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "1928:6:17", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "1970:28:17", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1980:18:17", + "type": "", + "value": "0xffffffffffffffff" + }, + "variables": [ + { + "name": "_1", + "nodeType": "YulTypedName", + "src": "1974:2:17", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2025:16:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2034:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2037:1:17", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "2027:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "2027:12:17" + }, + "nodeType": "YulExpressionStatement", + "src": "2027:12:17" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "2013:6:17" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "2021:2:17" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "2010:2:17" + }, + "nodeType": "YulFunctionCall", + "src": "2010:14:17" + }, + "nodeType": "YulIf", + "src": "2007:34:17" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "2050:32:17", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2064:9:17" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "2075:6:17" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2060:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "2060:22:17" + }, + "variables": [ + { + "name": "_2", + "nodeType": "YulTypedName", + "src": "2054:2:17", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2130:16:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2139:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2142:1:17", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "2132:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "2132:12:17" + }, + "nodeType": "YulExpressionStatement", + "src": "2132:12:17" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "_2", + "nodeType": "YulIdentifier", + "src": "2109:2:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2113:4:17", + "type": "", + "value": "0x1f" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2105:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "2105:13:17" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "2120:7:17" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "2101:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "2101:27:17" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "2094:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "2094:35:17" + }, + "nodeType": "YulIf", + "src": "2091:55:17" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "2155:26:17", + "value": { + "arguments": [ + { + "name": "_2", + "nodeType": "YulIdentifier", + "src": "2178:2:17" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "2165:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "2165:16:17" + }, + "variables": [ + { + "name": "_3", + "nodeType": "YulTypedName", + "src": "2159:2:17", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "2190:14:17", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2200:4:17", + "type": "", + "value": "0x20" + }, + "variables": [ + { + "name": "_4", + "nodeType": "YulTypedName", + "src": "2194:2:17", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2227:22:17", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x41", + "nodeType": "YulIdentifier", + "src": "2229:16:17" + }, + "nodeType": "YulFunctionCall", + "src": "2229:18:17" + }, + "nodeType": "YulExpressionStatement", + "src": "2229:18:17" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "_3", + "nodeType": "YulIdentifier", + "src": "2219:2:17" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "2223:2:17" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "2216:2:17" + }, + "nodeType": "YulFunctionCall", + "src": "2216:10:17" + }, + "nodeType": "YulIf", + "src": "2213:36:17" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "2258:20:17", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2272:1:17", + "type": "", + "value": "5" + }, + { + "name": "_3", + "nodeType": "YulIdentifier", + "src": "2275:2:17" + } + ], + "functionName": { + "name": "shl", + "nodeType": "YulIdentifier", + "src": "2268:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "2268:10:17" + }, + "variables": [ + { + "name": "_5", + "nodeType": "YulTypedName", + "src": "2262:2:17", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "2287:23:17", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2307:2:17", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "2301:5:17" + }, + "nodeType": "YulFunctionCall", + "src": "2301:9:17" + }, + "variables": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "2291:6:17", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "2319:115:17", + "value": { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "2341:6:17" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "_5", + "nodeType": "YulIdentifier", + "src": "2357:2:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2361:2:17", + "type": "", + "value": "63" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2353:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "2353:11:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2366:66:17", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "2349:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "2349:84:17" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2337:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "2337:97:17" + }, + "variables": [ + { + "name": "newFreePtr", + "nodeType": "YulTypedName", + "src": "2323:10:17", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2493:22:17", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x41", + "nodeType": "YulIdentifier", + "src": "2495:16:17" + }, + "nodeType": "YulFunctionCall", + "src": "2495:18:17" + }, + "nodeType": "YulExpressionStatement", + "src": "2495:18:17" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "newFreePtr", + "nodeType": "YulIdentifier", + "src": "2452:10:17" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "2464:2:17" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "2449:2:17" + }, + "nodeType": "YulFunctionCall", + "src": "2449:18:17" + }, + { + "arguments": [ + { + "name": "newFreePtr", + "nodeType": "YulIdentifier", + "src": "2472:10:17" + }, + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "2484:6:17" + } + ], + "functionName": { + "name": "lt", + "nodeType": "YulIdentifier", + "src": "2469:2:17" + }, + "nodeType": "YulFunctionCall", + "src": "2469:22:17" + } + ], + "functionName": { + "name": "or", + "nodeType": "YulIdentifier", + "src": "2446:2:17" + }, + "nodeType": "YulFunctionCall", + "src": "2446:46:17" + }, + "nodeType": "YulIf", + "src": "2443:72:17" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2531:2:17", + "type": "", + "value": "64" + }, + { + "name": "newFreePtr", + "nodeType": "YulIdentifier", + "src": "2535:10:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "2524:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "2524:22:17" + }, + "nodeType": "YulExpressionStatement", + "src": "2524:22:17" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "2555:17:17", + "value": { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "2566:6:17" + }, + "variables": [ + { + "name": "dst", + "nodeType": "YulTypedName", + "src": "2559:3:17", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "2588:6:17" + }, + { + "name": "_3", + "nodeType": "YulIdentifier", + "src": "2596:2:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "2581:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "2581:18:17" + }, + "nodeType": "YulExpressionStatement", + "src": "2581:18:17" + }, + { + "nodeType": "YulAssignment", + "src": "2608:22:17", + "value": { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "2619:6:17" + }, + { + "name": "_4", + "nodeType": "YulIdentifier", + "src": "2627:2:17" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2615:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "2615:15:17" + }, + "variableNames": [ + { + "name": "dst", + "nodeType": "YulIdentifier", + "src": "2608:3:17" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "2639:34:17", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "_2", + "nodeType": "YulIdentifier", + "src": "2661:2:17" + }, + { + "name": "_5", + "nodeType": "YulIdentifier", + "src": "2665:2:17" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2657:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "2657:11:17" + }, + { + "name": "_4", + "nodeType": "YulIdentifier", + "src": "2670:2:17" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2653:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "2653:20:17" + }, + "variables": [ + { + "name": "srcEnd", + "nodeType": "YulTypedName", + "src": "2643:6:17", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2705:16:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2714:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2717:1:17", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "2707:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "2707:12:17" + }, + "nodeType": "YulExpressionStatement", + "src": "2707:12:17" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "srcEnd", + "nodeType": "YulIdentifier", + "src": "2688:6:17" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "2696:7:17" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "2685:2:17" + }, + "nodeType": "YulFunctionCall", + "src": "2685:19:17" + }, + "nodeType": "YulIf", + "src": "2682:39:17" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "2730:22:17", + "value": { + "arguments": [ + { + "name": "_2", + "nodeType": "YulIdentifier", + "src": "2745:2:17" + }, + { + "name": "_4", + "nodeType": "YulIdentifier", + "src": "2749:2:17" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2741:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "2741:11:17" + }, + "variables": [ + { + "name": "src", + "nodeType": "YulTypedName", + "src": "2734:3:17", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2817:100:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "dst", + "nodeType": "YulIdentifier", + "src": "2838:3:17" + }, + { + "arguments": [ + { + "name": "src", + "nodeType": "YulIdentifier", + "src": "2870:3:17" + } + ], + "functionName": { + "name": "abi_decode_address_payable", + "nodeType": "YulIdentifier", + "src": "2843:26:17" + }, + "nodeType": "YulFunctionCall", + "src": "2843:31:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "2831:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "2831:44:17" + }, + "nodeType": "YulExpressionStatement", + "src": "2831:44:17" + }, + { + "nodeType": "YulAssignment", + "src": "2888:19:17", + "value": { + "arguments": [ + { + "name": "dst", + "nodeType": "YulIdentifier", + "src": "2899:3:17" + }, + { + "name": "_4", + "nodeType": "YulIdentifier", + "src": "2904:2:17" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2895:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "2895:12:17" + }, + "variableNames": [ + { + "name": "dst", + "nodeType": "YulIdentifier", + "src": "2888:3:17" + } + ] + } + ] + }, + "condition": { + "arguments": [ + { + "name": "src", + "nodeType": "YulIdentifier", + "src": "2772:3:17" + }, + { + "name": "srcEnd", + "nodeType": "YulIdentifier", + "src": "2777:6:17" + } + ], + "functionName": { + "name": "lt", + "nodeType": "YulIdentifier", + "src": "2769:2:17" + }, + "nodeType": "YulFunctionCall", + "src": "2769:15:17" + }, + "nodeType": "YulForLoop", + "post": { + "nodeType": "YulBlock", + "src": "2785:23:17", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "2787:19:17", + "value": { + "arguments": [ + { + "name": "src", + "nodeType": "YulIdentifier", + "src": "2798:3:17" + }, + { + "name": "_4", + "nodeType": "YulIdentifier", + "src": "2803:2:17" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2794:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "2794:12:17" + }, + "variableNames": [ + { + "name": "src", + "nodeType": "YulIdentifier", + "src": "2787:3:17" + } + ] + } + ] + }, + "pre": { + "nodeType": "YulBlock", + "src": "2765:3:17", + "statements": [] + }, + "src": "2761:156:17" + }, + { + "nodeType": "YulAssignment", + "src": "2926:16:17", + "value": { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "2936:6:17" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "2926:6:17" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "2951:42:17", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2978:9:17" + }, + { + "name": "_4", + "nodeType": "YulIdentifier", + "src": "2989:2:17" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2974:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "2974:18:17" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "2961:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "2961:32:17" + }, + "variableNames": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "2951:6:17" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_array$_t_address_payable_$dyn_memory_ptrt_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1811:9:17", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "1822:7:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "1834:6:17", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "1842:6:17", + "type": "" + } + ], + "src": "1733:1266:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "3105:76:17", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "3115:26:17", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3127:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3138:2:17", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3123:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "3123:18:17" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "3115:4:17" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3157:9:17" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "3168:6:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "3150:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "3150:25:17" + }, + "nodeType": "YulExpressionStatement", + "src": "3150:25:17" + } + ] + }, + "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "3074:9:17", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "3085:6:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "3096:4:17", + "type": "" + } + ], + "src": "3004:177:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "3290:352:17", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "3336:16:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3345:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3348:1:17", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "3338:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "3338:12:17" + }, + "nodeType": "YulExpressionStatement", + "src": "3338:12:17" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "3311:7:17" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3320:9:17" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "3307:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "3307:23:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3332:2:17", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "3303:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "3303:32:17" + }, + "nodeType": "YulIf", + "src": "3300:52:17" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "3361:36:17", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3387:9:17" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "3374:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "3374:23:17" + }, + "variables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "3365:5:17", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "3431:5:17" + } + ], + "functionName": { + "name": "validator_revert_address", + "nodeType": "YulIdentifier", + "src": "3406:24:17" + }, + "nodeType": "YulFunctionCall", + "src": "3406:31:17" + }, + "nodeType": "YulExpressionStatement", + "src": "3406:31:17" + }, + { + "nodeType": "YulAssignment", + "src": "3446:15:17", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "3456:5:17" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "3446:6:17" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "3470:47:17", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3502:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3513:2:17", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3498:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "3498:18:17" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "3485:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "3485:32:17" + }, + "variables": [ + { + "name": "value_1", + "nodeType": "YulTypedName", + "src": "3474:7:17", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value_1", + "nodeType": "YulIdentifier", + "src": "3551:7:17" + } + ], + "functionName": { + "name": "validator_revert_address", + "nodeType": "YulIdentifier", + "src": "3526:24:17" + }, + "nodeType": "YulFunctionCall", + "src": "3526:33:17" + }, + "nodeType": "YulExpressionStatement", + "src": "3526:33:17" + }, + { + "nodeType": "YulAssignment", + "src": "3568:17:17", + "value": { + "name": "value_1", + "nodeType": "YulIdentifier", + "src": "3578:7:17" + }, + "variableNames": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "3568:6:17" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "3594:42:17", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3621:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3632:2:17", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3617:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "3617:18:17" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "3604:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "3604:32:17" + }, + "variableNames": [ + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "3594:6:17" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_addresst_addresst_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "3240:9:17", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "3251:7:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "3263:6:17", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "3271:6:17", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "3279:6:17", + "type": "" + } + ], + "src": "3186:456:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "3744:87:17", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "3754:26:17", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3766:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3777:2:17", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3762:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "3762:18:17" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "3754:4:17" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3796:9:17" + }, + { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "3811:6:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3819:4:17", + "type": "", + "value": "0xff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "3807:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "3807:17:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "3789:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "3789:36:17" + }, + "nodeType": "YulExpressionStatement", + "src": "3789:36:17" + } + ] + }, + "name": "abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "3713:9:17", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "3724:6:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "3735:4:17", + "type": "" + } + ], + "src": "3647:184:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "3937:76:17", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "3947:26:17", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3959:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3970:2:17", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3955:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "3955:18:17" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "3947:4:17" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3989:9:17" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "4000:6:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "3982:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "3982:25:17" + }, + "nodeType": "YulExpressionStatement", + "src": "3982:25:17" + } + ] + }, + "name": "abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "3906:9:17", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "3917:6:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "3928:4:17", + "type": "" + } + ], + "src": "3836:177:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "4090:275:17", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "4139:16:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4148:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4151:1:17", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "4141:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "4141:12:17" + }, + "nodeType": "YulExpressionStatement", + "src": "4141:12:17" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "4118:6:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4126:4:17", + "type": "", + "value": "0x1f" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "4114:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "4114:17:17" + }, + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "4133:3:17" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "4110:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "4110:27:17" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "4103:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "4103:35:17" + }, + "nodeType": "YulIf", + "src": "4100:55:17" + }, + { + "nodeType": "YulAssignment", + "src": "4164:30:17", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "4187:6:17" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "4174:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "4174:20:17" + }, + "variableNames": [ + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "4164:6:17" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "4237:16:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4246:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4249:1:17", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "4239:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "4239:12:17" + }, + "nodeType": "YulExpressionStatement", + "src": "4239:12:17" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "4209:6:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4217:18:17", + "type": "", + "value": "0xffffffffffffffff" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "4206:2:17" + }, + "nodeType": "YulFunctionCall", + "src": "4206:30:17" + }, + "nodeType": "YulIf", + "src": "4203:50:17" + }, + { + "nodeType": "YulAssignment", + "src": "4262:29:17", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "4278:6:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4286:4:17", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "4274:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "4274:17:17" + }, + "variableNames": [ + { + "name": "arrayPos", + "nodeType": "YulIdentifier", + "src": "4262:8:17" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "4343:16:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4352:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4355:1:17", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "4345:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "4345:12:17" + }, + "nodeType": "YulExpressionStatement", + "src": "4345:12:17" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "4314:6:17" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "4322:6:17" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "4310:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "4310:19:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4331:4:17", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "4306:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "4306:30:17" + }, + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "4338:3:17" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "4303:2:17" + }, + "nodeType": "YulFunctionCall", + "src": "4303:39:17" + }, + "nodeType": "YulIf", + "src": "4300:59:17" + } + ] + }, + "name": "abi_decode_bytes_calldata", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "4053:6:17", + "type": "" + }, + { + "name": "end", + "nodeType": "YulTypedName", + "src": "4061:3:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "arrayPos", + "nodeType": "YulTypedName", + "src": "4069:8:17", + "type": "" + }, + { + "name": "length", + "nodeType": "YulTypedName", + "src": "4079:6:17", + "type": "" + } + ], + "src": "4018:347:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "4493:489:17", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "4539:16:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4548:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4551:1:17", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "4541:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "4541:12:17" + }, + "nodeType": "YulExpressionStatement", + "src": "4541:12:17" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "4514:7:17" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "4523:9:17" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "4510:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "4510:23:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4535:2:17", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "4506:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "4506:32:17" + }, + "nodeType": "YulIf", + "src": "4503:52:17" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "4564:36:17", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "4590:9:17" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "4577:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "4577:23:17" + }, + "variables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "4568:5:17", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "4634:5:17" + } + ], + "functionName": { + "name": "validator_revert_address", + "nodeType": "YulIdentifier", + "src": "4609:24:17" + }, + "nodeType": "YulFunctionCall", + "src": "4609:31:17" + }, + "nodeType": "YulExpressionStatement", + "src": "4609:31:17" + }, + { + "nodeType": "YulAssignment", + "src": "4649:15:17", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "4659:5:17" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "4649:6:17" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "4673:42:17", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "4700:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4711:2:17", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "4696:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "4696:18:17" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "4683:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "4683:32:17" + }, + "variableNames": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "4673:6:17" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "4724:46:17", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "4755:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4766:2:17", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "4751:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "4751:18:17" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "4738:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "4738:32:17" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "4728:6:17", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "4813:16:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4822:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4825:1:17", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "4815:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "4815:12:17" + }, + "nodeType": "YulExpressionStatement", + "src": "4815:12:17" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "4785:6:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4793:18:17", + "type": "", + "value": "0xffffffffffffffff" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "4782:2:17" + }, + "nodeType": "YulFunctionCall", + "src": "4782:30:17" + }, + "nodeType": "YulIf", + "src": "4779:50:17" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "4838:84:17", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "4894:9:17" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "4905:6:17" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "4890:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "4890:22:17" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "4914:7:17" + } + ], + "functionName": { + "name": "abi_decode_bytes_calldata", + "nodeType": "YulIdentifier", + "src": "4864:25:17" + }, + "nodeType": "YulFunctionCall", + "src": "4864:58:17" + }, + "variables": [ + { + "name": "value2_1", + "nodeType": "YulTypedName", + "src": "4842:8:17", + "type": "" + }, + { + "name": "value3_1", + "nodeType": "YulTypedName", + "src": "4852:8:17", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "4931:18:17", + "value": { + "name": "value2_1", + "nodeType": "YulIdentifier", + "src": "4941:8:17" + }, + "variableNames": [ + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "4931:6:17" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "4958:18:17", + "value": { + "name": "value3_1", + "nodeType": "YulIdentifier", + "src": "4968:8:17" + }, + "variableNames": [ + { + "name": "value3", + "nodeType": "YulIdentifier", + "src": "4958:6:17" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_addresst_uint256t_bytes_calldata_ptr", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "4435:9:17", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "4446:7:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "4458:6:17", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "4466:6:17", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "4474:6:17", + "type": "" + }, + { + "name": "value3", + "nodeType": "YulTypedName", + "src": "4482:6:17", + "type": "" + } + ], + "src": "4370:612:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "5127:614:17", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "5174:16:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5183:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5186:1:17", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "5176:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "5176:12:17" + }, + "nodeType": "YulExpressionStatement", + "src": "5176:12:17" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "5148:7:17" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "5157:9:17" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "5144:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "5144:23:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5169:3:17", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "5140:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "5140:33:17" + }, + "nodeType": "YulIf", + "src": "5137:53:17" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "5199:36:17", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "5225:9:17" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "5212:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "5212:23:17" + }, + "variables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "5203:5:17", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "5269:5:17" + } + ], + "functionName": { + "name": "validator_revert_address", + "nodeType": "YulIdentifier", + "src": "5244:24:17" + }, + "nodeType": "YulFunctionCall", + "src": "5244:31:17" + }, + "nodeType": "YulExpressionStatement", + "src": "5244:31:17" + }, + { + "nodeType": "YulAssignment", + "src": "5284:15:17", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "5294:5:17" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "5284:6:17" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "5308:47:17", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "5340:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5351:2:17", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "5336:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "5336:18:17" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "5323:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "5323:32:17" + }, + "variables": [ + { + "name": "value_1", + "nodeType": "YulTypedName", + "src": "5312:7:17", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value_1", + "nodeType": "YulIdentifier", + "src": "5389:7:17" + } + ], + "functionName": { + "name": "validator_revert_address", + "nodeType": "YulIdentifier", + "src": "5364:24:17" + }, + "nodeType": "YulFunctionCall", + "src": "5364:33:17" + }, + "nodeType": "YulExpressionStatement", + "src": "5364:33:17" + }, + { + "nodeType": "YulAssignment", + "src": "5406:17:17", + "value": { + "name": "value_1", + "nodeType": "YulIdentifier", + "src": "5416:7:17" + }, + "variableNames": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "5406:6:17" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "5432:42:17", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "5459:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5470:2:17", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "5455:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "5455:18:17" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "5442:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "5442:32:17" + }, + "variableNames": [ + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "5432:6:17" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "5483:46:17", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "5514:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5525:2:17", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "5510:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "5510:18:17" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "5497:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "5497:32:17" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "5487:6:17", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "5572:16:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5581:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5584:1:17", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "5574:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "5574:12:17" + }, + "nodeType": "YulExpressionStatement", + "src": "5574:12:17" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "5544:6:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5552:18:17", + "type": "", + "value": "0xffffffffffffffff" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "5541:2:17" + }, + "nodeType": "YulFunctionCall", + "src": "5541:30:17" + }, + "nodeType": "YulIf", + "src": "5538:50:17" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "5597:84:17", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "5653:9:17" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "5664:6:17" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "5649:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "5649:22:17" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "5673:7:17" + } + ], + "functionName": { + "name": "abi_decode_bytes_calldata", + "nodeType": "YulIdentifier", + "src": "5623:25:17" + }, + "nodeType": "YulFunctionCall", + "src": "5623:58:17" + }, + "variables": [ + { + "name": "value3_1", + "nodeType": "YulTypedName", + "src": "5601:8:17", + "type": "" + }, + { + "name": "value4_1", + "nodeType": "YulTypedName", + "src": "5611:8:17", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "5690:18:17", + "value": { + "name": "value3_1", + "nodeType": "YulIdentifier", + "src": "5700:8:17" + }, + "variableNames": [ + { + "name": "value3", + "nodeType": "YulIdentifier", + "src": "5690:6:17" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "5717:18:17", + "value": { + "name": "value4_1", + "nodeType": "YulIdentifier", + "src": "5727:8:17" + }, + "variableNames": [ + { + "name": "value4", + "nodeType": "YulIdentifier", + "src": "5717:6:17" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_addresst_addresst_uint256t_bytes_calldata_ptr", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "5061:9:17", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "5072:7:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "5084:6:17", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "5092:6:17", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "5100:6:17", + "type": "" + }, + { + "name": "value3", + "nodeType": "YulTypedName", + "src": "5108:6:17", + "type": "" + }, + { + "name": "value4", + "nodeType": "YulTypedName", + "src": "5116:6:17", + "type": "" + } + ], + "src": "4987:754:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "5816:177:17", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "5862:16:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5871:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5874:1:17", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "5864:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "5864:12:17" + }, + "nodeType": "YulExpressionStatement", + "src": "5864:12:17" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "5837:7:17" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "5846:9:17" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "5833:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "5833:23:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5858:2:17", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "5829:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "5829:32:17" + }, + "nodeType": "YulIf", + "src": "5826:52:17" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "5887:36:17", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "5913:9:17" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "5900:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "5900:23:17" + }, + "variables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "5891:5:17", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "5957:5:17" + } + ], + "functionName": { + "name": "validator_revert_address", + "nodeType": "YulIdentifier", + "src": "5932:24:17" + }, + "nodeType": "YulFunctionCall", + "src": "5932:31:17" + }, + "nodeType": "YulExpressionStatement", + "src": "5932:31:17" + }, + { + "nodeType": "YulAssignment", + "src": "5972:15:17", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "5982:5:17" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "5972:6:17" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_address", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "5782:9:17", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "5793:7:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "5805:6:17", + "type": "" + } + ], + "src": "5746:247:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "6355:978:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "6372:9:17" + }, + { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "6387:6:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6395:66:17", + "type": "", + "value": "0xff00000000000000000000000000000000000000000000000000000000000000" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "6383:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "6383:79:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "6365:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "6365:98:17" + }, + "nodeType": "YulExpressionStatement", + "src": "6365:98:17" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "6472:12:17", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6482:2:17", + "type": "", + "value": "32" + }, + "variables": [ + { + "name": "_1", + "nodeType": "YulTypedName", + "src": "6476:2:17", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "6504:9:17" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "6515:2:17" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "6500:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "6500:18:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6520:3:17", + "type": "", + "value": "224" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "6493:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "6493:31:17" + }, + "nodeType": "YulExpressionStatement", + "src": "6493:31:17" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "6533:60:17", + "value": { + "arguments": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "6565:6:17" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "6577:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6588:3:17", + "type": "", + "value": "224" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "6573:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "6573:19:17" + } + ], + "functionName": { + "name": "abi_encode_string", + "nodeType": "YulIdentifier", + "src": "6547:17:17" + }, + "nodeType": "YulFunctionCall", + "src": "6547:46:17" + }, + "variables": [ + { + "name": "tail_1", + "nodeType": "YulTypedName", + "src": "6537:6:17", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "6613:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6624:2:17", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "6609:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "6609:18:17" + }, + { + "arguments": [ + { + "name": "tail_1", + "nodeType": "YulIdentifier", + "src": "6633:6:17" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "6641:9:17" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "6629:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "6629:22:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "6602:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "6602:50:17" + }, + "nodeType": "YulExpressionStatement", + "src": "6602:50:17" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "6661:47:17", + "value": { + "arguments": [ + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "6693:6:17" + }, + { + "name": "tail_1", + "nodeType": "YulIdentifier", + "src": "6701:6:17" + } + ], + "functionName": { + "name": "abi_encode_string", + "nodeType": "YulIdentifier", + "src": "6675:17:17" + }, + "nodeType": "YulFunctionCall", + "src": "6675:33:17" + }, + "variables": [ + { + "name": "tail_2", + "nodeType": "YulTypedName", + "src": "6665:6:17", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "6728:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6739:2:17", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "6724:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "6724:18:17" + }, + { + "name": "value3", + "nodeType": "YulIdentifier", + "src": "6744:6:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "6717:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "6717:34:17" + }, + "nodeType": "YulExpressionStatement", + "src": "6717:34:17" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "6771:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6782:3:17", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "6767:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "6767:19:17" + }, + { + "arguments": [ + { + "name": "value4", + "nodeType": "YulIdentifier", + "src": "6792:6:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6800:42:17", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "6788:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "6788:55:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "6760:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "6760:84:17" + }, + "nodeType": "YulExpressionStatement", + "src": "6760:84:17" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "6864:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6875:3:17", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "6860:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "6860:19:17" + }, + { + "name": "value5", + "nodeType": "YulIdentifier", + "src": "6881:6:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "6853:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "6853:35:17" + }, + "nodeType": "YulExpressionStatement", + "src": "6853:35:17" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "6908:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6919:3:17", + "type": "", + "value": "192" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "6904:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "6904:19:17" + }, + { + "arguments": [ + { + "name": "tail_2", + "nodeType": "YulIdentifier", + "src": "6929:6:17" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "6937:9:17" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "6925:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "6925:22:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "6897:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "6897:51:17" + }, + "nodeType": "YulExpressionStatement", + "src": "6897:51:17" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "6957:17:17", + "value": { + "name": "tail_2", + "nodeType": "YulIdentifier", + "src": "6968:6:17" + }, + "variables": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "6961:3:17", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "6983:27:17", + "value": { + "arguments": [ + { + "name": "value6", + "nodeType": "YulIdentifier", + "src": "7003:6:17" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "6997:5:17" + }, + "nodeType": "YulFunctionCall", + "src": "6997:13:17" + }, + "variables": [ + { + "name": "length", + "nodeType": "YulTypedName", + "src": "6987:6:17", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "tail_2", + "nodeType": "YulIdentifier", + "src": "7026:6:17" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "7034:6:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "7019:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "7019:22:17" + }, + "nodeType": "YulExpressionStatement", + "src": "7019:22:17" + }, + { + "nodeType": "YulAssignment", + "src": "7050:22:17", + "value": { + "arguments": [ + { + "name": "tail_2", + "nodeType": "YulIdentifier", + "src": "7061:6:17" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "7069:2:17" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "7057:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "7057:15:17" + }, + "variableNames": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "7050:3:17" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "7081:29:17", + "value": { + "arguments": [ + { + "name": "value6", + "nodeType": "YulIdentifier", + "src": "7099:6:17" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "7107:2:17" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "7095:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "7095:15:17" + }, + "variables": [ + { + "name": "srcPtr", + "nodeType": "YulTypedName", + "src": "7085:6:17", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "7119:10:17", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7128:1:17", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "i", + "nodeType": "YulTypedName", + "src": "7123:1:17", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "7187:120:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "7208:3:17" + }, + { + "arguments": [ + { + "name": "srcPtr", + "nodeType": "YulIdentifier", + "src": "7219:6:17" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "7213:5:17" + }, + "nodeType": "YulFunctionCall", + "src": "7213:13:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "7201:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "7201:26:17" + }, + "nodeType": "YulExpressionStatement", + "src": "7201:26:17" + }, + { + "nodeType": "YulAssignment", + "src": "7240:19:17", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "7251:3:17" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "7256:2:17" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "7247:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "7247:12:17" + }, + "variableNames": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "7240:3:17" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "7272:25:17", + "value": { + "arguments": [ + { + "name": "srcPtr", + "nodeType": "YulIdentifier", + "src": "7286:6:17" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "7294:2:17" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "7282:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "7282:15:17" + }, + "variableNames": [ + { + "name": "srcPtr", + "nodeType": "YulIdentifier", + "src": "7272:6:17" + } + ] + } + ] + }, + "condition": { + "arguments": [ + { + "name": "i", + "nodeType": "YulIdentifier", + "src": "7149:1:17" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "7152:6:17" + } + ], + "functionName": { + "name": "lt", + "nodeType": "YulIdentifier", + "src": "7146:2:17" + }, + "nodeType": "YulFunctionCall", + "src": "7146:13:17" + }, + "nodeType": "YulForLoop", + "post": { + "nodeType": "YulBlock", + "src": "7160:18:17", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "7162:14:17", + "value": { + "arguments": [ + { + "name": "i", + "nodeType": "YulIdentifier", + "src": "7171:1:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7174:1:17", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "7167:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "7167:9:17" + }, + "variableNames": [ + { + "name": "i", + "nodeType": "YulIdentifier", + "src": "7162:1:17" + } + ] + } + ] + }, + "pre": { + "nodeType": "YulBlock", + "src": "7142:3:17", + "statements": [] + }, + "src": "7138:169:17" + }, + { + "nodeType": "YulAssignment", + "src": "7316:11:17", + "value": { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "7324:3:17" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "7316:4:17" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_bytes1_t_string_memory_ptr_t_string_memory_ptr_t_uint256_t_address_t_bytes32_t_array$_t_uint256_$dyn_memory_ptr__to_t_bytes1_t_string_memory_ptr_t_string_memory_ptr_t_uint256_t_address_t_bytes32_t_array$_t_uint256_$dyn_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "6276:9:17", + "type": "" + }, + { + "name": "value6", + "nodeType": "YulTypedName", + "src": "6287:6:17", + "type": "" + }, + { + "name": "value5", + "nodeType": "YulTypedName", + "src": "6295:6:17", + "type": "" + }, + { + "name": "value4", + "nodeType": "YulTypedName", + "src": "6303:6:17", + "type": "" + }, + { + "name": "value3", + "nodeType": "YulTypedName", + "src": "6311:6:17", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "6319:6:17", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "6327:6:17", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "6335:6:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "6346:4:17", + "type": "" + } + ], + "src": "5998:1335:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "7508:659:17", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "7555:16:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7564:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7567:1:17", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "7557:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "7557:12:17" + }, + "nodeType": "YulExpressionStatement", + "src": "7557:12:17" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "7529:7:17" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "7538:9:17" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "7525:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "7525:23:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7550:3:17", + "type": "", + "value": "224" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "7521:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "7521:33:17" + }, + "nodeType": "YulIf", + "src": "7518:53:17" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "7580:36:17", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "7606:9:17" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "7593:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "7593:23:17" + }, + "variables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "7584:5:17", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "7650:5:17" + } + ], + "functionName": { + "name": "validator_revert_address", + "nodeType": "YulIdentifier", + "src": "7625:24:17" + }, + "nodeType": "YulFunctionCall", + "src": "7625:31:17" + }, + "nodeType": "YulExpressionStatement", + "src": "7625:31:17" + }, + { + "nodeType": "YulAssignment", + "src": "7665:15:17", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "7675:5:17" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "7665:6:17" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "7689:47:17", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "7721:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7732:2:17", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "7717:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "7717:18:17" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "7704:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "7704:32:17" + }, + "variables": [ + { + "name": "value_1", + "nodeType": "YulTypedName", + "src": "7693:7:17", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value_1", + "nodeType": "YulIdentifier", + "src": "7770:7:17" + } + ], + "functionName": { + "name": "validator_revert_address", + "nodeType": "YulIdentifier", + "src": "7745:24:17" + }, + "nodeType": "YulFunctionCall", + "src": "7745:33:17" + }, + "nodeType": "YulExpressionStatement", + "src": "7745:33:17" + }, + { + "nodeType": "YulAssignment", + "src": "7787:17:17", + "value": { + "name": "value_1", + "nodeType": "YulIdentifier", + "src": "7797:7:17" + }, + "variableNames": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "7787:6:17" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "7813:42:17", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "7840:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7851:2:17", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "7836:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "7836:18:17" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "7823:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "7823:32:17" + }, + "variableNames": [ + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "7813:6:17" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "7864:42:17", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "7891:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7902:2:17", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "7887:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "7887:18:17" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "7874:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "7874:32:17" + }, + "variableNames": [ + { + "name": "value3", + "nodeType": "YulIdentifier", + "src": "7864:6:17" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "7915:48:17", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "7947:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7958:3:17", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "7943:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "7943:19:17" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "7930:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "7930:33:17" + }, + "variables": [ + { + "name": "value_2", + "nodeType": "YulTypedName", + "src": "7919:7:17", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "8015:16:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8024:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8027:1:17", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "8017:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "8017:12:17" + }, + "nodeType": "YulExpressionStatement", + "src": "8017:12:17" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value_2", + "nodeType": "YulIdentifier", + "src": "7985:7:17" + }, + { + "arguments": [ + { + "name": "value_2", + "nodeType": "YulIdentifier", + "src": "7998:7:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8007:4:17", + "type": "", + "value": "0xff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "7994:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "7994:18:17" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "7982:2:17" + }, + "nodeType": "YulFunctionCall", + "src": "7982:31:17" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "7975:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "7975:39:17" + }, + "nodeType": "YulIf", + "src": "7972:59:17" + }, + { + "nodeType": "YulAssignment", + "src": "8040:17:17", + "value": { + "name": "value_2", + "nodeType": "YulIdentifier", + "src": "8050:7:17" + }, + "variableNames": [ + { + "name": "value4", + "nodeType": "YulIdentifier", + "src": "8040:6:17" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "8066:43:17", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "8093:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8104:3:17", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "8089:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "8089:19:17" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "8076:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "8076:33:17" + }, + "variableNames": [ + { + "name": "value5", + "nodeType": "YulIdentifier", + "src": "8066:6:17" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "8118:43:17", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "8145:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8156:3:17", + "type": "", + "value": "192" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "8141:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "8141:19:17" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "8128:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "8128:33:17" + }, + "variableNames": [ + { + "name": "value6", + "nodeType": "YulIdentifier", + "src": "8118:6:17" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_addresst_addresst_uint256t_uint256t_uint8t_bytes32t_bytes32", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "7426:9:17", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "7437:7:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "7449:6:17", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "7457:6:17", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "7465:6:17", + "type": "" + }, + { + "name": "value3", + "nodeType": "YulTypedName", + "src": "7473:6:17", + "type": "" + }, + { + "name": "value4", + "nodeType": "YulTypedName", + "src": "7481:6:17", + "type": "" + }, + { + "name": "value5", + "nodeType": "YulTypedName", + "src": "7489:6:17", + "type": "" + }, + { + "name": "value6", + "nodeType": "YulTypedName", + "src": "7497:6:17", + "type": "" + } + ], + "src": "7338:829:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "8259:301:17", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "8305:16:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8314:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8317:1:17", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "8307:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "8307:12:17" + }, + "nodeType": "YulExpressionStatement", + "src": "8307:12:17" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "8280:7:17" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "8289:9:17" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "8276:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "8276:23:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8301:2:17", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "8272:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "8272:32:17" + }, + "nodeType": "YulIf", + "src": "8269:52:17" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "8330:36:17", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "8356:9:17" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "8343:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "8343:23:17" + }, + "variables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "8334:5:17", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "8400:5:17" + } + ], + "functionName": { + "name": "validator_revert_address", + "nodeType": "YulIdentifier", + "src": "8375:24:17" + }, + "nodeType": "YulFunctionCall", + "src": "8375:31:17" + }, + "nodeType": "YulExpressionStatement", + "src": "8375:31:17" + }, + { + "nodeType": "YulAssignment", + "src": "8415:15:17", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "8425:5:17" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "8415:6:17" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "8439:47:17", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "8471:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8482:2:17", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "8467:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "8467:18:17" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "8454:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "8454:32:17" + }, + "variables": [ + { + "name": "value_1", + "nodeType": "YulTypedName", + "src": "8443:7:17", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value_1", + "nodeType": "YulIdentifier", + "src": "8520:7:17" + } + ], + "functionName": { + "name": "validator_revert_address", + "nodeType": "YulIdentifier", + "src": "8495:24:17" + }, + "nodeType": "YulFunctionCall", + "src": "8495:33:17" + }, + "nodeType": "YulExpressionStatement", + "src": "8495:33:17" + }, + { + "nodeType": "YulAssignment", + "src": "8537:17:17", + "value": { + "name": "value_1", + "nodeType": "YulIdentifier", + "src": "8547:7:17" + }, + "variableNames": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "8537:6:17" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_addresst_address", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "8217:9:17", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "8228:7:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "8240:6:17", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "8248:6:17", + "type": "" + } + ], + "src": "8172:388:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "8660:228:17", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "8706:16:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8715:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8718:1:17", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "8708:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "8708:12:17" + }, + "nodeType": "YulExpressionStatement", + "src": "8708:12:17" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "8681:7:17" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "8690:9:17" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "8677:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "8677:23:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8702:2:17", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "8673:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "8673:32:17" + }, + "nodeType": "YulIf", + "src": "8670:52:17" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "8731:36:17", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "8757:9:17" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "8744:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "8744:23:17" + }, + "variables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "8735:5:17", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "8801:5:17" + } + ], + "functionName": { + "name": "validator_revert_address", + "nodeType": "YulIdentifier", + "src": "8776:24:17" + }, + "nodeType": "YulFunctionCall", + "src": "8776:31:17" + }, + "nodeType": "YulExpressionStatement", + "src": "8776:31:17" + }, + { + "nodeType": "YulAssignment", + "src": "8816:15:17", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "8826:5:17" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "8816:6:17" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "8840:42:17", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "8867:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8878:2:17", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "8863:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "8863:18:17" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "8850:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "8850:32:17" + }, + "variableNames": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "8840:6:17" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_address_payablet_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "8618:9:17", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "8629:7:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "8641:6:17", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "8649:6:17", + "type": "" + } + ], + "src": "8565:323:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "8925:152:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8942:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8945:77:17", + "type": "", + "value": "35408467139433450592217433187231851964531694900788300625387963629091585785856" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "8935:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "8935:88:17" + }, + "nodeType": "YulExpressionStatement", + "src": "8935:88:17" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9039:1:17", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9042:4:17", + "type": "", + "value": "0x11" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "9032:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "9032:15:17" + }, + "nodeType": "YulExpressionStatement", + "src": "9032:15:17" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9063:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9066:4:17", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "9056:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "9056:15:17" + }, + "nodeType": "YulExpressionStatement", + "src": "9056:15:17" + } + ] + }, + "name": "panic_error_0x11", + "nodeType": "YulFunctionDefinition", + "src": "8893:184:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "9128:228:17", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "9159:168:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9180:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9183:77:17", + "type": "", + "value": "35408467139433450592217433187231851964531694900788300625387963629091585785856" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "9173:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "9173:88:17" + }, + "nodeType": "YulExpressionStatement", + "src": "9173:88:17" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9281:1:17", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9284:4:17", + "type": "", + "value": "0x12" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "9274:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "9274:15:17" + }, + "nodeType": "YulExpressionStatement", + "src": "9274:15:17" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9309:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9312:4:17", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "9302:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "9302:15:17" + }, + "nodeType": "YulExpressionStatement", + "src": "9302:15:17" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "y", + "nodeType": "YulIdentifier", + "src": "9148:1:17" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "9141:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "9141:9:17" + }, + "nodeType": "YulIf", + "src": "9138:189:17" + }, + { + "nodeType": "YulAssignment", + "src": "9336:14:17", + "value": { + "arguments": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "9345:1:17" + }, + { + "name": "y", + "nodeType": "YulIdentifier", + "src": "9348:1:17" + } + ], + "functionName": { + "name": "div", + "nodeType": "YulIdentifier", + "src": "9341:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "9341:9:17" + }, + "variableNames": [ + { + "name": "r", + "nodeType": "YulIdentifier", + "src": "9336:1:17" + } + ] + } + ] + }, + "name": "checked_div_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "x", + "nodeType": "YulTypedName", + "src": "9113:1:17", + "type": "" + }, + { + "name": "y", + "nodeType": "YulTypedName", + "src": "9116:1:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "r", + "nodeType": "YulTypedName", + "src": "9122:1:17", + "type": "" + } + ], + "src": "9082:274:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "9413:116:17", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "9423:20:17", + "value": { + "arguments": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "9438:1:17" + }, + { + "name": "y", + "nodeType": "YulIdentifier", + "src": "9441:1:17" + } + ], + "functionName": { + "name": "mul", + "nodeType": "YulIdentifier", + "src": "9434:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "9434:9:17" + }, + "variableNames": [ + { + "name": "product", + "nodeType": "YulIdentifier", + "src": "9423:7:17" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "9501:22:17", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x11", + "nodeType": "YulIdentifier", + "src": "9503:16:17" + }, + "nodeType": "YulFunctionCall", + "src": "9503:18:17" + }, + "nodeType": "YulExpressionStatement", + "src": "9503:18:17" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "9472:1:17" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "9465:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "9465:9:17" + }, + { + "arguments": [ + { + "name": "y", + "nodeType": "YulIdentifier", + "src": "9479:1:17" + }, + { + "arguments": [ + { + "name": "product", + "nodeType": "YulIdentifier", + "src": "9486:7:17" + }, + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "9495:1:17" + } + ], + "functionName": { + "name": "div", + "nodeType": "YulIdentifier", + "src": "9482:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "9482:15:17" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "9476:2:17" + }, + "nodeType": "YulFunctionCall", + "src": "9476:22:17" + } + ], + "functionName": { + "name": "or", + "nodeType": "YulIdentifier", + "src": "9462:2:17" + }, + "nodeType": "YulFunctionCall", + "src": "9462:37:17" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "9455:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "9455:45:17" + }, + "nodeType": "YulIf", + "src": "9452:71:17" + } + ] + }, + "name": "checked_mul_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "x", + "nodeType": "YulTypedName", + "src": "9392:1:17", + "type": "" + }, + { + "name": "y", + "nodeType": "YulTypedName", + "src": "9395:1:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "product", + "nodeType": "YulTypedName", + "src": "9401:7:17", + "type": "" + } + ], + "src": "9361:168:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "9663:119:17", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "9673:26:17", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "9685:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9696:2:17", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "9681:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "9681:18:17" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "9673:4:17" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "9715:9:17" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "9726:6:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "9708:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "9708:25:17" + }, + "nodeType": "YulExpressionStatement", + "src": "9708:25:17" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "9753:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9764:2:17", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "9749:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "9749:18:17" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "9769:6:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "9742:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "9742:34:17" + }, + "nodeType": "YulExpressionStatement", + "src": "9742:34:17" + } + ] + }, + "name": "abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "9624:9:17", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "9635:6:17", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "9643:6:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "9654:4:17", + "type": "" + } + ], + "src": "9534:248:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "9819:152:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9836:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9839:77:17", + "type": "", + "value": "35408467139433450592217433187231851964531694900788300625387963629091585785856" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "9829:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "9829:88:17" + }, + "nodeType": "YulExpressionStatement", + "src": "9829:88:17" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9933:1:17", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9936:4:17", + "type": "", + "value": "0x32" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "9926:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "9926:15:17" + }, + "nodeType": "YulExpressionStatement", + "src": "9926:15:17" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9957:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9960:4:17", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "9950:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "9950:15:17" + }, + "nodeType": "YulExpressionStatement", + "src": "9950:15:17" + } + ] + }, + "name": "panic_error_0x32", + "nodeType": "YulFunctionDefinition", + "src": "9787:184:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "10023:148:17", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "10114:22:17", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x11", + "nodeType": "YulIdentifier", + "src": "10116:16:17" + }, + "nodeType": "YulFunctionCall", + "src": "10116:18:17" + }, + "nodeType": "YulExpressionStatement", + "src": "10116:18:17" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "10039:5:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "10046:66:17", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "10036:2:17" + }, + "nodeType": "YulFunctionCall", + "src": "10036:77:17" + }, + "nodeType": "YulIf", + "src": "10033:103:17" + }, + { + "nodeType": "YulAssignment", + "src": "10145:20:17", + "value": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "10156:5:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "10163:1:17", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "10152:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "10152:13:17" + }, + "variableNames": [ + { + "name": "ret", + "nodeType": "YulIdentifier", + "src": "10145:3:17" + } + ] + } + ] + }, + "name": "increment_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "10005:5:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "ret", + "nodeType": "YulTypedName", + "src": "10015:3:17", + "type": "" + } + ], + "src": "9976:195:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "10242:259:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "10259:3:17" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "10264:6:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "10252:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "10252:19:17" + }, + "nodeType": "YulExpressionStatement", + "src": "10252:19:17" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "10297:3:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "10302:4:17", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "10293:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "10293:14:17" + }, + { + "name": "start", + "nodeType": "YulIdentifier", + "src": "10309:5:17" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "10316:6:17" + } + ], + "functionName": { + "name": "calldatacopy", + "nodeType": "YulIdentifier", + "src": "10280:12:17" + }, + "nodeType": "YulFunctionCall", + "src": "10280:43:17" + }, + "nodeType": "YulExpressionStatement", + "src": "10280:43:17" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "10347:3:17" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "10352:6:17" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "10343:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "10343:16:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "10361:4:17", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "10339:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "10339:27:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "10368:1:17", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "10332:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "10332:38:17" + }, + "nodeType": "YulExpressionStatement", + "src": "10332:38:17" + }, + { + "nodeType": "YulAssignment", + "src": "10379:116:17", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "10394:3:17" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "10407:6:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "10415:2:17", + "type": "", + "value": "31" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "10403:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "10403:15:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "10420:66:17", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "10399:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "10399:88:17" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "10390:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "10390:98:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "10490:4:17", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "10386:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "10386:109:17" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "10379:3:17" + } + ] + } + ] + }, + "name": "abi_encode_bytes_calldata", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "start", + "nodeType": "YulTypedName", + "src": "10211:5:17", + "type": "" + }, + { + "name": "length", + "nodeType": "YulTypedName", + "src": "10218:6:17", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "10226:3:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "10234:3:17", + "type": "" + } + ], + "src": "10176:325:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "10691:250:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "10708:9:17" + }, + { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "10723:6:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "10731:42:17", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "10719:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "10719:55:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "10701:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "10701:74:17" + }, + "nodeType": "YulExpressionStatement", + "src": "10701:74:17" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "10795:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "10806:2:17", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "10791:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "10791:18:17" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "10811:6:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "10784:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "10784:34:17" + }, + "nodeType": "YulExpressionStatement", + "src": "10784:34:17" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "10838:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "10849:2:17", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "10834:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "10834:18:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "10854:2:17", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "10827:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "10827:30:17" + }, + "nodeType": "YulExpressionStatement", + "src": "10827:30:17" + }, + { + "nodeType": "YulAssignment", + "src": "10866:69:17", + "value": { + "arguments": [ + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "10900:6:17" + }, + { + "name": "value3", + "nodeType": "YulIdentifier", + "src": "10908:6:17" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "10920:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "10931:2:17", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "10916:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "10916:18:17" + } + ], + "functionName": { + "name": "abi_encode_bytes_calldata", + "nodeType": "YulIdentifier", + "src": "10874:25:17" + }, + "nodeType": "YulFunctionCall", + "src": "10874:61:17" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "10866:4:17" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_address_t_uint256_t_bytes_calldata_ptr__to_t_address_t_uint256_t_bytes_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "10636:9:17", + "type": "" + }, + { + "name": "value3", + "nodeType": "YulTypedName", + "src": "10647:6:17", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "10655:6:17", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "10663:6:17", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "10671:6:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "10682:4:17", + "type": "" + } + ], + "src": "10506:435:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "11024:199:17", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "11070:16:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11079:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11082:1:17", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "11072:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "11072:12:17" + }, + "nodeType": "YulExpressionStatement", + "src": "11072:12:17" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "11045:7:17" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "11054:9:17" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "11041:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "11041:23:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11066:2:17", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "11037:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "11037:32:17" + }, + "nodeType": "YulIf", + "src": "11034:52:17" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "11095:29:17", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "11114:9:17" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "11108:5:17" + }, + "nodeType": "YulFunctionCall", + "src": "11108:16:17" + }, + "variables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "11099:5:17", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "11177:16:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11186:1:17", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11189:1:17", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "11179:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "11179:12:17" + }, + "nodeType": "YulExpressionStatement", + "src": "11179:12:17" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "11146:5:17" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "11167:5:17" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "11160:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "11160:13:17" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "11153:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "11153:21:17" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "11143:2:17" + }, + "nodeType": "YulFunctionCall", + "src": "11143:32:17" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "11136:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "11136:40:17" + }, + "nodeType": "YulIf", + "src": "11133:60:17" + }, + { + "nodeType": "YulAssignment", + "src": "11202:15:17", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "11212:5:17" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "11202:6:17" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_bool_fromMemory", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "10990:9:17", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "11001:7:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "11013:6:17", + "type": "" + } + ], + "src": "10946:277:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "11441:325:17", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "11451:52:17", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11461:42:17", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffff" + }, + "variables": [ + { + "name": "_1", + "nodeType": "YulTypedName", + "src": "11455:2:17", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "11519:9:17" + }, + { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "11534:6:17" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "11542:2:17" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "11530:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "11530:15:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "11512:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "11512:34:17" + }, + "nodeType": "YulExpressionStatement", + "src": "11512:34:17" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "11566:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11577:2:17", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "11562:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "11562:18:17" + }, + { + "arguments": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "11586:6:17" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "11594:2:17" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "11582:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "11582:15:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "11555:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "11555:43:17" + }, + "nodeType": "YulExpressionStatement", + "src": "11555:43:17" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "11618:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11629:2:17", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "11614:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "11614:18:17" + }, + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "11634:6:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "11607:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "11607:34:17" + }, + "nodeType": "YulExpressionStatement", + "src": "11607:34:17" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "11661:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11672:2:17", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "11657:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "11657:18:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11677:3:17", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "11650:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "11650:31:17" + }, + "nodeType": "YulExpressionStatement", + "src": "11650:31:17" + }, + { + "nodeType": "YulAssignment", + "src": "11690:70:17", + "value": { + "arguments": [ + { + "name": "value3", + "nodeType": "YulIdentifier", + "src": "11724:6:17" + }, + { + "name": "value4", + "nodeType": "YulIdentifier", + "src": "11732:6:17" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "11744:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11755:3:17", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "11740:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "11740:19:17" + } + ], + "functionName": { + "name": "abi_encode_bytes_calldata", + "nodeType": "YulIdentifier", + "src": "11698:25:17" + }, + "nodeType": "YulFunctionCall", + "src": "11698:62:17" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "11690:4:17" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_address_t_address_t_uint256_t_bytes_calldata_ptr__to_t_address_t_address_t_uint256_t_bytes_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "11378:9:17", + "type": "" + }, + { + "name": "value4", + "nodeType": "YulTypedName", + "src": "11389:6:17", + "type": "" + }, + { + "name": "value3", + "nodeType": "YulTypedName", + "src": "11397:6:17", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "11405:6:17", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "11413:6:17", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "11421:6:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "11432:4:17", + "type": "" + } + ], + "src": "11228:538:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "11872:125:17", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "11882:26:17", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "11894:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11905:2:17", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "11890:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "11890:18:17" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "11882:4:17" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "11924:9:17" + }, + { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "11939:6:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11947:42:17", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "11935:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "11935:55:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "11917:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "11917:74:17" + }, + "nodeType": "YulExpressionStatement", + "src": "11917:74:17" + } + ] + }, + "name": "abi_encode_tuple_t_address__to_t_address__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "11841:9:17", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "11852:6:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "11863:4:17", + "type": "" + } + ], + "src": "11771:226:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "12243:373:17", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "12253:27:17", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "12265:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12276:3:17", + "type": "", + "value": "192" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12261:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "12261:19:17" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "12253:4:17" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "12296:9:17" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "12307:6:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "12289:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "12289:25:17" + }, + "nodeType": "YulExpressionStatement", + "src": "12289:25:17" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "12323:52:17", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12333:42:17", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffff" + }, + "variables": [ + { + "name": "_1", + "nodeType": "YulTypedName", + "src": "12327:2:17", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "12395:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12406:2:17", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12391:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "12391:18:17" + }, + { + "arguments": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "12415:6:17" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "12423:2:17" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "12411:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "12411:15:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "12384:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "12384:43:17" + }, + "nodeType": "YulExpressionStatement", + "src": "12384:43:17" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "12447:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12458:2:17", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12443:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "12443:18:17" + }, + { + "arguments": [ + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "12467:6:17" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "12475:2:17" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "12463:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "12463:15:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "12436:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "12436:43:17" + }, + "nodeType": "YulExpressionStatement", + "src": "12436:43:17" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "12499:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12510:2:17", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12495:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "12495:18:17" + }, + { + "name": "value3", + "nodeType": "YulIdentifier", + "src": "12515:6:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "12488:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "12488:34:17" + }, + "nodeType": "YulExpressionStatement", + "src": "12488:34:17" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "12542:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12553:3:17", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12538:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "12538:19:17" + }, + { + "name": "value4", + "nodeType": "YulIdentifier", + "src": "12559:6:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "12531:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "12531:35:17" + }, + "nodeType": "YulExpressionStatement", + "src": "12531:35:17" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "12586:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12597:3:17", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12582:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "12582:19:17" + }, + { + "name": "value5", + "nodeType": "YulIdentifier", + "src": "12603:6:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "12575:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "12575:35:17" + }, + "nodeType": "YulExpressionStatement", + "src": "12575:35:17" + } + ] + }, + "name": "abi_encode_tuple_t_bytes32_t_address_t_address_t_uint256_t_uint256_t_uint256__to_t_bytes32_t_address_t_address_t_uint256_t_uint256_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "12172:9:17", + "type": "" + }, + { + "name": "value5", + "nodeType": "YulTypedName", + "src": "12183:6:17", + "type": "" + }, + { + "name": "value4", + "nodeType": "YulTypedName", + "src": "12191:6:17", + "type": "" + }, + { + "name": "value3", + "nodeType": "YulTypedName", + "src": "12199:6:17", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "12207:6:17", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "12215:6:17", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "12223:6:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "12234:4:17", + "type": "" + } + ], + "src": "12002:614:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "12869:196:17", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "12886:3:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12891:66:17", + "type": "", + "value": "0x1901000000000000000000000000000000000000000000000000000000000000" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "12879:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "12879:79:17" + }, + "nodeType": "YulExpressionStatement", + "src": "12879:79:17" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "12978:3:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12983:1:17", + "type": "", + "value": "2" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12974:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "12974:11:17" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "12987:6:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "12967:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "12967:27:17" + }, + "nodeType": "YulExpressionStatement", + "src": "12967:27:17" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "13014:3:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13019:2:17", + "type": "", + "value": "34" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "13010:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "13010:12:17" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "13024:6:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "13003:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "13003:28:17" + }, + "nodeType": "YulExpressionStatement", + "src": "13003:28:17" + }, + { + "nodeType": "YulAssignment", + "src": "13040:19:17", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "13051:3:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13056:2:17", + "type": "", + "value": "66" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "13047:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "13047:12:17" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "13040:3:17" + } + ] + } + ] + }, + "name": "abi_encode_tuple_packed_t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541_t_bytes32_t_bytes32__to_t_string_memory_ptr_t_bytes32_t_bytes32__nonPadded_inplace_fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "12837:3:17", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "12842:6:17", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "12850:6:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "12861:3:17", + "type": "" + } + ], + "src": "12621:444:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "13251:217:17", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "13261:27:17", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "13273:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13284:3:17", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "13269:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "13269:19:17" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "13261:4:17" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "13304:9:17" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "13315:6:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "13297:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "13297:25:17" + }, + "nodeType": "YulExpressionStatement", + "src": "13297:25:17" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "13342:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13353:2:17", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "13338:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "13338:18:17" + }, + { + "arguments": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "13362:6:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13370:4:17", + "type": "", + "value": "0xff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "13358:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "13358:17:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "13331:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "13331:45:17" + }, + "nodeType": "YulExpressionStatement", + "src": "13331:45:17" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "13396:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13407:2:17", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "13392:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "13392:18:17" + }, + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "13412:6:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "13385:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "13385:34:17" + }, + "nodeType": "YulExpressionStatement", + "src": "13385:34:17" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "13439:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13450:2:17", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "13435:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "13435:18:17" + }, + { + "name": "value3", + "nodeType": "YulIdentifier", + "src": "13455:6:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "13428:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "13428:34:17" + }, + "nodeType": "YulExpressionStatement", + "src": "13428:34:17" + } + ] + }, + "name": "abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "13196:9:17", + "type": "" + }, + { + "name": "value3", + "nodeType": "YulTypedName", + "src": "13207:6:17", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "13215:6:17", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "13223:6:17", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "13231:6:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "13242:4:17", + "type": "" + } + ], + "src": "13070:398:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "13521:77:17", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "13531:16:17", + "value": { + "arguments": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "13542:1:17" + }, + { + "name": "y", + "nodeType": "YulIdentifier", + "src": "13545:1:17" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "13538:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "13538:9:17" + }, + "variableNames": [ + { + "name": "sum", + "nodeType": "YulIdentifier", + "src": "13531:3:17" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "13570:22:17", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x11", + "nodeType": "YulIdentifier", + "src": "13572:16:17" + }, + "nodeType": "YulFunctionCall", + "src": "13572:18:17" + }, + "nodeType": "YulExpressionStatement", + "src": "13572:18:17" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "13562:1:17" + }, + { + "name": "sum", + "nodeType": "YulIdentifier", + "src": "13565:3:17" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "13559:2:17" + }, + "nodeType": "YulFunctionCall", + "src": "13559:10:17" + }, + "nodeType": "YulIf", + "src": "13556:36:17" + } + ] + }, + "name": "checked_add_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "x", + "nodeType": "YulTypedName", + "src": "13504:1:17", + "type": "" + }, + { + "name": "y", + "nodeType": "YulTypedName", + "src": "13507:1:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "sum", + "nodeType": "YulTypedName", + "src": "13513:3:17", + "type": "" + } + ], + "src": "13473:125:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "13652:79:17", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "13662:17:17", + "value": { + "arguments": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "13674:1:17" + }, + { + "name": "y", + "nodeType": "YulIdentifier", + "src": "13677:1:17" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "13670:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "13670:9:17" + }, + "variableNames": [ + { + "name": "diff", + "nodeType": "YulIdentifier", + "src": "13662:4:17" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "13703:22:17", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x11", + "nodeType": "YulIdentifier", + "src": "13705:16:17" + }, + "nodeType": "YulFunctionCall", + "src": "13705:18:17" + }, + "nodeType": "YulExpressionStatement", + "src": "13705:18:17" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "diff", + "nodeType": "YulIdentifier", + "src": "13694:4:17" + }, + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "13700:1:17" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "13691:2:17" + }, + "nodeType": "YulFunctionCall", + "src": "13691:11:17" + }, + "nodeType": "YulIf", + "src": "13688:37:17" + } + ] + }, + "name": "checked_sub_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "x", + "nodeType": "YulTypedName", + "src": "13634:1:17", + "type": "" + }, + { + "name": "y", + "nodeType": "YulTypedName", + "src": "13637:1:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "diff", + "nodeType": "YulTypedName", + "src": "13643:4:17", + "type": "" + } + ], + "src": "13603:128:17" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "13921:255:17", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "13931:27:17", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "13943:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13954:3:17", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "13939:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "13939:19:17" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "13931:4:17" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "13974:9:17" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "13985:6:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "13967:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "13967:25:17" + }, + "nodeType": "YulExpressionStatement", + "src": "13967:25:17" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "14012:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14023:2:17", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "14008:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "14008:18:17" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "14028:6:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "14001:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "14001:34:17" + }, + "nodeType": "YulExpressionStatement", + "src": "14001:34:17" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "14055:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14066:2:17", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "14051:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "14051:18:17" + }, + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "14071:6:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "14044:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "14044:34:17" + }, + "nodeType": "YulExpressionStatement", + "src": "14044:34:17" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "14098:9:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14109:2:17", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "14094:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "14094:18:17" + }, + { + "arguments": [ + { + "name": "value3", + "nodeType": "YulIdentifier", + "src": "14118:6:17" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14126:42:17", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "14114:3:17" + }, + "nodeType": "YulFunctionCall", + "src": "14114:55:17" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "14087:6:17" + }, + "nodeType": "YulFunctionCall", + "src": "14087:83:17" + }, + "nodeType": "YulExpressionStatement", + "src": "14087:83:17" + } + ] + }, + "name": "abi_encode_tuple_t_bytes32_t_bytes32_t_uint256_t_address__to_t_bytes32_t_bytes32_t_uint256_t_address__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "13866:9:17", + "type": "" + }, + { + "name": "value3", + "nodeType": "YulTypedName", + "src": "13877:6:17", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "13885:6:17", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "13893:6:17", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "13901:6:17", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "13912:4:17", + "type": "" + } + ], + "src": "13736:440:17" + } + ] + }, + "contents": "{\n { }\n function abi_encode_string(value, pos) -> end\n {\n let length := mload(value)\n mstore(pos, length)\n let i := 0\n for { } lt(i, length) { i := add(i, 0x20) }\n {\n let _1 := 0x20\n mstore(add(add(pos, i), _1), mload(add(add(value, i), _1)))\n }\n mstore(add(add(pos, length), 0x20), 0)\n end := add(add(pos, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 0x20)\n }\n function abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n tail := abi_encode_string(value0, add(headStart, 32))\n }\n function validator_revert_address(value)\n {\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_addresst_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, iszero(iszero(value0)))\n }\n function panic_error_0x41()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function abi_decode_address_payable(offset) -> value\n {\n value := calldataload(offset)\n validator_revert_address(value)\n }\n function abi_decode_tuple_t_array$_t_address_payable_$dyn_memory_ptrt_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let offset := calldataload(headStart)\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let _3 := calldataload(_2)\n let _4 := 0x20\n if gt(_3, _1) { panic_error_0x41() }\n let _5 := shl(5, _3)\n let memPtr := mload(64)\n let newFreePtr := add(memPtr, and(add(_5, 63), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0))\n if or(gt(newFreePtr, _1), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n let dst := memPtr\n mstore(memPtr, _3)\n dst := add(memPtr, _4)\n let srcEnd := add(add(_2, _5), _4)\n if gt(srcEnd, dataEnd) { revert(0, 0) }\n let src := add(_2, _4)\n for { } lt(src, srcEnd) { src := add(src, _4) }\n {\n mstore(dst, abi_decode_address_payable(src))\n dst := add(dst, _4)\n }\n value0 := memPtr\n value1 := calldataload(add(headStart, _4))\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_addresst_addresst_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n value2 := calldataload(add(headStart, 64))\n }\n function abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xff))\n }\n function abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_bytes_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, length), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_addresst_uint256t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n let offset := calldataload(add(headStart, 64))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value2_1, value3_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value2 := value2_1\n value3 := value3_1\n }\n function abi_decode_tuple_t_addresst_addresst_uint256t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n value2 := calldataload(add(headStart, 64))\n let offset := calldataload(add(headStart, 96))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value3_1, value4_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value3 := value3_1\n value4 := value4_1\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n }\n function abi_encode_tuple_t_bytes1_t_string_memory_ptr_t_string_memory_ptr_t_uint256_t_address_t_bytes32_t_array$_t_uint256_$dyn_memory_ptr__to_t_bytes1_t_string_memory_ptr_t_string_memory_ptr_t_uint256_t_address_t_bytes32_t_array$_t_uint256_$dyn_memory_ptr__fromStack_reversed(headStart, value6, value5, value4, value3, value2, value1, value0) -> tail\n {\n mstore(headStart, and(value0, 0xff00000000000000000000000000000000000000000000000000000000000000))\n let _1 := 32\n mstore(add(headStart, _1), 224)\n let tail_1 := abi_encode_string(value1, add(headStart, 224))\n mstore(add(headStart, 64), sub(tail_1, headStart))\n let tail_2 := abi_encode_string(value2, tail_1)\n mstore(add(headStart, 96), value3)\n mstore(add(headStart, 128), and(value4, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 160), value5)\n mstore(add(headStart, 192), sub(tail_2, headStart))\n let pos := tail_2\n let length := mload(value6)\n mstore(tail_2, length)\n pos := add(tail_2, _1)\n let srcPtr := add(value6, _1)\n let i := 0\n for { } lt(i, length) { i := add(i, 1) }\n {\n mstore(pos, mload(srcPtr))\n pos := add(pos, _1)\n srcPtr := add(srcPtr, _1)\n }\n tail := pos\n }\n function abi_decode_tuple_t_addresst_addresst_uint256t_uint256t_uint8t_bytes32t_bytes32(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5, value6\n {\n if slt(sub(dataEnd, headStart), 224) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n value2 := calldataload(add(headStart, 64))\n value3 := calldataload(add(headStart, 96))\n let value_2 := calldataload(add(headStart, 128))\n if iszero(eq(value_2, and(value_2, 0xff))) { revert(0, 0) }\n value4 := value_2\n value5 := calldataload(add(headStart, 160))\n value6 := calldataload(add(headStart, 192))\n }\n function abi_decode_tuple_t_addresst_address(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n }\n function abi_decode_tuple_t_address_payablet_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n value1 := calldataload(add(headStart, 32))\n }\n function panic_error_0x11()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function checked_div_t_uint256(x, y) -> r\n {\n if iszero(y)\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x12)\n revert(0, 0x24)\n }\n r := div(x, y)\n }\n function checked_mul_t_uint256(x, y) -> product\n {\n product := mul(x, y)\n if iszero(or(iszero(x), eq(y, div(product, x)))) { panic_error_0x11() }\n }\n function abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n }\n function panic_error_0x32()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x32)\n revert(0, 0x24)\n }\n function increment_t_uint256(value) -> ret\n {\n if eq(value, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) { panic_error_0x11() }\n ret := add(value, 1)\n }\n function abi_encode_bytes_calldata(start, length, pos) -> end\n {\n mstore(pos, length)\n calldatacopy(add(pos, 0x20), start, length)\n mstore(add(add(pos, length), 0x20), 0)\n end := add(add(pos, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 0x20)\n }\n function abi_encode_tuple_t_address_t_uint256_t_bytes_calldata_ptr__to_t_address_t_uint256_t_bytes_memory_ptr__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), 96)\n tail := abi_encode_bytes_calldata(value2, value3, add(headStart, 96))\n }\n function abi_decode_tuple_t_bool_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, iszero(iszero(value)))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_address_t_address_t_uint256_t_bytes_calldata_ptr__to_t_address_t_address_t_uint256_t_bytes_memory_ptr__fromStack_reversed(headStart, value4, value3, value2, value1, value0) -> tail\n {\n let _1 := 0xffffffffffffffffffffffffffffffffffffffff\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), and(value1, _1))\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), 128)\n tail := abi_encode_bytes_calldata(value3, value4, add(headStart, 128))\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_t_bytes32_t_address_t_address_t_uint256_t_uint256_t_uint256__to_t_bytes32_t_address_t_address_t_uint256_t_uint256_t_uint256__fromStack_reversed(headStart, value5, value4, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 192)\n mstore(headStart, value0)\n let _1 := 0xffffffffffffffffffffffffffffffffffffffff\n mstore(add(headStart, 32), and(value1, _1))\n mstore(add(headStart, 64), and(value2, _1))\n mstore(add(headStart, 96), value3)\n mstore(add(headStart, 128), value4)\n mstore(add(headStart, 160), value5)\n }\n function abi_encode_tuple_packed_t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541_t_bytes32_t_bytes32__to_t_string_memory_ptr_t_bytes32_t_bytes32__nonPadded_inplace_fromStack_reversed(pos, value1, value0) -> end\n {\n mstore(pos, 0x1901000000000000000000000000000000000000000000000000000000000000)\n mstore(add(pos, 2), value0)\n mstore(add(pos, 34), value1)\n end := add(pos, 66)\n }\n function abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 128)\n mstore(headStart, value0)\n mstore(add(headStart, 32), and(value1, 0xff))\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n sum := add(x, y)\n if gt(x, sum) { panic_error_0x11() }\n }\n function checked_sub_t_uint256(x, y) -> diff\n {\n diff := sub(x, y)\n if gt(diff, x) { panic_error_0x11() }\n }\n function abi_encode_tuple_t_bytes32_t_bytes32_t_uint256_t_address__to_t_bytes32_t_bytes32_t_uint256_t_address__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 128)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), and(value3, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n}", + "id": 17, + "language": "Yul", + "name": "#utility.yul" + } + ], + "immutableReferences": { + "1252": [ + { + "length": 32, + "start": 4058 + } + ], + "1254": [ + { + "length": 32, + "start": 4144 + } + ], + "1256": [ + { + "length": 32, + "start": 1945 + }, + { + "length": 32, + "start": 4101 + } + ] + }, + "linkReferences": {}, + "object": "60806040526004361061013d575f3560e01c806370a08231116100bb578063c1d34b8911610071578063d505accf11610057578063d505accf146103d1578063dd62ed3e146103f2578063e7fcb06514610411575f80fd5b8063c1d34b8914610393578063cae9ca51146103b2575f80fd5b806384b0196e116100a157806384b0196e1461030557806395d89b411461032c578063a9059cbb14610374575f80fd5b806370a08231146102835780637ecebe00146102c4575f80fd5b806323b872dd116101105780633644e515116100f65780633644e515146102315780634000aea01461024557806365520efa14610264575f80fd5b806323b872dd146101f7578063313ce56714610216575f80fd5b806306fdde0314610141578063095ea7b3146101985780630e02df54146101c757806318160ddd146101da575b5f80fd5b34801561014c575f80fd5b5060408051808201909152600481527f47656d730000000000000000000000000000000000000000000000000000000060208201525b60405161018f91906111b3565b60405180910390f35b3480156101a3575f80fd5b506101b76101b23660046111f0565b610424565b604051901515815260200161018f565b6101b76101d5366004611257565b61043a565b3480156101e5575f80fd5b505f545b60405190815260200161018f565b348015610202575f80fd5b506101b761021136600461133b565b6105c7565b348015610221575f80fd5b506040516012815260200161018f565b34801561023c575f80fd5b506101e96105dd565b348015610250575f80fd5b506101b761025f3660046113be565b6105e6565b34801561026f575f80fd5b506101b761027e366004611416565b610693565b34801561028e575f80fd5b506101e961029d366004611484565b73ffffffffffffffffffffffffffffffffffffffff165f9081526001602052604090205490565b3480156102cf575f80fd5b506101e96102de366004611484565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b348015610310575f80fd5b50610319610743565b60405161018f979695949392919061149f565b348015610337575f80fd5b506101826040518060400160405280600381526020017f47454d000000000000000000000000000000000000000000000000000000000081525081565b34801561037f575f80fd5b506101b761038e3660046111f0565b6107c3565b34801561039e575f80fd5b506101b76103ad366004611416565b6107cf565b3480156103bd575f80fd5b506101b76103cc3660046113be565b610833565b3480156103dc575f80fd5b506103f06103eb36600461155c565b610895565b005b3480156103fd575f80fd5b506101e961040c3660046115cd565b610b58565b6101b761041f3660046111f0565b610bd5565b5f610430338484610c20565b5060015b92915050565b5f808351346104499190611631565b90508351816104589190611669565b34146104ac573484518261046c9190611669565b6040517f1f89f671000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044015b60405180910390fd5b5f8451846104ba9190611631565b90508451816104c99190611669565b841461051857838551826104dd9190611669565b6040517fe93890a2000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016104a3565b5f5b85518110156105b6576105473387838151811061053957610539611680565b602002602001015184610cfd565b85818151811061055957610559611680565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166108fc8490811502906040515f60405180830381858888f193505050501580156105a3573d5f803e3d5ffd5b50806105ae816116ad565b91505061051a565b50600195945050505050565b905090565b5f6105d3848484610ead565b5060019392505050565b5f6105c2610fd6565b5f6105f2338686610cfd565b6040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063a4c0ed369061064a90339088908890889060040161172b565b6020604051808303815f875af1158015610666573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061068a9190611760565b95945050505050565b5f61069f338686610cfd565b6040517f2eedcb7100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861690632eedcb71906106f99033908a9089908990899060040161177f565b6020604051808303815f875af1158015610715573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107399190611760565b9695505050505050565b7f0d000000000000000000000000000000000000000000000000000000000000006060805f808083610773611056565b60408051602080820183525f8083528351818152918201909352999a92999098504697507f0000000000000000000000000000000000000000000000000000000000000000965090945092509050565b5f610430338484610cfd565b5f6107db868686610ead565b6040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063a4c0ed36906106f990899088908890889060040161172b565b5f61083f338686610c20565b6040517eba451f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169062ba451f9061064a90339088908890889060040161172b565b73ffffffffffffffffffffffffffffffffffffffff87166108e4576040517f8e4c8aa60000000000000000000000000000000000000000000000000000000081525f60048201526024016104a3565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260036020526040812054906109126105dd565b604080517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9602082015273ffffffffffffffffffffffffffffffffffffffff808d1692820192909252908a1660608201526080810189905260a0810184905260c0810188905260e001604051602081830303815290604052805190602001206040516020016109d39291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f845290830180835281905260ff8816918301919091526060820186905260808201859052915060019060a0016020604051602081039080840390855afa158015610a56573d5f803e3d5ffd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614610ac4576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8515801590610ad257508542115b15610b12576040517fdd6b219a000000000000000000000000000000000000000000000000000000008152426004820152602481018790526044016104a3565b610b1d8260016117c9565b73ffffffffffffffffffffffffffffffffffffffff8a165f90815260036020526040902055610b4d898989610c20565b505050505050505050565b5f3073ffffffffffffffffffffffffffffffffffffffff841603610b9d57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610434565b5073ffffffffffffffffffffffffffffffffffffffff9182165f90815260026020908152604080832093909416825291909152205490565b5f610be1338484610cfd565b60405173ffffffffffffffffffffffffffffffffffffffff8416903480156108fc02915f818181858888f193505050501580156105d3573d5f803e3d5ffd5b73ffffffffffffffffffffffffffffffffffffffff83161580610c57575073ffffffffffffffffffffffffffffffffffffffff8216155b15610c90576040517f8e4c8aa60000000000000000000000000000000000000000000000000000000081525f60048201526024016104a3565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff82161580610d35575073ffffffffffffffffffffffffffffffffffffffff821630145b15610d84576040517f8e4c8aa600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016104a3565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526001602052604090205481811015610ded576040517f6584853f00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016104a3565b610df782826117dc565b73ffffffffffffffffffffffffffffffffffffffff8086165f908152600160205260408082209390935590851681529081208054849290610e399084906117c9565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e9f91815260200190565b60405180910390a350505050565b3373ffffffffffffffffffffffffffffffffffffffff841614801590610ee9575073ffffffffffffffffffffffffffffffffffffffff83163014155b15610fc65773ffffffffffffffffffffffffffffffffffffffff83165f9081526002602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610fc45781811015610f89576040517f95fcd25400000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016104a3565b610f9382826117dc565b73ffffffffffffffffffffffffffffffffffffffff85165f9081526002602090815260408083203384529091529020555b505b610fd1838383610cfd565b505050565b5f467f0000000000000000000000000000000000000000000000000000000000000000811461102e57611029817f0000000000000000000000000000000000000000000000000000000000000000611092565b611050565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b60606105c260408051808201909152600481527f47656d7300000000000000000000000000000000000000000000000000000000602082015290565b5f7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666110ee60408051808201909152600481527f47656d7300000000000000000000000000000000000000000000000000000000602082015290565b8051602091820120604051611134939287918791019384526020840192909252604083015273ffffffffffffffffffffffffffffffffffffffff16606082015260800190565b60405160208183030381529060405280519060200120905092915050565b5f81518084525f5b818110156111765760208185018101518683018201520161115a565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6111c56020830184611152565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146111ed575f80fd5b50565b5f8060408385031215611201575f80fd5b823561120c816111cc565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b8035611252816111cc565b919050565b5f8060408385031215611268575f80fd5b823567ffffffffffffffff8082111561127f575f80fd5b818501915085601f830112611292575f80fd5b81356020828211156112a6576112a661121a565b8160051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811086821117156112e9576112e961121a565b604052928352818301935084810182019289841115611306575f80fd5b948201945b8386101561132b5761131c86611247565b8552948201949382019361130b565b9997909101359750505050505050565b5f805f6060848603121561134d575f80fd5b8335611358816111cc565b92506020840135611368816111cc565b929592945050506040919091013590565b5f8083601f840112611389575f80fd5b50813567ffffffffffffffff8111156113a0575f80fd5b6020830191508360208285010111156113b7575f80fd5b9250929050565b5f805f80606085870312156113d1575f80fd5b84356113dc816111cc565b935060208501359250604085013567ffffffffffffffff8111156113fe575f80fd5b61140a87828801611379565b95989497509550505050565b5f805f805f6080868803121561142a575f80fd5b8535611435816111cc565b94506020860135611445816111cc565b935060408601359250606086013567ffffffffffffffff811115611467575f80fd5b61147388828901611379565b969995985093965092949392505050565b5f60208284031215611494575f80fd5b81356111c5816111cc565b7fff00000000000000000000000000000000000000000000000000000000000000881681525f602060e0818401526114da60e084018a611152565b83810360408501526114ec818a611152565b6060850189905273ffffffffffffffffffffffffffffffffffffffff8816608086015260a0850187905284810360c086015285518082528387019250908301905f5b8181101561154a5783518352928401929184019160010161152e565b50909c9b505050505050505050505050565b5f805f805f805f60e0888a031215611572575f80fd5b873561157d816111cc565b9650602088013561158d816111cc565b95506040880135945060608801359350608088013560ff811681146115b0575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156115de575f80fd5b82356115e9816111cc565b915060208301356115f9816111cc565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f82611664577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b808202811582820484141761043457610434611604565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036116dd576116dd611604565b5060010190565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6107396060830184866116e4565b5f60208284031215611770575f80fd5b815180151581146111c5575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff8088168352808716602084015250846040830152608060608301526117be6080830184866116e4565b979650505050505050565b8082018082111561043457610434611604565b818103818111156104345761043461160456fea2646970667358221220176888c253ea62d60e8b85116aad0a658dd29f3cc3d4c183633dc0d94e9023d564736f6c63430008140033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x13D JUMPI PUSH0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x70A08231 GT PUSH2 0xBB JUMPI DUP1 PUSH4 0xC1D34B89 GT PUSH2 0x71 JUMPI DUP1 PUSH4 0xD505ACCF GT PUSH2 0x57 JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0x3D1 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x3F2 JUMPI DUP1 PUSH4 0xE7FCB065 EQ PUSH2 0x411 JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xC1D34B89 EQ PUSH2 0x393 JUMPI DUP1 PUSH4 0xCAE9CA51 EQ PUSH2 0x3B2 JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x84B0196E GT PUSH2 0xA1 JUMPI DUP1 PUSH4 0x84B0196E EQ PUSH2 0x305 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x32C JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x374 JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x70A08231 EQ PUSH2 0x283 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x2C4 JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x23B872DD GT PUSH2 0x110 JUMPI DUP1 PUSH4 0x3644E515 GT PUSH2 0xF6 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x231 JUMPI DUP1 PUSH4 0x4000AEA0 EQ PUSH2 0x245 JUMPI DUP1 PUSH4 0x65520EFA EQ PUSH2 0x264 JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1F7 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x216 JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x141 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x198 JUMPI DUP1 PUSH4 0xE02DF54 EQ PUSH2 0x1C7 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x1DA JUMPI JUMPDEST PUSH0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x14C JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH32 0x47656D7300000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x18F SWAP2 SWAP1 PUSH2 0x11B3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A3 JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B7 PUSH2 0x1B2 CALLDATASIZE PUSH1 0x4 PUSH2 0x11F0 JUMP JUMPDEST PUSH2 0x424 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x18F JUMP JUMPDEST PUSH2 0x1B7 PUSH2 0x1D5 CALLDATASIZE PUSH1 0x4 PUSH2 0x1257 JUMP JUMPDEST PUSH2 0x43A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E5 JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH0 SLOAD JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x18F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x202 JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B7 PUSH2 0x211 CALLDATASIZE PUSH1 0x4 PUSH2 0x133B JUMP JUMPDEST PUSH2 0x5C7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x221 JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x12 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x18F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x23C JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E9 PUSH2 0x5DD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x250 JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B7 PUSH2 0x25F CALLDATASIZE PUSH1 0x4 PUSH2 0x13BE JUMP JUMPDEST PUSH2 0x5E6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x26F JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B7 PUSH2 0x27E CALLDATASIZE PUSH1 0x4 PUSH2 0x1416 JUMP JUMPDEST PUSH2 0x693 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x28E JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E9 PUSH2 0x29D CALLDATASIZE PUSH1 0x4 PUSH2 0x1484 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2CF JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E9 PUSH2 0x2DE CALLDATASIZE PUSH1 0x4 PUSH2 0x1484 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x310 JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH2 0x319 PUSH2 0x743 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x18F SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x149F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x337 JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH2 0x182 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x3 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x47454D0000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x37F JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B7 PUSH2 0x38E CALLDATASIZE PUSH1 0x4 PUSH2 0x11F0 JUMP JUMPDEST PUSH2 0x7C3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x39E JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B7 PUSH2 0x3AD CALLDATASIZE PUSH1 0x4 PUSH2 0x1416 JUMP JUMPDEST PUSH2 0x7CF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3BD JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B7 PUSH2 0x3CC CALLDATASIZE PUSH1 0x4 PUSH2 0x13BE JUMP JUMPDEST PUSH2 0x833 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3DC JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH2 0x3F0 PUSH2 0x3EB CALLDATASIZE PUSH1 0x4 PUSH2 0x155C JUMP JUMPDEST PUSH2 0x895 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3FD JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E9 PUSH2 0x40C CALLDATASIZE PUSH1 0x4 PUSH2 0x15CD JUMP JUMPDEST PUSH2 0xB58 JUMP JUMPDEST PUSH2 0x1B7 PUSH2 0x41F CALLDATASIZE PUSH1 0x4 PUSH2 0x11F0 JUMP JUMPDEST PUSH2 0xBD5 JUMP JUMPDEST PUSH0 PUSH2 0x430 CALLER DUP5 DUP5 PUSH2 0xC20 JUMP JUMPDEST POP PUSH1 0x1 JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH0 DUP1 DUP4 MLOAD CALLVALUE PUSH2 0x449 SWAP2 SWAP1 PUSH2 0x1631 JUMP JUMPDEST SWAP1 POP DUP4 MLOAD DUP2 PUSH2 0x458 SWAP2 SWAP1 PUSH2 0x1669 JUMP JUMPDEST CALLVALUE EQ PUSH2 0x4AC JUMPI CALLVALUE DUP5 MLOAD DUP3 PUSH2 0x46C SWAP2 SWAP1 PUSH2 0x1669 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x1F89F67100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH0 DUP5 MLOAD DUP5 PUSH2 0x4BA SWAP2 SWAP1 PUSH2 0x1631 JUMP JUMPDEST SWAP1 POP DUP5 MLOAD DUP2 PUSH2 0x4C9 SWAP2 SWAP1 PUSH2 0x1669 JUMP JUMPDEST DUP5 EQ PUSH2 0x518 JUMPI DUP4 DUP6 MLOAD DUP3 PUSH2 0x4DD SWAP2 SWAP1 PUSH2 0x1669 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xE93890A200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 ADD PUSH2 0x4A3 JUMP JUMPDEST PUSH0 JUMPDEST DUP6 MLOAD DUP2 LT ISZERO PUSH2 0x5B6 JUMPI PUSH2 0x547 CALLER DUP8 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x539 JUMPI PUSH2 0x539 PUSH2 0x1680 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP5 PUSH2 0xCFD JUMP JUMPDEST DUP6 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0x559 JUMPI PUSH2 0x559 PUSH2 0x1680 JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x8FC DUP5 SWAP1 DUP2 ISZERO MUL SWAP1 PUSH1 0x40 MLOAD PUSH0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x5A3 JUMPI RETURNDATASIZE PUSH0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH0 REVERT JUMPDEST POP DUP1 PUSH2 0x5AE DUP2 PUSH2 0x16AD JUMP JUMPDEST SWAP2 POP POP PUSH2 0x51A JUMP JUMPDEST POP PUSH1 0x1 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH0 PUSH2 0x5D3 DUP5 DUP5 DUP5 PUSH2 0xEAD JUMP JUMPDEST POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH0 PUSH2 0x5C2 PUSH2 0xFD6 JUMP JUMPDEST PUSH0 PUSH2 0x5F2 CALLER DUP7 DUP7 PUSH2 0xCFD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA4C0ED3600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP1 PUSH4 0xA4C0ED36 SWAP1 PUSH2 0x64A SWAP1 CALLER SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x172B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x666 JUMPI RETURNDATASIZE PUSH0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x68A SWAP2 SWAP1 PUSH2 0x1760 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH0 PUSH2 0x69F CALLER DUP7 DUP7 PUSH2 0xCFD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x2EEDCB7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP1 PUSH4 0x2EEDCB71 SWAP1 PUSH2 0x6F9 SWAP1 CALLER SWAP1 DUP11 SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x177F JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x715 JUMPI RETURNDATASIZE PUSH0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x739 SWAP2 SWAP1 PUSH2 0x1760 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH32 0xD00000000000000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP1 PUSH0 DUP1 DUP1 DUP4 PUSH2 0x773 PUSH2 0x1056 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 ADD DUP4 MSTORE PUSH0 DUP1 DUP4 MSTORE DUP4 MLOAD DUP2 DUP2 MSTORE SWAP2 DUP3 ADD SWAP1 SWAP4 MSTORE SWAP10 SWAP11 SWAP3 SWAP10 SWAP1 SWAP9 POP CHAINID SWAP8 POP PUSH32 0x0 SWAP7 POP SWAP1 SWAP5 POP SWAP3 POP SWAP1 POP JUMP JUMPDEST PUSH0 PUSH2 0x430 CALLER DUP5 DUP5 PUSH2 0xCFD JUMP JUMPDEST PUSH0 PUSH2 0x7DB DUP7 DUP7 DUP7 PUSH2 0xEAD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA4C0ED3600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP1 PUSH4 0xA4C0ED36 SWAP1 PUSH2 0x6F9 SWAP1 DUP10 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x172B JUMP JUMPDEST PUSH0 PUSH2 0x83F CALLER DUP7 DUP7 PUSH2 0xC20 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH31 0xBA451F00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP1 PUSH3 0xBA451F SWAP1 PUSH2 0x64A SWAP1 CALLER SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x172B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH2 0x8E4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8E4C8AA600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH0 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 ADD PUSH2 0x4A3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP1 PUSH2 0x912 PUSH2 0x5DD JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 PUSH1 0x20 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP14 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 DUP11 AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 DUP2 ADD DUP10 SWAP1 MSTORE PUSH1 0xA0 DUP2 ADD DUP5 SWAP1 MSTORE PUSH1 0xC0 DUP2 ADD DUP9 SWAP1 MSTORE PUSH1 0xE0 ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x9D3 SWAP3 SWAP2 SWAP1 PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x2 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x22 DUP3 ADD MSTORE PUSH1 0x42 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE DUP3 DUP3 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD KECCAK256 PUSH0 DUP5 MSTORE SWAP1 DUP4 ADD DUP1 DUP4 MSTORE DUP2 SWAP1 MSTORE PUSH1 0xFF DUP9 AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP3 ADD DUP7 SWAP1 MSTORE PUSH1 0x80 DUP3 ADD DUP6 SWAP1 MSTORE SWAP2 POP PUSH1 0x1 SWAP1 PUSH1 0xA0 ADD PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xA56 JUMPI RETURNDATASIZE PUSH0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xAC4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8BAA579F00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP6 ISZERO DUP1 ISZERO SWAP1 PUSH2 0xAD2 JUMPI POP DUP6 TIMESTAMP GT JUMPDEST ISZERO PUSH2 0xB12 JUMPI PUSH1 0x40 MLOAD PUSH32 0xDD6B219A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE TIMESTAMP PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP8 SWAP1 MSTORE PUSH1 0x44 ADD PUSH2 0x4A3 JUMP JUMPDEST PUSH2 0xB1D DUP3 PUSH1 0x1 PUSH2 0x17C9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH2 0xB4D DUP10 DUP10 DUP10 PUSH2 0xC20 JUMP JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SUB PUSH2 0xB9D JUMPI POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x434 JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH0 PUSH2 0xBE1 CALLER DUP5 DUP5 PUSH2 0xCFD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 CALLVALUE DUP1 ISZERO PUSH2 0x8FC MUL SWAP2 PUSH0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x5D3 JUMPI RETURNDATASIZE PUSH0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO DUP1 PUSH2 0xC57 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO JUMPDEST ISZERO PUSH2 0xC90 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8E4C8AA600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH0 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 ADD PUSH2 0x4A3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE SWAP1 MLOAD DUP5 DUP2 MSTORE PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO DUP1 PUSH2 0xD35 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ADDRESS EQ JUMPDEST ISZERO PUSH2 0xD84 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8E4C8AA600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 ADD PUSH2 0x4A3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 DUP2 LT ISZERO PUSH2 0xDED JUMPI PUSH1 0x40 MLOAD PUSH32 0x6584853F00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x24 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x44 ADD PUSH2 0x4A3 JUMP JUMPDEST PUSH2 0xDF7 DUP3 DUP3 PUSH2 0x17DC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP6 AND DUP2 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP5 SWAP3 SWAP1 PUSH2 0xE39 SWAP1 DUP5 SWAP1 PUSH2 0x17C9 JUMP JUMPDEST SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD PUSH2 0xE9F SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND EQ DUP1 ISZERO SWAP1 PUSH2 0xEE9 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ADDRESS EQ ISZERO JUMPDEST ISZERO PUSH2 0xFC6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 EQ PUSH2 0xFC4 JUMPI DUP2 DUP2 LT ISZERO PUSH2 0xF89 JUMPI PUSH1 0x40 MLOAD PUSH32 0x95FCD25400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x24 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x44 ADD PUSH2 0x4A3 JUMP JUMPDEST PUSH2 0xF93 DUP3 DUP3 PUSH2 0x17DC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SSTORE JUMPDEST POP JUMPDEST PUSH2 0xFD1 DUP4 DUP4 DUP4 PUSH2 0xCFD JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH0 CHAINID PUSH32 0x0 DUP2 EQ PUSH2 0x102E JUMPI PUSH2 0x1029 DUP2 PUSH32 0x0 PUSH2 0x1092 JUMP JUMPDEST PUSH2 0x1050 JUMP JUMPDEST PUSH32 0x0 JUMPDEST SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x5C2 PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH32 0x47656D7300000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH0 PUSH32 0x8CAD95687BA82C2CE50E74F7B754645E5117C3A5BEC8151C0726D5857980A866 PUSH2 0x10EE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH32 0x47656D7300000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH2 0x1134 SWAP4 SWAP3 DUP8 SWAP2 DUP8 SWAP2 ADD SWAP4 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1176 JUMPI PUSH1 0x20 DUP2 DUP6 ADD DUP2 ADD MLOAD DUP7 DUP4 ADD DUP3 ADD MSTORE ADD PUSH2 0x115A JUMP JUMPDEST POP PUSH0 PUSH1 0x20 DUP3 DUP7 ADD ADD MSTORE PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP4 ADD AND DUP6 ADD ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH0 PUSH2 0x11C5 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1152 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x11ED JUMPI PUSH0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1201 JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x120C DUP2 PUSH2 0x11CC JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH0 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x1252 DUP2 PUSH2 0x11CC JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1268 JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x127F JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1292 JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0x20 DUP3 DUP3 GT ISZERO PUSH2 0x12A6 JUMPI PUSH2 0x12A6 PUSH2 0x121A JUMP JUMPDEST DUP2 PUSH1 0x5 SHL PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x3F DUP4 ADD AND DUP2 ADD DUP2 DUP2 LT DUP7 DUP3 GT OR ISZERO PUSH2 0x12E9 JUMPI PUSH2 0x12E9 PUSH2 0x121A JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP3 DUP4 MSTORE DUP2 DUP4 ADD SWAP4 POP DUP5 DUP2 ADD DUP3 ADD SWAP3 DUP10 DUP5 GT ISZERO PUSH2 0x1306 JUMPI PUSH0 DUP1 REVERT JUMPDEST SWAP5 DUP3 ADD SWAP5 JUMPDEST DUP4 DUP7 LT ISZERO PUSH2 0x132B JUMPI PUSH2 0x131C DUP7 PUSH2 0x1247 JUMP JUMPDEST DUP6 MSTORE SWAP5 DUP3 ADD SWAP5 SWAP4 DUP3 ADD SWAP4 PUSH2 0x130B JUMP JUMPDEST SWAP10 SWAP8 SWAP1 SWAP2 ADD CALLDATALOAD SWAP8 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH0 DUP1 PUSH0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x134D JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x1358 DUP2 PUSH2 0x11CC JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x1368 DUP2 PUSH2 0x11CC JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x1389 JUMPI PUSH0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x13A0 JUMPI PUSH0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x13B7 JUMPI PUSH0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH0 DUP1 PUSH0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x13D1 JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x13DC DUP2 PUSH2 0x11CC JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x13FE JUMPI PUSH0 DUP1 REVERT JUMPDEST PUSH2 0x140A DUP8 DUP3 DUP9 ADD PUSH2 0x1379 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH0 DUP1 PUSH0 DUP1 PUSH0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x142A JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x1435 DUP2 PUSH2 0x11CC JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x1445 DUP2 PUSH2 0x11CC JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1467 JUMPI PUSH0 DUP1 REVERT JUMPDEST PUSH2 0x1473 DUP9 DUP3 DUP10 ADD PUSH2 0x1379 JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1494 JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x11C5 DUP2 PUSH2 0x11CC JUMP JUMPDEST PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 DUP9 AND DUP2 MSTORE PUSH0 PUSH1 0x20 PUSH1 0xE0 DUP2 DUP5 ADD MSTORE PUSH2 0x14DA PUSH1 0xE0 DUP5 ADD DUP11 PUSH2 0x1152 JUMP JUMPDEST DUP4 DUP2 SUB PUSH1 0x40 DUP6 ADD MSTORE PUSH2 0x14EC DUP2 DUP11 PUSH2 0x1152 JUMP JUMPDEST PUSH1 0x60 DUP6 ADD DUP10 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x80 DUP7 ADD MSTORE PUSH1 0xA0 DUP6 ADD DUP8 SWAP1 MSTORE DUP5 DUP2 SUB PUSH1 0xC0 DUP7 ADD MSTORE DUP6 MLOAD DUP1 DUP3 MSTORE DUP4 DUP8 ADD SWAP3 POP SWAP1 DUP4 ADD SWAP1 PUSH0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x154A JUMPI DUP4 MLOAD DUP4 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x152E JUMP JUMPDEST POP SWAP1 SWAP13 SWAP12 POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH0 DUP1 PUSH0 DUP1 PUSH0 DUP1 PUSH0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x1572 JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP8 CALLDATALOAD PUSH2 0x157D DUP2 PUSH2 0x11CC JUMP JUMPDEST SWAP7 POP PUSH1 0x20 DUP9 ADD CALLDATALOAD PUSH2 0x158D DUP2 PUSH2 0x11CC JUMP JUMPDEST SWAP6 POP PUSH1 0x40 DUP9 ADD CALLDATALOAD SWAP5 POP PUSH1 0x60 DUP9 ADD CALLDATALOAD SWAP4 POP PUSH1 0x80 DUP9 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x15B0 JUMPI PUSH0 DUP1 REVERT JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 SWAP3 SWAP6 SWAP5 PUSH1 0xA0 DUP5 ADD CALLDATALOAD SWAP5 POP PUSH1 0xC0 SWAP1 SWAP4 ADD CALLDATALOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x15DE JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x15E9 DUP2 PUSH2 0x11CC JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x15F9 DUP2 PUSH2 0x11CC JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH0 REVERT JUMPDEST PUSH0 DUP3 PUSH2 0x1664 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH0 REVERT JUMPDEST POP DIV SWAP1 JUMP JUMPDEST DUP1 DUP3 MUL DUP2 ISZERO DUP3 DUP3 DIV DUP5 EQ OR PUSH2 0x434 JUMPI PUSH2 0x434 PUSH2 0x1604 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH0 REVERT JUMPDEST PUSH0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x16DD JUMPI PUSH2 0x16DD PUSH2 0x1604 JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST DUP2 DUP4 MSTORE DUP2 DUP2 PUSH1 0x20 DUP6 ADD CALLDATACOPY POP PUSH0 PUSH1 0x20 DUP3 DUP5 ADD ADD MSTORE PUSH0 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND DUP5 ADD ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP2 MSTORE DUP4 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x60 PUSH1 0x40 DUP3 ADD MSTORE PUSH0 PUSH2 0x739 PUSH1 0x60 DUP4 ADD DUP5 DUP7 PUSH2 0x16E4 JUMP JUMPDEST PUSH0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1770 JUMPI PUSH0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x11C5 JUMPI PUSH0 DUP1 REVERT JUMPDEST PUSH0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP9 AND DUP4 MSTORE DUP1 DUP8 AND PUSH1 0x20 DUP5 ADD MSTORE POP DUP5 PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x17BE PUSH1 0x80 DUP4 ADD DUP5 DUP7 PUSH2 0x16E4 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST DUP1 DUP3 ADD DUP1 DUP3 GT ISZERO PUSH2 0x434 JUMPI PUSH2 0x434 PUSH2 0x1604 JUMP JUMPDEST DUP2 DUP2 SUB DUP2 DUP2 GT ISZERO PUSH2 0x434 JUMPI PUSH2 0x434 PUSH2 0x1604 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 OR PUSH9 0x88C253EA62D60E8B85 GT PUSH11 0xAD0A658DD29F3CC3D4C183 PUSH4 0x3DC0D94E SWAP1 0x23 0xD5 PUSH5 0x736F6C6343 STOP ADDMOD EQ STOP CALLER ", + "sourceMap": "355:314:16:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;570:97;;;;;;;;;;-1:-1:-1;650:13:16;;;;;;;;;;;;;;;;;570:97;;;;;;;:::i;:::-;;;;;;;;3232:146:3;;;;;;;;;;-1:-1:-1;3232:146:3;;;;;:::i;:::-;;:::i;:::-;;;1370:14:17;;1363:22;1345:41;;1333:2;1318:18;3232:146:3;1205:187:17;1617:546:3;;;;;;:::i;:::-;;:::i;558:102::-;;;;;;;;;;-1:-1:-1;613:7:3;3996:12;558:102;;;3150:25:17;;;3138:2;3123:18;558:102:3;3004:177:17;3045:160:3;;;;;;;;;;-1:-1:-1;3045:160:3;;;;;:::i;:::-;;:::i;1098:91::-;;;;;;;;;;-1:-1:-1;1098:91:3;;1182:2;3789:36:17;;3777:2;3762:18;1098:91:3;3647:184:17;378:115:1;;;;;;;;;;;;;:::i;2202:222:3:-;;;;;;;;;;-1:-1:-1;2202:222:3;;;;;:::i;:::-;;:::i;2736:282::-;;;;;;;;;;-1:-1:-1;2736:282:3;;;;;:::i;:::-;;:::i;687:106::-;;;;;;;;;;-1:-1:-1;687:106:3;;;;;:::i;:::-;773:16;;753:7;773:16;;;:9;:16;;;;;;;687:106;638:92:0;;;;;;;;;;-1:-1:-1;638:92:0;;;;;:::i;:::-;712:14;;692:7;712:14;;;:7;:14;;;;;;;638:92;789:428:12;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;529:37:16:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1216:135:3;;;;;;;;;;-1:-1:-1;1216:135:3;;;;;:::i;:::-;;:::i;2463:234::-;;;;;;;;;;-1:-1:-1;2463:234:3;;;;;:::i;:::-;;:::i;3417:238::-;;;;;;;;;;-1:-1:-1;3417:238:3;;;;;:::i;:::-;;:::i;920:718:0:-;;;;;;;;;;-1:-1:-1;920:718:0;;;;;:::i;:::-;;:::i;:::-;;820:251:3;;;;;;;;;;-1:-1:-1;820:251:3;;;;;:::i;:::-;;:::i;1394:180::-;;;;;;:::i;:::-;;:::i;3232:146::-;3309:4;3319:40;3331:10;3343:7;3352:6;3319:11;:40::i;:::-;-1:-1:-1;3370:4:3;3232:146;;;;;:::o;1617:546::-;1726:4;1736:11;1762:3;:10;1750:9;:22;;;;:::i;:::-;1736:36;;1799:3;:10;1793:3;:16;;;;:::i;:::-;1780:9;:29;1776:96;;1839:9;1856:3;:10;1850:3;:16;;;;:::i;:::-;1823:44;;;;;;;;9708:25:17;;;;9749:18;;;9742:34;9681:18;;1823:44:3;;;;;;;;1776:96;1875:14;1906:3;:10;1892:11;:24;;;;:::i;:::-;1875:41;;1948:3;:10;1939:6;:19;;;;:::i;:::-;1924:11;:34;1920:109;;1991:11;2013:3;:10;2004:6;:19;;;;:::i;:::-;1972:52;;;;;;;;9708:25:17;;;;9749:18;;;9742:34;9681:18;;1972:52:3;9534:248:17;1920:109:3;2037:9;2032:113;2056:3;:10;2052:1;:14;2032:113;;;2078:37;2088:10;2100:3;2104:1;2100:6;;;;;;;;:::i;:::-;;;;;;;2108;2078:9;:37::i;:::-;2120:3;2124:1;2120:6;;;;;;;;:::i;:::-;;;;;;;:15;;:20;2136:3;2120:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2068:3:3;;;;:::i;:::-;;;;2032:113;;;-1:-1:-1;2155:4:3;;1617:546;-1:-1:-1;;;;;1617:546:3:o;633:23::-;626:30;;558:102;:::o;3045:160::-;3145:4;3155:31;3169:4;3175:2;3179:6;3155:13;:31::i;:::-;-1:-1:-1;3197:4:3;3045:160;;;;;:::o;378:115:1:-;444:7;464:25;:23;:25::i;2202:222:3:-;2303:4;2313:33;2323:10;2335:2;2339:6;2313:9;:33::i;:::-;2357:63;;;;;:37;;;;;;:63;;2395:10;;2407:6;;2415:4;;;;2357:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2350:70;2202:222;-1:-1:-1;;;;;2202:222:3:o;2736:282::-;2867:4;2877:33;2887:10;2899:2;2903:6;2877:9;:33::i;:::-;2921:93;;;;;:55;;;;;;:93;;2977:10;;2989;;3001:6;;3009:4;;;;2921:93;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2914:100;2736:282;-1:-1:-1;;;;;;2736:282:3:o;789:428:12:-;1038:13;885:18;;867:13;;;885:18;1062:7;:5;:7::i;:::-;1073:12;;;;;;;;;-1:-1:-1;1073:12:12;;;1197:16;;;;;;;;;;;789:428;;1055:14;;1073:12;;-1:-1:-1;1114:9:12;;-1:-1:-1;1150:18:12;;-1:-1:-1;;;;1197:16:12;-1:-1:-1;789:428:12;-1:-1:-1;789:428:12:o;1216:135:3:-;1289:4;1299:33;1309:10;1321:2;1325:6;1299:9;:33::i;2463:234::-;2584:4;2594:31;2608:4;2614:2;2618:6;2594:13;:31::i;:::-;2636:57;;;;;:37;;;;;;:57;;2674:4;;2680:6;;2688:4;;;;2636:57;;;:::i;3417:238::-;3522:4;3532:40;3544:10;3556:7;3565:6;3532:11;:40::i;:::-;3583:68;;;;;:42;;;;;;:68;;3626:10;;3638:6;;3646:4;;;;3583:68;;;:::i;920:718:0:-;1075:19;;;1071:68;;1108:26;;;;;1131:1;1108:26;;;11917:74:17;11890:18;;1108:26:0;11771:226:17;1071:68:0;1166:14;;;1143:20;1166:14;;;:7;:14;;;;;;;1253:18;:16;:18::i;:::-;1287:74;;;465:95;1287:74;;;12289:25:17;12333:42;12411:15;;;12391:18;;;12384:43;;;;12463:15;;;12443:18;;;12436:43;12495:18;;;12488:34;;;12538:19;;;12531:35;;;12582:19;;;12575:35;;;12261:19;;1287:74:0;;;;;;;;;;;;1277:85;;;;;;1215:152;;;;;;;;12891:66:17;12879:79;;12983:1;12974:11;;12967:27;;;;13019:2;13010:12;;13003:28;13056:2;13047:12;;12621:444;1215:152:0;;;;;;;;;;;;;;1201:170;;1215:152;1201:170;;;;1388:26;;;;;;;;;13297:25:17;;;13370:4;13358:17;;13338:18;;;13331:45;;;;13392:18;;;13385:34;;;13435:18;;;13428:34;;;1201:170:0;-1:-1:-1;1388:26:0;;13269:19:17;;1388:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1379:35;;:5;:35;;;1375:76;;1428:18;;;;;;;;;;;;;;1375:76;1458:13;;;;;:43;;;1493:8;1475:15;:26;1458:43;1454:105;;;1515:39;;;;;1528:15;1515:39;;;9708:25:17;9749:18;;;9742:34;;;9681:18;;1515:39:0;9534:248:17;1454:105:0;1580:16;:12;1595:1;1580:16;:::i;:::-;1563:14;;;;;;;:7;:14;;;;;:33;1600:34;1571:5;1619:7;1628:5;1600:11;:34::i;:::-;1067:571;;920:718;;;;;;;:::o;820:251:3:-;903:7;937:4;920:22;;;;916:114;;-1:-1:-1;1008:17:3;1001:24;;916:114;-1:-1:-1;1040:18:3;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;820:251::o;1394:180::-;1486:4;1496:33;1506:10;1518:2;1522:6;1496:9;:33::i;:::-;1533:22;;:11;;;;1545:9;1533:22;;;;;;;;;1545:9;1533:11;:22;;;;;;;;;;;;;;;;;;;4015:277;4119:19;;;;;:44;;-1:-1:-1;4142:21:3;;;;4119:44;4115:93;;;4177:26;;;;;4200:1;4177:26;;;11917:74:17;11890:18;;4177:26:3;11771:226:17;4115:93:3;4211:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;4256:32;;3150:25:17;;;4256:32:3;;3123:18:17;4256:32:3;;;;;;;4015:277;;;:::o;4959:405::-;5046:16;;;;;:39;;-1:-1:-1;5066:19:3;;;5080:4;5066:19;5046:39;5042:80;;;5099:18;;;;;11947:42:17;11935:55;;5099:18:3;;;11917:74:17;11890:18;;5099::3;11771:226:17;5042:80:3;5150:15;;;5125:22;5150:15;;;:9;:15;;;;;;5173:23;;;5169:85;;;5210:39;;;;;;;;9708:25:17;;;9749:18;;;9742:34;;;9681:18;;5210:39:3;9534:248:17;5169:85:3;5275:23;5292:6;5275:14;:23;:::i;:::-;5257:15;;;;;;;;:9;:15;;;;;;:41;;;;5302:13;;;;;;;;:23;;5319:6;;5257:15;5302:23;;5319:6;;5302:23;:::i;:::-;;;;;;;;5349:2;5334:26;;5343:4;5334:26;;;5353:6;5334:26;;;;3150:25:17;;3138:2;3123:18;;3004:177;5334:26:3;;;;;;;;5038:326;4959:405;;;:::o;4295:661::-;4479:10;:18;;;;;;;:43;;-1:-1:-1;4501:21:3;;;4517:4;4501:21;;4479:43;4475:447;;;4556:17;;;4529:24;4556:17;;;:11;:17;;;;;;;;4574:10;4556:29;;;;;;;;4614:17;4594:37;;4590:328;;4773:6;4754:16;:25;4750:100;;;4795:48;;;;;;;;9708:25:17;;;9749:18;;;9742:34;;;9681:18;;4795:48:3;9534:248:17;4750:100:3;4887:25;4906:6;4887:16;:25;:::i;:::-;4855:17;;;;;;;:11;:17;;;;;;;;4873:10;4855:29;;;;;;;:57;4590:328;4524:398;4475:447;4925:27;4935:4;4941:2;4945:6;4925:9;:27::i;:::-;4295:661;;;:::o;1620:381:12:-;1678:7;1735:9;1885:18;1874:29;;:123;;1943:54;1969:7;1978:18;1943:25;:54::i;:::-;1874:123;;;1910:26;1874:123;1864:133;;;1620:381;:::o;1541:76::-;1581:13;1607:6;650:13:16;;;;;;;;;;;;;;;;;;570:97;2073:320:12;2174:7;2229:80;2332:6;650:13:16;;;;;;;;;;;;;;;;;;570:97;2332:6:12;2316:24;;;;;;;2212:172;;;;;2347:7;;2361:17;;2212:172;13967:25:17;;;14023:2;14008:18;;14001:34;;;;14066:2;14051:18;;14044:34;14126:42;14114:55;14109:2;14094:18;;14087:83;13954:3;13939:19;;13736:440;2212:172:12;;;;;;;;;;;;;2197:192;;;;;;2187:202;;2073:320;;;;:::o;14:482:17:-;56:3;94:5;88:12;121:6;116:3;109:19;146:1;156:162;170:6;167:1;164:13;156:162;;;232:4;288:13;;;284:22;;278:29;260:11;;;256:20;;249:59;185:12;156:162;;;160:3;363:1;356:4;347:6;342:3;338:16;334:27;327:38;485:4;415:66;410:2;402:6;398:15;394:88;389:3;385:98;381:109;374:116;;;14:482;;;;:::o;501:220::-;650:2;639:9;632:21;613:4;670:45;711:2;700:9;696:18;688:6;670:45;:::i;:::-;662:53;501:220;-1:-1:-1;;;501:220:17:o;726:154::-;812:42;805:5;801:54;794:5;791:65;781:93;;870:1;867;860:12;781:93;726:154;:::o;885:315::-;953:6;961;1014:2;1002:9;993:7;989:23;985:32;982:52;;;1030:1;1027;1020:12;982:52;1069:9;1056:23;1088:31;1113:5;1088:31;:::i;:::-;1138:5;1190:2;1175:18;;;;1162:32;;-1:-1:-1;;;885:315:17:o;1397:184::-;1449:77;1446:1;1439:88;1546:4;1543:1;1536:15;1570:4;1567:1;1560:15;1586:142;1662:20;;1691:31;1662:20;1691:31;:::i;:::-;1586:142;;;:::o;1733:1266::-;1834:6;1842;1895:2;1883:9;1874:7;1870:23;1866:32;1863:52;;;1911:1;1908;1901:12;1863:52;1951:9;1938:23;1980:18;2021:2;2013:6;2010:14;2007:34;;;2037:1;2034;2027:12;2007:34;2075:6;2064:9;2060:22;2050:32;;2120:7;2113:4;2109:2;2105:13;2101:27;2091:55;;2142:1;2139;2132:12;2091:55;2178:2;2165:16;2200:4;2223:2;2219;2216:10;2213:36;;;2229:18;;:::i;:::-;2275:2;2272:1;2268:10;2307:2;2301:9;2366:66;2361:2;2357;2353:11;2349:84;2341:6;2337:97;2484:6;2472:10;2469:22;2464:2;2452:10;2449:18;2446:46;2443:72;;;2495:18;;:::i;:::-;2531:2;2524:22;2581:18;;;2615:15;;;;-1:-1:-1;2657:11:17;;;2653:20;;;2685:19;;;2682:39;;;2717:1;2714;2707:12;2682:39;2741:11;;;;2761:156;2777:6;2772:3;2769:15;2761:156;;;2843:31;2870:3;2843:31;:::i;:::-;2831:44;;2794:12;;;;2895;;;;2761:156;;;2936:6;2974:18;;;;2961:32;;-1:-1:-1;;;;;;;1733:1266:17:o;3186:456::-;3263:6;3271;3279;3332:2;3320:9;3311:7;3307:23;3303:32;3300:52;;;3348:1;3345;3338:12;3300:52;3387:9;3374:23;3406:31;3431:5;3406:31;:::i;:::-;3456:5;-1:-1:-1;3513:2:17;3498:18;;3485:32;3526:33;3485:32;3526:33;:::i;:::-;3186:456;;3578:7;;-1:-1:-1;;;3632:2:17;3617:18;;;;3604:32;;3186:456::o;4018:347::-;4069:8;4079:6;4133:3;4126:4;4118:6;4114:17;4110:27;4100:55;;4151:1;4148;4141:12;4100:55;-1:-1:-1;4174:20:17;;4217:18;4206:30;;4203:50;;;4249:1;4246;4239:12;4203:50;4286:4;4278:6;4274:17;4262:29;;4338:3;4331:4;4322:6;4314;4310:19;4306:30;4303:39;4300:59;;;4355:1;4352;4345:12;4300:59;4018:347;;;;;:::o;4370:612::-;4458:6;4466;4474;4482;4535:2;4523:9;4514:7;4510:23;4506:32;4503:52;;;4551:1;4548;4541:12;4503:52;4590:9;4577:23;4609:31;4634:5;4609:31;:::i;:::-;4659:5;-1:-1:-1;4711:2:17;4696:18;;4683:32;;-1:-1:-1;4766:2:17;4751:18;;4738:32;4793:18;4782:30;;4779:50;;;4825:1;4822;4815:12;4779:50;4864:58;4914:7;4905:6;4894:9;4890:22;4864:58;:::i;:::-;4370:612;;;;-1:-1:-1;4941:8:17;-1:-1:-1;;;;4370:612:17:o;4987:754::-;5084:6;5092;5100;5108;5116;5169:3;5157:9;5148:7;5144:23;5140:33;5137:53;;;5186:1;5183;5176:12;5137:53;5225:9;5212:23;5244:31;5269:5;5244:31;:::i;:::-;5294:5;-1:-1:-1;5351:2:17;5336:18;;5323:32;5364:33;5323:32;5364:33;:::i;:::-;5416:7;-1:-1:-1;5470:2:17;5455:18;;5442:32;;-1:-1:-1;5525:2:17;5510:18;;5497:32;5552:18;5541:30;;5538:50;;;5584:1;5581;5574:12;5538:50;5623:58;5673:7;5664:6;5653:9;5649:22;5623:58;:::i;:::-;4987:754;;;;-1:-1:-1;4987:754:17;;-1:-1:-1;5700:8:17;;5597:84;4987:754;-1:-1:-1;;;4987:754:17:o;5746:247::-;5805:6;5858:2;5846:9;5837:7;5833:23;5829:32;5826:52;;;5874:1;5871;5864:12;5826:52;5913:9;5900:23;5932:31;5957:5;5932:31;:::i;5998:1335::-;6395:66;6387:6;6383:79;6372:9;6365:98;6346:4;6482:2;6520:3;6515:2;6504:9;6500:18;6493:31;6547:46;6588:3;6577:9;6573:19;6565:6;6547:46;:::i;:::-;6641:9;6633:6;6629:22;6624:2;6613:9;6609:18;6602:50;6675:33;6701:6;6693;6675:33;:::i;:::-;6739:2;6724:18;;6717:34;;;6800:42;6788:55;;6782:3;6767:19;;6760:84;6875:3;6860:19;;6853:35;;;6925:22;;;6919:3;6904:19;;6897:51;6997:13;;7019:22;;;7095:15;;;;-1:-1:-1;7057:15:17;;;;-1:-1:-1;7138:169:17;7152:6;7149:1;7146:13;7138:169;;;7213:13;;7201:26;;7282:15;;;;7247:12;;;;7174:1;7167:9;7138:169;;;-1:-1:-1;7324:3:17;;5998:1335;-1:-1:-1;;;;;;;;;;;;5998:1335:17:o;7338:829::-;7449:6;7457;7465;7473;7481;7489;7497;7550:3;7538:9;7529:7;7525:23;7521:33;7518:53;;;7567:1;7564;7557:12;7518:53;7606:9;7593:23;7625:31;7650:5;7625:31;:::i;:::-;7675:5;-1:-1:-1;7732:2:17;7717:18;;7704:32;7745:33;7704:32;7745:33;:::i;:::-;7797:7;-1:-1:-1;7851:2:17;7836:18;;7823:32;;-1:-1:-1;7902:2:17;7887:18;;7874:32;;-1:-1:-1;7958:3:17;7943:19;;7930:33;8007:4;7994:18;;7982:31;;7972:59;;8027:1;8024;8017:12;7972:59;7338:829;;;;-1:-1:-1;7338:829:17;;;;8050:7;8104:3;8089:19;;8076:33;;-1:-1:-1;8156:3:17;8141:19;;;8128:33;;7338:829;-1:-1:-1;;7338:829:17:o;8172:388::-;8240:6;8248;8301:2;8289:9;8280:7;8276:23;8272:32;8269:52;;;8317:1;8314;8307:12;8269:52;8356:9;8343:23;8375:31;8400:5;8375:31;:::i;:::-;8425:5;-1:-1:-1;8482:2:17;8467:18;;8454:32;8495:33;8454:32;8495:33;:::i;:::-;8547:7;8537:17;;;8172:388;;;;;:::o;8893:184::-;8945:77;8942:1;8935:88;9042:4;9039:1;9032:15;9066:4;9063:1;9056:15;9082:274;9122:1;9148;9138:189;;9183:77;9180:1;9173:88;9284:4;9281:1;9274:15;9312:4;9309:1;9302:15;9138:189;-1:-1:-1;9341:9:17;;9082:274::o;9361:168::-;9434:9;;;9465;;9482:15;;;9476:22;;9462:37;9452:71;;9503:18;;:::i;9787:184::-;9839:77;9836:1;9829:88;9936:4;9933:1;9926:15;9960:4;9957:1;9950:15;9976:195;10015:3;10046:66;10039:5;10036:77;10033:103;;10116:18;;:::i;:::-;-1:-1:-1;10163:1:17;10152:13;;9976:195::o;10176:325::-;10264:6;10259:3;10252:19;10316:6;10309:5;10302:4;10297:3;10293:14;10280:43;;10368:1;10361:4;10352:6;10347:3;10343:16;10339:27;10332:38;10234:3;10490:4;10420:66;10415:2;10407:6;10403:15;10399:88;10394:3;10390:98;10386:109;10379:116;;10176:325;;;;:::o;10506:435::-;10731:42;10723:6;10719:55;10708:9;10701:74;10811:6;10806:2;10795:9;10791:18;10784:34;10854:2;10849;10838:9;10834:18;10827:30;10682:4;10874:61;10931:2;10920:9;10916:18;10908:6;10900;10874:61;:::i;10946:277::-;11013:6;11066:2;11054:9;11045:7;11041:23;11037:32;11034:52;;;11082:1;11079;11072:12;11034:52;11114:9;11108:16;11167:5;11160:13;11153:21;11146:5;11143:32;11133:60;;11189:1;11186;11179:12;11228:538;11432:4;11461:42;11542:2;11534:6;11530:15;11519:9;11512:34;11594:2;11586:6;11582:15;11577:2;11566:9;11562:18;11555:43;;11634:6;11629:2;11618:9;11614:18;11607:34;11677:3;11672:2;11661:9;11657:18;11650:31;11698:62;11755:3;11744:9;11740:19;11732:6;11724;11698:62;:::i;:::-;11690:70;11228:538;-1:-1:-1;;;;;;;11228:538:17:o;13473:125::-;13538:9;;;13559:10;;;13556:36;;;13572:18;;:::i;13603:128::-;13670:9;;;13691:11;;;13688:37;;;13705:18;;:::i" + }, + "gasEstimates": { + "creation": { + "codeDepositCost": "1236200", + "executionCost": "infinite", + "totalCost": "infinite" + }, + "external": { + "DOMAIN_SEPARATOR()": "infinite", + "allowance(address,address)": "infinite", + "approve(address,uint256)": "24599", + "approveAndCall(address,uint256,bytes)": "infinite", + "balanceOf(address)": "2550", + "decimals()": "244", + "distributeAlongWithETH(address[],uint256)": "infinite", + "eip712Domain()": "infinite", + "name()": "infinite", + "nonces(address)": "2572", + "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": "infinite", + "symbol()": "infinite", + "totalSupply()": "2369", + "transfer(address,uint256)": "infinite", + "transferAlongWithETH(address,uint256)": "infinite", + "transferAndCall(address,uint256,bytes)": "infinite", + "transferFrom(address,address,uint256)": "infinite", + "transferFromAndCall(address,address,uint256,bytes)": "infinite", + "transferOnBehalfAndCall(address,address,uint256,bytes)": "infinite" + } + }, + "methodIdentifiers": { + "DOMAIN_SEPARATOR()": "3644e515", + "allowance(address,address)": "dd62ed3e", + "approve(address,uint256)": "095ea7b3", + "approveAndCall(address,uint256,bytes)": "cae9ca51", + "balanceOf(address)": "70a08231", + "decimals()": "313ce567", + "distributeAlongWithETH(address[],uint256)": "0e02df54", + "eip712Domain()": "84b0196e", + "name()": "06fdde03", + "nonces(address)": "7ecebe00", + "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": "d505accf", + "symbol()": "95d89b41", + "totalSupply()": "18160ddd", + "transfer(address,uint256)": "a9059cbb", + "transferAlongWithETH(address,uint256)": "e7fcb065", + "transferAndCall(address,uint256,bytes)": "4000aea0", + "transferFrom(address,address,uint256)": "23b872dd", + "transferFromAndCall(address,address,uint256,bytes)": "c1d34b89", + "transferOnBehalfAndCall(address,address,uint256,bytes)": "65520efa" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"DeadlineOver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"provided\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"}],\"name\":\"InvalidMsgValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"provided\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"}],\"name\":\"InvalidTotalAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentAllowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"}],\"name\":\"NotAuthorizedAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"}],\"name\":\"NotEnoughTokens\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"approveAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"tos\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"totalAmount\",\"type\":\"uint256\"}],\"name\":\"distributeAlongWithETH\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eip712Domain\",\"outputs\":[{\"internalType\":\"bytes1\",\"name\":\"fields\",\"type\":\"bytes1\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"chainID\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"verifyingContract\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"extensions\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferAlongWithETH\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferFromAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferOnBehalfAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Ronan Sandford\",\"errors\":{\"DeadlineOver(uint256,uint256)\":[{\"params\":{\"currentTime\":\"time at which the error happen\",\"deadline\":\"the deadline\"}}],\"InvalidAddress(address)\":[{\"params\":{\"addr\":\"invalid address\"}}],\"InvalidMsgValue(uint256,uint256)\":[{\"params\":{\"expected\":\"value expected\",\"provided\":\"msg.value amount provided\"}}],\"InvalidTotalAmount(uint256,uint256)\":[{\"params\":{\"expected\":\"value expected\",\"provided\":\"msg.value amount provided\"}}],\"NotAuthorizedAllowance(uint256,uint256)\":[{\"params\":{\"currentAllowance\":\"the current allowance\",\"expected\":\"amount expected\"}}],\"NotEnoughTokens(uint256,uint256)\":[{\"params\":{\"currentBalance\":\"the current balance\",\"expected\":\"amount expected\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"the account approving the `spender`\",\"spender\":\"the account allowed to spend\",\"value\":\"the amount granted\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"the account the tokens are sent from\",\"to\":\"the account the tokens are sent to\",\"value\":\"number of tokens sent\"}}},\"kind\":\"dev\",\"methods\":{\"approveAndCall(address,uint256,bytes)\":{\"params\":{\"amount\":\"number of token to transfer\",\"data\":\"extra data\",\"spender\":\"account to send the token for\"},\"returns\":{\"_0\":\"success\"}},\"eip712Domain()\":{\"returns\":{\"chainID\":\"EIP-712 chainID\",\"extensions\":\"A list of EIP numbers that specify additional fields in the domain. The method to obtain the value for each of these additional fields and any conditions for inclusion are expected to be specified in the respective EIP. The value of fields does not affect their inclusion.\",\"fields\":\"A bit map where bit i is set to 1 if and only if domain field i is present (0 \\u2264 i \\u2264 4). Bits are read from least significant to most significant, and fields are indexed in the order that is specified by EIP-712, identical to the order in which they are listed in the function type.\",\"name\":\"EIP-712 name\",\"salt\":\"EIP-712 salt\",\"verifyingContract\":\"EIP-712 name verifyingContract\",\"version\":\"EIP-712 version\"}},\"nonces(address)\":{\"params\":{\"owner\":\"address queried\"},\"returns\":{\"_0\":\"nonce value\"}},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"params\":{\"deadline\":\"timestamp in seconds after which the permit is not valid.\",\"owner\":\"owner of the tokens\",\"r\":\"signature part r\",\"s\":\"signature part s\",\"spender\":\"address allowed to spend on behalf of the owner.\",\"v\":\"signature part v\",\"value\":\"amount of token allowed to be spent\"}},\"transferAndCall(address,uint256,bytes)\":{\"params\":{\"amount\":\"number of token to transfer\",\"data\":\"extra data\",\"to\":\"account to receive the tokens\"},\"returns\":{\"_0\":\"success\"}},\"transferFromAndCall(address,address,uint256,bytes)\":{\"params\":{\"amount\":\"number of token to transfer\",\"data\":\"extra data\",\"from\":\"account to send the token from\",\"to\":\"account to receive the tokens\"},\"returns\":{\"_0\":\"success\"}},\"transferOnBehalfAndCall(address,address,uint256,bytes)\":{\"params\":{\"amount\":\"number of token to transfer\",\"data\":\"extra data\",\"forAddress\":\"account to send the token for\",\"to\":\"account to receive the tokens\"},\"returns\":{\"_0\":\"success\"}}},\"title\":\"Gems Tokens\",\"version\":1},\"userdoc\":{\"errors\":{\"DeadlineOver(uint256,uint256)\":[{\"notice\":\"The permit has expired\"}],\"InvalidAddress(address)\":[{\"notice\":\"An invalid address is specified (for example: zero address)\"}],\"InvalidMsgValue(uint256,uint256)\":[{\"notice\":\"The msg value do not match the expected value\"}],\"InvalidSignature()\":[{\"notice\":\"The signature do not match the expected signer\"}],\"InvalidTotalAmount(uint256,uint256)\":[{\"notice\":\"The total amount provided do not match the expected value\"}],\"NotAuthorizedAllowance(uint256,uint256)\":[{\"notice\":\"the amount requested exceed the allowance\"}],\"NotEnoughTokens(uint256,uint256)\":[{\"notice\":\"the amount requested exceed the balance\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"trigger on approval amount being set. Note that Transfer events need to be considered to compute the current allowance.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"trigger when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"notice\":\"EIP-712 Domain separator hash\"},\"allowance(address,address)\":{\"notice\":\"Returns the amount which `spender` is still allowed to withdraw from `owner`.\"},\"approve(address,uint256)\":{\"notice\":\"Allows `spender` to withdraw from your account multiple times, up to `amount`.\"},\"approveAndCall(address,uint256,bytes)\":{\"notice\":\"approve `amount` token to be spent by `spender` and callback into it via `onTokenApproval`\"},\"balanceOf(address)\":{\"notice\":\"Returns the account balance of another account with address `owner`.\"},\"decimals()\":{\"notice\":\"Returns the number of decimals the token uses.\"},\"distributeAlongWithETH(address[],uint256)\":{\"notice\":\"distribute\"},\"eip712Domain()\":{\"notice\":\"The return values of this function MUST describe the domain separator that is used for verification of EIP-712 signatures in the contract. They describe both the form of the EIP712Domain struct (i.e., which of the optional fields and extensions are present) and the value of each field, as follows.\"},\"nonces(address)\":{\"notice\":\"return the current nonce of the owner\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"allow `spender` to spend `value` amount of token on behalf of `owner`\"},\"symbol()\":{\"notice\":\"Returns the symbol of the token.\"},\"totalSupply()\":{\"notice\":\"Returns the total token supply.\"},\"transfer(address,uint256)\":{\"notice\":\"Transfers `amount` of tokens to address `to`.\"},\"transferAlongWithETH(address,uint256)\":{\"notice\":\"transfer\"},\"transferAndCall(address,uint256,bytes)\":{\"notice\":\"transfer `amount` token to `to` and callback into it via `onTokenTransfer`\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfers `amount` tokens from address `from` to address `to`.\"},\"transferFromAndCall(address,address,uint256,bytes)\":{\"notice\":\"transfer `amount` token to `to` and callback into it via `onTokenTransfer`\"},\"transferOnBehalfAndCall(address,address,uint256,bytes)\":{\"notice\":\"transfer `amount` token to `to` and callback into it via `onTokenTransferedOnBehalf`\"}},\"notice\":\"Gems Tokens initialy generated by playing instances of Stratagems\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/token/Gems.sol\":\"Gems\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solidity-kit/solc_0.8/ERC20/ERC2612/implementations/UsingPermit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport '../../implementations/ImplementingERC20Internal.sol';\\nimport '../interfaces/IERC2612.sol';\\nimport '../../../ERC712/implementations/UsingERC712.sol';\\nimport '../../../ERC712/implementations/ImplementingExternalDomainSeparator.sol';\\n\\nabstract contract UsingPermit is ImplementingERC20Internal, ImplementingExternalDomainSeparator, UsingERC712, IERC2612 {\\n\\tbytes32 internal constant PERMIT_TYPEHASH =\\n\\t\\tkeccak256('Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)');\\n\\n\\tmapping(address => uint256) internal _nonces;\\n\\n\\t/// @inheritdoc IERC2612\\n\\tfunction nonces(address owner) external view returns (uint256) {\\n\\t\\treturn _nonces[owner];\\n\\t}\\n\\n\\t/// @inheritdoc IERC2612\\n\\tfunction DOMAIN_SEPARATOR()\\n\\t\\tpublic\\n\\t\\tview\\n\\t\\tvirtual\\n\\t\\toverride(IERC2612, ImplementingExternalDomainSeparator)\\n\\t\\treturns (bytes32);\\n\\n\\t/// @inheritdoc IERC2612\\n\\tfunction permit(\\n\\t\\taddress owner,\\n\\t\\taddress spender,\\n\\t\\tuint256 value,\\n\\t\\tuint256 deadline,\\n\\t\\tuint8 v,\\n\\t\\tbytes32 r,\\n\\t\\tbytes32 s\\n\\t) external override {\\n\\t\\tif (owner == address(0)) {\\n\\t\\t\\trevert InvalidAddress(address(0));\\n\\t\\t}\\n\\n\\t\\tuint256 currentNonce = _nonces[owner];\\n\\t\\tbytes32 digest = keccak256(\\n\\t\\t\\tabi.encodePacked(\\n\\t\\t\\t\\t'\\\\x19\\\\x01',\\n\\t\\t\\t\\tDOMAIN_SEPARATOR(),\\n\\t\\t\\t\\tkeccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, currentNonce, deadline))\\n\\t\\t\\t)\\n\\t\\t);\\n\\t\\tif (owner != ecrecover(digest, v, r, s)) {\\n\\t\\t\\trevert InvalidSignature();\\n\\t\\t}\\n\\t\\tif (deadline != 0 && block.timestamp > deadline) {\\n\\t\\t\\trevert DeadlineOver(block.timestamp, deadline);\\n\\t\\t}\\n\\n\\t\\t_nonces[owner] = currentNonce + 1;\\n\\t\\t_approveFor(owner, spender, value);\\n\\t}\\n}\\n\",\"keccak256\":\"0x311115bfcaa89f3acdddfa261794e47ebf87ce81436c2758456900b8c6d81053\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/ERC2612/implementations/UsingPermitWithDynamicChainID.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./UsingPermit.sol\\\";\\nimport \\\"../../../ERC712/implementations/UsingERC712WithDynamicChainID.sol\\\";\\n\\nabstract contract UsingPermitWithDynamicChainID is UsingPermit, UsingERC712WithDynamicChainID {\\n\\tconstructor(address verifyingContract) UsingERC712WithDynamicChainID(verifyingContract) {}\\n\\n\\t/// @inheritdoc IERC2612\\n\\tfunction DOMAIN_SEPARATOR() public view virtual override returns (bytes32) {\\n\\t\\treturn _currentDomainSeparator();\\n\\t}\\n}\\n\",\"keccak256\":\"0xe21356300c4ccc093643cd925c5707fc0509559b8850e5d951b481d845310ee2\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/ERC2612/interfaces/IERC2612.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/IERC20Errors.sol\\\";\\n\\ninterface IERC2612 {\\n\\t/// @notice The signature do not match the expected signer\\n\\terror InvalidSignature();\\n\\t/// @notice The permit has expired\\n\\t/// @param currentTime time at which the error happen\\n\\t/// @param deadline the deadline\\n\\terror DeadlineOver(uint256 currentTime, uint256 deadline);\\n\\n\\t/// @notice allow `spender` to spend `value` amount of token on behalf of `owner`\\n\\t/// @param owner owner of the tokens\\n\\t/// @param spender address allowed to spend on behalf of the owner.\\n\\t/// @param value amount of token allowed to be spent\\n\\t/// @param deadline timestamp in seconds after which the permit is not valid.\\n\\t/// @param v signature part v\\n\\t/// @param r signature part r\\n\\t/// @param s signature part s\\n\\tfunction permit(\\n\\t\\taddress owner,\\n\\t\\taddress spender,\\n\\t\\tuint256 value,\\n\\t\\tuint256 deadline,\\n\\t\\tuint8 v,\\n\\t\\tbytes32 r,\\n\\t\\tbytes32 s\\n\\t) external;\\n\\n\\t/// @notice return the current nonce of the owner\\n\\t/// @param owner address queried\\n\\t/// @return nonce nonce value\\n\\tfunction nonces(address owner) external view returns (uint256 nonce);\\n\\n\\t/// @notice EIP-712 Domain separator hash\\n\\tfunction DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xe610994a34db6e750ee555ab2011292a980ec650e9afb7619fb0bc3fcad75095\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/implementations/ERC20Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IERC20.sol\\\";\\nimport \\\"../interfaces/IERC20WithCallback.sol\\\";\\nimport \\\"../interfaces/IERC20WithDistribution.sol\\\";\\nimport \\\"./ImplementingERC20Internal.sol\\\";\\nimport \\\"../../utils/Constants.sol\\\";\\n\\nabstract contract ERC20Base is IERC20, IERC20WithCallback, IERC20WithDistribution, ImplementingERC20Internal {\\n\\tuint256 internal _totalSupply;\\n\\tmapping(address => uint256) internal _balances;\\n\\tmapping(address => mapping(address => uint256)) internal _allowances;\\n\\n\\t/// @inheritdoc IERC20\\n\\tfunction totalSupply() external view override returns (uint256) {\\n\\t\\treturn _internal_totalSupply();\\n\\t}\\n\\n\\t/// @inheritdoc IERC20\\n\\tfunction balanceOf(address owner) external view override returns (uint256) {\\n\\t\\treturn _balances[owner];\\n\\t}\\n\\n\\t/// @inheritdoc IERC20\\n\\tfunction allowance(address owner, address spender) external view override returns (uint256) {\\n\\t\\tif (owner == address(this)) {\\n\\t\\t\\t// see transferFrom: address(this) allows anyone\\n\\t\\t\\treturn type(uint256).max;\\n\\t\\t}\\n\\t\\treturn _allowances[owner][spender];\\n\\t}\\n\\n\\t/// @inheritdoc IERC20\\n\\tfunction decimals() external pure virtual override returns (uint8) {\\n\\t\\treturn uint8(18);\\n\\t}\\n\\n\\t/// @inheritdoc IERC20\\n\\tfunction transfer(address to, uint256 amount) external override returns (bool) {\\n\\t\\t_transfer(msg.sender, to, amount);\\n\\t\\treturn true;\\n\\t}\\n\\n\\t/// @inheritdoc IERC20WithDistribution\\n\\tfunction transferAlongWithETH(address payable to, uint256 amount) external payable returns (bool) {\\n\\t\\t_transfer(msg.sender, to, amount);\\n\\t\\tto.transfer(msg.value);\\n\\t\\treturn true;\\n\\t}\\n\\n\\t/// @inheritdoc IERC20WithDistribution\\n\\tfunction distributeAlongWithETH(address payable[] memory tos, uint256 totalAmount) external payable returns (bool) {\\n\\t\\tuint256 val = msg.value / tos.length;\\n\\t\\tif (msg.value != val * tos.length) {\\n\\t\\t\\trevert InvalidMsgValue(msg.value, val * tos.length);\\n\\t\\t}\\n\\t\\tuint256 amount = totalAmount / tos.length;\\n\\t\\tif (totalAmount != amount * tos.length) {\\n\\t\\t\\trevert InvalidTotalAmount(totalAmount, amount * tos.length);\\n\\t\\t}\\n\\t\\tfor (uint256 i = 0; i < tos.length; i++) {\\n\\t\\t\\t_transfer(msg.sender, tos[i], amount);\\n\\t\\t\\ttos[i].transfer(val);\\n\\t\\t}\\n\\t\\treturn true;\\n\\t}\\n\\n\\t/// @inheritdoc IERC20WithCallback\\n\\tfunction transferAndCall(\\n\\t\\taddress to,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool) {\\n\\t\\t_transfer(msg.sender, to, amount);\\n\\t\\treturn ITransferReceiver(to).onTokenTransfer(msg.sender, amount, data);\\n\\t}\\n\\n\\t/// @inheritdoc IERC20WithCallback\\n\\tfunction transferFromAndCall(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool) {\\n\\t\\t_transferFrom(from, to, amount);\\n\\t\\treturn ITransferReceiver(to).onTokenTransfer(from, amount, data);\\n\\t}\\n\\n\\t/// @inheritdoc IERC20WithCallback\\n\\tfunction transferOnBehalfAndCall(\\n\\t\\taddress forAddress,\\n\\t\\taddress to,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool) {\\n\\t\\t_transfer(msg.sender, to, amount);\\n\\t\\treturn ITransferOnBehalfReceiver(to).onTokenTransferedOnBehalf(msg.sender, forAddress, amount, data);\\n\\t}\\n\\n\\t/// @inheritdoc IERC20\\n\\tfunction transferFrom(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 amount\\n\\t) external override returns (bool) {\\n\\t\\t_transferFrom(from, to, amount);\\n\\t\\treturn true;\\n\\t}\\n\\n\\t/// @inheritdoc IERC20\\n\\tfunction approve(address spender, uint256 amount) external override returns (bool) {\\n\\t\\t_approveFor(msg.sender, spender, amount);\\n\\t\\treturn true;\\n\\t}\\n\\n\\t/// @inheritdoc IERC20WithCallback\\n\\tfunction approveAndCall(\\n\\t\\taddress spender,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool) {\\n\\t\\t_approveFor(msg.sender, spender, amount);\\n\\t\\treturn IApprovalReceiver(spender).onTokenApproval(msg.sender, amount, data);\\n\\t}\\n\\n\\t// ------------------------------------------------------------------------------------------------------------------\\n\\t// INTERNALS\\n\\t// ------------------------------------------------------------------------------------------------------------------\\n\\n\\tfunction _internal_totalSupply() internal view override returns (uint256) {\\n\\t\\treturn _totalSupply;\\n\\t}\\n\\n\\tfunction _approveFor(\\n\\t\\taddress owner,\\n\\t\\taddress spender,\\n\\t\\tuint256 amount\\n\\t) internal override {\\n\\t\\tif (owner == address(0) || spender == address(0)) {\\n\\t\\t\\trevert InvalidAddress(address(0));\\n\\t\\t}\\n\\t\\t_allowances[owner][spender] = amount;\\n\\t\\temit Approval(owner, spender, amount);\\n\\t}\\n\\n\\tfunction _transferFrom(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 amount\\n\\t) internal {\\n\\t\\t// anybody can transfer from this\\n\\t\\t// this allow mintAndApprovedCall without gas overhead\\n\\t\\tif (msg.sender != from && from != address(this)) {\\n\\t\\t\\tuint256 currentAllowance = _allowances[from][msg.sender];\\n\\t\\t\\tif (currentAllowance != type(uint256).max) {\\n\\t\\t\\t\\t// save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n\\t\\t\\t\\tif (currentAllowance < amount) {\\n\\t\\t\\t\\t\\trevert NotAuthorizedAllowance(currentAllowance, amount);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t_allowances[from][msg.sender] = currentAllowance - amount;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t_transfer(from, to, amount);\\n\\t}\\n\\n\\tfunction _transfer(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 amount\\n\\t) internal {\\n\\t\\tif (to == address(0) || to == address(this)) {\\n\\t\\t\\trevert InvalidAddress(to);\\n\\t\\t}\\n\\t\\tuint256 currentBalance = _balances[from];\\n\\t\\tif (currentBalance < amount) {\\n\\t\\t\\trevert NotEnoughTokens(currentBalance, amount);\\n\\t\\t}\\n\\t\\t_balances[from] = currentBalance - amount;\\n\\t\\t_balances[to] += amount;\\n\\t\\temit Transfer(from, to, amount);\\n\\t}\\n\\n\\tfunction _transferAllIfAny(address from, address to) internal {\\n\\t\\tuint256 balanceLeft = _balances[from];\\n\\t\\tif (balanceLeft > 0) {\\n\\t\\t\\t_balances[from] = 0;\\n\\t\\t\\t_balances[to] += balanceLeft;\\n\\t\\t\\temit Transfer(from, to, balanceLeft);\\n\\t\\t}\\n\\t}\\n\\n\\tfunction _mint(address to, uint256 amount) internal override {\\n\\t\\t_totalSupply += amount;\\n\\t\\t_balances[to] += amount;\\n\\t\\temit Transfer(address(0), to, amount);\\n\\t}\\n\\n\\tfunction _burnFrom(address from, uint256 amount) internal override {\\n\\t\\tuint256 currentBalance = _balances[from];\\n\\t\\tif (currentBalance < amount) {\\n\\t\\t\\trevert NotEnoughTokens(currentBalance, amount);\\n\\t\\t}\\n\\t\\t_balances[from] = currentBalance - amount;\\n\\t\\t_totalSupply -= amount;\\n\\t\\temit Transfer(from, address(0), amount);\\n\\t}\\n}\\n\",\"keccak256\":\"0xfeb88cdc5795fe281cc9b13cb30ee9f57bf9e27ed719d96f599dd0a1a7e91dcd\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/implementations/ImplementingERC20Internal.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nabstract contract ImplementingERC20Internal {\\n\\tfunction _approveFor(\\n\\t\\taddress owner,\\n\\t\\taddress target,\\n\\t\\tuint256 amount\\n\\t) internal virtual;\\n\\n\\tfunction _mint(address to, uint256 amount) internal virtual;\\n\\n\\tfunction _burnFrom(address from, uint256 amount) internal virtual;\\n\\n\\tfunction _internal_totalSupply() internal view virtual returns (uint256);\\n}\\n\",\"keccak256\":\"0xa748d2b3c0573af21672cb5c19ea769ccec11fc03a2f7606213308d28a94f7ef\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IERC20Errors.sol\\\";\\n\\ninterface IERC20 {\\n\\t/// @notice trigger when tokens are transferred, including zero value transfers.\\n\\t/// @param from the account the tokens are sent from\\n\\t/// @param to the account the tokens are sent to\\n\\t/// @param value number of tokens sent\\n\\tevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n\\t/// @notice trigger on approval amount being set.\\n\\t/// Note that Transfer events need to be considered to compute the current allowance.\\n\\t/// @param owner the account approving the `spender`\\n\\t/// @param spender the account allowed to spend\\n\\t/// @param value the amount granted\\n\\tevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n\\t/// @notice Returns the total token supply.\\n\\tfunction totalSupply() external view returns (uint256);\\n\\n\\t/// @notice Returns the number of decimals the token uses.\\n\\tfunction decimals() external view returns (uint8);\\n\\n\\t/// @notice Returns the symbol of the token.\\n\\tfunction symbol() external view returns (string memory);\\n\\n\\t/// @notice Returns the name of the token.\\n\\tfunction name() external view returns (string memory);\\n\\n\\t/// @notice Returns the account balance of another account with address `owner`.\\n\\tfunction balanceOf(address owner) external view returns (uint256);\\n\\n\\t/// @notice Transfers `amount` of tokens to address `to`.\\n\\tfunction transfer(address to, uint256 amount) external returns (bool);\\n\\n\\t/// @notice Returns the amount which `spender` is still allowed to withdraw from `owner`.\\n\\tfunction allowance(address owner, address spender) external view returns (uint256);\\n\\n\\t/// @notice Allows `spender` to withdraw from your account multiple times, up to `amount`.\\n\\tfunction approve(address spender, uint256 amount) external returns (bool);\\n\\n\\t/// @notice Transfers `amount` tokens from address `from` to address `to`.\\n\\tfunction transferFrom(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 amount\\n\\t) external returns (bool);\\n}\\n\",\"keccak256\":\"0x68034c81cd7775e19a5bb75dd33022da7add3bc1852309eed9f797f1ff835507\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/interfaces/IERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/// @notice The msg value do not match the expected value\\n/// @param provided msg.value amount provided\\n/// @param expected value expected\\nerror InvalidMsgValue(uint256 provided, uint256 expected);\\n/// @notice The total amount provided do not match the expected value\\n/// @param provided msg.value amount provided\\n/// @param expected value expected\\nerror InvalidTotalAmount(uint256 provided, uint256 expected);\\n/// @notice An invalid address is specified (for example: zero address)\\n/// @param addr invalid address\\nerror InvalidAddress(address addr);\\n/// @notice the amount requested exceed the allowance\\n/// @param currentAllowance the current allowance\\n/// @param expected amount expected\\nerror NotAuthorizedAllowance(uint256 currentAllowance, uint256 expected);\\n/// @notice the amount requested exceed the balance\\n/// @param currentBalance the current balance\\n/// @param expected amount expected\\nerror NotEnoughTokens(uint256 currentBalance, uint256 expected);\\n\",\"keccak256\":\"0xc8ab4cfee19338da32d2fc5473e1ee740bf608c59196ebd16de74294c4813ae9\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/interfaces/IERC20WithCallback.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IERC20.sol\\\";\\n\\ninterface ITransferReceiver {\\n\\t/// @notice called by ERC20 token after transfer been executed.\\n\\t/// @param payer account sending the money\\n\\t/// @param amount number of token transfered\\n\\t/// @param data extra data\\n\\tfunction onTokenTransfer(\\n\\t\\taddress payer,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool);\\n}\\n\\ninterface ITransferOnBehalfReceiver {\\n\\t/// @notice called by ERC20 token after transfer been executed.\\n\\t/// @param payer account sending the money\\n\\t/// @param forAddress account to be considered as te actual payer\\n\\t/// @param amount number of token transfered\\n\\t/// @param data extra data\\n\\tfunction onTokenTransferedOnBehalf(\\n\\t\\taddress payer,\\n\\t\\taddress forAddress,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool);\\n}\\n\\ninterface IApprovalReceiver {\\n\\t/// @notice called by ERC20 token after transfer been executed.\\n\\t/// @param owner account that grant the approval\\n\\t/// @param amount number of token approved\\n\\t/// @param data extra data\\n\\tfunction onTokenApproval(\\n\\t\\taddress owner,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool);\\n}\\n\\ninterface IERC20WithCallback is IERC20 {\\n\\t/// @notice transfer `amount` token to `to` and callback into it via `onTokenTransfer`\\n\\t/// @param to account to receive the tokens\\n\\t/// @param amount number of token to transfer\\n\\t/// @param data extra data\\n\\t/// @return success\\n\\tfunction transferAndCall(\\n\\t\\taddress to,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool);\\n\\n\\t/// @notice transfer `amount` token to `to` and callback into it via `onTokenTransfer`\\n\\t/// @param from account to send the token from\\n\\t/// @param to account to receive the tokens\\n\\t/// @param amount number of token to transfer\\n\\t/// @param data extra data\\n\\t/// @return success\\n\\tfunction transferFromAndCall(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool);\\n\\n\\t/// @notice transfer `amount` token to `to` and callback into it via `onTokenTransferedOnBehalf`\\n\\t/// @param forAddress account to send the token for\\n\\t/// @param to account to receive the tokens\\n\\t/// @param amount number of token to transfer\\n\\t/// @param data extra data\\n\\t/// @return success\\n\\tfunction transferOnBehalfAndCall(\\n\\t\\taddress forAddress,\\n\\t\\taddress to,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool);\\n\\n\\t/// @notice approve `amount` token to be spent by `spender` and callback into it via `onTokenApproval`\\n\\t/// @param spender account to send the token for\\n\\t/// @param amount number of token to transfer\\n\\t/// @param data extra data\\n\\t/// @return success\\n\\tfunction approveAndCall(\\n\\t\\taddress spender,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool);\\n}\\n\",\"keccak256\":\"0xcbe7ac72af21634f11616ee1ff302df87039ec7d9752382ea7dbc748a5692f86\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/interfaces/IERC20WithDistribution.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IERC20.sol\\\";\\n\\ninterface IERC20WithDistribution is IERC20 {\\n\\t/// @notice transfer\\n\\tfunction transferAlongWithETH(address payable to, uint256 amount) external payable returns (bool);\\n\\n\\t/// @notice distribute\\n\\tfunction distributeAlongWithETH(address payable[] memory tos, uint256 totalAmount) external payable returns (bool);\\n}\\n\",\"keccak256\":\"0x8c46558a2161e80878f6102cd868c83a227d942ef1e38b639fc29b9c0025b7a3\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC712/implementations/ImplementingExternalDomainSeparator.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nabstract contract ImplementingExternalDomainSeparator {\\n\\t/// @notice EIP-712 Domain separator hash\\n\\tfunction DOMAIN_SEPARATOR() public view virtual returns (bytes32);\\n}\\n\",\"keccak256\":\"0xaeea9575d7d21d565d7148a9d57d5f559760e1e73a94e9038b2110cd50d1cd14\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC712/implementations/Named.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nabstract contract Named {\\n\\t/// @notice Returns the name of the contract.\\n\\tfunction name() public view virtual returns (string memory);\\n}\\n\",\"keccak256\":\"0x924b53f83a89b85206c14daea25f30248502b831f4424186c567581581c46794\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC712/implementations/UsingERC712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IERC5267.sol\\\";\\n\\nabstract contract UsingERC712 is IERC5267 {}\\n\",\"keccak256\":\"0x5b2d5c3dd2ebe8dedf66a6d1a8b01918a42dfe3bc00778dca06fdf7686b7699e\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC712/implementations/UsingERC712WithDynamicChainID.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./UsingERC712.sol\\\";\\nimport \\\"./Named.sol\\\";\\n\\nabstract contract UsingERC712WithDynamicChainID is UsingERC712, Named {\\n\\tuint256 private immutable _deploymentChainID;\\n\\tbytes32 private immutable _deploymentDomainSeparator;\\n\\taddress private immutable _verifyingContract;\\n\\n\\t/// @dev we let you specifying the verifying contract so that if you use a proxy, the implementation can use it.\\n\\tconstructor(address verifyingContract) {\\n\\t\\tuint256 chainID;\\n\\t\\tassembly {\\n\\t\\t\\tchainID := chainid()\\n\\t\\t}\\n\\n\\t\\t_deploymentChainID = chainID;\\n\\t\\t_verifyingContract = verifyingContract == address(0) ? address(this) : verifyingContract;\\n\\t\\t_deploymentDomainSeparator = _calculateDomainSeparator(chainID, _verifyingContract);\\n\\t}\\n\\n\\t/// @inheritdoc IERC5267\\n\\tfunction eip712Domain()\\n\\t\\texternal\\n\\t\\tview\\n\\t\\tvirtual\\n\\t\\toverride\\n\\t\\treturns (\\n\\t\\t\\tbytes1 fields,\\n\\t\\t\\tstring memory name,\\n\\t\\t\\tstring memory version,\\n\\t\\t\\tuint256 chainID,\\n\\t\\t\\taddress verifyingContract,\\n\\t\\t\\tbytes32 salt,\\n\\t\\t\\tuint256[] memory extensions\\n\\t\\t)\\n\\t{\\n\\t\\tfields = 0x0D;\\n\\t\\tname = _name();\\n\\t\\tversion = \\\"\\\";\\n\\t\\tassembly {\\n\\t\\t\\tchainID := chainid()\\n\\t\\t}\\n\\t\\tverifyingContract = _verifyingContract;\\n\\t\\tsalt = 0;\\n\\t\\textensions = new uint256[](0);\\n\\t}\\n\\n\\t// ------------------------------------------------------------------------------------------------------------------\\n\\t// INTERNALS\\n\\t// ------------------------------------------------------------------------------------------------------------------\\n\\n\\t// need to ensure we can use return value \\\"name\\\" in `eip712Domain`\\n\\tfunction _name() internal view returns (string memory) {\\n\\t\\treturn name();\\n\\t}\\n\\n\\tfunction _currentDomainSeparator() internal view returns (bytes32) {\\n\\t\\tuint256 chainID;\\n\\t\\tassembly {\\n\\t\\t\\tchainID := chainid()\\n\\t\\t}\\n\\n\\t\\t// in case a fork happen, to support the chain that had to change its chainID, we compute the domain operator\\n\\t\\treturn\\n\\t\\t\\tchainID == _deploymentChainID\\n\\t\\t\\t\\t? _deploymentDomainSeparator\\n\\t\\t\\t\\t: _calculateDomainSeparator(chainID, _verifyingContract);\\n\\t}\\n\\n\\t/// @dev Calculate the Domain Separator used to compute ERC712 hash\\n\\tfunction _calculateDomainSeparator(uint256 chainID, address verifyingContract) private view returns (bytes32) {\\n\\t\\treturn\\n\\t\\t\\tkeccak256(\\n\\t\\t\\t\\tabi.encode(\\n\\t\\t\\t\\t\\tkeccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\"),\\n\\t\\t\\t\\t\\tkeccak256(bytes(name())),\\n\\t\\t\\t\\t\\tchainID,\\n\\t\\t\\t\\t\\tverifyingContract\\n\\t\\t\\t\\t)\\n\\t\\t\\t);\\n\\t}\\n}\\n\",\"keccak256\":\"0x95bb33423ae9d2e9fcf7a91418630bb2d4bc438e2aa8cd9958e42af24183b488\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC712/interfaces/IERC5267.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\ninterface IERC5267 {\\n\\t/// @notice The return values of this function MUST describe the domain separator that is used for verification of EIP-712 signatures in the contract. They describe both the form of the EIP712Domain struct (i.e., which of the optional fields and extensions are present) and the value of each field, as follows.\\n\\t/// @return fields A bit map where bit i is set to 1 if and only if domain field i is present (0 \\u2264 i \\u2264 4). Bits are read from least significant to most significant, and fields are indexed in the order that is specified by EIP-712, identical to the order in which they are listed in the function type.\\n\\t/// @return name EIP-712 name\\n\\t/// @return version EIP-712 version\\n\\t/// @return chainID EIP-712 chainID\\n\\t/// @return verifyingContract EIP-712 name verifyingContract\\n\\t/// @return salt EIP-712 salt\\n\\t/// @return extensions A list of EIP numbers that specify additional fields in the domain. The method to obtain the value for each of these additional fields and any conditions for inclusion are expected to be specified in the respective EIP. The value of fields does not affect their inclusion.\\n\\tfunction eip712Domain()\\n\\t\\texternal\\n\\t\\tview\\n\\t\\treturns (\\n\\t\\t\\tbytes1 fields,\\n\\t\\t\\tstring memory name,\\n\\t\\t\\tstring memory version,\\n\\t\\t\\tuint256 chainID,\\n\\t\\t\\taddress verifyingContract,\\n\\t\\t\\tbytes32 salt,\\n\\t\\t\\tuint256[] memory extensions\\n\\t\\t);\\n}\\n\",\"keccak256\":\"0xb0f30c518c3c6afc4e88fff6f822469425ed81611065be5528b10dee5aebde63\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/utils/Constants.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nlibrary Constants {\\n\\tuint256 internal constant DECIMALS_18 = 1000000000000000000;\\n}\\n\",\"keccak256\":\"0xe9da4ad04d270eb44b2bada7307894079ad6d3458b4d237b7992022f900d94b6\",\"license\":\"MIT\"},\"src/token/Gems.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nimport 'solidity-kit/solc_0.8/ERC20/implementations/ERC20Base.sol';\\nimport 'solidity-kit/solc_0.8/ERC20/ERC2612/implementations/UsingPermitWithDynamicChainID.sol';\\n\\n/// @title Gems Tokens\\n/// @author Ronan Sandford\\n/// @notice Gems Tokens initialy generated by playing instances of Stratagems\\ncontract Gems is ERC20Base, UsingPermitWithDynamicChainID {\\n\\tconstructor(address to, uint256 amount) UsingPermitWithDynamicChainID(address(this)) {\\n\\t\\t_mint(to, amount);\\n\\t}\\n\\n\\tstring public constant symbol = 'GEM';\\n\\n\\tfunction name() public pure override(IERC20, Named) returns (string memory) {\\n\\t\\treturn 'Gems';\\n\\t}\\n}\\n\",\"keccak256\":\"0x0a2a1cb72c3e7bdcf16b8675460a0485d6488abdd27013db8a84012a01ea5487\",\"license\":\"AGPL-3.0\"}},\"version\":1}", + "storageLayout": { + "storage": [ + { + "astId": 243, + "contract": "src/token/Gems.sol:Gems", + "label": "_totalSupply", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 247, + "contract": "src/token/Gems.sol:Gems", + "label": "_balances", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 253, + "contract": "src/token/Gems.sol:Gems", + "label": "_allowances", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" + }, + { + "astId": 22, + "contract": "src/token/Gems.sol:Gems", + "label": "_nonces", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_uint256)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => uint256))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_uint256)" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + }, + "userdoc": { + "errors": { + "DeadlineOver(uint256,uint256)": [ + { + "notice": "The permit has expired" + } + ], + "InvalidAddress(address)": [ + { + "notice": "An invalid address is specified (for example: zero address)" + } + ], + "InvalidMsgValue(uint256,uint256)": [ + { + "notice": "The msg value do not match the expected value" + } + ], + "InvalidSignature()": [ + { + "notice": "The signature do not match the expected signer" + } + ], + "InvalidTotalAmount(uint256,uint256)": [ + { + "notice": "The total amount provided do not match the expected value" + } + ], + "NotAuthorizedAllowance(uint256,uint256)": [ + { + "notice": "the amount requested exceed the allowance" + } + ], + "NotEnoughTokens(uint256,uint256)": [ + { + "notice": "the amount requested exceed the balance" + } + ] + }, + "events": { + "Approval(address,address,uint256)": { + "notice": "trigger on approval amount being set. Note that Transfer events need to be considered to compute the current allowance." + }, + "Transfer(address,address,uint256)": { + "notice": "trigger when tokens are transferred, including zero value transfers." + } + }, + "kind": "user", + "methods": { + "DOMAIN_SEPARATOR()": { + "notice": "EIP-712 Domain separator hash" + }, + "allowance(address,address)": { + "notice": "Returns the amount which `spender` is still allowed to withdraw from `owner`." + }, + "approve(address,uint256)": { + "notice": "Allows `spender` to withdraw from your account multiple times, up to `amount`." + }, + "approveAndCall(address,uint256,bytes)": { + "notice": "approve `amount` token to be spent by `spender` and callback into it via `onTokenApproval`" + }, + "balanceOf(address)": { + "notice": "Returns the account balance of another account with address `owner`." + }, + "decimals()": { + "notice": "Returns the number of decimals the token uses." + }, + "distributeAlongWithETH(address[],uint256)": { + "notice": "distribute" + }, + "eip712Domain()": { + "notice": "The return values of this function MUST describe the domain separator that is used for verification of EIP-712 signatures in the contract. They describe both the form of the EIP712Domain struct (i.e., which of the optional fields and extensions are present) and the value of each field, as follows." + }, + "nonces(address)": { + "notice": "return the current nonce of the owner" + }, + "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": { + "notice": "allow `spender` to spend `value` amount of token on behalf of `owner`" + }, + "symbol()": { + "notice": "Returns the symbol of the token." + }, + "totalSupply()": { + "notice": "Returns the total token supply." + }, + "transfer(address,uint256)": { + "notice": "Transfers `amount` of tokens to address `to`." + }, + "transferAlongWithETH(address,uint256)": { + "notice": "transfer" + }, + "transferAndCall(address,uint256,bytes)": { + "notice": "transfer `amount` token to `to` and callback into it via `onTokenTransfer`" + }, + "transferFrom(address,address,uint256)": { + "notice": "Transfers `amount` tokens from address `from` to address `to`." + }, + "transferFromAndCall(address,address,uint256,bytes)": { + "notice": "transfer `amount` token to `to` and callback into it via `onTokenTransfer`" + }, + "transferOnBehalfAndCall(address,address,uint256,bytes)": { + "notice": "transfer `amount` token to `to` and callback into it via `onTokenTransferedOnBehalf`" + } + }, + "notice": "Gems Tokens initialy generated by playing instances of Stratagems", + "version": 1 + }, + "argsData": "0x000000000000000000000000a372804ae197d71a358abb1b8691ada98ac9934900000000000000000000000061c461ecc993aadeb7e4b47e96d1b8cc37314b2000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "transaction": { + "hash": "0xa49c2c972af5f98d0ca4741ce4e9cb4c07c29c4f7b19bbeb5540dd67dd0a6947", + "nonce": "0x87", + "origin": "0x61c461ecc993aadeb7e4b47e96d1b8cc37314b20" + }, + "_format": "hh-sol-artifact-1" +} \ No newline at end of file diff --git a/contracts/deployments/sepolia/Gems_Implementation.json b/contracts/deployments/sepolia/Gems_Implementation.json new file mode 100644 index 00000000..d36e02ca --- /dev/null +++ b/contracts/deployments/sepolia/Gems_Implementation.json @@ -0,0 +1,987 @@ +{ + "address": "0xa372804ae197d71a358abb1b8691ada98ac99349", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "DeadlineOver", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "name": "InvalidAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "provided", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "InvalidMsgValue", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "provided", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "InvalidTotalAmount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentAllowance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "NotAuthorizedAllowance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "NotEnoughTokens", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "approveAndCall", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable[]", + "name": "tos", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "totalAmount", + "type": "uint256" + } + ], + "name": "distributeAlongWithETH", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "eip712Domain", + "outputs": [ + { + "internalType": "bytes1", + "name": "fields", + "type": "bytes1" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + }, + { + "internalType": "uint256", + "name": "chainID", + "type": "uint256" + }, + { + "internalType": "address", + "name": "verifyingContract", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256[]", + "name": "extensions", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferAlongWithETH", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "transferAndCall", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "transferFromAndCall", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "forAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "transferOnBehalfAndCall", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "contractName": "Gems", + "sourceName": "src/token/Gems.sol", + "bytecode": "0x60e060405234801562000010575f80fd5b5060405162001a5a38038062001a5a8339810160408190526200003391620001aa565b4660808190523090819081156200004b57816200004d565b305b6001600160a01b031660c08190526200006890829062000084565b60a052506200007c91508390508262000121565b505062000203565b5f7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866620000c860408051808201909152600481526347656d7360e01b602082015290565b80516020918201206040516200010293928791879101938452602084019290925260408301526001600160a01b0316606082015260800190565b6040516020818303038152906040528051906020012090505b92915050565b805f80828254620001339190620001e3565b90915550506001600160a01b0382165f908152600160205260408120805483929062000161908490620001e3565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b5f8060408385031215620001bc575f80fd5b82516001600160a01b0381168114620001d3575f80fd5b6020939093015192949293505050565b808201808211156200011b57634e487b7160e01b5f52601160045260245ffd5b60805160a05160c051611825620002355f395f8181610799015261100501525f61103001525f610fda01526118255ff3fe60806040526004361061013d575f3560e01c806370a08231116100bb578063c1d34b8911610071578063d505accf11610057578063d505accf146103d1578063dd62ed3e146103f2578063e7fcb06514610411575f80fd5b8063c1d34b8914610393578063cae9ca51146103b2575f80fd5b806384b0196e116100a157806384b0196e1461030557806395d89b411461032c578063a9059cbb14610374575f80fd5b806370a08231146102835780637ecebe00146102c4575f80fd5b806323b872dd116101105780633644e515116100f65780633644e515146102315780634000aea01461024557806365520efa14610264575f80fd5b806323b872dd146101f7578063313ce56714610216575f80fd5b806306fdde0314610141578063095ea7b3146101985780630e02df54146101c757806318160ddd146101da575b5f80fd5b34801561014c575f80fd5b5060408051808201909152600481527f47656d730000000000000000000000000000000000000000000000000000000060208201525b60405161018f91906111b3565b60405180910390f35b3480156101a3575f80fd5b506101b76101b23660046111f0565b610424565b604051901515815260200161018f565b6101b76101d5366004611257565b61043a565b3480156101e5575f80fd5b505f545b60405190815260200161018f565b348015610202575f80fd5b506101b761021136600461133b565b6105c7565b348015610221575f80fd5b506040516012815260200161018f565b34801561023c575f80fd5b506101e96105dd565b348015610250575f80fd5b506101b761025f3660046113be565b6105e6565b34801561026f575f80fd5b506101b761027e366004611416565b610693565b34801561028e575f80fd5b506101e961029d366004611484565b73ffffffffffffffffffffffffffffffffffffffff165f9081526001602052604090205490565b3480156102cf575f80fd5b506101e96102de366004611484565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b348015610310575f80fd5b50610319610743565b60405161018f979695949392919061149f565b348015610337575f80fd5b506101826040518060400160405280600381526020017f47454d000000000000000000000000000000000000000000000000000000000081525081565b34801561037f575f80fd5b506101b761038e3660046111f0565b6107c3565b34801561039e575f80fd5b506101b76103ad366004611416565b6107cf565b3480156103bd575f80fd5b506101b76103cc3660046113be565b610833565b3480156103dc575f80fd5b506103f06103eb36600461155c565b610895565b005b3480156103fd575f80fd5b506101e961040c3660046115cd565b610b58565b6101b761041f3660046111f0565b610bd5565b5f610430338484610c20565b5060015b92915050565b5f808351346104499190611631565b90508351816104589190611669565b34146104ac573484518261046c9190611669565b6040517f1f89f671000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044015b60405180910390fd5b5f8451846104ba9190611631565b90508451816104c99190611669565b841461051857838551826104dd9190611669565b6040517fe93890a2000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016104a3565b5f5b85518110156105b6576105473387838151811061053957610539611680565b602002602001015184610cfd565b85818151811061055957610559611680565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166108fc8490811502906040515f60405180830381858888f193505050501580156105a3573d5f803e3d5ffd5b50806105ae816116ad565b91505061051a565b50600195945050505050565b905090565b5f6105d3848484610ead565b5060019392505050565b5f6105c2610fd6565b5f6105f2338686610cfd565b6040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063a4c0ed369061064a90339088908890889060040161172b565b6020604051808303815f875af1158015610666573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061068a9190611760565b95945050505050565b5f61069f338686610cfd565b6040517f2eedcb7100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861690632eedcb71906106f99033908a9089908990899060040161177f565b6020604051808303815f875af1158015610715573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107399190611760565b9695505050505050565b7f0d000000000000000000000000000000000000000000000000000000000000006060805f808083610773611056565b60408051602080820183525f8083528351818152918201909352999a92999098504697507f0000000000000000000000000000000000000000000000000000000000000000965090945092509050565b5f610430338484610cfd565b5f6107db868686610ead565b6040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063a4c0ed36906106f990899088908890889060040161172b565b5f61083f338686610c20565b6040517eba451f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169062ba451f9061064a90339088908890889060040161172b565b73ffffffffffffffffffffffffffffffffffffffff87166108e4576040517f8e4c8aa60000000000000000000000000000000000000000000000000000000081525f60048201526024016104a3565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260036020526040812054906109126105dd565b604080517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9602082015273ffffffffffffffffffffffffffffffffffffffff808d1692820192909252908a1660608201526080810189905260a0810184905260c0810188905260e001604051602081830303815290604052805190602001206040516020016109d39291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f845290830180835281905260ff8816918301919091526060820186905260808201859052915060019060a0016020604051602081039080840390855afa158015610a56573d5f803e3d5ffd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614610ac4576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8515801590610ad257508542115b15610b12576040517fdd6b219a000000000000000000000000000000000000000000000000000000008152426004820152602481018790526044016104a3565b610b1d8260016117c9565b73ffffffffffffffffffffffffffffffffffffffff8a165f90815260036020526040902055610b4d898989610c20565b505050505050505050565b5f3073ffffffffffffffffffffffffffffffffffffffff841603610b9d57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610434565b5073ffffffffffffffffffffffffffffffffffffffff9182165f90815260026020908152604080832093909416825291909152205490565b5f610be1338484610cfd565b60405173ffffffffffffffffffffffffffffffffffffffff8416903480156108fc02915f818181858888f193505050501580156105d3573d5f803e3d5ffd5b73ffffffffffffffffffffffffffffffffffffffff83161580610c57575073ffffffffffffffffffffffffffffffffffffffff8216155b15610c90576040517f8e4c8aa60000000000000000000000000000000000000000000000000000000081525f60048201526024016104a3565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff82161580610d35575073ffffffffffffffffffffffffffffffffffffffff821630145b15610d84576040517f8e4c8aa600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016104a3565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526001602052604090205481811015610ded576040517f6584853f00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016104a3565b610df782826117dc565b73ffffffffffffffffffffffffffffffffffffffff8086165f908152600160205260408082209390935590851681529081208054849290610e399084906117c9565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e9f91815260200190565b60405180910390a350505050565b3373ffffffffffffffffffffffffffffffffffffffff841614801590610ee9575073ffffffffffffffffffffffffffffffffffffffff83163014155b15610fc65773ffffffffffffffffffffffffffffffffffffffff83165f9081526002602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610fc45781811015610f89576040517f95fcd25400000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016104a3565b610f9382826117dc565b73ffffffffffffffffffffffffffffffffffffffff85165f9081526002602090815260408083203384529091529020555b505b610fd1838383610cfd565b505050565b5f467f0000000000000000000000000000000000000000000000000000000000000000811461102e57611029817f0000000000000000000000000000000000000000000000000000000000000000611092565b611050565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b60606105c260408051808201909152600481527f47656d7300000000000000000000000000000000000000000000000000000000602082015290565b5f7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666110ee60408051808201909152600481527f47656d7300000000000000000000000000000000000000000000000000000000602082015290565b8051602091820120604051611134939287918791019384526020840192909252604083015273ffffffffffffffffffffffffffffffffffffffff16606082015260800190565b60405160208183030381529060405280519060200120905092915050565b5f81518084525f5b818110156111765760208185018101518683018201520161115a565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6111c56020830184611152565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146111ed575f80fd5b50565b5f8060408385031215611201575f80fd5b823561120c816111cc565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b8035611252816111cc565b919050565b5f8060408385031215611268575f80fd5b823567ffffffffffffffff8082111561127f575f80fd5b818501915085601f830112611292575f80fd5b81356020828211156112a6576112a661121a565b8160051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811086821117156112e9576112e961121a565b604052928352818301935084810182019289841115611306575f80fd5b948201945b8386101561132b5761131c86611247565b8552948201949382019361130b565b9997909101359750505050505050565b5f805f6060848603121561134d575f80fd5b8335611358816111cc565b92506020840135611368816111cc565b929592945050506040919091013590565b5f8083601f840112611389575f80fd5b50813567ffffffffffffffff8111156113a0575f80fd5b6020830191508360208285010111156113b7575f80fd5b9250929050565b5f805f80606085870312156113d1575f80fd5b84356113dc816111cc565b935060208501359250604085013567ffffffffffffffff8111156113fe575f80fd5b61140a87828801611379565b95989497509550505050565b5f805f805f6080868803121561142a575f80fd5b8535611435816111cc565b94506020860135611445816111cc565b935060408601359250606086013567ffffffffffffffff811115611467575f80fd5b61147388828901611379565b969995985093965092949392505050565b5f60208284031215611494575f80fd5b81356111c5816111cc565b7fff00000000000000000000000000000000000000000000000000000000000000881681525f602060e0818401526114da60e084018a611152565b83810360408501526114ec818a611152565b6060850189905273ffffffffffffffffffffffffffffffffffffffff8816608086015260a0850187905284810360c086015285518082528387019250908301905f5b8181101561154a5783518352928401929184019160010161152e565b50909c9b505050505050505050505050565b5f805f805f805f60e0888a031215611572575f80fd5b873561157d816111cc565b9650602088013561158d816111cc565b95506040880135945060608801359350608088013560ff811681146115b0575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156115de575f80fd5b82356115e9816111cc565b915060208301356115f9816111cc565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f82611664577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b808202811582820484141761043457610434611604565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036116dd576116dd611604565b5060010190565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6107396060830184866116e4565b5f60208284031215611770575f80fd5b815180151581146111c5575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff8088168352808716602084015250846040830152608060608301526117be6080830184866116e4565b979650505050505050565b8082018082111561043457610434611604565b818103818111156104345761043461160456fea2646970667358221220176888c253ea62d60e8b85116aad0a658dd29f3cc3d4c183633dc0d94e9023d564736f6c63430008140033", + "deployedBytecode": "0x60806040526004361061013d575f3560e01c806370a08231116100bb578063c1d34b8911610071578063d505accf11610057578063d505accf146103d1578063dd62ed3e146103f2578063e7fcb06514610411575f80fd5b8063c1d34b8914610393578063cae9ca51146103b2575f80fd5b806384b0196e116100a157806384b0196e1461030557806395d89b411461032c578063a9059cbb14610374575f80fd5b806370a08231146102835780637ecebe00146102c4575f80fd5b806323b872dd116101105780633644e515116100f65780633644e515146102315780634000aea01461024557806365520efa14610264575f80fd5b806323b872dd146101f7578063313ce56714610216575f80fd5b806306fdde0314610141578063095ea7b3146101985780630e02df54146101c757806318160ddd146101da575b5f80fd5b34801561014c575f80fd5b5060408051808201909152600481527f47656d730000000000000000000000000000000000000000000000000000000060208201525b60405161018f91906111b3565b60405180910390f35b3480156101a3575f80fd5b506101b76101b23660046111f0565b610424565b604051901515815260200161018f565b6101b76101d5366004611257565b61043a565b3480156101e5575f80fd5b505f545b60405190815260200161018f565b348015610202575f80fd5b506101b761021136600461133b565b6105c7565b348015610221575f80fd5b506040516012815260200161018f565b34801561023c575f80fd5b506101e96105dd565b348015610250575f80fd5b506101b761025f3660046113be565b6105e6565b34801561026f575f80fd5b506101b761027e366004611416565b610693565b34801561028e575f80fd5b506101e961029d366004611484565b73ffffffffffffffffffffffffffffffffffffffff165f9081526001602052604090205490565b3480156102cf575f80fd5b506101e96102de366004611484565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b348015610310575f80fd5b50610319610743565b60405161018f979695949392919061149f565b348015610337575f80fd5b506101826040518060400160405280600381526020017f47454d000000000000000000000000000000000000000000000000000000000081525081565b34801561037f575f80fd5b506101b761038e3660046111f0565b6107c3565b34801561039e575f80fd5b506101b76103ad366004611416565b6107cf565b3480156103bd575f80fd5b506101b76103cc3660046113be565b610833565b3480156103dc575f80fd5b506103f06103eb36600461155c565b610895565b005b3480156103fd575f80fd5b506101e961040c3660046115cd565b610b58565b6101b761041f3660046111f0565b610bd5565b5f610430338484610c20565b5060015b92915050565b5f808351346104499190611631565b90508351816104589190611669565b34146104ac573484518261046c9190611669565b6040517f1f89f671000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044015b60405180910390fd5b5f8451846104ba9190611631565b90508451816104c99190611669565b841461051857838551826104dd9190611669565b6040517fe93890a2000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016104a3565b5f5b85518110156105b6576105473387838151811061053957610539611680565b602002602001015184610cfd565b85818151811061055957610559611680565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166108fc8490811502906040515f60405180830381858888f193505050501580156105a3573d5f803e3d5ffd5b50806105ae816116ad565b91505061051a565b50600195945050505050565b905090565b5f6105d3848484610ead565b5060019392505050565b5f6105c2610fd6565b5f6105f2338686610cfd565b6040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063a4c0ed369061064a90339088908890889060040161172b565b6020604051808303815f875af1158015610666573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061068a9190611760565b95945050505050565b5f61069f338686610cfd565b6040517f2eedcb7100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861690632eedcb71906106f99033908a9089908990899060040161177f565b6020604051808303815f875af1158015610715573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107399190611760565b9695505050505050565b7f0d000000000000000000000000000000000000000000000000000000000000006060805f808083610773611056565b60408051602080820183525f8083528351818152918201909352999a92999098504697507f0000000000000000000000000000000000000000000000000000000000000000965090945092509050565b5f610430338484610cfd565b5f6107db868686610ead565b6040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063a4c0ed36906106f990899088908890889060040161172b565b5f61083f338686610c20565b6040517eba451f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169062ba451f9061064a90339088908890889060040161172b565b73ffffffffffffffffffffffffffffffffffffffff87166108e4576040517f8e4c8aa60000000000000000000000000000000000000000000000000000000081525f60048201526024016104a3565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260036020526040812054906109126105dd565b604080517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9602082015273ffffffffffffffffffffffffffffffffffffffff808d1692820192909252908a1660608201526080810189905260a0810184905260c0810188905260e001604051602081830303815290604052805190602001206040516020016109d39291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f845290830180835281905260ff8816918301919091526060820186905260808201859052915060019060a0016020604051602081039080840390855afa158015610a56573d5f803e3d5ffd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614610ac4576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8515801590610ad257508542115b15610b12576040517fdd6b219a000000000000000000000000000000000000000000000000000000008152426004820152602481018790526044016104a3565b610b1d8260016117c9565b73ffffffffffffffffffffffffffffffffffffffff8a165f90815260036020526040902055610b4d898989610c20565b505050505050505050565b5f3073ffffffffffffffffffffffffffffffffffffffff841603610b9d57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610434565b5073ffffffffffffffffffffffffffffffffffffffff9182165f90815260026020908152604080832093909416825291909152205490565b5f610be1338484610cfd565b60405173ffffffffffffffffffffffffffffffffffffffff8416903480156108fc02915f818181858888f193505050501580156105d3573d5f803e3d5ffd5b73ffffffffffffffffffffffffffffffffffffffff83161580610c57575073ffffffffffffffffffffffffffffffffffffffff8216155b15610c90576040517f8e4c8aa60000000000000000000000000000000000000000000000000000000081525f60048201526024016104a3565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff82161580610d35575073ffffffffffffffffffffffffffffffffffffffff821630145b15610d84576040517f8e4c8aa600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016104a3565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526001602052604090205481811015610ded576040517f6584853f00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016104a3565b610df782826117dc565b73ffffffffffffffffffffffffffffffffffffffff8086165f908152600160205260408082209390935590851681529081208054849290610e399084906117c9565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e9f91815260200190565b60405180910390a350505050565b3373ffffffffffffffffffffffffffffffffffffffff841614801590610ee9575073ffffffffffffffffffffffffffffffffffffffff83163014155b15610fc65773ffffffffffffffffffffffffffffffffffffffff83165f9081526002602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610fc45781811015610f89576040517f95fcd25400000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016104a3565b610f9382826117dc565b73ffffffffffffffffffffffffffffffffffffffff85165f9081526002602090815260408083203384529091529020555b505b610fd1838383610cfd565b505050565b5f467f0000000000000000000000000000000000000000000000000000000000000000811461102e57611029817f0000000000000000000000000000000000000000000000000000000000000000611092565b611050565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b60606105c260408051808201909152600481527f47656d7300000000000000000000000000000000000000000000000000000000602082015290565b5f7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666110ee60408051808201909152600481527f47656d7300000000000000000000000000000000000000000000000000000000602082015290565b8051602091820120604051611134939287918791019384526020840192909252604083015273ffffffffffffffffffffffffffffffffffffffff16606082015260800190565b60405160208183030381529060405280519060200120905092915050565b5f81518084525f5b818110156111765760208185018101518683018201520161115a565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6111c56020830184611152565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146111ed575f80fd5b50565b5f8060408385031215611201575f80fd5b823561120c816111cc565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b8035611252816111cc565b919050565b5f8060408385031215611268575f80fd5b823567ffffffffffffffff8082111561127f575f80fd5b818501915085601f830112611292575f80fd5b81356020828211156112a6576112a661121a565b8160051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811086821117156112e9576112e961121a565b604052928352818301935084810182019289841115611306575f80fd5b948201945b8386101561132b5761131c86611247565b8552948201949382019361130b565b9997909101359750505050505050565b5f805f6060848603121561134d575f80fd5b8335611358816111cc565b92506020840135611368816111cc565b929592945050506040919091013590565b5f8083601f840112611389575f80fd5b50813567ffffffffffffffff8111156113a0575f80fd5b6020830191508360208285010111156113b7575f80fd5b9250929050565b5f805f80606085870312156113d1575f80fd5b84356113dc816111cc565b935060208501359250604085013567ffffffffffffffff8111156113fe575f80fd5b61140a87828801611379565b95989497509550505050565b5f805f805f6080868803121561142a575f80fd5b8535611435816111cc565b94506020860135611445816111cc565b935060408601359250606086013567ffffffffffffffff811115611467575f80fd5b61147388828901611379565b969995985093965092949392505050565b5f60208284031215611494575f80fd5b81356111c5816111cc565b7fff00000000000000000000000000000000000000000000000000000000000000881681525f602060e0818401526114da60e084018a611152565b83810360408501526114ec818a611152565b6060850189905273ffffffffffffffffffffffffffffffffffffffff8816608086015260a0850187905284810360c086015285518082528387019250908301905f5b8181101561154a5783518352928401929184019160010161152e565b50909c9b505050505050505050505050565b5f805f805f805f60e0888a031215611572575f80fd5b873561157d816111cc565b9650602088013561158d816111cc565b95506040880135945060608801359350608088013560ff811681146115b0575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156115de575f80fd5b82356115e9816111cc565b915060208301356115f9816111cc565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f82611664577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b808202811582820484141761043457610434611604565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036116dd576116dd611604565b5060010190565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6107396060830184866116e4565b5f60208284031215611770575f80fd5b815180151581146111c5575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff8088168352808716602084015250846040830152608060608301526117be6080830184866116e4565b979650505050505050565b8082018082111561043457610434611604565b818103818111156104345761043461160456fea2646970667358221220176888c253ea62d60e8b85116aad0a658dd29f3cc3d4c183633dc0d94e9023d564736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {}, + "devdoc": { + "author": "Ronan Sandford", + "errors": { + "DeadlineOver(uint256,uint256)": [ + { + "params": { + "currentTime": "time at which the error happen", + "deadline": "the deadline" + } + } + ], + "InvalidAddress(address)": [ + { + "params": { + "addr": "invalid address" + } + } + ], + "InvalidMsgValue(uint256,uint256)": [ + { + "params": { + "expected": "value expected", + "provided": "msg.value amount provided" + } + } + ], + "InvalidTotalAmount(uint256,uint256)": [ + { + "params": { + "expected": "value expected", + "provided": "msg.value amount provided" + } + } + ], + "NotAuthorizedAllowance(uint256,uint256)": [ + { + "params": { + "currentAllowance": "the current allowance", + "expected": "amount expected" + } + } + ], + "NotEnoughTokens(uint256,uint256)": [ + { + "params": { + "currentBalance": "the current balance", + "expected": "amount expected" + } + } + ] + }, + "events": { + "Approval(address,address,uint256)": { + "params": { + "owner": "the account approving the `spender`", + "spender": "the account allowed to spend", + "value": "the amount granted" + } + }, + "Transfer(address,address,uint256)": { + "params": { + "from": "the account the tokens are sent from", + "to": "the account the tokens are sent to", + "value": "number of tokens sent" + } + } + }, + "kind": "dev", + "methods": { + "approveAndCall(address,uint256,bytes)": { + "params": { + "amount": "number of token to transfer", + "data": "extra data", + "spender": "account to send the token for" + }, + "returns": { + "_0": "success" + } + }, + "eip712Domain()": { + "returns": { + "chainID": "EIP-712 chainID", + "extensions": "A list of EIP numbers that specify additional fields in the domain. The method to obtain the value for each of these additional fields and any conditions for inclusion are expected to be specified in the respective EIP. The value of fields does not affect their inclusion.", + "fields": "A bit map where bit i is set to 1 if and only if domain field i is present (0 ≤ i ≤ 4). Bits are read from least significant to most significant, and fields are indexed in the order that is specified by EIP-712, identical to the order in which they are listed in the function type.", + "name": "EIP-712 name", + "salt": "EIP-712 salt", + "verifyingContract": "EIP-712 name verifyingContract", + "version": "EIP-712 version" + } + }, + "nonces(address)": { + "params": { + "owner": "address queried" + }, + "returns": { + "_0": "nonce value" + } + }, + "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": { + "params": { + "deadline": "timestamp in seconds after which the permit is not valid.", + "owner": "owner of the tokens", + "r": "signature part r", + "s": "signature part s", + "spender": "address allowed to spend on behalf of the owner.", + "v": "signature part v", + "value": "amount of token allowed to be spent" + } + }, + "transferAndCall(address,uint256,bytes)": { + "params": { + "amount": "number of token to transfer", + "data": "extra data", + "to": "account to receive the tokens" + }, + "returns": { + "_0": "success" + } + }, + "transferFromAndCall(address,address,uint256,bytes)": { + "params": { + "amount": "number of token to transfer", + "data": "extra data", + "from": "account to send the token from", + "to": "account to receive the tokens" + }, + "returns": { + "_0": "success" + } + }, + "transferOnBehalfAndCall(address,address,uint256,bytes)": { + "params": { + "amount": "number of token to transfer", + "data": "extra data", + "forAddress": "account to send the token for", + "to": "account to receive the tokens" + }, + "returns": { + "_0": "success" + } + } + }, + "title": "Gems Tokens", + "version": 1 + }, + "evm": { + "gasEstimates": { + "creation": { + "codeDepositCost": "1236200", + "executionCost": "infinite", + "totalCost": "infinite" + }, + "external": { + "DOMAIN_SEPARATOR()": "infinite", + "allowance(address,address)": "infinite", + "approve(address,uint256)": "24599", + "approveAndCall(address,uint256,bytes)": "infinite", + "balanceOf(address)": "2550", + "decimals()": "244", + "distributeAlongWithETH(address[],uint256)": "infinite", + "eip712Domain()": "infinite", + "name()": "infinite", + "nonces(address)": "2572", + "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": "infinite", + "symbol()": "infinite", + "totalSupply()": "2369", + "transfer(address,uint256)": "infinite", + "transferAlongWithETH(address,uint256)": "infinite", + "transferAndCall(address,uint256,bytes)": "infinite", + "transferFrom(address,address,uint256)": "infinite", + "transferFromAndCall(address,address,uint256,bytes)": "infinite", + "transferOnBehalfAndCall(address,address,uint256,bytes)": "infinite" + } + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"DeadlineOver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"provided\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"}],\"name\":\"InvalidMsgValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"provided\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"}],\"name\":\"InvalidTotalAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentAllowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"}],\"name\":\"NotAuthorizedAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"}],\"name\":\"NotEnoughTokens\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"approveAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"tos\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"totalAmount\",\"type\":\"uint256\"}],\"name\":\"distributeAlongWithETH\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eip712Domain\",\"outputs\":[{\"internalType\":\"bytes1\",\"name\":\"fields\",\"type\":\"bytes1\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"chainID\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"verifyingContract\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"extensions\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferAlongWithETH\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferFromAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferOnBehalfAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Ronan Sandford\",\"errors\":{\"DeadlineOver(uint256,uint256)\":[{\"params\":{\"currentTime\":\"time at which the error happen\",\"deadline\":\"the deadline\"}}],\"InvalidAddress(address)\":[{\"params\":{\"addr\":\"invalid address\"}}],\"InvalidMsgValue(uint256,uint256)\":[{\"params\":{\"expected\":\"value expected\",\"provided\":\"msg.value amount provided\"}}],\"InvalidTotalAmount(uint256,uint256)\":[{\"params\":{\"expected\":\"value expected\",\"provided\":\"msg.value amount provided\"}}],\"NotAuthorizedAllowance(uint256,uint256)\":[{\"params\":{\"currentAllowance\":\"the current allowance\",\"expected\":\"amount expected\"}}],\"NotEnoughTokens(uint256,uint256)\":[{\"params\":{\"currentBalance\":\"the current balance\",\"expected\":\"amount expected\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"the account approving the `spender`\",\"spender\":\"the account allowed to spend\",\"value\":\"the amount granted\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"the account the tokens are sent from\",\"to\":\"the account the tokens are sent to\",\"value\":\"number of tokens sent\"}}},\"kind\":\"dev\",\"methods\":{\"approveAndCall(address,uint256,bytes)\":{\"params\":{\"amount\":\"number of token to transfer\",\"data\":\"extra data\",\"spender\":\"account to send the token for\"},\"returns\":{\"_0\":\"success\"}},\"eip712Domain()\":{\"returns\":{\"chainID\":\"EIP-712 chainID\",\"extensions\":\"A list of EIP numbers that specify additional fields in the domain. The method to obtain the value for each of these additional fields and any conditions for inclusion are expected to be specified in the respective EIP. The value of fields does not affect their inclusion.\",\"fields\":\"A bit map where bit i is set to 1 if and only if domain field i is present (0 \\u2264 i \\u2264 4). Bits are read from least significant to most significant, and fields are indexed in the order that is specified by EIP-712, identical to the order in which they are listed in the function type.\",\"name\":\"EIP-712 name\",\"salt\":\"EIP-712 salt\",\"verifyingContract\":\"EIP-712 name verifyingContract\",\"version\":\"EIP-712 version\"}},\"nonces(address)\":{\"params\":{\"owner\":\"address queried\"},\"returns\":{\"_0\":\"nonce value\"}},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"params\":{\"deadline\":\"timestamp in seconds after which the permit is not valid.\",\"owner\":\"owner of the tokens\",\"r\":\"signature part r\",\"s\":\"signature part s\",\"spender\":\"address allowed to spend on behalf of the owner.\",\"v\":\"signature part v\",\"value\":\"amount of token allowed to be spent\"}},\"transferAndCall(address,uint256,bytes)\":{\"params\":{\"amount\":\"number of token to transfer\",\"data\":\"extra data\",\"to\":\"account to receive the tokens\"},\"returns\":{\"_0\":\"success\"}},\"transferFromAndCall(address,address,uint256,bytes)\":{\"params\":{\"amount\":\"number of token to transfer\",\"data\":\"extra data\",\"from\":\"account to send the token from\",\"to\":\"account to receive the tokens\"},\"returns\":{\"_0\":\"success\"}},\"transferOnBehalfAndCall(address,address,uint256,bytes)\":{\"params\":{\"amount\":\"number of token to transfer\",\"data\":\"extra data\",\"forAddress\":\"account to send the token for\",\"to\":\"account to receive the tokens\"},\"returns\":{\"_0\":\"success\"}}},\"title\":\"Gems Tokens\",\"version\":1},\"userdoc\":{\"errors\":{\"DeadlineOver(uint256,uint256)\":[{\"notice\":\"The permit has expired\"}],\"InvalidAddress(address)\":[{\"notice\":\"An invalid address is specified (for example: zero address)\"}],\"InvalidMsgValue(uint256,uint256)\":[{\"notice\":\"The msg value do not match the expected value\"}],\"InvalidSignature()\":[{\"notice\":\"The signature do not match the expected signer\"}],\"InvalidTotalAmount(uint256,uint256)\":[{\"notice\":\"The total amount provided do not match the expected value\"}],\"NotAuthorizedAllowance(uint256,uint256)\":[{\"notice\":\"the amount requested exceed the allowance\"}],\"NotEnoughTokens(uint256,uint256)\":[{\"notice\":\"the amount requested exceed the balance\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"trigger on approval amount being set. Note that Transfer events need to be considered to compute the current allowance.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"trigger when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"notice\":\"EIP-712 Domain separator hash\"},\"allowance(address,address)\":{\"notice\":\"Returns the amount which `spender` is still allowed to withdraw from `owner`.\"},\"approve(address,uint256)\":{\"notice\":\"Allows `spender` to withdraw from your account multiple times, up to `amount`.\"},\"approveAndCall(address,uint256,bytes)\":{\"notice\":\"approve `amount` token to be spent by `spender` and callback into it via `onTokenApproval`\"},\"balanceOf(address)\":{\"notice\":\"Returns the account balance of another account with address `owner`.\"},\"decimals()\":{\"notice\":\"Returns the number of decimals the token uses.\"},\"distributeAlongWithETH(address[],uint256)\":{\"notice\":\"distribute\"},\"eip712Domain()\":{\"notice\":\"The return values of this function MUST describe the domain separator that is used for verification of EIP-712 signatures in the contract. They describe both the form of the EIP712Domain struct (i.e., which of the optional fields and extensions are present) and the value of each field, as follows.\"},\"nonces(address)\":{\"notice\":\"return the current nonce of the owner\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"allow `spender` to spend `value` amount of token on behalf of `owner`\"},\"symbol()\":{\"notice\":\"Returns the symbol of the token.\"},\"totalSupply()\":{\"notice\":\"Returns the total token supply.\"},\"transfer(address,uint256)\":{\"notice\":\"Transfers `amount` of tokens to address `to`.\"},\"transferAlongWithETH(address,uint256)\":{\"notice\":\"transfer\"},\"transferAndCall(address,uint256,bytes)\":{\"notice\":\"transfer `amount` token to `to` and callback into it via `onTokenTransfer`\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfers `amount` tokens from address `from` to address `to`.\"},\"transferFromAndCall(address,address,uint256,bytes)\":{\"notice\":\"transfer `amount` token to `to` and callback into it via `onTokenTransfer`\"},\"transferOnBehalfAndCall(address,address,uint256,bytes)\":{\"notice\":\"transfer `amount` token to `to` and callback into it via `onTokenTransferedOnBehalf`\"}},\"notice\":\"Gems Tokens initialy generated by playing instances of Stratagems\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/token/Gems.sol\":\"Gems\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solidity-kit/solc_0.8/ERC20/ERC2612/implementations/UsingPermit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport '../../implementations/ImplementingERC20Internal.sol';\\nimport '../interfaces/IERC2612.sol';\\nimport '../../../ERC712/implementations/UsingERC712.sol';\\nimport '../../../ERC712/implementations/ImplementingExternalDomainSeparator.sol';\\n\\nabstract contract UsingPermit is ImplementingERC20Internal, ImplementingExternalDomainSeparator, UsingERC712, IERC2612 {\\n\\tbytes32 internal constant PERMIT_TYPEHASH =\\n\\t\\tkeccak256('Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)');\\n\\n\\tmapping(address => uint256) internal _nonces;\\n\\n\\t/// @inheritdoc IERC2612\\n\\tfunction nonces(address owner) external view returns (uint256) {\\n\\t\\treturn _nonces[owner];\\n\\t}\\n\\n\\t/// @inheritdoc IERC2612\\n\\tfunction DOMAIN_SEPARATOR()\\n\\t\\tpublic\\n\\t\\tview\\n\\t\\tvirtual\\n\\t\\toverride(IERC2612, ImplementingExternalDomainSeparator)\\n\\t\\treturns (bytes32);\\n\\n\\t/// @inheritdoc IERC2612\\n\\tfunction permit(\\n\\t\\taddress owner,\\n\\t\\taddress spender,\\n\\t\\tuint256 value,\\n\\t\\tuint256 deadline,\\n\\t\\tuint8 v,\\n\\t\\tbytes32 r,\\n\\t\\tbytes32 s\\n\\t) external override {\\n\\t\\tif (owner == address(0)) {\\n\\t\\t\\trevert InvalidAddress(address(0));\\n\\t\\t}\\n\\n\\t\\tuint256 currentNonce = _nonces[owner];\\n\\t\\tbytes32 digest = keccak256(\\n\\t\\t\\tabi.encodePacked(\\n\\t\\t\\t\\t'\\\\x19\\\\x01',\\n\\t\\t\\t\\tDOMAIN_SEPARATOR(),\\n\\t\\t\\t\\tkeccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, currentNonce, deadline))\\n\\t\\t\\t)\\n\\t\\t);\\n\\t\\tif (owner != ecrecover(digest, v, r, s)) {\\n\\t\\t\\trevert InvalidSignature();\\n\\t\\t}\\n\\t\\tif (deadline != 0 && block.timestamp > deadline) {\\n\\t\\t\\trevert DeadlineOver(block.timestamp, deadline);\\n\\t\\t}\\n\\n\\t\\t_nonces[owner] = currentNonce + 1;\\n\\t\\t_approveFor(owner, spender, value);\\n\\t}\\n}\\n\",\"keccak256\":\"0x311115bfcaa89f3acdddfa261794e47ebf87ce81436c2758456900b8c6d81053\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/ERC2612/implementations/UsingPermitWithDynamicChainID.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./UsingPermit.sol\\\";\\nimport \\\"../../../ERC712/implementations/UsingERC712WithDynamicChainID.sol\\\";\\n\\nabstract contract UsingPermitWithDynamicChainID is UsingPermit, UsingERC712WithDynamicChainID {\\n\\tconstructor(address verifyingContract) UsingERC712WithDynamicChainID(verifyingContract) {}\\n\\n\\t/// @inheritdoc IERC2612\\n\\tfunction DOMAIN_SEPARATOR() public view virtual override returns (bytes32) {\\n\\t\\treturn _currentDomainSeparator();\\n\\t}\\n}\\n\",\"keccak256\":\"0xe21356300c4ccc093643cd925c5707fc0509559b8850e5d951b481d845310ee2\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/ERC2612/interfaces/IERC2612.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/IERC20Errors.sol\\\";\\n\\ninterface IERC2612 {\\n\\t/// @notice The signature do not match the expected signer\\n\\terror InvalidSignature();\\n\\t/// @notice The permit has expired\\n\\t/// @param currentTime time at which the error happen\\n\\t/// @param deadline the deadline\\n\\terror DeadlineOver(uint256 currentTime, uint256 deadline);\\n\\n\\t/// @notice allow `spender` to spend `value` amount of token on behalf of `owner`\\n\\t/// @param owner owner of the tokens\\n\\t/// @param spender address allowed to spend on behalf of the owner.\\n\\t/// @param value amount of token allowed to be spent\\n\\t/// @param deadline timestamp in seconds after which the permit is not valid.\\n\\t/// @param v signature part v\\n\\t/// @param r signature part r\\n\\t/// @param s signature part s\\n\\tfunction permit(\\n\\t\\taddress owner,\\n\\t\\taddress spender,\\n\\t\\tuint256 value,\\n\\t\\tuint256 deadline,\\n\\t\\tuint8 v,\\n\\t\\tbytes32 r,\\n\\t\\tbytes32 s\\n\\t) external;\\n\\n\\t/// @notice return the current nonce of the owner\\n\\t/// @param owner address queried\\n\\t/// @return nonce nonce value\\n\\tfunction nonces(address owner) external view returns (uint256 nonce);\\n\\n\\t/// @notice EIP-712 Domain separator hash\\n\\tfunction DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xe610994a34db6e750ee555ab2011292a980ec650e9afb7619fb0bc3fcad75095\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/implementations/ERC20Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IERC20.sol\\\";\\nimport \\\"../interfaces/IERC20WithCallback.sol\\\";\\nimport \\\"../interfaces/IERC20WithDistribution.sol\\\";\\nimport \\\"./ImplementingERC20Internal.sol\\\";\\nimport \\\"../../utils/Constants.sol\\\";\\n\\nabstract contract ERC20Base is IERC20, IERC20WithCallback, IERC20WithDistribution, ImplementingERC20Internal {\\n\\tuint256 internal _totalSupply;\\n\\tmapping(address => uint256) internal _balances;\\n\\tmapping(address => mapping(address => uint256)) internal _allowances;\\n\\n\\t/// @inheritdoc IERC20\\n\\tfunction totalSupply() external view override returns (uint256) {\\n\\t\\treturn _internal_totalSupply();\\n\\t}\\n\\n\\t/// @inheritdoc IERC20\\n\\tfunction balanceOf(address owner) external view override returns (uint256) {\\n\\t\\treturn _balances[owner];\\n\\t}\\n\\n\\t/// @inheritdoc IERC20\\n\\tfunction allowance(address owner, address spender) external view override returns (uint256) {\\n\\t\\tif (owner == address(this)) {\\n\\t\\t\\t// see transferFrom: address(this) allows anyone\\n\\t\\t\\treturn type(uint256).max;\\n\\t\\t}\\n\\t\\treturn _allowances[owner][spender];\\n\\t}\\n\\n\\t/// @inheritdoc IERC20\\n\\tfunction decimals() external pure virtual override returns (uint8) {\\n\\t\\treturn uint8(18);\\n\\t}\\n\\n\\t/// @inheritdoc IERC20\\n\\tfunction transfer(address to, uint256 amount) external override returns (bool) {\\n\\t\\t_transfer(msg.sender, to, amount);\\n\\t\\treturn true;\\n\\t}\\n\\n\\t/// @inheritdoc IERC20WithDistribution\\n\\tfunction transferAlongWithETH(address payable to, uint256 amount) external payable returns (bool) {\\n\\t\\t_transfer(msg.sender, to, amount);\\n\\t\\tto.transfer(msg.value);\\n\\t\\treturn true;\\n\\t}\\n\\n\\t/// @inheritdoc IERC20WithDistribution\\n\\tfunction distributeAlongWithETH(address payable[] memory tos, uint256 totalAmount) external payable returns (bool) {\\n\\t\\tuint256 val = msg.value / tos.length;\\n\\t\\tif (msg.value != val * tos.length) {\\n\\t\\t\\trevert InvalidMsgValue(msg.value, val * tos.length);\\n\\t\\t}\\n\\t\\tuint256 amount = totalAmount / tos.length;\\n\\t\\tif (totalAmount != amount * tos.length) {\\n\\t\\t\\trevert InvalidTotalAmount(totalAmount, amount * tos.length);\\n\\t\\t}\\n\\t\\tfor (uint256 i = 0; i < tos.length; i++) {\\n\\t\\t\\t_transfer(msg.sender, tos[i], amount);\\n\\t\\t\\ttos[i].transfer(val);\\n\\t\\t}\\n\\t\\treturn true;\\n\\t}\\n\\n\\t/// @inheritdoc IERC20WithCallback\\n\\tfunction transferAndCall(\\n\\t\\taddress to,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool) {\\n\\t\\t_transfer(msg.sender, to, amount);\\n\\t\\treturn ITransferReceiver(to).onTokenTransfer(msg.sender, amount, data);\\n\\t}\\n\\n\\t/// @inheritdoc IERC20WithCallback\\n\\tfunction transferFromAndCall(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool) {\\n\\t\\t_transferFrom(from, to, amount);\\n\\t\\treturn ITransferReceiver(to).onTokenTransfer(from, amount, data);\\n\\t}\\n\\n\\t/// @inheritdoc IERC20WithCallback\\n\\tfunction transferOnBehalfAndCall(\\n\\t\\taddress forAddress,\\n\\t\\taddress to,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool) {\\n\\t\\t_transfer(msg.sender, to, amount);\\n\\t\\treturn ITransferOnBehalfReceiver(to).onTokenTransferedOnBehalf(msg.sender, forAddress, amount, data);\\n\\t}\\n\\n\\t/// @inheritdoc IERC20\\n\\tfunction transferFrom(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 amount\\n\\t) external override returns (bool) {\\n\\t\\t_transferFrom(from, to, amount);\\n\\t\\treturn true;\\n\\t}\\n\\n\\t/// @inheritdoc IERC20\\n\\tfunction approve(address spender, uint256 amount) external override returns (bool) {\\n\\t\\t_approveFor(msg.sender, spender, amount);\\n\\t\\treturn true;\\n\\t}\\n\\n\\t/// @inheritdoc IERC20WithCallback\\n\\tfunction approveAndCall(\\n\\t\\taddress spender,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool) {\\n\\t\\t_approveFor(msg.sender, spender, amount);\\n\\t\\treturn IApprovalReceiver(spender).onTokenApproval(msg.sender, amount, data);\\n\\t}\\n\\n\\t// ------------------------------------------------------------------------------------------------------------------\\n\\t// INTERNALS\\n\\t// ------------------------------------------------------------------------------------------------------------------\\n\\n\\tfunction _internal_totalSupply() internal view override returns (uint256) {\\n\\t\\treturn _totalSupply;\\n\\t}\\n\\n\\tfunction _approveFor(\\n\\t\\taddress owner,\\n\\t\\taddress spender,\\n\\t\\tuint256 amount\\n\\t) internal override {\\n\\t\\tif (owner == address(0) || spender == address(0)) {\\n\\t\\t\\trevert InvalidAddress(address(0));\\n\\t\\t}\\n\\t\\t_allowances[owner][spender] = amount;\\n\\t\\temit Approval(owner, spender, amount);\\n\\t}\\n\\n\\tfunction _transferFrom(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 amount\\n\\t) internal {\\n\\t\\t// anybody can transfer from this\\n\\t\\t// this allow mintAndApprovedCall without gas overhead\\n\\t\\tif (msg.sender != from && from != address(this)) {\\n\\t\\t\\tuint256 currentAllowance = _allowances[from][msg.sender];\\n\\t\\t\\tif (currentAllowance != type(uint256).max) {\\n\\t\\t\\t\\t// save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n\\t\\t\\t\\tif (currentAllowance < amount) {\\n\\t\\t\\t\\t\\trevert NotAuthorizedAllowance(currentAllowance, amount);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t_allowances[from][msg.sender] = currentAllowance - amount;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t_transfer(from, to, amount);\\n\\t}\\n\\n\\tfunction _transfer(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 amount\\n\\t) internal {\\n\\t\\tif (to == address(0) || to == address(this)) {\\n\\t\\t\\trevert InvalidAddress(to);\\n\\t\\t}\\n\\t\\tuint256 currentBalance = _balances[from];\\n\\t\\tif (currentBalance < amount) {\\n\\t\\t\\trevert NotEnoughTokens(currentBalance, amount);\\n\\t\\t}\\n\\t\\t_balances[from] = currentBalance - amount;\\n\\t\\t_balances[to] += amount;\\n\\t\\temit Transfer(from, to, amount);\\n\\t}\\n\\n\\tfunction _transferAllIfAny(address from, address to) internal {\\n\\t\\tuint256 balanceLeft = _balances[from];\\n\\t\\tif (balanceLeft > 0) {\\n\\t\\t\\t_balances[from] = 0;\\n\\t\\t\\t_balances[to] += balanceLeft;\\n\\t\\t\\temit Transfer(from, to, balanceLeft);\\n\\t\\t}\\n\\t}\\n\\n\\tfunction _mint(address to, uint256 amount) internal override {\\n\\t\\t_totalSupply += amount;\\n\\t\\t_balances[to] += amount;\\n\\t\\temit Transfer(address(0), to, amount);\\n\\t}\\n\\n\\tfunction _burnFrom(address from, uint256 amount) internal override {\\n\\t\\tuint256 currentBalance = _balances[from];\\n\\t\\tif (currentBalance < amount) {\\n\\t\\t\\trevert NotEnoughTokens(currentBalance, amount);\\n\\t\\t}\\n\\t\\t_balances[from] = currentBalance - amount;\\n\\t\\t_totalSupply -= amount;\\n\\t\\temit Transfer(from, address(0), amount);\\n\\t}\\n}\\n\",\"keccak256\":\"0xfeb88cdc5795fe281cc9b13cb30ee9f57bf9e27ed719d96f599dd0a1a7e91dcd\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/implementations/ImplementingERC20Internal.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nabstract contract ImplementingERC20Internal {\\n\\tfunction _approveFor(\\n\\t\\taddress owner,\\n\\t\\taddress target,\\n\\t\\tuint256 amount\\n\\t) internal virtual;\\n\\n\\tfunction _mint(address to, uint256 amount) internal virtual;\\n\\n\\tfunction _burnFrom(address from, uint256 amount) internal virtual;\\n\\n\\tfunction _internal_totalSupply() internal view virtual returns (uint256);\\n}\\n\",\"keccak256\":\"0xa748d2b3c0573af21672cb5c19ea769ccec11fc03a2f7606213308d28a94f7ef\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IERC20Errors.sol\\\";\\n\\ninterface IERC20 {\\n\\t/// @notice trigger when tokens are transferred, including zero value transfers.\\n\\t/// @param from the account the tokens are sent from\\n\\t/// @param to the account the tokens are sent to\\n\\t/// @param value number of tokens sent\\n\\tevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n\\t/// @notice trigger on approval amount being set.\\n\\t/// Note that Transfer events need to be considered to compute the current allowance.\\n\\t/// @param owner the account approving the `spender`\\n\\t/// @param spender the account allowed to spend\\n\\t/// @param value the amount granted\\n\\tevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n\\t/// @notice Returns the total token supply.\\n\\tfunction totalSupply() external view returns (uint256);\\n\\n\\t/// @notice Returns the number of decimals the token uses.\\n\\tfunction decimals() external view returns (uint8);\\n\\n\\t/// @notice Returns the symbol of the token.\\n\\tfunction symbol() external view returns (string memory);\\n\\n\\t/// @notice Returns the name of the token.\\n\\tfunction name() external view returns (string memory);\\n\\n\\t/// @notice Returns the account balance of another account with address `owner`.\\n\\tfunction balanceOf(address owner) external view returns (uint256);\\n\\n\\t/// @notice Transfers `amount` of tokens to address `to`.\\n\\tfunction transfer(address to, uint256 amount) external returns (bool);\\n\\n\\t/// @notice Returns the amount which `spender` is still allowed to withdraw from `owner`.\\n\\tfunction allowance(address owner, address spender) external view returns (uint256);\\n\\n\\t/// @notice Allows `spender` to withdraw from your account multiple times, up to `amount`.\\n\\tfunction approve(address spender, uint256 amount) external returns (bool);\\n\\n\\t/// @notice Transfers `amount` tokens from address `from` to address `to`.\\n\\tfunction transferFrom(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 amount\\n\\t) external returns (bool);\\n}\\n\",\"keccak256\":\"0x68034c81cd7775e19a5bb75dd33022da7add3bc1852309eed9f797f1ff835507\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/interfaces/IERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/// @notice The msg value do not match the expected value\\n/// @param provided msg.value amount provided\\n/// @param expected value expected\\nerror InvalidMsgValue(uint256 provided, uint256 expected);\\n/// @notice The total amount provided do not match the expected value\\n/// @param provided msg.value amount provided\\n/// @param expected value expected\\nerror InvalidTotalAmount(uint256 provided, uint256 expected);\\n/// @notice An invalid address is specified (for example: zero address)\\n/// @param addr invalid address\\nerror InvalidAddress(address addr);\\n/// @notice the amount requested exceed the allowance\\n/// @param currentAllowance the current allowance\\n/// @param expected amount expected\\nerror NotAuthorizedAllowance(uint256 currentAllowance, uint256 expected);\\n/// @notice the amount requested exceed the balance\\n/// @param currentBalance the current balance\\n/// @param expected amount expected\\nerror NotEnoughTokens(uint256 currentBalance, uint256 expected);\\n\",\"keccak256\":\"0xc8ab4cfee19338da32d2fc5473e1ee740bf608c59196ebd16de74294c4813ae9\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/interfaces/IERC20WithCallback.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IERC20.sol\\\";\\n\\ninterface ITransferReceiver {\\n\\t/// @notice called by ERC20 token after transfer been executed.\\n\\t/// @param payer account sending the money\\n\\t/// @param amount number of token transfered\\n\\t/// @param data extra data\\n\\tfunction onTokenTransfer(\\n\\t\\taddress payer,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool);\\n}\\n\\ninterface ITransferOnBehalfReceiver {\\n\\t/// @notice called by ERC20 token after transfer been executed.\\n\\t/// @param payer account sending the money\\n\\t/// @param forAddress account to be considered as te actual payer\\n\\t/// @param amount number of token transfered\\n\\t/// @param data extra data\\n\\tfunction onTokenTransferedOnBehalf(\\n\\t\\taddress payer,\\n\\t\\taddress forAddress,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool);\\n}\\n\\ninterface IApprovalReceiver {\\n\\t/// @notice called by ERC20 token after transfer been executed.\\n\\t/// @param owner account that grant the approval\\n\\t/// @param amount number of token approved\\n\\t/// @param data extra data\\n\\tfunction onTokenApproval(\\n\\t\\taddress owner,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool);\\n}\\n\\ninterface IERC20WithCallback is IERC20 {\\n\\t/// @notice transfer `amount` token to `to` and callback into it via `onTokenTransfer`\\n\\t/// @param to account to receive the tokens\\n\\t/// @param amount number of token to transfer\\n\\t/// @param data extra data\\n\\t/// @return success\\n\\tfunction transferAndCall(\\n\\t\\taddress to,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool);\\n\\n\\t/// @notice transfer `amount` token to `to` and callback into it via `onTokenTransfer`\\n\\t/// @param from account to send the token from\\n\\t/// @param to account to receive the tokens\\n\\t/// @param amount number of token to transfer\\n\\t/// @param data extra data\\n\\t/// @return success\\n\\tfunction transferFromAndCall(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool);\\n\\n\\t/// @notice transfer `amount` token to `to` and callback into it via `onTokenTransferedOnBehalf`\\n\\t/// @param forAddress account to send the token for\\n\\t/// @param to account to receive the tokens\\n\\t/// @param amount number of token to transfer\\n\\t/// @param data extra data\\n\\t/// @return success\\n\\tfunction transferOnBehalfAndCall(\\n\\t\\taddress forAddress,\\n\\t\\taddress to,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool);\\n\\n\\t/// @notice approve `amount` token to be spent by `spender` and callback into it via `onTokenApproval`\\n\\t/// @param spender account to send the token for\\n\\t/// @param amount number of token to transfer\\n\\t/// @param data extra data\\n\\t/// @return success\\n\\tfunction approveAndCall(\\n\\t\\taddress spender,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool);\\n}\\n\",\"keccak256\":\"0xcbe7ac72af21634f11616ee1ff302df87039ec7d9752382ea7dbc748a5692f86\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/interfaces/IERC20WithDistribution.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IERC20.sol\\\";\\n\\ninterface IERC20WithDistribution is IERC20 {\\n\\t/// @notice transfer\\n\\tfunction transferAlongWithETH(address payable to, uint256 amount) external payable returns (bool);\\n\\n\\t/// @notice distribute\\n\\tfunction distributeAlongWithETH(address payable[] memory tos, uint256 totalAmount) external payable returns (bool);\\n}\\n\",\"keccak256\":\"0x8c46558a2161e80878f6102cd868c83a227d942ef1e38b639fc29b9c0025b7a3\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC712/implementations/ImplementingExternalDomainSeparator.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nabstract contract ImplementingExternalDomainSeparator {\\n\\t/// @notice EIP-712 Domain separator hash\\n\\tfunction DOMAIN_SEPARATOR() public view virtual returns (bytes32);\\n}\\n\",\"keccak256\":\"0xaeea9575d7d21d565d7148a9d57d5f559760e1e73a94e9038b2110cd50d1cd14\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC712/implementations/Named.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nabstract contract Named {\\n\\t/// @notice Returns the name of the contract.\\n\\tfunction name() public view virtual returns (string memory);\\n}\\n\",\"keccak256\":\"0x924b53f83a89b85206c14daea25f30248502b831f4424186c567581581c46794\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC712/implementations/UsingERC712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IERC5267.sol\\\";\\n\\nabstract contract UsingERC712 is IERC5267 {}\\n\",\"keccak256\":\"0x5b2d5c3dd2ebe8dedf66a6d1a8b01918a42dfe3bc00778dca06fdf7686b7699e\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC712/implementations/UsingERC712WithDynamicChainID.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./UsingERC712.sol\\\";\\nimport \\\"./Named.sol\\\";\\n\\nabstract contract UsingERC712WithDynamicChainID is UsingERC712, Named {\\n\\tuint256 private immutable _deploymentChainID;\\n\\tbytes32 private immutable _deploymentDomainSeparator;\\n\\taddress private immutable _verifyingContract;\\n\\n\\t/// @dev we let you specifying the verifying contract so that if you use a proxy, the implementation can use it.\\n\\tconstructor(address verifyingContract) {\\n\\t\\tuint256 chainID;\\n\\t\\tassembly {\\n\\t\\t\\tchainID := chainid()\\n\\t\\t}\\n\\n\\t\\t_deploymentChainID = chainID;\\n\\t\\t_verifyingContract = verifyingContract == address(0) ? address(this) : verifyingContract;\\n\\t\\t_deploymentDomainSeparator = _calculateDomainSeparator(chainID, _verifyingContract);\\n\\t}\\n\\n\\t/// @inheritdoc IERC5267\\n\\tfunction eip712Domain()\\n\\t\\texternal\\n\\t\\tview\\n\\t\\tvirtual\\n\\t\\toverride\\n\\t\\treturns (\\n\\t\\t\\tbytes1 fields,\\n\\t\\t\\tstring memory name,\\n\\t\\t\\tstring memory version,\\n\\t\\t\\tuint256 chainID,\\n\\t\\t\\taddress verifyingContract,\\n\\t\\t\\tbytes32 salt,\\n\\t\\t\\tuint256[] memory extensions\\n\\t\\t)\\n\\t{\\n\\t\\tfields = 0x0D;\\n\\t\\tname = _name();\\n\\t\\tversion = \\\"\\\";\\n\\t\\tassembly {\\n\\t\\t\\tchainID := chainid()\\n\\t\\t}\\n\\t\\tverifyingContract = _verifyingContract;\\n\\t\\tsalt = 0;\\n\\t\\textensions = new uint256[](0);\\n\\t}\\n\\n\\t// ------------------------------------------------------------------------------------------------------------------\\n\\t// INTERNALS\\n\\t// ------------------------------------------------------------------------------------------------------------------\\n\\n\\t// need to ensure we can use return value \\\"name\\\" in `eip712Domain`\\n\\tfunction _name() internal view returns (string memory) {\\n\\t\\treturn name();\\n\\t}\\n\\n\\tfunction _currentDomainSeparator() internal view returns (bytes32) {\\n\\t\\tuint256 chainID;\\n\\t\\tassembly {\\n\\t\\t\\tchainID := chainid()\\n\\t\\t}\\n\\n\\t\\t// in case a fork happen, to support the chain that had to change its chainID, we compute the domain operator\\n\\t\\treturn\\n\\t\\t\\tchainID == _deploymentChainID\\n\\t\\t\\t\\t? _deploymentDomainSeparator\\n\\t\\t\\t\\t: _calculateDomainSeparator(chainID, _verifyingContract);\\n\\t}\\n\\n\\t/// @dev Calculate the Domain Separator used to compute ERC712 hash\\n\\tfunction _calculateDomainSeparator(uint256 chainID, address verifyingContract) private view returns (bytes32) {\\n\\t\\treturn\\n\\t\\t\\tkeccak256(\\n\\t\\t\\t\\tabi.encode(\\n\\t\\t\\t\\t\\tkeccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\"),\\n\\t\\t\\t\\t\\tkeccak256(bytes(name())),\\n\\t\\t\\t\\t\\tchainID,\\n\\t\\t\\t\\t\\tverifyingContract\\n\\t\\t\\t\\t)\\n\\t\\t\\t);\\n\\t}\\n}\\n\",\"keccak256\":\"0x95bb33423ae9d2e9fcf7a91418630bb2d4bc438e2aa8cd9958e42af24183b488\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC712/interfaces/IERC5267.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\ninterface IERC5267 {\\n\\t/// @notice The return values of this function MUST describe the domain separator that is used for verification of EIP-712 signatures in the contract. They describe both the form of the EIP712Domain struct (i.e., which of the optional fields and extensions are present) and the value of each field, as follows.\\n\\t/// @return fields A bit map where bit i is set to 1 if and only if domain field i is present (0 \\u2264 i \\u2264 4). Bits are read from least significant to most significant, and fields are indexed in the order that is specified by EIP-712, identical to the order in which they are listed in the function type.\\n\\t/// @return name EIP-712 name\\n\\t/// @return version EIP-712 version\\n\\t/// @return chainID EIP-712 chainID\\n\\t/// @return verifyingContract EIP-712 name verifyingContract\\n\\t/// @return salt EIP-712 salt\\n\\t/// @return extensions A list of EIP numbers that specify additional fields in the domain. The method to obtain the value for each of these additional fields and any conditions for inclusion are expected to be specified in the respective EIP. The value of fields does not affect their inclusion.\\n\\tfunction eip712Domain()\\n\\t\\texternal\\n\\t\\tview\\n\\t\\treturns (\\n\\t\\t\\tbytes1 fields,\\n\\t\\t\\tstring memory name,\\n\\t\\t\\tstring memory version,\\n\\t\\t\\tuint256 chainID,\\n\\t\\t\\taddress verifyingContract,\\n\\t\\t\\tbytes32 salt,\\n\\t\\t\\tuint256[] memory extensions\\n\\t\\t);\\n}\\n\",\"keccak256\":\"0xb0f30c518c3c6afc4e88fff6f822469425ed81611065be5528b10dee5aebde63\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/utils/Constants.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nlibrary Constants {\\n\\tuint256 internal constant DECIMALS_18 = 1000000000000000000;\\n}\\n\",\"keccak256\":\"0xe9da4ad04d270eb44b2bada7307894079ad6d3458b4d237b7992022f900d94b6\",\"license\":\"MIT\"},\"src/token/Gems.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nimport 'solidity-kit/solc_0.8/ERC20/implementations/ERC20Base.sol';\\nimport 'solidity-kit/solc_0.8/ERC20/ERC2612/implementations/UsingPermitWithDynamicChainID.sol';\\n\\n/// @title Gems Tokens\\n/// @author Ronan Sandford\\n/// @notice Gems Tokens initialy generated by playing instances of Stratagems\\ncontract Gems is ERC20Base, UsingPermitWithDynamicChainID {\\n\\tconstructor(address to, uint256 amount) UsingPermitWithDynamicChainID(address(this)) {\\n\\t\\t_mint(to, amount);\\n\\t}\\n\\n\\tstring public constant symbol = 'GEM';\\n\\n\\tfunction name() public pure override(IERC20, Named) returns (string memory) {\\n\\t\\treturn 'Gems';\\n\\t}\\n}\\n\",\"keccak256\":\"0x0a2a1cb72c3e7bdcf16b8675460a0485d6488abdd27013db8a84012a01ea5487\",\"license\":\"AGPL-3.0\"}},\"version\":1}", + "storageLayout": { + "storage": [ + { + "astId": 243, + "contract": "src/token/Gems.sol:Gems", + "label": "_totalSupply", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 247, + "contract": "src/token/Gems.sol:Gems", + "label": "_balances", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 253, + "contract": "src/token/Gems.sol:Gems", + "label": "_allowances", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" + }, + { + "astId": 22, + "contract": "src/token/Gems.sol:Gems", + "label": "_nonces", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_uint256)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => uint256))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_uint256)" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + }, + "userdoc": { + "errors": { + "DeadlineOver(uint256,uint256)": [ + { + "notice": "The permit has expired" + } + ], + "InvalidAddress(address)": [ + { + "notice": "An invalid address is specified (for example: zero address)" + } + ], + "InvalidMsgValue(uint256,uint256)": [ + { + "notice": "The msg value do not match the expected value" + } + ], + "InvalidSignature()": [ + { + "notice": "The signature do not match the expected signer" + } + ], + "InvalidTotalAmount(uint256,uint256)": [ + { + "notice": "The total amount provided do not match the expected value" + } + ], + "NotAuthorizedAllowance(uint256,uint256)": [ + { + "notice": "the amount requested exceed the allowance" + } + ], + "NotEnoughTokens(uint256,uint256)": [ + { + "notice": "the amount requested exceed the balance" + } + ] + }, + "events": { + "Approval(address,address,uint256)": { + "notice": "trigger on approval amount being set. Note that Transfer events need to be considered to compute the current allowance." + }, + "Transfer(address,address,uint256)": { + "notice": "trigger when tokens are transferred, including zero value transfers." + } + }, + "kind": "user", + "methods": { + "DOMAIN_SEPARATOR()": { + "notice": "EIP-712 Domain separator hash" + }, + "allowance(address,address)": { + "notice": "Returns the amount which `spender` is still allowed to withdraw from `owner`." + }, + "approve(address,uint256)": { + "notice": "Allows `spender` to withdraw from your account multiple times, up to `amount`." + }, + "approveAndCall(address,uint256,bytes)": { + "notice": "approve `amount` token to be spent by `spender` and callback into it via `onTokenApproval`" + }, + "balanceOf(address)": { + "notice": "Returns the account balance of another account with address `owner`." + }, + "decimals()": { + "notice": "Returns the number of decimals the token uses." + }, + "distributeAlongWithETH(address[],uint256)": { + "notice": "distribute" + }, + "eip712Domain()": { + "notice": "The return values of this function MUST describe the domain separator that is used for verification of EIP-712 signatures in the contract. They describe both the form of the EIP712Domain struct (i.e., which of the optional fields and extensions are present) and the value of each field, as follows." + }, + "nonces(address)": { + "notice": "return the current nonce of the owner" + }, + "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": { + "notice": "allow `spender` to spend `value` amount of token on behalf of `owner`" + }, + "symbol()": { + "notice": "Returns the symbol of the token." + }, + "totalSupply()": { + "notice": "Returns the total token supply." + }, + "transfer(address,uint256)": { + "notice": "Transfers `amount` of tokens to address `to`." + }, + "transferAlongWithETH(address,uint256)": { + "notice": "transfer" + }, + "transferAndCall(address,uint256,bytes)": { + "notice": "transfer `amount` token to `to` and callback into it via `onTokenTransfer`" + }, + "transferFrom(address,address,uint256)": { + "notice": "Transfers `amount` tokens from address `from` to address `to`." + }, + "transferFromAndCall(address,address,uint256,bytes)": { + "notice": "transfer `amount` token to `to` and callback into it via `onTokenTransfer`" + }, + "transferOnBehalfAndCall(address,address,uint256,bytes)": { + "notice": "transfer `amount` token to `to` and callback into it via `onTokenTransferedOnBehalf`" + } + }, + "notice": "Gems Tokens initialy generated by playing instances of Stratagems", + "version": 1 + }, + "argsData": "0x000000000000000000000000e53cd71271acadbeb0f64d9c8c62bbddc8ca9e660000000000000000000000000000000000000000033b2e3c9fd0803ce8000000", + "transaction": { + "hash": "0x8ee0c233ef4317229291b1f523812bf44bc4528c829f7dc1488f5de3fd0580e2", + "nonce": "0x86", + "origin": "0x61c461ecc993aadeb7e4b47e96d1b8cc37314b20" + } +} \ No newline at end of file diff --git a/contracts/deployments/sepolia/Gems_Proxy.json b/contracts/deployments/sepolia/Gems_Proxy.json new file mode 100644 index 00000000..c79962ba --- /dev/null +++ b/contracts/deployments/sepolia/Gems_Proxy.json @@ -0,0 +1,197 @@ +{ + "address": "0xbe1a691b55b37763fefd3058bada0016028bffe0", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "implementationAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "ownerAddress", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousImplementation", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "ProxyImplementationUpdated", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "id", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "contractName": "EIP173Proxy", + "sourceName": "solc_0.8/EIP173/EIP173Proxy.sol", + "bytecode": "0x608060405260405162000c7838038062000c788339810160408190526200002691620001e4565b620000318262000046565b6200003d8382620000b5565b505050620002db565b5f6200005e5f8051602062000c588339815191525490565b9050815f8051602062000c5883398151915255816001600160a01b0316816001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8054908390556040516001600160a01b0380851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b7379068296905f90a38151156200018b575f836001600160a01b031683604051620001379190620002be565b5f60405180830381855af49150503d805f811462000171576040519150601f19603f3d011682016040523d82523d5f602084013e62000176565b606091505b505090508062000189573d805f803e805ffd5b505b505050565b80516001600160a01b0381168114620001a7575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620001dc578181015183820152602001620001c2565b50505f910152565b5f805f60608486031215620001f7575f80fd5b620002028462000190565b9250620002126020850162000190565b60408501519092506001600160401b03808211156200022f575f80fd5b818601915086601f83011262000243575f80fd5b815181811115620002585762000258620001ac565b604051601f8201601f19908116603f01168101908382118183101715620002835762000283620001ac565b816040528281528960208487010111156200029c575f80fd5b620002af836020830160208801620001c0565b80955050505050509250925092565b5f8251620002d1818460208701620001c0565b9190910192915050565b61096f80620002e95f395ff3fe60806040526004361061005d575f3560e01c80634f1ef286116100425780634f1ef286146101265780638da5cb5b14610139578063f2fde38b14610172576100c9565b806301ffc9a7146100d35780633659cfe614610107576100c9565b366100c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f45544845525f52454a454354454400000000000000000000000000000000000060448201526064015b60405180910390fd5b6100d1610191565b005b3480156100de575f80fd5b506100f26100ed3660046107f2565b6101db565b60405190151581526020015b60405180910390f35b348015610112575f80fd5b506100d1610121366004610859565b6103a6565b6100d1610134366004610872565b610477565b348015610144575f80fd5b5061014d610571565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100fe565b34801561017d575f80fd5b506100d161018c366004610859565b61059f565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc545f3681823780813683855af491503d8082833e8280156101d1578183f35b8183fd5b50505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061026d57507f7f5828d0000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b1561027a57506001919050565b7fffffffff0000000000000000000000000000000000000000000000000000000080831690036102ab57505f919050565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008416600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa925050508015610393575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610390918101906108ee565b60015b61039f57505f92915050565b9392505050565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461045c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c0565b6104748160405180602001604052805f81525061065e565b50565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461052d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c0565b61056c8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061065e92505050565b505050565b5f61059a7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905090565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610655576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c0565b61047481610746565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80549083905560405173ffffffffffffffffffffffffffffffffffffffff80851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b7379068296905f90a381511561056c575f8373ffffffffffffffffffffffffffffffffffffffff16836040516106f7919061090d565b5f60405180830381855af49150503d805f811461072f576040519150601f19603f3d011682016040523d82523d5f602084013e610734565b606091505b50509050806101d5573d805f803e805ffd5b5f61076f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b9050817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103558173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60208284031215610802575f80fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461039f575f80fd5b803573ffffffffffffffffffffffffffffffffffffffff81168114610854575f80fd5b919050565b5f60208284031215610869575f80fd5b61039f82610831565b5f805f60408486031215610884575f80fd5b61088d84610831565b9250602084013567ffffffffffffffff808211156108a9575f80fd5b818601915086601f8301126108bc575f80fd5b8135818111156108ca575f80fd5b8760208285010111156108db575f80fd5b6020830194508093505050509250925092565b5f602082840312156108fe575f80fd5b8151801515811461039f575f80fd5b5f82515f5b8181101561092c5760208186018101518583015201610912565b505f92019182525091905056fea2646970667358221220b684f5b70c5366d5cfce68365932ccc48bc1e8ce159edd1546835e83f82a3f2964736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103", + "deployedBytecode": "0x60806040526004361061005d575f3560e01c80634f1ef286116100425780634f1ef286146101265780638da5cb5b14610139578063f2fde38b14610172576100c9565b806301ffc9a7146100d35780633659cfe614610107576100c9565b366100c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f45544845525f52454a454354454400000000000000000000000000000000000060448201526064015b60405180910390fd5b6100d1610191565b005b3480156100de575f80fd5b506100f26100ed3660046107f2565b6101db565b60405190151581526020015b60405180910390f35b348015610112575f80fd5b506100d1610121366004610859565b6103a6565b6100d1610134366004610872565b610477565b348015610144575f80fd5b5061014d610571565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100fe565b34801561017d575f80fd5b506100d161018c366004610859565b61059f565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc545f3681823780813683855af491503d8082833e8280156101d1578183f35b8183fd5b50505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061026d57507f7f5828d0000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b1561027a57506001919050565b7fffffffff0000000000000000000000000000000000000000000000000000000080831690036102ab57505f919050565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008416600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa925050508015610393575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610390918101906108ee565b60015b61039f57505f92915050565b9392505050565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461045c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c0565b6104748160405180602001604052805f81525061065e565b50565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461052d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c0565b61056c8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061065e92505050565b505050565b5f61059a7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905090565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610655576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c0565b61047481610746565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80549083905560405173ffffffffffffffffffffffffffffffffffffffff80851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b7379068296905f90a381511561056c575f8373ffffffffffffffffffffffffffffffffffffffff16836040516106f7919061090d565b5f60405180830381855af49150503d805f811461072f576040519150601f19603f3d011682016040523d82523d5f602084013e610734565b606091505b50509050806101d5573d805f803e805ffd5b5f61076f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b9050817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103558173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60208284031215610802575f80fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461039f575f80fd5b803573ffffffffffffffffffffffffffffffffffffffff81168114610854575f80fd5b919050565b5f60208284031215610869575f80fd5b61039f82610831565b5f805f60408486031215610884575f80fd5b61088d84610831565b9250602084013567ffffffffffffffff808211156108a9575f80fd5b818601915086601f8301126108bc575f80fd5b8135818111156108ca575f80fd5b8760208285010111156108db575f80fd5b6020830194508093505050509250925092565b5f602082840312156108fe575f80fd5b8151801515811461039f575f80fd5b5f82515f5b8181101561092c5760208186018101518583015201610912565b505f92019182525091905056fea2646970667358221220b684f5b70c5366d5cfce68365932ccc48bc1e8ce159edd1546835e83f82a3f2964736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {}, + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "gasEstimates": { + "creation": { + "codeDepositCost": "483000", + "executionCost": "infinite", + "totalCost": "infinite" + }, + "external": { + "": "infinite", + "owner()": "2359", + "supportsInterface(bytes4)": "infinite", + "transferOwnership(address)": "28275", + "upgradeTo(address)": "28302", + "upgradeToAndCall(address,bytes)": "infinite" + }, + "internal": { + "_owner()": "infinite", + "_setOwner(address)": "25798" + } + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementationAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"ownerAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousImplementation\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"ProxyImplementationUpdated\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"id\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Proxy implementing EIP173 for ownership management\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"solc_0.8/EIP173/EIP173Proxy.sol\":\"EIP173Proxy\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solc_0.8/EIP173/EIP173Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../EIP1967/Proxy.sol\\\";\\n\\ninterface ERC165 {\\n function supportsInterface(bytes4 id) external view returns (bool);\\n}\\n\\n///@notice Proxy implementing EIP173 for ownership management\\ncontract EIP173Proxy is Proxy {\\n // --------------------------------------------------------------------------------------------\\n // Events\\n // --------------------------------------------------------------------------------------------\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n // --------------------------------------------------------------------------------------------\\n // Constructor\\n // --------------------------------------------------------------------------------------------\\n\\n constructor(address implementationAddress, address ownerAddress, bytes memory data) payable {\\n _setOwner(ownerAddress);\\n _setImplementation(implementationAddress, data);\\n }\\n\\n // --------------------------------------------------------------------------------------------\\n // Public Interface\\n // --------------------------------------------------------------------------------------------\\n\\n function owner() external view returns (address) {\\n return _owner();\\n }\\n\\n function supportsInterface(bytes4 id) external view returns (bool) {\\n if (id == 0x01ffc9a7 || id == 0x7f5828d0) {\\n return true;\\n }\\n if (id == 0xFFFFFFFF) {\\n return false;\\n }\\n\\n ERC165 implementation;\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n implementation := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n }\\n\\n // Technically this is not standard compliant as ERC-165 require 30,000 gas which that call cannot ensure\\n // because it is itself inside `supportsInterface` that might only get 30,000 gas.\\n // In practise this is unlikely to be an issue.\\n try implementation.supportsInterface(id) returns (bool support) {\\n return support;\\n } catch {\\n return false;\\n }\\n }\\n\\n function transferOwnership(address newOwner) external onlyOwner {\\n _setOwner(newOwner);\\n }\\n\\n function upgradeTo(address newImplementation) external onlyOwner {\\n _setImplementation(newImplementation, \\\"\\\");\\n }\\n\\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable onlyOwner {\\n _setImplementation(newImplementation, data);\\n }\\n\\n // --------------------------------------------------------------------------------------------\\n // Modifiers\\n // --------------------------------------------------------------------------------------------\\n\\n modifier onlyOwner() {\\n require(msg.sender == _owner(), \\\"NOT_AUTHORIZED\\\");\\n _;\\n }\\n\\n // --------------------------------------------------------------------------------------------\\n // Internal\\n // --------------------------------------------------------------------------------------------\\n\\n function _owner() internal view returns (address adminAddress) {\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n adminAddress := sload(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103)\\n }\\n }\\n\\n function _setOwner(address newOwner) internal {\\n address previousOwner = _owner();\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n sstore(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103, newOwner)\\n }\\n emit OwnershipTransferred(previousOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xf424b3ab9dd0c0328554e3ff27d6cae0681b81a107b2a9313ecadae374800f2c\",\"license\":\"MIT\"},\"solc_0.8/EIP1967/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n// EIP-1967\\nabstract contract Proxy {\\n // --------------------------------------------------------------------------------------------\\n // Events\\n // --------------------------------------------------------------------------------------------\\n\\n event ProxyImplementationUpdated(address indexed previousImplementation, address indexed newImplementation);\\n\\n // --------------------------------------------------------------------------------------------\\n // Public Interface\\n // --------------------------------------------------------------------------------------------\\n\\n receive() external payable virtual {\\n revert(\\\"ETHER_REJECTED\\\"); // explicit reject by default\\n }\\n\\n fallback() external payable {\\n _fallback();\\n }\\n\\n // --------------------------------------------------------------------------------------------\\n // Internal\\n // --------------------------------------------------------------------------------------------\\n\\n function _fallback() internal {\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n let implementationAddress := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n calldatacopy(0x0, 0x0, calldatasize())\\n let success := delegatecall(gas(), implementationAddress, 0x0, calldatasize(), 0, 0)\\n let retSz := returndatasize()\\n returndatacopy(0, 0, retSz)\\n switch success\\n case 0 { revert(0, retSz) }\\n default { return(0, retSz) }\\n }\\n }\\n\\n function _setImplementation(address newImplementation, bytes memory data) internal {\\n address previousImplementation;\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n previousImplementation := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n }\\n\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n sstore(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc, newImplementation)\\n }\\n\\n emit ProxyImplementationUpdated(previousImplementation, newImplementation);\\n\\n if (data.length > 0) {\\n (bool success,) = newImplementation.delegatecall(data);\\n if (!success) {\\n assembly {\\n // This assembly ensure the revert contains the exact string data\\n let returnDataSize := returndatasize()\\n returndatacopy(0, 0, returnDataSize)\\n revert(0, returnDataSize)\\n }\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xb2192ed12467c27c3f6035903c0350c709c88c5bfde520e016c99f46b389016d\",\"license\":\"MIT\"}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": {}, + "notice": "Proxy implementing EIP173 for ownership management", + "version": 1 + }, + "argsData": "0x000000000000000000000000a372804ae197d71a358abb1b8691ada98ac9934900000000000000000000000061c461ecc993aadeb7e4b47e96d1b8cc37314b2000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "transaction": { + "hash": "0xa49c2c972af5f98d0ca4741ce4e9cb4c07c29c4f7b19bbeb5540dd67dd0a6947", + "nonce": "0x87", + "origin": "0x61c461ecc993aadeb7e4b47e96d1b8cc37314b20" + } +} \ No newline at end of file diff --git a/contracts/deployments/sepolia/Stratagems.json b/contracts/deployments/sepolia/Stratagems.json new file mode 100644 index 00000000..b84fd107 --- /dev/null +++ b/contracts/deployments/sepolia/Stratagems.json @@ -0,0 +1,2008 @@ +{ + "address": "0x564c4045fce3de04911c0bd1ed79db9c8781cd0f", + "abi": [ + { + "inputs": [], + "name": "CanStillResolve", + "type": "error" + }, + { + "inputs": [], + "name": "CommitmentHashNotMatching", + "type": "error" + }, + { + "inputs": [], + "name": "GameNotStarted", + "type": "error" + }, + { + "inputs": [], + "name": "InCommitmentPhase", + "type": "error" + }, + { + "inputs": [], + "name": "InResolutionPhase", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidEpoch", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidFurtherMoves", + "type": "error" + }, + { + "inputs": [], + "name": "NothingToResolve", + "type": "error" + }, + { + "inputs": [], + "name": "PreviousCommitmentNotResolved", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "inReserve", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "ReserveTooLow", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint24", + "name": "epoch", + "type": "uint24" + } + ], + "name": "CommitmentCancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint24", + "name": "epoch", + "type": "uint24" + }, + { + "indexed": false, + "internalType": "bytes24", + "name": "commitmentHash", + "type": "bytes24" + } + ], + "name": "CommitmentMade", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint24", + "name": "epoch", + "type": "uint24" + }, + { + "indexed": true, + "internalType": "bytes24", + "name": "commitmentHash", + "type": "bytes24" + }, + { + "components": [ + { + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + } + ], + "indexed": false, + "internalType": "struct UsingStratagemsTypes.Move[]", + "name": "moves", + "type": "tuple[]" + }, + { + "indexed": false, + "internalType": "bytes24", + "name": "furtherMoves", + "type": "bytes24" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newReserveAmount", + "type": "uint256" + } + ], + "name": "CommitmentResolved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint24", + "name": "epoch", + "type": "uint24" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountBurnt", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes24", + "name": "furtherMoves", + "type": "bytes24" + } + ], + "name": "CommitmentVoid", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum UsingStratagemsTypes.Color", + "name": "oldColor", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "enum UsingStratagemsTypes.Color", + "name": "newColor", + "type": "uint8" + } + ], + "name": "MoveProcessed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountDeposited", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newAmount", + "type": "uint256" + } + ], + "name": "ReserveDeposited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountWithdrawn", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newAmount", + "type": "uint256" + } + ], + "name": "ReserveWithdrawn", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "secret", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + } + ], + "internalType": "struct UsingStratagemsTypes.Move[]", + "name": "moves", + "type": "tuple[]" + }, + { + "internalType": "bytes24", + "name": "furtherMoves", + "type": "bytes24" + } + ], + "name": "acknowledgeMissedResolution", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "acknowledgeMissedResolutionByBurningAllReserve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokensAmountToAdd", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "internalType": "struct UsingStratagemsTypes.Permit", + "name": "permit", + "type": "tuple" + } + ], + "name": "addToReserve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "cancelCommitment", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "getCell", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint24", + "name": "lastEpochUpdate", + "type": "uint24" + }, + { + "internalType": "uint24", + "name": "epochWhenTokenIsAdded", + "type": "uint24" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "life", + "type": "uint8" + }, + { + "internalType": "int8", + "name": "delta", + "type": "int8" + }, + { + "internalType": "uint8", + "name": "enemyMap", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "distribution", + "type": "uint8" + } + ], + "internalType": "struct UsingStratagemsTypes.FullCell", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + } + ], + "name": "getCells", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint24", + "name": "lastEpochUpdate", + "type": "uint24" + }, + { + "internalType": "uint24", + "name": "epochWhenTokenIsAdded", + "type": "uint24" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "life", + "type": "uint8" + }, + { + "internalType": "int8", + "name": "delta", + "type": "int8" + }, + { + "internalType": "uint8", + "name": "enemyMap", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "distribution", + "type": "uint8" + } + ], + "internalType": "struct UsingStratagemsTypes.FullCell[]", + "name": "cells", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getCommitment", + "outputs": [ + { + "components": [ + { + "internalType": "bytes24", + "name": "hash", + "type": "bytes24" + }, + { + "internalType": "uint24", + "name": "epoch", + "type": "uint24" + } + ], + "internalType": "struct UsingStratagemsTypes.Commitment", + "name": "commitment", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getConfig", + "outputs": [ + { + "components": [ + { + "internalType": "contract IERC20WithIERC2612", + "name": "tokens", + "type": "address" + }, + { + "internalType": "address payable", + "name": "burnAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "commitPhaseDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "resolutionPhaseDuration", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "maxLife", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "numTokensPerGems", + "type": "uint256" + } + ], + "internalType": "struct UsingStratagemsTypes.Config", + "name": "config", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getTokensInReserve", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes24", + "name": "commitmentHash", + "type": "bytes24" + } + ], + "name": "makeCommitment", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes24", + "name": "commitmentHash", + "type": "bytes24" + }, + { + "internalType": "uint256", + "name": "tokensAmountToAdd", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "internalType": "struct UsingStratagemsTypes.Permit", + "name": "permit", + "type": "tuple" + } + ], + "name": "makeCommitmentWithExtraReserve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "position", + "type": "uint64" + } + ], + "name": "poke", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64[]", + "name": "positions", + "type": "uint64[]" + } + ], + "name": "pokeMultiple", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "secret", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + } + ], + "internalType": "struct UsingStratagemsTypes.Move[]", + "name": "moves", + "type": "tuple[]" + }, + { + "internalType": "bytes24", + "name": "furtherMoves", + "type": "bytes24" + }, + { + "internalType": "bool", + "name": "useReserve", + "type": "bool" + } + ], + "name": "resolve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "withdrawFromReserve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "name": "InvalidAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "NonExistentToken", + "type": "error" + }, + { + "inputs": [], + "name": "NonceOverflow", + "type": "error" + }, + { + "inputs": [], + "name": "NotAuthorized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "provided", + "type": "address" + }, + { + "internalType": "address", + "name": "currentOwner", + "type": "address" + } + ], + "name": "NotOwner", + "type": "error" + }, + { + "inputs": [], + "name": "TransferRejected", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "approved", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "tokenIDs", + "type": "uint256[]" + } + ], + "name": "ownerAndLastTransferBlockNumberList", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "lastTransferBlockNumber", + "type": "uint256" + } + ], + "internalType": "struct IERC721WithBlocknumber.OwnerData[]", + "name": "ownersData", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "ownerAndLastTransferBlockNumberOf", + "outputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceID", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "InvalidCellOverwrite", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "life", + "type": "uint256" + }, + { + "internalType": "int32", + "name": "x", + "type": "int32" + }, + { + "internalType": "int32", + "name": "y", + "type": "int32" + } + ], + "name": "InvalidLifeConfiguration", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "components": [ + { + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint24", + "name": "lastEpochUpdate", + "type": "uint24" + }, + { + "internalType": "uint24", + "name": "epochWhenTokenIsAdded", + "type": "uint24" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "life", + "type": "uint8" + }, + { + "internalType": "int8", + "name": "delta", + "type": "int8" + }, + { + "internalType": "uint8", + "name": "enemyMap", + "type": "uint8" + } + ], + "indexed": false, + "internalType": "struct IStratagemsDebug.DebugCell[]", + "name": "cells", + "type": "tuple[]" + } + ], + "name": "ForceCells", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint24", + "name": "epoch", + "type": "uint24" + }, + { + "components": [ + { + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "life", + "type": "uint8" + } + ], + "indexed": false, + "internalType": "struct IStratagemsDebug.SimpleCell[]", + "name": "cells", + "type": "tuple[]" + } + ], + "name": "ForceSimpleCells", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newTime", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "delta", + "type": "uint256" + } + ], + "name": "TimeIncreased", + "type": "event" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint24", + "name": "lastEpochUpdate", + "type": "uint24" + }, + { + "internalType": "uint24", + "name": "epochWhenTokenIsAdded", + "type": "uint24" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "life", + "type": "uint8" + }, + { + "internalType": "int8", + "name": "delta", + "type": "int8" + }, + { + "internalType": "uint8", + "name": "enemyMap", + "type": "uint8" + } + ], + "internalType": "struct IStratagemsDebug.DebugCell[]", + "name": "cells", + "type": "tuple[]" + } + ], + "name": "forceCells", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + } + ], + "internalType": "struct UsingStratagemsTypes.Move[]", + "name": "moves", + "type": "tuple[]" + } + ], + "name": "forceMoves", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "life", + "type": "uint8" + } + ], + "internalType": "struct IStratagemsDebug.SimpleCell[]", + "name": "cells", + "type": "tuple[]" + } + ], + "name": "forceSimpleCells", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "getRawCell", + "outputs": [ + { + "components": [ + { + "internalType": "uint24", + "name": "lastEpochUpdate", + "type": "uint24" + }, + { + "internalType": "uint24", + "name": "epochWhenTokenIsAdded", + "type": "uint24" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "life", + "type": "uint8" + }, + { + "internalType": "int8", + "name": "delta", + "type": "int8" + }, + { + "internalType": "uint8", + "name": "enemyMap", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "distribution", + "type": "uint8" + } + ], + "internalType": "struct UsingStratagemsTypes.Cell", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "delta", + "type": "uint256" + } + ], + "name": "increaseTime", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "timestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "contractName": "Router10X60", + "sourceName": "solc_0.8/router/Router10X60.sol", + "bytecode": "0x61034060405234801562000011575f80fd5b506040516200108f3803806200108f8339810160408190526200003491620006e2565b602081015151815151600a811115620000945760405162461bcd60e51b815260206004820152601b60248201527f4d41585f494d504c454d454e544154494f4e535f52454143484544000000000060448201526064015b60405180910390fd5b603c821115620000da5760405162461bcd60e51b815260206004820152601060248201526f13505617d4d251d4d7d4915050d2115160821b60448201526064016200008b565b5f835f01515f81518110620000f357620000f3620007e8565b602002602001015190505f805f805f805f805f60018b111562000133578c5180516001908110620001285762000128620007e8565b602002602001015198505b60028b111562000160578c5180516002908110620001555762000155620007e8565b602002602001015197505b60038b11156200018d578c5180516003908110620001825762000182620007e8565b602002602001015196505b60048b1115620001ba578c5180516004908110620001af57620001af620007e8565b602002602001015195505b60058b1115620001e7578c5180516005908110620001dc57620001dc620007e8565b602002602001015194505b60068b111562000214578c5180516006908110620002095762000209620007e8565b602002602001015193505b60078b111562000241578c5180516007908110620002365762000236620007e8565b602002602001015192505b60088b11156200026e578c5180516008908110620002635762000263620007e8565b602002602001015191505b60098b11156200029b578c5180516009908110620002905762000290620007e8565b602002602001015190505b6001600160a01b03998a1660805297891660a05295881660c05293871660e05291861661010052851661012052841661014052831661016052821661018052166101a0525f80808080808080808080805b8d81101562000553575f8f6020015182815181106200030f576200030f620007e8565b602090810291909101015160d881901c915060e01c808410620003645760405162461bcd60e51b815260206004820152600c60248201526b2727aa2fa4a72fa7a92222a960a11b60448201526064016200008b565b8063ffffffff169350600683101562000391576200038483602862000810565b82901b8e179d506200053b565b600c831015620003c257620003a860068462000830565b620003b590602862000810565b82901b8d179c506200053b565b6012831015620003f357620003d9600c8462000830565b620003e690602862000810565b82901b8c179b506200053b565b601883101562000424576200040a60128462000830565b6200041790602862000810565b82901b8b179a506200053b565b601e83101562000455576200043b60188462000830565b6200044890602862000810565b82901b8a1799506200053b565b602483101562000486576200046c601e8462000830565b6200047990602862000810565b82901b891798506200053b565b602a831015620004b7576200049d60248462000830565b620004aa90602862000810565b82901b881797506200053b565b6030831015620004e857620004ce602a8462000830565b620004db90602862000810565b82901b871796506200053b565b60368310156200051957620004ff60308462000830565b6200050c90602862000810565b82901b861796506200053b565b6200052660368462000830565b6200053390602862000810565b82901b851796505b505080806200054a9062000846565b915050620002ec565b50506101e09990995261020097909752610220959095526102409390935261026091909152610280526102a0526102c0526102e052610300525061032052604001516001600160a01b03166101c05262000861565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715620005e157620005e1620005a8565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620006125762000612620005a8565b604052919050565b5f6001600160401b03821115620006355762000635620005a8565b5060051b60200190565b80516001600160a01b038116811462000656575f80fd5b919050565b5f82601f8301126200066b575f80fd5b81516020620006846200067e836200061a565b620005e7565b82815260059290921b84018101918181019086841115620006a3575f80fd5b8286015b84811015620006d75780516001600160d81b031981168114620006c9575f8081fd5b8352918301918301620006a7565b509695505050505050565b5f6020808385031215620006f4575f80fd5b82516001600160401b03808211156200070b575f80fd5b90840190606082870312156200071f575f80fd5b62000729620005bc565b82518281111562000738575f80fd5b8301601f8101881362000749575f80fd5b80516200075a6200067e826200061a565b81815260059190911b8201860190868101908a83111562000779575f80fd5b928701925b82841015620007a25762000792846200063f565b825292870192908701906200077e565b84525050508284015182811115620007b8575f80fd5b620007c6888286016200065b565b8583015250620007d9604084016200063f565b60408201529695505050505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176200082a576200082a620007fc565b92915050565b818103818111156200082a576200082a620007fc565b5f600182016200085a576200085a620007fc565b5060010190565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e0516103005161032051610749620009465f395f601401525f61033901525f6102f201525f6102a201525f61025201525f61020201525f6101b201525f61016201525f61011201525f60c201525f607201525f6105ac01525f61058501525f61055601525f61052701525f6104f801525f6104c901525f61049a01525f61046b01525f61043c01525f61040d01525f6103de01526107495ff3fe60806040525f803560e01c90808061003860017f0000000000000000000000000000000000000000000000000000000000000000610698565b90505b8082116103d2575f600261004f83856106b1565b61005991906106c4565b90505f60068210156100a1576100708260286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b600c8210156100f1576100b5600683610698565b6100c09060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b601282101561014157610105600c83610698565b6101109060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b601882101561019157610155601283610698565b6101609060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b601e8210156101e1576101a5601883610698565b6101b09060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b6024821015610231576101f5601e83610698565b6102009060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b602a82101561028157610245602483610698565b6102509060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b60308210156102d157610295602a83610698565b6102a09060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b6036821015610321576102e5603083610698565b6102f09060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b61032c603683610698565b6103379060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff1690505b63ffffffff600882901c811690871681111561038c57610385600184610698565b93506103ca565b8663ffffffff168163ffffffff1610156103b2576103ab8360016106b1565b94506103ca565b6103c060ff831660016106b1565b95505050506103d2565b50505061003b565b5f8360010361040257507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360020361043157507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360030361046057507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360040361048f57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b836005036104be57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b836006036104ed57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360070361051c57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360080361054b57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360090361057a57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b83600a036105a957507f00000000000000000000000000000000000000000000000000000000000000006105cc565b507f00000000000000000000000000000000000000000000000000000000000000005b73ffffffffffffffffffffffffffffffffffffffff811661064d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f554e4b4e4f574e5f4d4554484f44000000000000000000000000000000000000604482015260640160405180910390fd5b365f80375f80365f845af43d5f803e808015610667573d5ff35b3d5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156106ab576106ab61066b565b92915050565b808201808211156106ab576106ab61066b565b5f826106f7577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820281158282048414176106ab576106ab61066b56fea2646970667358221220e346ecc6b2ab869aea383a1cb6f406a909814848ad012048b904d157b81a433964736f6c63430008140033", + "deployedBytecode": "0x60806040525f803560e01c90808061003860017f0000000000000000000000000000000000000000000000000000000000000000610698565b90505b8082116103d2575f600261004f83856106b1565b61005991906106c4565b90505f60068210156100a1576100708260286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b600c8210156100f1576100b5600683610698565b6100c09060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b601282101561014157610105600c83610698565b6101109060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b601882101561019157610155601283610698565b6101609060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b601e8210156101e1576101a5601883610698565b6101b09060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b6024821015610231576101f5601e83610698565b6102009060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b602a82101561028157610245602483610698565b6102509060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b60308210156102d157610295602a83610698565b6102a09060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b6036821015610321576102e5603083610698565b6102f09060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b61032c603683610698565b6103379060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff1690505b63ffffffff600882901c811690871681111561038c57610385600184610698565b93506103ca565b8663ffffffff168163ffffffff1610156103b2576103ab8360016106b1565b94506103ca565b6103c060ff831660016106b1565b95505050506103d2565b50505061003b565b5f8360010361040257507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360020361043157507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360030361046057507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360040361048f57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b836005036104be57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b836006036104ed57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360070361051c57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360080361054b57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360090361057a57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b83600a036105a957507f00000000000000000000000000000000000000000000000000000000000000006105cc565b507f00000000000000000000000000000000000000000000000000000000000000005b73ffffffffffffffffffffffffffffffffffffffff811661064d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f554e4b4e4f574e5f4d4554484f44000000000000000000000000000000000000604482015260640160405180910390fd5b365f80375f80365f845af43d5f803e808015610667573d5ff35b3d5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156106ab576106ab61066b565b92915050565b808201808211156106ab576106ab61066b565b5f826106f7577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820281158282048414176106ab576106ab61066b56fea2646970667358221220e346ecc6b2ab869aea383a1cb6f406a909814848ad012048b904d157b81a433964736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {}, + "devdoc": { + "kind": "dev", + "version": 1, + "methods": { + "acknowledgeMissedResolution(address,bytes32,(uint64,uint8)[],bytes24)": { + "params": { + "furtherMoves": "if moves cannot be contained in one tx, further moves are represented by a hash to resolve too", + "moves": "the actual moves", + "player": "the account who committed the move", + "secret": "the secret used to make the commit" + } + }, + "addToReserve(uint256,(uint256,uint256,uint8,bytes32,bytes32))": { + "params": { + "permit": "permit EIP2612, .value = zero if not needed", + "tokensAmountToAdd": "amount of tokens to add" + } + }, + "getCell(uint256)": { + "params": { + "id": "the cell id" + } + }, + "getCells(uint256[])": { + "params": { + "ids": "the list of cell ids" + } + }, + "getCommitment(address)": { + "params": { + "account": "the address of which to retrieve the commitment" + } + }, + "getTokensInReserve(address)": { + "params": { + "account": "the address to retrived the amount in reserve of." + } + }, + "makeCommitment(bytes24)": { + "params": { + "commitmentHash": "the hash of the moves" + } + }, + "makeCommitmentWithExtraReserve(bytes24,uint256,(uint256,uint256,uint8,bytes32,bytes32))": { + "params": { + "commitmentHash": "the has of the moves", + "permit": "permit EIP2612, value = zero if not needed", + "tokensAmountToAdd": "amount of tokens to add to the reserve. the resulting total must be enough to cover the moves" + } + }, + "poke(uint64)": { + "params": { + "position": "the cell position" + } + }, + "pokeMultiple(uint64[])": { + "params": { + "positions": "cell positions to collect from" + } + }, + "resolve(address,bytes32,(uint64,uint8)[],bytes24,bool)": { + "params": { + "furtherMoves": "if moves cannot be contained in one tx, further moves are represented by a hash to resolve too Note that you have to that have enough moves (specified by MAX_NUM_MOVES_PER_HASH = 32)", + "moves": "the actual moves", + "player": "the account who committed the move", + "secret": "the secret used to make the commit", + "useReserve": "whether the tokens are taken from the reserve or from approvals. This allow player to keep their reserve intact and use it on their next move. Note that this require the Stratagems contract to have enough allowance." + } + }, + "withdrawFromReserve(uint256)": { + "params": { + "amount": "number of tokens to withdraw" + } + }, + "approve(address,uint256)": { + "params": { + "operator": "The address receiving the approval.", + "tokenID": "The id of the token." + } + }, + "getApproved(uint256)": { + "params": { + "tokenID": "The id of the token." + }, + "returns": { + "operator": "The address of the operator." + } + }, + "isApprovedForAll(address,address)": { + "params": { + "operator": "The address of the operator.", + "owner": "The address of the owner." + }, + "returns": { + "_0": "isOperator The status of the approval." + } + }, + "ownerAndLastTransferBlockNumberList(uint256[])": { + "params": { + "tokenIDs": "The list of token ids to check." + }, + "returns": { + "ownersData": "The list of (owner, lastTransferBlockNumber) for each ids given as input." + } + }, + "ownerAndLastTransferBlockNumberOf(uint256)": { + "params": { + "tokenID": "The id of the token." + }, + "returns": { + "blockNumber": "The blocknumber at which the last transfer of that id happened.", + "owner": "The address of the token owner." + } + }, + "ownerOf(uint256)": { + "params": { + "tokenID": "The id of the token." + }, + "returns": { + "owner": "The address of the token owner." + } + }, + "safeTransferFrom(address,address,uint256)": { + "params": { + "from": "The send of the token.", + "to": "The recipient of the token.", + "tokenID": "The id of the token." + } + }, + "safeTransferFrom(address,address,uint256,bytes)": { + "params": { + "data": "Additional data.", + "from": "The sender of the token.", + "to": "The recipient of the token.", + "tokenID": "The id of the token." + } + }, + "setApprovalForAll(address,bool)": { + "params": { + "approved": "The determination of the approval.", + "operator": "The address receiving the approval." + } + }, + "supportsInterface(bytes4)": { + "details": "Interface identification is specified in ERC-165. This function uses less than 30,000 gas.", + "params": { + "interfaceID": "The interface identifier, as specified in ERC-165" + }, + "returns": { + "_0": "`true` if the contract implements `interfaceID` and `interfaceID` is not 0xffffffff, `false` otherwise" + } + }, + "tokenURI(uint256)": { + "details": "Throws if `tokenID` is not a valid NFT. URIs are defined in RFC 3986. The URI may point to a JSON file that conforms to the \"ERC721 Metadata JSON Schema\".", + "params": { + "tokenID": "id of the token being queried." + } + }, + "transferFrom(address,address,uint256)": { + "params": { + "from": "The sender of the token.", + "to": "The recipient of the token.", + "tokenID": "The id of the token." + } + } + }, + "events": { + "CommitmentCancelled(address,uint24)": { + "params": { + "epoch": "epoch number on which this commit belongs to", + "player": "account taking the staking risk (can be a different account than the one controlling the gems)" + } + }, + "CommitmentMade(address,uint24,bytes24)": { + "params": { + "commitmentHash": "the hash of moves", + "epoch": "epoch number on which this commit belongs to", + "player": "account taking the staking risk (can be a different account than the one controlling the gems)" + } + }, + "CommitmentResolved(address,uint24,bytes24,(uint64,uint8)[],bytes24,uint256)": { + "params": { + "commitmentHash": "the hash of the moves", + "epoch": "epoch number on which this commit belongs to", + "furtherMoves": "hash of further moves, unless bytes32(0) which indicate end.", + "moves": "the moves", + "player": "account who commited" + } + }, + "CommitmentVoid(address,uint24,uint256,bytes24)": { + "params": { + "amountBurnt": "amount of token to burn", + "epoch": "epoch number on which this commit belongs to", + "furtherMoves": "hash of further moves, unless bytes32(0) which indicate end.", + "player": "the account that made the commitment" + } + }, + "MoveProcessed(uint64,address,uint8,uint8)": { + "params": { + "newColor": "color that takes over", + "oldColor": "previous color of the cell", + "player": "account making the move", + "position": "cell at which the move take place" + } + }, + "ReserveDeposited(address,uint256,uint256)": { + "params": { + "amountDeposited": "the number of tokens deposited", + "newAmount": "the number of tokens in reserver as a result", + "player": "account receiving the token in the reserve" + } + }, + "ReserveWithdrawn(address,uint256,uint256)": { + "params": { + "amountWithdrawn": "the number of tokens withdrawnn", + "newAmount": "the number of tokens in reserver as a result", + "player": "account withdrawing the tokens" + } + }, + "Approval(address,address,uint256)": { + "params": { + "approved": "account who can know transfer on the owner's behalf", + "owner": "current owner of the token", + "tokenID": "id of the token being approved" + } + }, + "ApprovalForAll(address,address,bool)": { + "params": { + "approved": "whether it is approved or not", + "operator": "account who can know transfer on the owner's behalf", + "owner": "the account granting rights over all of its token" + } + }, + "Transfer(address,address,uint256)": { + "params": { + "from": "the account the token is sent from", + "to": "the account the token is sent to", + "tokenID": "id of the token being sent" + } + } + }, + "errors": { + "ReserveTooLow(uint256,uint256)": [ + { + "params": { + "expected": "amount required to proceed", + "inReserve": "amount in reserver as the time of the call" + } + } + ], + "InvalidAddress(address)": [ + { + "params": { + "addr": "invalid address" + } + } + ], + "NonExistentToken(uint256)": [ + { + "params": { + "tokenID": "id of the expected token" + } + } + ], + "NotOwner(address,address)": [ + { + "params": { + "currentOwner": "the current owner", + "provided": "the address expected to be the current owner" + } + } + ] + } + }, + "evm": { + "gasEstimates": { + "creation": { + "codeDepositCost": "373000", + "executionCost": "infinite", + "totalCost": "infinite" + }, + "external": { + "": "infinite" + } + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"address[]\",\"name\":\"implementations\",\"type\":\"address[]\"},{\"internalType\":\"bytes5[]\",\"name\":\"sigMap\",\"type\":\"bytes5[]\"},{\"internalType\":\"address\",\"name\":\"fallbackImplementation\",\"type\":\"address\"}],\"internalType\":\"struct Router10X60.Routes\",\"name\":\"routes\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"author\":\"Ronan Sandford\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"routes\":\"define the routing each selector is represented by a bytes5, where the upper most bytes4 is the selector and the lowest bytes represent the index of the implementations implementations' addresses are given in an array\"}}},\"title\":\"Router for at max 10 Implementations and 60 function selectors\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"This Router implementation only support at max 10 implementations and 60 function selectors\"}},\"notice\":\"Create an immutable route and delegate function call to their respective implementations\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"solc_0.8/router/Router10X60.sol\":\"Router10X60\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solc_0.8/router/Router10X60.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/// @title Router for at max 10 Implementations and 60 function selectors\\n/// @author Ronan Sandford\\n/// @notice Create an immutable route and delegate function call to their respective implementations\\ncontract Router10X60 {\\n\\taddress internal immutable implementation_00;\\n\\taddress internal immutable implementation_01;\\n\\taddress internal immutable implementation_02;\\n\\taddress internal immutable implementation_03;\\n\\taddress internal immutable implementation_04;\\n\\taddress internal immutable implementation_05;\\n\\taddress internal immutable implementation_06;\\n\\taddress internal immutable implementation_07;\\n\\taddress internal immutable implementation_08;\\n\\taddress internal immutable implementation_09;\\n\\n\\taddress internal immutable fallback_implementation;\\n\\n\\tuint256 internal immutable sigs_00;\\n\\tuint256 internal immutable sigs_01;\\n\\tuint256 internal immutable sigs_02;\\n\\tuint256 internal immutable sigs_03;\\n\\tuint256 internal immutable sigs_04;\\n\\tuint256 internal immutable sigs_05;\\n\\tuint256 internal immutable sigs_06;\\n\\tuint256 internal immutable sigs_07;\\n\\tuint256 internal immutable sigs_08;\\n\\tuint256 internal immutable sigs_09;\\n\\n\\tuint256 internal immutable sigs_count;\\n\\n\\t// This is the interface for routes specification\\n\\tstruct Routes {\\n\\t\\taddress[] implementations;\\n\\t\\t/// The sigmap is represented as an array of entry\\n\\t\\t// each entry is 5 bytes\\n\\t\\t/// the upmost bytes are the bytes4 function selector\\n\\t\\t// the lowest byte represent the index in the implementation's address array provided aling\\n\\t\\t// This measn there is at max 256 implementation possible\\n\\t\\t// The entry needs to be ordered so binary search can be executed on them\\n\\t\\tbytes5[] sigMap;\\n\\t\\taddress fallbackImplementation;\\n\\t}\\n\\n\\t/// @notice This Router implementation only support at max 10 implementations and 60 function selectors\\n\\t/// @param routes define the routing \\n\\t/// each selector is represented by a bytes5, where the upper most bytes4 is the selector and \\n\\t/// the lowest bytes represent the index of the implementations\\n\\t/// implementations' addresses are given in an array\\n\\tconstructor(Routes memory routes) {\\n\\t\\tuint256 numSigs = routes.sigMap.length;\\n\\t\\tuint256 numImpl = routes.implementations.length;\\n\\t\\trequire(numImpl <= 10, 'MAX_IMPLEMENTATIONS_REACHED');\\n\\t\\trequire(numSigs <= 60, 'MAX_SIGS_REACHED');\\n\\n\\t\\t{\\n\\t\\t\\taddress tmp_implementation_00 = routes.implementations[0];\\n\\t\\t\\taddress tmp_implementation_01;\\n\\t\\t\\taddress tmp_implementation_02;\\n\\t\\t\\taddress tmp_implementation_03;\\n\\t\\t\\taddress tmp_implementation_04;\\n\\t\\t\\taddress tmp_implementation_05;\\n\\t\\t\\taddress tmp_implementation_06;\\n\\t\\t\\taddress tmp_implementation_07;\\n\\t\\t\\taddress tmp_implementation_08;\\n\\t\\t\\taddress tmp_implementation_09;\\n\\t\\t\\tif (numImpl > 1) {\\n\\t\\t\\t\\ttmp_implementation_01 = routes.implementations[1];\\n\\t\\t\\t}\\n\\t\\t\\tif (numImpl > 2) {\\n\\t\\t\\t\\ttmp_implementation_02 = routes.implementations[2];\\n\\t\\t\\t}\\n\\t\\t\\tif (numImpl > 3) {\\n\\t\\t\\t\\ttmp_implementation_03 = routes.implementations[3];\\n\\t\\t\\t}\\n\\t\\t\\tif (numImpl > 4) {\\n\\t\\t\\t\\ttmp_implementation_04 = routes.implementations[4];\\n\\t\\t\\t}\\n\\t\\t\\tif (numImpl > 5) {\\n\\t\\t\\t\\ttmp_implementation_05 = routes.implementations[5];\\n\\t\\t\\t}\\n\\t\\t\\tif (numImpl > 6) {\\n\\t\\t\\t\\ttmp_implementation_06 = routes.implementations[6];\\n\\t\\t\\t}\\n\\t\\t\\tif (numImpl > 7) {\\n\\t\\t\\t\\ttmp_implementation_07 = routes.implementations[7];\\n\\t\\t\\t}\\n\\t\\t\\tif (numImpl > 8) {\\n\\t\\t\\t\\ttmp_implementation_08 = routes.implementations[8];\\n\\t\\t\\t}\\n\\t\\t\\tif (numImpl > 9) {\\n\\t\\t\\t\\ttmp_implementation_09 = routes.implementations[9];\\n\\t\\t\\t}\\n\\n\\t\\t\\timplementation_00 = tmp_implementation_00;\\n\\t\\t\\timplementation_01 = tmp_implementation_01;\\n\\t\\t\\timplementation_02 = tmp_implementation_02;\\n\\t\\t\\timplementation_03 = tmp_implementation_03;\\n\\t\\t\\timplementation_04 = tmp_implementation_04;\\n\\t\\t\\timplementation_05 = tmp_implementation_05;\\n\\t\\t\\timplementation_06 = tmp_implementation_06;\\n\\t\\t\\timplementation_07 = tmp_implementation_07;\\n\\t\\t\\timplementation_08 = tmp_implementation_08;\\n\\t\\t\\timplementation_09 = tmp_implementation_09;\\n\\t\\t}\\n\\n\\t\\t{\\n\\t\\t\\tuint256 tmp_sigs_00;\\n\\t\\t\\tuint256 tmp_sigs_01;\\n\\t\\t\\tuint256 tmp_sigs_02;\\n\\t\\t\\tuint256 tmp_sigs_03;\\n\\t\\t\\tuint256 tmp_sigs_04;\\n\\t\\t\\tuint256 tmp_sigs_05;\\n\\t\\t\\tuint256 tmp_sigs_06;\\n\\t\\t\\tuint256 tmp_sigs_07;\\n\\t\\t\\tuint256 tmp_sigs_08;\\n\\t\\t\\tuint256 tmp_sigs_09;\\n\\t\\t\\t\\n\\t\\t\\tuint256 lastSig;\\n\\t\\t\\tfor (uint256 i = 0; i < numSigs; i++) {\\n\\t\\t\\t\\tuint256 pair = uint256(uint40(routes.sigMap[i]));\\n\\t\\t\\t\\tuint32 sig = uint32(pair >> 8);\\n\\t\\t\\t\\trequire(lastSig < sig, \\\"NOT_IN_ORDER\\\");\\n\\t\\t\\t\\tlastSig = sig;\\n\\t\\t\\t\\tif (i < 6) {\\n\\t\\t\\t\\t\\ttmp_sigs_00 = tmp_sigs_00 | (pair << (i * 40));\\n\\t\\t\\t\\t} else if (i < 12) {\\n\\t\\t\\t\\t\\ttmp_sigs_01 = tmp_sigs_01 | (pair << ((i - 6) * 40));\\n\\t\\t\\t\\t} else if (i < 18) {\\n\\t\\t\\t\\t\\ttmp_sigs_02 = tmp_sigs_02 | (pair << ((i - 12) * 40));\\n\\t\\t\\t\\t} else if (i < 24) {\\n\\t\\t\\t\\t\\ttmp_sigs_03 = tmp_sigs_03 | (pair << ((i - 18) * 40));\\n\\t\\t\\t\\t} else if (i < 30) {\\n\\t\\t\\t\\t\\ttmp_sigs_04 = tmp_sigs_04 | (pair << ((i - 24) * 40));\\n\\t\\t\\t\\t} else if (i < 36) {\\n\\t\\t\\t\\t\\ttmp_sigs_05 = tmp_sigs_05 | (pair << ((i - 30) * 40));\\n\\t\\t\\t\\t} else if (i < 42) {\\n\\t\\t\\t\\t\\ttmp_sigs_06 = tmp_sigs_06 | (pair << ((i - 36) * 40));\\n\\t\\t\\t\\t} else if (i < 48) {\\n\\t\\t\\t\\t\\ttmp_sigs_07 = tmp_sigs_07 | (pair << ((i - 42) * 40));\\n\\t\\t\\t\\t} else if (i < 54) {\\n\\t\\t\\t\\t\\ttmp_sigs_07 = tmp_sigs_08 | (pair << ((i - 48) * 40));\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\ttmp_sigs_07 = tmp_sigs_09 | (pair << ((i - 54) * 40));\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\tsigs_00 = tmp_sigs_00;\\n\\t\\t\\tsigs_01 = tmp_sigs_01;\\n\\t\\t\\tsigs_02 = tmp_sigs_02;\\n\\t\\t\\tsigs_03 = tmp_sigs_03;\\n\\t\\t\\tsigs_04 = tmp_sigs_04;\\n\\t\\t\\tsigs_05 = tmp_sigs_05;\\n\\t\\t\\tsigs_06 = tmp_sigs_06;\\n\\t\\t\\tsigs_07 = tmp_sigs_07;\\n\\t\\t\\tsigs_08 = tmp_sigs_08;\\n\\t\\t\\tsigs_09 = tmp_sigs_09;\\n\\n\\t\\t\\tsigs_count = numSigs;\\n\\t\\t}\\n\\n\\t\\tfallback_implementation = routes.fallbackImplementation;\\n\\t}\\n\\n\\tfallback() external payable {\\n\\t\\tuint32 sig = uint32(msg.sig);\\n\\t\\tuint256 implementationIndex;\\n\\t\\tuint256 left = 0;\\n \\tuint256 right = sigs_count - 1;\\n\\t\\twhile (left <= right) {\\n\\t\\t\\tuint256 i = (left + right) / 2;\\n\\t\\t\\tuint40 pair;\\n\\t\\t\\tif (i < 6) {\\n\\t\\t\\t\\tpair = uint40((sigs_00 >> (i * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t} else if (i < 12) {\\n\\t\\t\\t\\tpair = uint40((sigs_01 >> ((i - 6) * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t} else if (i < 18) {\\n\\t\\t\\t\\tpair = uint40((sigs_02 >> ((i - 12) * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t} else if (i < 24) {\\n\\t\\t\\t\\tpair = uint40((sigs_03 >> ((i - 18) * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t} else if (i < 30) {\\n\\t\\t\\t\\tpair = uint40((sigs_04 >> ((i - 24) * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t} else if (i < 36) {\\n\\t\\t\\t\\tpair = uint40((sigs_05 >> ((i - 30) * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t} else if (i < 42) {\\n\\t\\t\\t\\tpair = uint40((sigs_06 >> ((i - 36) * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t} else if (i < 48) {\\n\\t\\t\\t\\tpair = uint40((sigs_07 >> ((i - 42) * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t} else if (i < 54) {\\n\\t\\t\\t\\tpair = uint40((sigs_08 >> ((i - 48) * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tpair = uint40((sigs_09 >> ((i - 54) * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t}\\n\\t\\t\\tuint32 value = uint32(pair >> 8);\\n\\t\\t\\tif (value > sig) {\\n\\t\\t\\t\\tright = i -1;\\n\\t\\t\\t} else if (value < sig) {\\n\\t\\t\\t\\tleft = i + 1;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\timplementationIndex = uint256(pair & 0xFF) + 1;\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\taddress implementation;\\n\\t\\tif (implementationIndex == 1) {\\n\\t\\t\\timplementation = implementation_00;\\n\\t\\t} else if (implementationIndex == 2) {\\n\\t\\t\\timplementation = implementation_01;\\n\\t\\t} else if (implementationIndex == 3) {\\n\\t\\t\\timplementation = implementation_02;\\n\\t\\t} else if (implementationIndex == 4) {\\n\\t\\t\\timplementation = implementation_03;\\n\\t\\t} else if (implementationIndex == 5) {\\n\\t\\t\\timplementation = implementation_04;\\n\\t\\t} else if (implementationIndex == 6) {\\n\\t\\t\\timplementation = implementation_05;\\n\\t\\t} else if (implementationIndex == 7) {\\n\\t\\t\\timplementation = implementation_06;\\n\\t\\t} else if (implementationIndex == 8) {\\n\\t\\t\\timplementation = implementation_07;\\n\\t\\t} else if (implementationIndex == 9) {\\n\\t\\t\\timplementation = implementation_08;\\n\\t\\t} else if (implementationIndex == 10) {\\n\\t\\t\\timplementation = implementation_09;\\n\\t\\t} else {\\n\\t\\t\\timplementation = fallback_implementation;\\n\\t\\t}\\n\\n\\t\\trequire(implementation != address(0), 'UNKNOWN_METHOD');\\n\\n\\t\\t// taken from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/8cab922347e79732f6a532a75da5081ba7447a71/contracts/proxy/Proxy.sol#L22-L45\\n\\t\\tassembly {\\n\\t\\t\\t// Copy msg.data. We take full control of memory in this inline assembly\\n\\t\\t\\t// block because it will not return to Solidity code. We overwrite the\\n\\t\\t\\t// Solidity scratch pad at memory position 0.\\n\\t\\t\\tcalldatacopy(0, 0, calldatasize())\\n\\n\\t\\t\\t// Call the implementation.\\n\\t\\t\\t// out and outsize are 0 because we don't know the size yet.\\n\\t\\t\\tlet result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n\\t\\t\\t// Copy the returned data.\\n\\t\\t\\treturndatacopy(0, 0, returndatasize())\\n\\n\\t\\t\\tswitch result\\n\\t\\t\\t// delegatecall returns 0 on error.\\n\\t\\t\\tcase 0 {\\n\\t\\t\\t\\trevert(0, returndatasize())\\n\\t\\t\\t}\\n\\t\\t\\tdefault {\\n\\t\\t\\t\\treturn(0, returndatasize())\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\",\"keccak256\":\"0x8f51b7932023299088698f99c6f75f54cf880417d4a42c38548e17b7850d8646\",\"license\":\"MIT\"}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "version": 1, + "methods": { + "acknowledgeMissedResolution(address,bytes32,(uint64,uint8)[],bytes24)": { + "notice": "called by player if they missed the resolution phase and want to minimze the token loss. By providing the moves, they will be slashed only the amount of token required to make the moves" + }, + "acknowledgeMissedResolutionByBurningAllReserve()": { + "notice": "should only be called as last resort this will burn all tokens in reserve If player has access to the secret, better call `acknowledgeMissedResolution`" + }, + "addToReserve(uint256,(uint256,uint256,uint8,bytes32,bytes32))": { + "notice": "called by players to add tokens to their reserve" + }, + "cancelCommitment()": { + "notice": "called by players to cancel their current commitment Can only be called during the commit phase in which the commitment was made It cannot be called afterward" + }, + "getCell(uint256)": { + "notice": "return updated cell (based on current epoch)" + }, + "getCells(uint256[])": { + "notice": "return the list of updated cells (based on current epoch) whose ids is given" + }, + "getCommitment(address)": { + "notice": "The commitment to be resolved. zeroed if no commitment need to be made." + }, + "getConfig()": { + "notice": "return the config used to initialise the Game" + }, + "getTokensInReserve(address)": { + "notice": "the number of token in reserve per account This is used to slash player who do not resolve their commit The amount can be greater than the number of token required for the next move This allow player to potentially hide their intention." + }, + "makeCommitment(bytes24)": { + "notice": "called by players to commit their moves this can be called multiple time in the same epoch, the last call overriding the previous. When a commitment is made, it needs to be resolved in the resolution phase of the same epoch.abi If missed, player can still reveal its moves but none of them will be resolved. The player would lose its associated reserved amount." + }, + "makeCommitmentWithExtraReserve(bytes24,uint256,(uint256,uint256,uint8,bytes32,bytes32))": { + "notice": "called to make a commitment along with tokens to add to the reserve" + }, + "pokeMultiple(uint64[])": { + "notice": "poke and collect the tokens won across multiple cells" + }, + "resolve(address,bytes32,(uint64,uint8)[],bytes24,bool)": { + "notice": "called by player to resolve their commitment this is where the core logic of the game takes place This is where the game board evolves The game is designed so that resolution order do not matter" + }, + "withdrawFromReserve(uint256)": { + "notice": "called by players to withdraw tokens from the reserve can only be called if no commitments are pending Note that while you can withdraw after commiting, note that if you do not have enough tokens you'll have your commitment failing." + }, + "approve(address,uint256)": { + "notice": "Approve an operator to transfer a specific token on the senders behalf." + }, + "balanceOf(address)": { + "notice": "balanceOf is not implemented, keeping track of this add gas and we did not consider that worth it" + }, + "getApproved(uint256)": { + "notice": "Get the approved operator for a specific token." + }, + "isApprovedForAll(address,address)": { + "notice": "Check if the sender approved the operator to transfer any of its tokens." + }, + "name()": { + "notice": "A descriptive name for a collection of NFTs in this contract" + }, + "ownerAndLastTransferBlockNumberList(uint256[])": { + "notice": "Get the list of owner of a token and the blockNumber of its last transfer, useful to voting mechanism." + }, + "ownerAndLastTransferBlockNumberOf(uint256)": { + "notice": "Get the owner of a token and the blockNumber of the last transfer, useful to voting mechanism." + }, + "ownerOf(uint256)": { + "notice": "Get the owner of a token." + }, + "safeTransferFrom(address,address,uint256)": { + "notice": "Transfer a token between 2 addresses letting the receiver know of the transfer." + }, + "safeTransferFrom(address,address,uint256,bytes)": { + "notice": "Transfer a token between 2 addresses letting the receiver knows of the transfer." + }, + "setApprovalForAll(address,bool)": { + "notice": "Set the approval for an operator to manage all the tokens of the sender." + }, + "supportsInterface(bytes4)": { + "notice": "Query if a contract implements an interface" + }, + "symbol()": { + "notice": "An abbreviated name for NFTs in this contract" + }, + "tokenURI(uint256)": { + "notice": "A distinct Uniform Resource Identifier (URI) for a given asset." + }, + "transferFrom(address,address,uint256)": { + "notice": "Transfer a token between 2 addresses." + } + }, + "events": { + "CommitmentCancelled(address,uint24)": { + "notice": "A player has cancelled its current commitment (before it reached the resolution phase)" + }, + "CommitmentMade(address,uint24,bytes24)": { + "notice": "A player has commited to make a move and resolve it on the resolution phase" + }, + "CommitmentResolved(address,uint24,bytes24,(uint64,uint8)[],bytes24,uint256)": { + "notice": "Player has resolved its previous commitment" + }, + "CommitmentVoid(address,uint24,uint256,bytes24)": { + "notice": "A player has canceled a previous commitment by burning some tokens" + }, + "MoveProcessed(uint64,address,uint8,uint8)": { + "notice": "A move has been resolved." + }, + "ReserveDeposited(address,uint256,uint256)": { + "notice": "Player has deposited token in the reserve, allowing it to use that much in game" + }, + "ReserveWithdrawn(address,uint256,uint256)": { + "notice": "Player have withdrawn token from the reserve" + }, + "Approval(address,address,uint256)": { + "notice": "Triggered when a token is approved to be sent by another account Note tat the approval get reset when a Transfer event for that same token is emitted." + }, + "ApprovalForAll(address,address,bool)": { + "notice": "Triggered when an account approve or disaprove another to transfer on its behalf" + }, + "Transfer(address,address,uint256)": { + "notice": "Triggered when a token is transferred" + } + }, + "errors": { + "CanStillResolve()": [ + { + "notice": "Player have to resolve if they can Stratagems will prevent them from acknowledging missed resolution if there is still time to resolve." + } + ], + "CommitmentHashNotMatching()": [ + { + "notice": "Player have to reveal their commitment using the exact same move values If they provide different value, the commitment hash will differ and Stratagems will reject their resolution." + } + ], + "GameNotStarted()": [ + { + "notice": "Game has not started yet, can't perform any action" + } + ], + "InCommitmentPhase()": [ + { + "notice": "When in Commit phase, player can make new commitment but they cannot resolve their move yet." + } + ], + "InResolutionPhase()": [ + { + "notice": "When in Resolution phase, it is not possible to commit new moves or cancel previous commitment During Resolution phase, players have to reveal their commitment, if not already done." + } + ], + "InvalidEpoch()": [ + { + "notice": "Player can only resolve their move in the same epoch they commited.abi If a player resolve later it can only do to minimize the reserve burn cost by calling : `acknowledgeMissedResolution`" + } + ], + "InvalidFurtherMoves()": [ + { + "notice": "Player can make arbitrary number of moves per epoch. To do so they group moves into (MAX_NUM_MOVES_PER_HASH = 32) moves This result in a recursive series of hash that they can then submit in turn while resolving. The limit (MAX_NUM_MOVES_PER_HASH = 32) ensure a resolution batch fits in a block." + } + ], + "NothingToResolve()": [ + { + "notice": "Player can only resolve moves they commited." + } + ], + "PreviousCommitmentNotResolved()": [ + { + "notice": "Previous commitment need to be resolved before making a new one. Even if the corresponding reveal phase has passed.\\ It is also not possible to withdraw any amount from reserve until the commitment is revealed.\\If player lost the information to reveal, it can acknowledge failure which will burn all its reserve.\\" + } + ], + "ReserveTooLow(uint256,uint256)": [ + { + "notice": "to make a commitment you always need at least one `config.numTokensPerGems` amount in reserve Player also need one `config.numTokensPerGems` per moves during the resolution phase." + } + ], + "InvalidAddress(address)": [ + { + "notice": "An invalid address is specified (for example: zero address)" + } + ], + "NonExistentToken(uint256)": [ + { + "notice": "The token does not exist" + } + ], + "NonceOverflow()": [ + { + "notice": "The Nonce overflowed, make a transfer to self to allow new nonces." + } + ], + "NotAuthorized()": [ + { + "notice": "Not authorized to perform this operation" + } + ], + "NotOwner(address,address)": [ + { + "notice": "The address from which the token is sent is not the current owner" + } + ], + "TransferRejected()": [ + { + "notice": "The Transfer was rejected by the destination" + } + ] + } + }, + "argsData": "0x0000000000000000000000003f75e916ac2871bcdeb8b6e5b28f29052407333600000000000000000000000061c461ecc993aadeb7e4b47e96d1b8cc37314b2000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "transaction": { + "hash": "0x166317a721a5396c6775e747e1966601a59850f50c2ee823c20bbcb6d786f6a3", + "nonce": "0x8c", + "origin": "0x61c461ecc993aadeb7e4b47e96d1b8cc37314b20" + } +} \ No newline at end of file diff --git a/contracts/deployments/sepolia/Stratagems_Implementation.json b/contracts/deployments/sepolia/Stratagems_Implementation.json new file mode 100644 index 00000000..9887df46 --- /dev/null +++ b/contracts/deployments/sepolia/Stratagems_Implementation.json @@ -0,0 +1,2008 @@ +{ + "address": "0x3f75e916ac2871bcdeb8b6e5b28f290524073336", + "abi": [ + { + "inputs": [], + "name": "CanStillResolve", + "type": "error" + }, + { + "inputs": [], + "name": "CommitmentHashNotMatching", + "type": "error" + }, + { + "inputs": [], + "name": "GameNotStarted", + "type": "error" + }, + { + "inputs": [], + "name": "InCommitmentPhase", + "type": "error" + }, + { + "inputs": [], + "name": "InResolutionPhase", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidEpoch", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidFurtherMoves", + "type": "error" + }, + { + "inputs": [], + "name": "NothingToResolve", + "type": "error" + }, + { + "inputs": [], + "name": "PreviousCommitmentNotResolved", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "inReserve", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "ReserveTooLow", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint24", + "name": "epoch", + "type": "uint24" + } + ], + "name": "CommitmentCancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint24", + "name": "epoch", + "type": "uint24" + }, + { + "indexed": false, + "internalType": "bytes24", + "name": "commitmentHash", + "type": "bytes24" + } + ], + "name": "CommitmentMade", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint24", + "name": "epoch", + "type": "uint24" + }, + { + "indexed": true, + "internalType": "bytes24", + "name": "commitmentHash", + "type": "bytes24" + }, + { + "components": [ + { + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + } + ], + "indexed": false, + "internalType": "struct UsingStratagemsTypes.Move[]", + "name": "moves", + "type": "tuple[]" + }, + { + "indexed": false, + "internalType": "bytes24", + "name": "furtherMoves", + "type": "bytes24" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newReserveAmount", + "type": "uint256" + } + ], + "name": "CommitmentResolved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint24", + "name": "epoch", + "type": "uint24" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountBurnt", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes24", + "name": "furtherMoves", + "type": "bytes24" + } + ], + "name": "CommitmentVoid", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum UsingStratagemsTypes.Color", + "name": "oldColor", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "enum UsingStratagemsTypes.Color", + "name": "newColor", + "type": "uint8" + } + ], + "name": "MoveProcessed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountDeposited", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newAmount", + "type": "uint256" + } + ], + "name": "ReserveDeposited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountWithdrawn", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newAmount", + "type": "uint256" + } + ], + "name": "ReserveWithdrawn", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "secret", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + } + ], + "internalType": "struct UsingStratagemsTypes.Move[]", + "name": "moves", + "type": "tuple[]" + }, + { + "internalType": "bytes24", + "name": "furtherMoves", + "type": "bytes24" + } + ], + "name": "acknowledgeMissedResolution", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "acknowledgeMissedResolutionByBurningAllReserve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokensAmountToAdd", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "internalType": "struct UsingStratagemsTypes.Permit", + "name": "permit", + "type": "tuple" + } + ], + "name": "addToReserve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "cancelCommitment", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "getCell", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint24", + "name": "lastEpochUpdate", + "type": "uint24" + }, + { + "internalType": "uint24", + "name": "epochWhenTokenIsAdded", + "type": "uint24" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "life", + "type": "uint8" + }, + { + "internalType": "int8", + "name": "delta", + "type": "int8" + }, + { + "internalType": "uint8", + "name": "enemyMap", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "distribution", + "type": "uint8" + } + ], + "internalType": "struct UsingStratagemsTypes.FullCell", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + } + ], + "name": "getCells", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint24", + "name": "lastEpochUpdate", + "type": "uint24" + }, + { + "internalType": "uint24", + "name": "epochWhenTokenIsAdded", + "type": "uint24" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "life", + "type": "uint8" + }, + { + "internalType": "int8", + "name": "delta", + "type": "int8" + }, + { + "internalType": "uint8", + "name": "enemyMap", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "distribution", + "type": "uint8" + } + ], + "internalType": "struct UsingStratagemsTypes.FullCell[]", + "name": "cells", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getCommitment", + "outputs": [ + { + "components": [ + { + "internalType": "bytes24", + "name": "hash", + "type": "bytes24" + }, + { + "internalType": "uint24", + "name": "epoch", + "type": "uint24" + } + ], + "internalType": "struct UsingStratagemsTypes.Commitment", + "name": "commitment", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getConfig", + "outputs": [ + { + "components": [ + { + "internalType": "contract IERC20WithIERC2612", + "name": "tokens", + "type": "address" + }, + { + "internalType": "address payable", + "name": "burnAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "commitPhaseDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "resolutionPhaseDuration", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "maxLife", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "numTokensPerGems", + "type": "uint256" + } + ], + "internalType": "struct UsingStratagemsTypes.Config", + "name": "config", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getTokensInReserve", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes24", + "name": "commitmentHash", + "type": "bytes24" + } + ], + "name": "makeCommitment", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes24", + "name": "commitmentHash", + "type": "bytes24" + }, + { + "internalType": "uint256", + "name": "tokensAmountToAdd", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "internalType": "struct UsingStratagemsTypes.Permit", + "name": "permit", + "type": "tuple" + } + ], + "name": "makeCommitmentWithExtraReserve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "position", + "type": "uint64" + } + ], + "name": "poke", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64[]", + "name": "positions", + "type": "uint64[]" + } + ], + "name": "pokeMultiple", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "secret", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + } + ], + "internalType": "struct UsingStratagemsTypes.Move[]", + "name": "moves", + "type": "tuple[]" + }, + { + "internalType": "bytes24", + "name": "furtherMoves", + "type": "bytes24" + }, + { + "internalType": "bool", + "name": "useReserve", + "type": "bool" + } + ], + "name": "resolve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "withdrawFromReserve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "name": "InvalidAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "NonExistentToken", + "type": "error" + }, + { + "inputs": [], + "name": "NonceOverflow", + "type": "error" + }, + { + "inputs": [], + "name": "NotAuthorized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "provided", + "type": "address" + }, + { + "internalType": "address", + "name": "currentOwner", + "type": "address" + } + ], + "name": "NotOwner", + "type": "error" + }, + { + "inputs": [], + "name": "TransferRejected", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "approved", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "tokenIDs", + "type": "uint256[]" + } + ], + "name": "ownerAndLastTransferBlockNumberList", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "lastTransferBlockNumber", + "type": "uint256" + } + ], + "internalType": "struct IERC721WithBlocknumber.OwnerData[]", + "name": "ownersData", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "ownerAndLastTransferBlockNumberOf", + "outputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceID", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "InvalidCellOverwrite", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "life", + "type": "uint256" + }, + { + "internalType": "int32", + "name": "x", + "type": "int32" + }, + { + "internalType": "int32", + "name": "y", + "type": "int32" + } + ], + "name": "InvalidLifeConfiguration", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "components": [ + { + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint24", + "name": "lastEpochUpdate", + "type": "uint24" + }, + { + "internalType": "uint24", + "name": "epochWhenTokenIsAdded", + "type": "uint24" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "life", + "type": "uint8" + }, + { + "internalType": "int8", + "name": "delta", + "type": "int8" + }, + { + "internalType": "uint8", + "name": "enemyMap", + "type": "uint8" + } + ], + "indexed": false, + "internalType": "struct IStratagemsDebug.DebugCell[]", + "name": "cells", + "type": "tuple[]" + } + ], + "name": "ForceCells", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint24", + "name": "epoch", + "type": "uint24" + }, + { + "components": [ + { + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "life", + "type": "uint8" + } + ], + "indexed": false, + "internalType": "struct IStratagemsDebug.SimpleCell[]", + "name": "cells", + "type": "tuple[]" + } + ], + "name": "ForceSimpleCells", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newTime", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "delta", + "type": "uint256" + } + ], + "name": "TimeIncreased", + "type": "event" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint24", + "name": "lastEpochUpdate", + "type": "uint24" + }, + { + "internalType": "uint24", + "name": "epochWhenTokenIsAdded", + "type": "uint24" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "life", + "type": "uint8" + }, + { + "internalType": "int8", + "name": "delta", + "type": "int8" + }, + { + "internalType": "uint8", + "name": "enemyMap", + "type": "uint8" + } + ], + "internalType": "struct IStratagemsDebug.DebugCell[]", + "name": "cells", + "type": "tuple[]" + } + ], + "name": "forceCells", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + } + ], + "internalType": "struct UsingStratagemsTypes.Move[]", + "name": "moves", + "type": "tuple[]" + } + ], + "name": "forceMoves", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "life", + "type": "uint8" + } + ], + "internalType": "struct IStratagemsDebug.SimpleCell[]", + "name": "cells", + "type": "tuple[]" + } + ], + "name": "forceSimpleCells", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "getRawCell", + "outputs": [ + { + "components": [ + { + "internalType": "uint24", + "name": "lastEpochUpdate", + "type": "uint24" + }, + { + "internalType": "uint24", + "name": "epochWhenTokenIsAdded", + "type": "uint24" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "life", + "type": "uint8" + }, + { + "internalType": "int8", + "name": "delta", + "type": "int8" + }, + { + "internalType": "uint8", + "name": "enemyMap", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "distribution", + "type": "uint8" + } + ], + "internalType": "struct UsingStratagemsTypes.Cell", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "delta", + "type": "uint256" + } + ], + "name": "increaseTime", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "timestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "contractName": "Router10X60", + "sourceName": "solc_0.8/router/Router10X60.sol", + "bytecode": "0x61034060405234801562000011575f80fd5b506040516200108f3803806200108f8339810160408190526200003491620006e2565b602081015151815151600a811115620000945760405162461bcd60e51b815260206004820152601b60248201527f4d41585f494d504c454d454e544154494f4e535f52454143484544000000000060448201526064015b60405180910390fd5b603c821115620000da5760405162461bcd60e51b815260206004820152601060248201526f13505617d4d251d4d7d4915050d2115160821b60448201526064016200008b565b5f835f01515f81518110620000f357620000f3620007e8565b602002602001015190505f805f805f805f805f60018b111562000133578c5180516001908110620001285762000128620007e8565b602002602001015198505b60028b111562000160578c5180516002908110620001555762000155620007e8565b602002602001015197505b60038b11156200018d578c5180516003908110620001825762000182620007e8565b602002602001015196505b60048b1115620001ba578c5180516004908110620001af57620001af620007e8565b602002602001015195505b60058b1115620001e7578c5180516005908110620001dc57620001dc620007e8565b602002602001015194505b60068b111562000214578c5180516006908110620002095762000209620007e8565b602002602001015193505b60078b111562000241578c5180516007908110620002365762000236620007e8565b602002602001015192505b60088b11156200026e578c5180516008908110620002635762000263620007e8565b602002602001015191505b60098b11156200029b578c5180516009908110620002905762000290620007e8565b602002602001015190505b6001600160a01b03998a1660805297891660a05295881660c05293871660e05291861661010052851661012052841661014052831661016052821661018052166101a0525f80808080808080808080805b8d81101562000553575f8f6020015182815181106200030f576200030f620007e8565b602090810291909101015160d881901c915060e01c808410620003645760405162461bcd60e51b815260206004820152600c60248201526b2727aa2fa4a72fa7a92222a960a11b60448201526064016200008b565b8063ffffffff169350600683101562000391576200038483602862000810565b82901b8e179d506200053b565b600c831015620003c257620003a860068462000830565b620003b590602862000810565b82901b8d179c506200053b565b6012831015620003f357620003d9600c8462000830565b620003e690602862000810565b82901b8c179b506200053b565b601883101562000424576200040a60128462000830565b6200041790602862000810565b82901b8b179a506200053b565b601e83101562000455576200043b60188462000830565b6200044890602862000810565b82901b8a1799506200053b565b602483101562000486576200046c601e8462000830565b6200047990602862000810565b82901b891798506200053b565b602a831015620004b7576200049d60248462000830565b620004aa90602862000810565b82901b881797506200053b565b6030831015620004e857620004ce602a8462000830565b620004db90602862000810565b82901b871796506200053b565b60368310156200051957620004ff60308462000830565b6200050c90602862000810565b82901b861796506200053b565b6200052660368462000830565b6200053390602862000810565b82901b851796505b505080806200054a9062000846565b915050620002ec565b50506101e09990995261020097909752610220959095526102409390935261026091909152610280526102a0526102c0526102e052610300525061032052604001516001600160a01b03166101c05262000861565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715620005e157620005e1620005a8565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620006125762000612620005a8565b604052919050565b5f6001600160401b03821115620006355762000635620005a8565b5060051b60200190565b80516001600160a01b038116811462000656575f80fd5b919050565b5f82601f8301126200066b575f80fd5b81516020620006846200067e836200061a565b620005e7565b82815260059290921b84018101918181019086841115620006a3575f80fd5b8286015b84811015620006d75780516001600160d81b031981168114620006c9575f8081fd5b8352918301918301620006a7565b509695505050505050565b5f6020808385031215620006f4575f80fd5b82516001600160401b03808211156200070b575f80fd5b90840190606082870312156200071f575f80fd5b62000729620005bc565b82518281111562000738575f80fd5b8301601f8101881362000749575f80fd5b80516200075a6200067e826200061a565b81815260059190911b8201860190868101908a83111562000779575f80fd5b928701925b82841015620007a25762000792846200063f565b825292870192908701906200077e565b84525050508284015182811115620007b8575f80fd5b620007c6888286016200065b565b8583015250620007d9604084016200063f565b60408201529695505050505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176200082a576200082a620007fc565b92915050565b818103818111156200082a576200082a620007fc565b5f600182016200085a576200085a620007fc565b5060010190565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e0516103005161032051610749620009465f395f601401525f61033901525f6102f201525f6102a201525f61025201525f61020201525f6101b201525f61016201525f61011201525f60c201525f607201525f6105ac01525f61058501525f61055601525f61052701525f6104f801525f6104c901525f61049a01525f61046b01525f61043c01525f61040d01525f6103de01526107495ff3fe60806040525f803560e01c90808061003860017f0000000000000000000000000000000000000000000000000000000000000000610698565b90505b8082116103d2575f600261004f83856106b1565b61005991906106c4565b90505f60068210156100a1576100708260286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b600c8210156100f1576100b5600683610698565b6100c09060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b601282101561014157610105600c83610698565b6101109060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b601882101561019157610155601283610698565b6101609060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b601e8210156101e1576101a5601883610698565b6101b09060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b6024821015610231576101f5601e83610698565b6102009060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b602a82101561028157610245602483610698565b6102509060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b60308210156102d157610295602a83610698565b6102a09060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b6036821015610321576102e5603083610698565b6102f09060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b61032c603683610698565b6103379060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff1690505b63ffffffff600882901c811690871681111561038c57610385600184610698565b93506103ca565b8663ffffffff168163ffffffff1610156103b2576103ab8360016106b1565b94506103ca565b6103c060ff831660016106b1565b95505050506103d2565b50505061003b565b5f8360010361040257507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360020361043157507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360030361046057507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360040361048f57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b836005036104be57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b836006036104ed57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360070361051c57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360080361054b57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360090361057a57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b83600a036105a957507f00000000000000000000000000000000000000000000000000000000000000006105cc565b507f00000000000000000000000000000000000000000000000000000000000000005b73ffffffffffffffffffffffffffffffffffffffff811661064d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f554e4b4e4f574e5f4d4554484f44000000000000000000000000000000000000604482015260640160405180910390fd5b365f80375f80365f845af43d5f803e808015610667573d5ff35b3d5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156106ab576106ab61066b565b92915050565b808201808211156106ab576106ab61066b565b5f826106f7577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820281158282048414176106ab576106ab61066b56fea2646970667358221220e346ecc6b2ab869aea383a1cb6f406a909814848ad012048b904d157b81a433964736f6c63430008140033", + "deployedBytecode": "0x60806040525f803560e01c90808061003860017f0000000000000000000000000000000000000000000000000000000000000000610698565b90505b8082116103d2575f600261004f83856106b1565b61005991906106c4565b90505f60068210156100a1576100708260286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b600c8210156100f1576100b5600683610698565b6100c09060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b601282101561014157610105600c83610698565b6101109060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b601882101561019157610155601283610698565b6101609060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b601e8210156101e1576101a5601883610698565b6101b09060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b6024821015610231576101f5601e83610698565b6102009060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b602a82101561028157610245602483610698565b6102509060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b60308210156102d157610295602a83610698565b6102a09060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b6036821015610321576102e5603083610698565b6102f09060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b61032c603683610698565b6103379060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff1690505b63ffffffff600882901c811690871681111561038c57610385600184610698565b93506103ca565b8663ffffffff168163ffffffff1610156103b2576103ab8360016106b1565b94506103ca565b6103c060ff831660016106b1565b95505050506103d2565b50505061003b565b5f8360010361040257507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360020361043157507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360030361046057507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360040361048f57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b836005036104be57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b836006036104ed57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360070361051c57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360080361054b57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360090361057a57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b83600a036105a957507f00000000000000000000000000000000000000000000000000000000000000006105cc565b507f00000000000000000000000000000000000000000000000000000000000000005b73ffffffffffffffffffffffffffffffffffffffff811661064d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f554e4b4e4f574e5f4d4554484f44000000000000000000000000000000000000604482015260640160405180910390fd5b365f80375f80365f845af43d5f803e808015610667573d5ff35b3d5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156106ab576106ab61066b565b92915050565b808201808211156106ab576106ab61066b565b5f826106f7577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820281158282048414176106ab576106ab61066b56fea2646970667358221220e346ecc6b2ab869aea383a1cb6f406a909814848ad012048b904d157b81a433964736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {}, + "devdoc": { + "kind": "dev", + "version": 1, + "methods": { + "acknowledgeMissedResolution(address,bytes32,(uint64,uint8)[],bytes24)": { + "params": { + "furtherMoves": "if moves cannot be contained in one tx, further moves are represented by a hash to resolve too", + "moves": "the actual moves", + "player": "the account who committed the move", + "secret": "the secret used to make the commit" + } + }, + "addToReserve(uint256,(uint256,uint256,uint8,bytes32,bytes32))": { + "params": { + "permit": "permit EIP2612, .value = zero if not needed", + "tokensAmountToAdd": "amount of tokens to add" + } + }, + "getCell(uint256)": { + "params": { + "id": "the cell id" + } + }, + "getCells(uint256[])": { + "params": { + "ids": "the list of cell ids" + } + }, + "getCommitment(address)": { + "params": { + "account": "the address of which to retrieve the commitment" + } + }, + "getTokensInReserve(address)": { + "params": { + "account": "the address to retrived the amount in reserve of." + } + }, + "makeCommitment(bytes24)": { + "params": { + "commitmentHash": "the hash of the moves" + } + }, + "makeCommitmentWithExtraReserve(bytes24,uint256,(uint256,uint256,uint8,bytes32,bytes32))": { + "params": { + "commitmentHash": "the has of the moves", + "permit": "permit EIP2612, value = zero if not needed", + "tokensAmountToAdd": "amount of tokens to add to the reserve. the resulting total must be enough to cover the moves" + } + }, + "poke(uint64)": { + "params": { + "position": "the cell position" + } + }, + "pokeMultiple(uint64[])": { + "params": { + "positions": "cell positions to collect from" + } + }, + "resolve(address,bytes32,(uint64,uint8)[],bytes24,bool)": { + "params": { + "furtherMoves": "if moves cannot be contained in one tx, further moves are represented by a hash to resolve too Note that you have to that have enough moves (specified by MAX_NUM_MOVES_PER_HASH = 32)", + "moves": "the actual moves", + "player": "the account who committed the move", + "secret": "the secret used to make the commit", + "useReserve": "whether the tokens are taken from the reserve or from approvals. This allow player to keep their reserve intact and use it on their next move. Note that this require the Stratagems contract to have enough allowance." + } + }, + "withdrawFromReserve(uint256)": { + "params": { + "amount": "number of tokens to withdraw" + } + }, + "approve(address,uint256)": { + "params": { + "operator": "The address receiving the approval.", + "tokenID": "The id of the token." + } + }, + "getApproved(uint256)": { + "params": { + "tokenID": "The id of the token." + }, + "returns": { + "operator": "The address of the operator." + } + }, + "isApprovedForAll(address,address)": { + "params": { + "operator": "The address of the operator.", + "owner": "The address of the owner." + }, + "returns": { + "_0": "isOperator The status of the approval." + } + }, + "ownerAndLastTransferBlockNumberList(uint256[])": { + "params": { + "tokenIDs": "The list of token ids to check." + }, + "returns": { + "ownersData": "The list of (owner, lastTransferBlockNumber) for each ids given as input." + } + }, + "ownerAndLastTransferBlockNumberOf(uint256)": { + "params": { + "tokenID": "The id of the token." + }, + "returns": { + "blockNumber": "The blocknumber at which the last transfer of that id happened.", + "owner": "The address of the token owner." + } + }, + "ownerOf(uint256)": { + "params": { + "tokenID": "The id of the token." + }, + "returns": { + "owner": "The address of the token owner." + } + }, + "safeTransferFrom(address,address,uint256)": { + "params": { + "from": "The send of the token.", + "to": "The recipient of the token.", + "tokenID": "The id of the token." + } + }, + "safeTransferFrom(address,address,uint256,bytes)": { + "params": { + "data": "Additional data.", + "from": "The sender of the token.", + "to": "The recipient of the token.", + "tokenID": "The id of the token." + } + }, + "setApprovalForAll(address,bool)": { + "params": { + "approved": "The determination of the approval.", + "operator": "The address receiving the approval." + } + }, + "supportsInterface(bytes4)": { + "details": "Interface identification is specified in ERC-165. This function uses less than 30,000 gas.", + "params": { + "interfaceID": "The interface identifier, as specified in ERC-165" + }, + "returns": { + "_0": "`true` if the contract implements `interfaceID` and `interfaceID` is not 0xffffffff, `false` otherwise" + } + }, + "tokenURI(uint256)": { + "details": "Throws if `tokenID` is not a valid NFT. URIs are defined in RFC 3986. The URI may point to a JSON file that conforms to the \"ERC721 Metadata JSON Schema\".", + "params": { + "tokenID": "id of the token being queried." + } + }, + "transferFrom(address,address,uint256)": { + "params": { + "from": "The sender of the token.", + "to": "The recipient of the token.", + "tokenID": "The id of the token." + } + } + }, + "events": { + "CommitmentCancelled(address,uint24)": { + "params": { + "epoch": "epoch number on which this commit belongs to", + "player": "account taking the staking risk (can be a different account than the one controlling the gems)" + } + }, + "CommitmentMade(address,uint24,bytes24)": { + "params": { + "commitmentHash": "the hash of moves", + "epoch": "epoch number on which this commit belongs to", + "player": "account taking the staking risk (can be a different account than the one controlling the gems)" + } + }, + "CommitmentResolved(address,uint24,bytes24,(uint64,uint8)[],bytes24,uint256)": { + "params": { + "commitmentHash": "the hash of the moves", + "epoch": "epoch number on which this commit belongs to", + "furtherMoves": "hash of further moves, unless bytes32(0) which indicate end.", + "moves": "the moves", + "player": "account who commited" + } + }, + "CommitmentVoid(address,uint24,uint256,bytes24)": { + "params": { + "amountBurnt": "amount of token to burn", + "epoch": "epoch number on which this commit belongs to", + "furtherMoves": "hash of further moves, unless bytes32(0) which indicate end.", + "player": "the account that made the commitment" + } + }, + "MoveProcessed(uint64,address,uint8,uint8)": { + "params": { + "newColor": "color that takes over", + "oldColor": "previous color of the cell", + "player": "account making the move", + "position": "cell at which the move take place" + } + }, + "ReserveDeposited(address,uint256,uint256)": { + "params": { + "amountDeposited": "the number of tokens deposited", + "newAmount": "the number of tokens in reserver as a result", + "player": "account receiving the token in the reserve" + } + }, + "ReserveWithdrawn(address,uint256,uint256)": { + "params": { + "amountWithdrawn": "the number of tokens withdrawnn", + "newAmount": "the number of tokens in reserver as a result", + "player": "account withdrawing the tokens" + } + }, + "Approval(address,address,uint256)": { + "params": { + "approved": "account who can know transfer on the owner's behalf", + "owner": "current owner of the token", + "tokenID": "id of the token being approved" + } + }, + "ApprovalForAll(address,address,bool)": { + "params": { + "approved": "whether it is approved or not", + "operator": "account who can know transfer on the owner's behalf", + "owner": "the account granting rights over all of its token" + } + }, + "Transfer(address,address,uint256)": { + "params": { + "from": "the account the token is sent from", + "to": "the account the token is sent to", + "tokenID": "id of the token being sent" + } + } + }, + "errors": { + "ReserveTooLow(uint256,uint256)": [ + { + "params": { + "expected": "amount required to proceed", + "inReserve": "amount in reserver as the time of the call" + } + } + ], + "InvalidAddress(address)": [ + { + "params": { + "addr": "invalid address" + } + } + ], + "NonExistentToken(uint256)": [ + { + "params": { + "tokenID": "id of the expected token" + } + } + ], + "NotOwner(address,address)": [ + { + "params": { + "currentOwner": "the current owner", + "provided": "the address expected to be the current owner" + } + } + ] + } + }, + "evm": { + "gasEstimates": { + "creation": { + "codeDepositCost": "373000", + "executionCost": "infinite", + "totalCost": "infinite" + }, + "external": { + "": "infinite" + } + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"address[]\",\"name\":\"implementations\",\"type\":\"address[]\"},{\"internalType\":\"bytes5[]\",\"name\":\"sigMap\",\"type\":\"bytes5[]\"},{\"internalType\":\"address\",\"name\":\"fallbackImplementation\",\"type\":\"address\"}],\"internalType\":\"struct Router10X60.Routes\",\"name\":\"routes\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"author\":\"Ronan Sandford\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"routes\":\"define the routing each selector is represented by a bytes5, where the upper most bytes4 is the selector and the lowest bytes represent the index of the implementations implementations' addresses are given in an array\"}}},\"title\":\"Router for at max 10 Implementations and 60 function selectors\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"This Router implementation only support at max 10 implementations and 60 function selectors\"}},\"notice\":\"Create an immutable route and delegate function call to their respective implementations\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"solc_0.8/router/Router10X60.sol\":\"Router10X60\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solc_0.8/router/Router10X60.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/// @title Router for at max 10 Implementations and 60 function selectors\\n/// @author Ronan Sandford\\n/// @notice Create an immutable route and delegate function call to their respective implementations\\ncontract Router10X60 {\\n\\taddress internal immutable implementation_00;\\n\\taddress internal immutable implementation_01;\\n\\taddress internal immutable implementation_02;\\n\\taddress internal immutable implementation_03;\\n\\taddress internal immutable implementation_04;\\n\\taddress internal immutable implementation_05;\\n\\taddress internal immutable implementation_06;\\n\\taddress internal immutable implementation_07;\\n\\taddress internal immutable implementation_08;\\n\\taddress internal immutable implementation_09;\\n\\n\\taddress internal immutable fallback_implementation;\\n\\n\\tuint256 internal immutable sigs_00;\\n\\tuint256 internal immutable sigs_01;\\n\\tuint256 internal immutable sigs_02;\\n\\tuint256 internal immutable sigs_03;\\n\\tuint256 internal immutable sigs_04;\\n\\tuint256 internal immutable sigs_05;\\n\\tuint256 internal immutable sigs_06;\\n\\tuint256 internal immutable sigs_07;\\n\\tuint256 internal immutable sigs_08;\\n\\tuint256 internal immutable sigs_09;\\n\\n\\tuint256 internal immutable sigs_count;\\n\\n\\t// This is the interface for routes specification\\n\\tstruct Routes {\\n\\t\\taddress[] implementations;\\n\\t\\t/// The sigmap is represented as an array of entry\\n\\t\\t// each entry is 5 bytes\\n\\t\\t/// the upmost bytes are the bytes4 function selector\\n\\t\\t// the lowest byte represent the index in the implementation's address array provided aling\\n\\t\\t// This measn there is at max 256 implementation possible\\n\\t\\t// The entry needs to be ordered so binary search can be executed on them\\n\\t\\tbytes5[] sigMap;\\n\\t\\taddress fallbackImplementation;\\n\\t}\\n\\n\\t/// @notice This Router implementation only support at max 10 implementations and 60 function selectors\\n\\t/// @param routes define the routing \\n\\t/// each selector is represented by a bytes5, where the upper most bytes4 is the selector and \\n\\t/// the lowest bytes represent the index of the implementations\\n\\t/// implementations' addresses are given in an array\\n\\tconstructor(Routes memory routes) {\\n\\t\\tuint256 numSigs = routes.sigMap.length;\\n\\t\\tuint256 numImpl = routes.implementations.length;\\n\\t\\trequire(numImpl <= 10, 'MAX_IMPLEMENTATIONS_REACHED');\\n\\t\\trequire(numSigs <= 60, 'MAX_SIGS_REACHED');\\n\\n\\t\\t{\\n\\t\\t\\taddress tmp_implementation_00 = routes.implementations[0];\\n\\t\\t\\taddress tmp_implementation_01;\\n\\t\\t\\taddress tmp_implementation_02;\\n\\t\\t\\taddress tmp_implementation_03;\\n\\t\\t\\taddress tmp_implementation_04;\\n\\t\\t\\taddress tmp_implementation_05;\\n\\t\\t\\taddress tmp_implementation_06;\\n\\t\\t\\taddress tmp_implementation_07;\\n\\t\\t\\taddress tmp_implementation_08;\\n\\t\\t\\taddress tmp_implementation_09;\\n\\t\\t\\tif (numImpl > 1) {\\n\\t\\t\\t\\ttmp_implementation_01 = routes.implementations[1];\\n\\t\\t\\t}\\n\\t\\t\\tif (numImpl > 2) {\\n\\t\\t\\t\\ttmp_implementation_02 = routes.implementations[2];\\n\\t\\t\\t}\\n\\t\\t\\tif (numImpl > 3) {\\n\\t\\t\\t\\ttmp_implementation_03 = routes.implementations[3];\\n\\t\\t\\t}\\n\\t\\t\\tif (numImpl > 4) {\\n\\t\\t\\t\\ttmp_implementation_04 = routes.implementations[4];\\n\\t\\t\\t}\\n\\t\\t\\tif (numImpl > 5) {\\n\\t\\t\\t\\ttmp_implementation_05 = routes.implementations[5];\\n\\t\\t\\t}\\n\\t\\t\\tif (numImpl > 6) {\\n\\t\\t\\t\\ttmp_implementation_06 = routes.implementations[6];\\n\\t\\t\\t}\\n\\t\\t\\tif (numImpl > 7) {\\n\\t\\t\\t\\ttmp_implementation_07 = routes.implementations[7];\\n\\t\\t\\t}\\n\\t\\t\\tif (numImpl > 8) {\\n\\t\\t\\t\\ttmp_implementation_08 = routes.implementations[8];\\n\\t\\t\\t}\\n\\t\\t\\tif (numImpl > 9) {\\n\\t\\t\\t\\ttmp_implementation_09 = routes.implementations[9];\\n\\t\\t\\t}\\n\\n\\t\\t\\timplementation_00 = tmp_implementation_00;\\n\\t\\t\\timplementation_01 = tmp_implementation_01;\\n\\t\\t\\timplementation_02 = tmp_implementation_02;\\n\\t\\t\\timplementation_03 = tmp_implementation_03;\\n\\t\\t\\timplementation_04 = tmp_implementation_04;\\n\\t\\t\\timplementation_05 = tmp_implementation_05;\\n\\t\\t\\timplementation_06 = tmp_implementation_06;\\n\\t\\t\\timplementation_07 = tmp_implementation_07;\\n\\t\\t\\timplementation_08 = tmp_implementation_08;\\n\\t\\t\\timplementation_09 = tmp_implementation_09;\\n\\t\\t}\\n\\n\\t\\t{\\n\\t\\t\\tuint256 tmp_sigs_00;\\n\\t\\t\\tuint256 tmp_sigs_01;\\n\\t\\t\\tuint256 tmp_sigs_02;\\n\\t\\t\\tuint256 tmp_sigs_03;\\n\\t\\t\\tuint256 tmp_sigs_04;\\n\\t\\t\\tuint256 tmp_sigs_05;\\n\\t\\t\\tuint256 tmp_sigs_06;\\n\\t\\t\\tuint256 tmp_sigs_07;\\n\\t\\t\\tuint256 tmp_sigs_08;\\n\\t\\t\\tuint256 tmp_sigs_09;\\n\\t\\t\\t\\n\\t\\t\\tuint256 lastSig;\\n\\t\\t\\tfor (uint256 i = 0; i < numSigs; i++) {\\n\\t\\t\\t\\tuint256 pair = uint256(uint40(routes.sigMap[i]));\\n\\t\\t\\t\\tuint32 sig = uint32(pair >> 8);\\n\\t\\t\\t\\trequire(lastSig < sig, \\\"NOT_IN_ORDER\\\");\\n\\t\\t\\t\\tlastSig = sig;\\n\\t\\t\\t\\tif (i < 6) {\\n\\t\\t\\t\\t\\ttmp_sigs_00 = tmp_sigs_00 | (pair << (i * 40));\\n\\t\\t\\t\\t} else if (i < 12) {\\n\\t\\t\\t\\t\\ttmp_sigs_01 = tmp_sigs_01 | (pair << ((i - 6) * 40));\\n\\t\\t\\t\\t} else if (i < 18) {\\n\\t\\t\\t\\t\\ttmp_sigs_02 = tmp_sigs_02 | (pair << ((i - 12) * 40));\\n\\t\\t\\t\\t} else if (i < 24) {\\n\\t\\t\\t\\t\\ttmp_sigs_03 = tmp_sigs_03 | (pair << ((i - 18) * 40));\\n\\t\\t\\t\\t} else if (i < 30) {\\n\\t\\t\\t\\t\\ttmp_sigs_04 = tmp_sigs_04 | (pair << ((i - 24) * 40));\\n\\t\\t\\t\\t} else if (i < 36) {\\n\\t\\t\\t\\t\\ttmp_sigs_05 = tmp_sigs_05 | (pair << ((i - 30) * 40));\\n\\t\\t\\t\\t} else if (i < 42) {\\n\\t\\t\\t\\t\\ttmp_sigs_06 = tmp_sigs_06 | (pair << ((i - 36) * 40));\\n\\t\\t\\t\\t} else if (i < 48) {\\n\\t\\t\\t\\t\\ttmp_sigs_07 = tmp_sigs_07 | (pair << ((i - 42) * 40));\\n\\t\\t\\t\\t} else if (i < 54) {\\n\\t\\t\\t\\t\\ttmp_sigs_07 = tmp_sigs_08 | (pair << ((i - 48) * 40));\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\ttmp_sigs_07 = tmp_sigs_09 | (pair << ((i - 54) * 40));\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\tsigs_00 = tmp_sigs_00;\\n\\t\\t\\tsigs_01 = tmp_sigs_01;\\n\\t\\t\\tsigs_02 = tmp_sigs_02;\\n\\t\\t\\tsigs_03 = tmp_sigs_03;\\n\\t\\t\\tsigs_04 = tmp_sigs_04;\\n\\t\\t\\tsigs_05 = tmp_sigs_05;\\n\\t\\t\\tsigs_06 = tmp_sigs_06;\\n\\t\\t\\tsigs_07 = tmp_sigs_07;\\n\\t\\t\\tsigs_08 = tmp_sigs_08;\\n\\t\\t\\tsigs_09 = tmp_sigs_09;\\n\\n\\t\\t\\tsigs_count = numSigs;\\n\\t\\t}\\n\\n\\t\\tfallback_implementation = routes.fallbackImplementation;\\n\\t}\\n\\n\\tfallback() external payable {\\n\\t\\tuint32 sig = uint32(msg.sig);\\n\\t\\tuint256 implementationIndex;\\n\\t\\tuint256 left = 0;\\n \\tuint256 right = sigs_count - 1;\\n\\t\\twhile (left <= right) {\\n\\t\\t\\tuint256 i = (left + right) / 2;\\n\\t\\t\\tuint40 pair;\\n\\t\\t\\tif (i < 6) {\\n\\t\\t\\t\\tpair = uint40((sigs_00 >> (i * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t} else if (i < 12) {\\n\\t\\t\\t\\tpair = uint40((sigs_01 >> ((i - 6) * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t} else if (i < 18) {\\n\\t\\t\\t\\tpair = uint40((sigs_02 >> ((i - 12) * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t} else if (i < 24) {\\n\\t\\t\\t\\tpair = uint40((sigs_03 >> ((i - 18) * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t} else if (i < 30) {\\n\\t\\t\\t\\tpair = uint40((sigs_04 >> ((i - 24) * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t} else if (i < 36) {\\n\\t\\t\\t\\tpair = uint40((sigs_05 >> ((i - 30) * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t} else if (i < 42) {\\n\\t\\t\\t\\tpair = uint40((sigs_06 >> ((i - 36) * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t} else if (i < 48) {\\n\\t\\t\\t\\tpair = uint40((sigs_07 >> ((i - 42) * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t} else if (i < 54) {\\n\\t\\t\\t\\tpair = uint40((sigs_08 >> ((i - 48) * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tpair = uint40((sigs_09 >> ((i - 54) * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t}\\n\\t\\t\\tuint32 value = uint32(pair >> 8);\\n\\t\\t\\tif (value > sig) {\\n\\t\\t\\t\\tright = i -1;\\n\\t\\t\\t} else if (value < sig) {\\n\\t\\t\\t\\tleft = i + 1;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\timplementationIndex = uint256(pair & 0xFF) + 1;\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\taddress implementation;\\n\\t\\tif (implementationIndex == 1) {\\n\\t\\t\\timplementation = implementation_00;\\n\\t\\t} else if (implementationIndex == 2) {\\n\\t\\t\\timplementation = implementation_01;\\n\\t\\t} else if (implementationIndex == 3) {\\n\\t\\t\\timplementation = implementation_02;\\n\\t\\t} else if (implementationIndex == 4) {\\n\\t\\t\\timplementation = implementation_03;\\n\\t\\t} else if (implementationIndex == 5) {\\n\\t\\t\\timplementation = implementation_04;\\n\\t\\t} else if (implementationIndex == 6) {\\n\\t\\t\\timplementation = implementation_05;\\n\\t\\t} else if (implementationIndex == 7) {\\n\\t\\t\\timplementation = implementation_06;\\n\\t\\t} else if (implementationIndex == 8) {\\n\\t\\t\\timplementation = implementation_07;\\n\\t\\t} else if (implementationIndex == 9) {\\n\\t\\t\\timplementation = implementation_08;\\n\\t\\t} else if (implementationIndex == 10) {\\n\\t\\t\\timplementation = implementation_09;\\n\\t\\t} else {\\n\\t\\t\\timplementation = fallback_implementation;\\n\\t\\t}\\n\\n\\t\\trequire(implementation != address(0), 'UNKNOWN_METHOD');\\n\\n\\t\\t// taken from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/8cab922347e79732f6a532a75da5081ba7447a71/contracts/proxy/Proxy.sol#L22-L45\\n\\t\\tassembly {\\n\\t\\t\\t// Copy msg.data. We take full control of memory in this inline assembly\\n\\t\\t\\t// block because it will not return to Solidity code. We overwrite the\\n\\t\\t\\t// Solidity scratch pad at memory position 0.\\n\\t\\t\\tcalldatacopy(0, 0, calldatasize())\\n\\n\\t\\t\\t// Call the implementation.\\n\\t\\t\\t// out and outsize are 0 because we don't know the size yet.\\n\\t\\t\\tlet result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n\\t\\t\\t// Copy the returned data.\\n\\t\\t\\treturndatacopy(0, 0, returndatasize())\\n\\n\\t\\t\\tswitch result\\n\\t\\t\\t// delegatecall returns 0 on error.\\n\\t\\t\\tcase 0 {\\n\\t\\t\\t\\trevert(0, returndatasize())\\n\\t\\t\\t}\\n\\t\\t\\tdefault {\\n\\t\\t\\t\\treturn(0, returndatasize())\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\",\"keccak256\":\"0x8f51b7932023299088698f99c6f75f54cf880417d4a42c38548e17b7850d8646\",\"license\":\"MIT\"}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "version": 1, + "methods": { + "acknowledgeMissedResolution(address,bytes32,(uint64,uint8)[],bytes24)": { + "notice": "called by player if they missed the resolution phase and want to minimze the token loss. By providing the moves, they will be slashed only the amount of token required to make the moves" + }, + "acknowledgeMissedResolutionByBurningAllReserve()": { + "notice": "should only be called as last resort this will burn all tokens in reserve If player has access to the secret, better call `acknowledgeMissedResolution`" + }, + "addToReserve(uint256,(uint256,uint256,uint8,bytes32,bytes32))": { + "notice": "called by players to add tokens to their reserve" + }, + "cancelCommitment()": { + "notice": "called by players to cancel their current commitment Can only be called during the commit phase in which the commitment was made It cannot be called afterward" + }, + "getCell(uint256)": { + "notice": "return updated cell (based on current epoch)" + }, + "getCells(uint256[])": { + "notice": "return the list of updated cells (based on current epoch) whose ids is given" + }, + "getCommitment(address)": { + "notice": "The commitment to be resolved. zeroed if no commitment need to be made." + }, + "getConfig()": { + "notice": "return the config used to initialise the Game" + }, + "getTokensInReserve(address)": { + "notice": "the number of token in reserve per account This is used to slash player who do not resolve their commit The amount can be greater than the number of token required for the next move This allow player to potentially hide their intention." + }, + "makeCommitment(bytes24)": { + "notice": "called by players to commit their moves this can be called multiple time in the same epoch, the last call overriding the previous. When a commitment is made, it needs to be resolved in the resolution phase of the same epoch.abi If missed, player can still reveal its moves but none of them will be resolved. The player would lose its associated reserved amount." + }, + "makeCommitmentWithExtraReserve(bytes24,uint256,(uint256,uint256,uint8,bytes32,bytes32))": { + "notice": "called to make a commitment along with tokens to add to the reserve" + }, + "pokeMultiple(uint64[])": { + "notice": "poke and collect the tokens won across multiple cells" + }, + "resolve(address,bytes32,(uint64,uint8)[],bytes24,bool)": { + "notice": "called by player to resolve their commitment this is where the core logic of the game takes place This is where the game board evolves The game is designed so that resolution order do not matter" + }, + "withdrawFromReserve(uint256)": { + "notice": "called by players to withdraw tokens from the reserve can only be called if no commitments are pending Note that while you can withdraw after commiting, note that if you do not have enough tokens you'll have your commitment failing." + }, + "approve(address,uint256)": { + "notice": "Approve an operator to transfer a specific token on the senders behalf." + }, + "balanceOf(address)": { + "notice": "balanceOf is not implemented, keeping track of this add gas and we did not consider that worth it" + }, + "getApproved(uint256)": { + "notice": "Get the approved operator for a specific token." + }, + "isApprovedForAll(address,address)": { + "notice": "Check if the sender approved the operator to transfer any of its tokens." + }, + "name()": { + "notice": "A descriptive name for a collection of NFTs in this contract" + }, + "ownerAndLastTransferBlockNumberList(uint256[])": { + "notice": "Get the list of owner of a token and the blockNumber of its last transfer, useful to voting mechanism." + }, + "ownerAndLastTransferBlockNumberOf(uint256)": { + "notice": "Get the owner of a token and the blockNumber of the last transfer, useful to voting mechanism." + }, + "ownerOf(uint256)": { + "notice": "Get the owner of a token." + }, + "safeTransferFrom(address,address,uint256)": { + "notice": "Transfer a token between 2 addresses letting the receiver know of the transfer." + }, + "safeTransferFrom(address,address,uint256,bytes)": { + "notice": "Transfer a token between 2 addresses letting the receiver knows of the transfer." + }, + "setApprovalForAll(address,bool)": { + "notice": "Set the approval for an operator to manage all the tokens of the sender." + }, + "supportsInterface(bytes4)": { + "notice": "Query if a contract implements an interface" + }, + "symbol()": { + "notice": "An abbreviated name for NFTs in this contract" + }, + "tokenURI(uint256)": { + "notice": "A distinct Uniform Resource Identifier (URI) for a given asset." + }, + "transferFrom(address,address,uint256)": { + "notice": "Transfer a token between 2 addresses." + } + }, + "events": { + "CommitmentCancelled(address,uint24)": { + "notice": "A player has cancelled its current commitment (before it reached the resolution phase)" + }, + "CommitmentMade(address,uint24,bytes24)": { + "notice": "A player has commited to make a move and resolve it on the resolution phase" + }, + "CommitmentResolved(address,uint24,bytes24,(uint64,uint8)[],bytes24,uint256)": { + "notice": "Player has resolved its previous commitment" + }, + "CommitmentVoid(address,uint24,uint256,bytes24)": { + "notice": "A player has canceled a previous commitment by burning some tokens" + }, + "MoveProcessed(uint64,address,uint8,uint8)": { + "notice": "A move has been resolved." + }, + "ReserveDeposited(address,uint256,uint256)": { + "notice": "Player has deposited token in the reserve, allowing it to use that much in game" + }, + "ReserveWithdrawn(address,uint256,uint256)": { + "notice": "Player have withdrawn token from the reserve" + }, + "Approval(address,address,uint256)": { + "notice": "Triggered when a token is approved to be sent by another account Note tat the approval get reset when a Transfer event for that same token is emitted." + }, + "ApprovalForAll(address,address,bool)": { + "notice": "Triggered when an account approve or disaprove another to transfer on its behalf" + }, + "Transfer(address,address,uint256)": { + "notice": "Triggered when a token is transferred" + } + }, + "errors": { + "CanStillResolve()": [ + { + "notice": "Player have to resolve if they can Stratagems will prevent them from acknowledging missed resolution if there is still time to resolve." + } + ], + "CommitmentHashNotMatching()": [ + { + "notice": "Player have to reveal their commitment using the exact same move values If they provide different value, the commitment hash will differ and Stratagems will reject their resolution." + } + ], + "GameNotStarted()": [ + { + "notice": "Game has not started yet, can't perform any action" + } + ], + "InCommitmentPhase()": [ + { + "notice": "When in Commit phase, player can make new commitment but they cannot resolve their move yet." + } + ], + "InResolutionPhase()": [ + { + "notice": "When in Resolution phase, it is not possible to commit new moves or cancel previous commitment During Resolution phase, players have to reveal their commitment, if not already done." + } + ], + "InvalidEpoch()": [ + { + "notice": "Player can only resolve their move in the same epoch they commited.abi If a player resolve later it can only do to minimize the reserve burn cost by calling : `acknowledgeMissedResolution`" + } + ], + "InvalidFurtherMoves()": [ + { + "notice": "Player can make arbitrary number of moves per epoch. To do so they group moves into (MAX_NUM_MOVES_PER_HASH = 32) moves This result in a recursive series of hash that they can then submit in turn while resolving. The limit (MAX_NUM_MOVES_PER_HASH = 32) ensure a resolution batch fits in a block." + } + ], + "NothingToResolve()": [ + { + "notice": "Player can only resolve moves they commited." + } + ], + "PreviousCommitmentNotResolved()": [ + { + "notice": "Previous commitment need to be resolved before making a new one. Even if the corresponding reveal phase has passed.\\ It is also not possible to withdraw any amount from reserve until the commitment is revealed.\\If player lost the information to reveal, it can acknowledge failure which will burn all its reserve.\\" + } + ], + "ReserveTooLow(uint256,uint256)": [ + { + "notice": "to make a commitment you always need at least one `config.numTokensPerGems` amount in reserve Player also need one `config.numTokensPerGems` per moves during the resolution phase." + } + ], + "InvalidAddress(address)": [ + { + "notice": "An invalid address is specified (for example: zero address)" + } + ], + "NonExistentToken(uint256)": [ + { + "notice": "The token does not exist" + } + ], + "NonceOverflow()": [ + { + "notice": "The Nonce overflowed, make a transfer to self to allow new nonces." + } + ], + "NotAuthorized()": [ + { + "notice": "Not authorized to perform this operation" + } + ], + "NotOwner(address,address)": [ + { + "notice": "The address from which the token is sent is not the current owner" + } + ], + "TransferRejected()": [ + { + "notice": "The Transfer was rejected by the destination" + } + ] + } + }, + "argsData": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000082f6cc7f0bcc32bb27c75b56db90aa5bcbdd8c70000000000000000000000000efe0a109697c36352128890d3d30d747b916dc39000000000000000000000000d51b777835d43a660e080ffd46ff3ad5ebd47d55000000000000000000000000000000000000000000000000000000000000002401ffc9a70100000000000000000000000000000000000000000000000000000006fdde0301000000000000000000000000000000000000000000000000000000081812fc01000000000000000000000000000000000000000000000000000000095ea7b3010000000000000000000000000000000000000000000000000000000a8bcdb900000000000000000000000000000000000000000000000000000000145165a900000000000000000000000000000000000000000000000000000000206848f60000000000000000000000000000000000000000000000000000000023b872dd0100000000000000000000000000000000000000000000000000000024a27240000000000000000000000000000000000000000000000000000000002779347e020000000000000000000000000000000000000000000000000000003c9a2a1a0200000000000000000000000000000000000000000000000000000042842e0e0100000000000000000000000000000000000000000000000000000048f3c51c010000000000000000000000000000000000000000000000000000004dd3ab23000000000000000000000000000000000000000000000000000000006352211e0100000000000000000000000000000000000000000000000000000070a082310100000000000000000000000000000000000000000000000000000081ca54b9000000000000000000000000000000000000000000000000000000008b8fc3a10000000000000000000000000000000000000000000000000000000095d89b4101000000000000000000000000000000000000000000000000000000990b050900000000000000000000000000000000000000000000000000000000a22cb46501000000000000000000000000000000000000000000000000000000afa1e2d100000000000000000000000000000000000000000000000000000000b301577300000000000000000000000000000000000000000000000000000000b80777ea02000000000000000000000000000000000000000000000000000000b88d4fde01000000000000000000000000000000000000000000000000000000c0e7538700000000000000000000000000000000000000000000000000000000c3f909d400000000000000000000000000000000000000000000000000000000c87b56dd01000000000000000000000000000000000000000000000000000000cd315b0802000000000000000000000000000000000000000000000000000000d671011200000000000000000000000000000000000000000000000000000000d703f50a02000000000000000000000000000000000000000000000000000000df97113402000000000000000000000000000000000000000000000000000000e985e9c501000000000000000000000000000000000000000000000000000000f18885ce00000000000000000000000000000000000000000000000000000000f394528201000000000000000000000000000000000000000000000000000000fa1026dd00000000000000000000000000000000000000000000000000000000", + "transaction": { + "hash": "0x117fade325857655fd3eadbcb0ce147cdb1797e9ef6ca4145b5abaed27f8d105", + "nonce": "0x8b", + "origin": "0x61c461ecc993aadeb7e4b47e96d1b8cc37314b20" + } +} \ No newline at end of file diff --git a/contracts/deployments/sepolia/Stratagems_Implementation_Router.json b/contracts/deployments/sepolia/Stratagems_Implementation_Router.json new file mode 100644 index 00000000..00b50f34 --- /dev/null +++ b/contracts/deployments/sepolia/Stratagems_Implementation_Router.json @@ -0,0 +1,89 @@ +{ + "address": "0x3f75e916ac2871bcdeb8b6e5b28f290524073336", + "abi": [ + { + "inputs": [ + { + "components": [ + { + "internalType": "address[]", + "name": "implementations", + "type": "address[]" + }, + { + "internalType": "bytes5[]", + "name": "sigMap", + "type": "bytes5[]" + }, + { + "internalType": "address", + "name": "fallbackImplementation", + "type": "address" + } + ], + "internalType": "struct Router10X60.Routes", + "name": "routes", + "type": "tuple" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "stateMutability": "payable", + "type": "fallback" + } + ], + "contractName": "Router10X60", + "sourceName": "solc_0.8/router/Router10X60.sol", + "bytecode": "0x61034060405234801562000011575f80fd5b506040516200108f3803806200108f8339810160408190526200003491620006e2565b602081015151815151600a811115620000945760405162461bcd60e51b815260206004820152601b60248201527f4d41585f494d504c454d454e544154494f4e535f52454143484544000000000060448201526064015b60405180910390fd5b603c821115620000da5760405162461bcd60e51b815260206004820152601060248201526f13505617d4d251d4d7d4915050d2115160821b60448201526064016200008b565b5f835f01515f81518110620000f357620000f3620007e8565b602002602001015190505f805f805f805f805f60018b111562000133578c5180516001908110620001285762000128620007e8565b602002602001015198505b60028b111562000160578c5180516002908110620001555762000155620007e8565b602002602001015197505b60038b11156200018d578c5180516003908110620001825762000182620007e8565b602002602001015196505b60048b1115620001ba578c5180516004908110620001af57620001af620007e8565b602002602001015195505b60058b1115620001e7578c5180516005908110620001dc57620001dc620007e8565b602002602001015194505b60068b111562000214578c5180516006908110620002095762000209620007e8565b602002602001015193505b60078b111562000241578c5180516007908110620002365762000236620007e8565b602002602001015192505b60088b11156200026e578c5180516008908110620002635762000263620007e8565b602002602001015191505b60098b11156200029b578c5180516009908110620002905762000290620007e8565b602002602001015190505b6001600160a01b03998a1660805297891660a05295881660c05293871660e05291861661010052851661012052841661014052831661016052821661018052166101a0525f80808080808080808080805b8d81101562000553575f8f6020015182815181106200030f576200030f620007e8565b602090810291909101015160d881901c915060e01c808410620003645760405162461bcd60e51b815260206004820152600c60248201526b2727aa2fa4a72fa7a92222a960a11b60448201526064016200008b565b8063ffffffff169350600683101562000391576200038483602862000810565b82901b8e179d506200053b565b600c831015620003c257620003a860068462000830565b620003b590602862000810565b82901b8d179c506200053b565b6012831015620003f357620003d9600c8462000830565b620003e690602862000810565b82901b8c179b506200053b565b601883101562000424576200040a60128462000830565b6200041790602862000810565b82901b8b179a506200053b565b601e83101562000455576200043b60188462000830565b6200044890602862000810565b82901b8a1799506200053b565b602483101562000486576200046c601e8462000830565b6200047990602862000810565b82901b891798506200053b565b602a831015620004b7576200049d60248462000830565b620004aa90602862000810565b82901b881797506200053b565b6030831015620004e857620004ce602a8462000830565b620004db90602862000810565b82901b871796506200053b565b60368310156200051957620004ff60308462000830565b6200050c90602862000810565b82901b861796506200053b565b6200052660368462000830565b6200053390602862000810565b82901b851796505b505080806200054a9062000846565b915050620002ec565b50506101e09990995261020097909752610220959095526102409390935261026091909152610280526102a0526102c0526102e052610300525061032052604001516001600160a01b03166101c05262000861565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715620005e157620005e1620005a8565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620006125762000612620005a8565b604052919050565b5f6001600160401b03821115620006355762000635620005a8565b5060051b60200190565b80516001600160a01b038116811462000656575f80fd5b919050565b5f82601f8301126200066b575f80fd5b81516020620006846200067e836200061a565b620005e7565b82815260059290921b84018101918181019086841115620006a3575f80fd5b8286015b84811015620006d75780516001600160d81b031981168114620006c9575f8081fd5b8352918301918301620006a7565b509695505050505050565b5f6020808385031215620006f4575f80fd5b82516001600160401b03808211156200070b575f80fd5b90840190606082870312156200071f575f80fd5b62000729620005bc565b82518281111562000738575f80fd5b8301601f8101881362000749575f80fd5b80516200075a6200067e826200061a565b81815260059190911b8201860190868101908a83111562000779575f80fd5b928701925b82841015620007a25762000792846200063f565b825292870192908701906200077e565b84525050508284015182811115620007b8575f80fd5b620007c6888286016200065b565b8583015250620007d9604084016200063f565b60408201529695505050505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176200082a576200082a620007fc565b92915050565b818103818111156200082a576200082a620007fc565b5f600182016200085a576200085a620007fc565b5060010190565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e0516103005161032051610749620009465f395f601401525f61033901525f6102f201525f6102a201525f61025201525f61020201525f6101b201525f61016201525f61011201525f60c201525f607201525f6105ac01525f61058501525f61055601525f61052701525f6104f801525f6104c901525f61049a01525f61046b01525f61043c01525f61040d01525f6103de01526107495ff3fe60806040525f803560e01c90808061003860017f0000000000000000000000000000000000000000000000000000000000000000610698565b90505b8082116103d2575f600261004f83856106b1565b61005991906106c4565b90505f60068210156100a1576100708260286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b600c8210156100f1576100b5600683610698565b6100c09060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b601282101561014157610105600c83610698565b6101109060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b601882101561019157610155601283610698565b6101609060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b601e8210156101e1576101a5601883610698565b6101b09060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b6024821015610231576101f5601e83610698565b6102009060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b602a82101561028157610245602483610698565b6102509060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b60308210156102d157610295602a83610698565b6102a09060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b6036821015610321576102e5603083610698565b6102f09060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b61032c603683610698565b6103379060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff1690505b63ffffffff600882901c811690871681111561038c57610385600184610698565b93506103ca565b8663ffffffff168163ffffffff1610156103b2576103ab8360016106b1565b94506103ca565b6103c060ff831660016106b1565b95505050506103d2565b50505061003b565b5f8360010361040257507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360020361043157507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360030361046057507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360040361048f57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b836005036104be57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b836006036104ed57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360070361051c57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360080361054b57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360090361057a57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b83600a036105a957507f00000000000000000000000000000000000000000000000000000000000000006105cc565b507f00000000000000000000000000000000000000000000000000000000000000005b73ffffffffffffffffffffffffffffffffffffffff811661064d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f554e4b4e4f574e5f4d4554484f44000000000000000000000000000000000000604482015260640160405180910390fd5b365f80375f80365f845af43d5f803e808015610667573d5ff35b3d5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156106ab576106ab61066b565b92915050565b808201808211156106ab576106ab61066b565b5f826106f7577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820281158282048414176106ab576106ab61066b56fea2646970667358221220e346ecc6b2ab869aea383a1cb6f406a909814848ad012048b904d157b81a433964736f6c63430008140033", + "deployedBytecode": "0x60806040525f803560e01c90808061003860017f0000000000000000000000000000000000000000000000000000000000000000610698565b90505b8082116103d2575f600261004f83856106b1565b61005991906106c4565b90505f60068210156100a1576100708260286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b600c8210156100f1576100b5600683610698565b6100c09060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b601282101561014157610105600c83610698565b6101109060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b601882101561019157610155601283610698565b6101609060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b601e8210156101e1576101a5601883610698565b6101b09060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b6024821015610231576101f5601e83610698565b6102009060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b602a82101561028157610245602483610698565b6102509060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b60308210156102d157610295602a83610698565b6102a09060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b6036821015610321576102e5603083610698565b6102f09060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff169050610364565b61032c603683610698565b6103379060286106fc565b7f0000000000000000000000000000000000000000000000000000000000000000901c64ffffffffff1690505b63ffffffff600882901c811690871681111561038c57610385600184610698565b93506103ca565b8663ffffffff168163ffffffff1610156103b2576103ab8360016106b1565b94506103ca565b6103c060ff831660016106b1565b95505050506103d2565b50505061003b565b5f8360010361040257507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360020361043157507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360030361046057507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360040361048f57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b836005036104be57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b836006036104ed57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360070361051c57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360080361054b57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b8360090361057a57507f00000000000000000000000000000000000000000000000000000000000000006105cc565b83600a036105a957507f00000000000000000000000000000000000000000000000000000000000000006105cc565b507f00000000000000000000000000000000000000000000000000000000000000005b73ffffffffffffffffffffffffffffffffffffffff811661064d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f554e4b4e4f574e5f4d4554484f44000000000000000000000000000000000000604482015260640160405180910390fd5b365f80375f80365f845af43d5f803e808015610667573d5ff35b3d5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156106ab576106ab61066b565b92915050565b808201808211156106ab576106ab61066b565b5f826106f7577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820281158282048414176106ab576106ab61066b56fea2646970667358221220e346ecc6b2ab869aea383a1cb6f406a909814848ad012048b904d157b81a433964736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {}, + "devdoc": { + "author": "Ronan Sandford", + "kind": "dev", + "methods": { + "constructor": { + "params": { + "routes": "define the routing each selector is represented by a bytes5, where the upper most bytes4 is the selector and the lowest bytes represent the index of the implementations implementations' addresses are given in an array" + } + } + }, + "title": "Router for at max 10 Implementations and 60 function selectors", + "version": 1 + }, + "evm": { + "gasEstimates": { + "creation": { + "codeDepositCost": "373000", + "executionCost": "infinite", + "totalCost": "infinite" + }, + "external": { + "": "infinite" + } + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"address[]\",\"name\":\"implementations\",\"type\":\"address[]\"},{\"internalType\":\"bytes5[]\",\"name\":\"sigMap\",\"type\":\"bytes5[]\"},{\"internalType\":\"address\",\"name\":\"fallbackImplementation\",\"type\":\"address\"}],\"internalType\":\"struct Router10X60.Routes\",\"name\":\"routes\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"author\":\"Ronan Sandford\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"routes\":\"define the routing each selector is represented by a bytes5, where the upper most bytes4 is the selector and the lowest bytes represent the index of the implementations implementations' addresses are given in an array\"}}},\"title\":\"Router for at max 10 Implementations and 60 function selectors\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"This Router implementation only support at max 10 implementations and 60 function selectors\"}},\"notice\":\"Create an immutable route and delegate function call to their respective implementations\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"solc_0.8/router/Router10X60.sol\":\"Router10X60\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solc_0.8/router/Router10X60.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/// @title Router for at max 10 Implementations and 60 function selectors\\n/// @author Ronan Sandford\\n/// @notice Create an immutable route and delegate function call to their respective implementations\\ncontract Router10X60 {\\n\\taddress internal immutable implementation_00;\\n\\taddress internal immutable implementation_01;\\n\\taddress internal immutable implementation_02;\\n\\taddress internal immutable implementation_03;\\n\\taddress internal immutable implementation_04;\\n\\taddress internal immutable implementation_05;\\n\\taddress internal immutable implementation_06;\\n\\taddress internal immutable implementation_07;\\n\\taddress internal immutable implementation_08;\\n\\taddress internal immutable implementation_09;\\n\\n\\taddress internal immutable fallback_implementation;\\n\\n\\tuint256 internal immutable sigs_00;\\n\\tuint256 internal immutable sigs_01;\\n\\tuint256 internal immutable sigs_02;\\n\\tuint256 internal immutable sigs_03;\\n\\tuint256 internal immutable sigs_04;\\n\\tuint256 internal immutable sigs_05;\\n\\tuint256 internal immutable sigs_06;\\n\\tuint256 internal immutable sigs_07;\\n\\tuint256 internal immutable sigs_08;\\n\\tuint256 internal immutable sigs_09;\\n\\n\\tuint256 internal immutable sigs_count;\\n\\n\\t// This is the interface for routes specification\\n\\tstruct Routes {\\n\\t\\taddress[] implementations;\\n\\t\\t/// The sigmap is represented as an array of entry\\n\\t\\t// each entry is 5 bytes\\n\\t\\t/// the upmost bytes are the bytes4 function selector\\n\\t\\t// the lowest byte represent the index in the implementation's address array provided aling\\n\\t\\t// This measn there is at max 256 implementation possible\\n\\t\\t// The entry needs to be ordered so binary search can be executed on them\\n\\t\\tbytes5[] sigMap;\\n\\t\\taddress fallbackImplementation;\\n\\t}\\n\\n\\t/// @notice This Router implementation only support at max 10 implementations and 60 function selectors\\n\\t/// @param routes define the routing \\n\\t/// each selector is represented by a bytes5, where the upper most bytes4 is the selector and \\n\\t/// the lowest bytes represent the index of the implementations\\n\\t/// implementations' addresses are given in an array\\n\\tconstructor(Routes memory routes) {\\n\\t\\tuint256 numSigs = routes.sigMap.length;\\n\\t\\tuint256 numImpl = routes.implementations.length;\\n\\t\\trequire(numImpl <= 10, 'MAX_IMPLEMENTATIONS_REACHED');\\n\\t\\trequire(numSigs <= 60, 'MAX_SIGS_REACHED');\\n\\n\\t\\t{\\n\\t\\t\\taddress tmp_implementation_00 = routes.implementations[0];\\n\\t\\t\\taddress tmp_implementation_01;\\n\\t\\t\\taddress tmp_implementation_02;\\n\\t\\t\\taddress tmp_implementation_03;\\n\\t\\t\\taddress tmp_implementation_04;\\n\\t\\t\\taddress tmp_implementation_05;\\n\\t\\t\\taddress tmp_implementation_06;\\n\\t\\t\\taddress tmp_implementation_07;\\n\\t\\t\\taddress tmp_implementation_08;\\n\\t\\t\\taddress tmp_implementation_09;\\n\\t\\t\\tif (numImpl > 1) {\\n\\t\\t\\t\\ttmp_implementation_01 = routes.implementations[1];\\n\\t\\t\\t}\\n\\t\\t\\tif (numImpl > 2) {\\n\\t\\t\\t\\ttmp_implementation_02 = routes.implementations[2];\\n\\t\\t\\t}\\n\\t\\t\\tif (numImpl > 3) {\\n\\t\\t\\t\\ttmp_implementation_03 = routes.implementations[3];\\n\\t\\t\\t}\\n\\t\\t\\tif (numImpl > 4) {\\n\\t\\t\\t\\ttmp_implementation_04 = routes.implementations[4];\\n\\t\\t\\t}\\n\\t\\t\\tif (numImpl > 5) {\\n\\t\\t\\t\\ttmp_implementation_05 = routes.implementations[5];\\n\\t\\t\\t}\\n\\t\\t\\tif (numImpl > 6) {\\n\\t\\t\\t\\ttmp_implementation_06 = routes.implementations[6];\\n\\t\\t\\t}\\n\\t\\t\\tif (numImpl > 7) {\\n\\t\\t\\t\\ttmp_implementation_07 = routes.implementations[7];\\n\\t\\t\\t}\\n\\t\\t\\tif (numImpl > 8) {\\n\\t\\t\\t\\ttmp_implementation_08 = routes.implementations[8];\\n\\t\\t\\t}\\n\\t\\t\\tif (numImpl > 9) {\\n\\t\\t\\t\\ttmp_implementation_09 = routes.implementations[9];\\n\\t\\t\\t}\\n\\n\\t\\t\\timplementation_00 = tmp_implementation_00;\\n\\t\\t\\timplementation_01 = tmp_implementation_01;\\n\\t\\t\\timplementation_02 = tmp_implementation_02;\\n\\t\\t\\timplementation_03 = tmp_implementation_03;\\n\\t\\t\\timplementation_04 = tmp_implementation_04;\\n\\t\\t\\timplementation_05 = tmp_implementation_05;\\n\\t\\t\\timplementation_06 = tmp_implementation_06;\\n\\t\\t\\timplementation_07 = tmp_implementation_07;\\n\\t\\t\\timplementation_08 = tmp_implementation_08;\\n\\t\\t\\timplementation_09 = tmp_implementation_09;\\n\\t\\t}\\n\\n\\t\\t{\\n\\t\\t\\tuint256 tmp_sigs_00;\\n\\t\\t\\tuint256 tmp_sigs_01;\\n\\t\\t\\tuint256 tmp_sigs_02;\\n\\t\\t\\tuint256 tmp_sigs_03;\\n\\t\\t\\tuint256 tmp_sigs_04;\\n\\t\\t\\tuint256 tmp_sigs_05;\\n\\t\\t\\tuint256 tmp_sigs_06;\\n\\t\\t\\tuint256 tmp_sigs_07;\\n\\t\\t\\tuint256 tmp_sigs_08;\\n\\t\\t\\tuint256 tmp_sigs_09;\\n\\t\\t\\t\\n\\t\\t\\tuint256 lastSig;\\n\\t\\t\\tfor (uint256 i = 0; i < numSigs; i++) {\\n\\t\\t\\t\\tuint256 pair = uint256(uint40(routes.sigMap[i]));\\n\\t\\t\\t\\tuint32 sig = uint32(pair >> 8);\\n\\t\\t\\t\\trequire(lastSig < sig, \\\"NOT_IN_ORDER\\\");\\n\\t\\t\\t\\tlastSig = sig;\\n\\t\\t\\t\\tif (i < 6) {\\n\\t\\t\\t\\t\\ttmp_sigs_00 = tmp_sigs_00 | (pair << (i * 40));\\n\\t\\t\\t\\t} else if (i < 12) {\\n\\t\\t\\t\\t\\ttmp_sigs_01 = tmp_sigs_01 | (pair << ((i - 6) * 40));\\n\\t\\t\\t\\t} else if (i < 18) {\\n\\t\\t\\t\\t\\ttmp_sigs_02 = tmp_sigs_02 | (pair << ((i - 12) * 40));\\n\\t\\t\\t\\t} else if (i < 24) {\\n\\t\\t\\t\\t\\ttmp_sigs_03 = tmp_sigs_03 | (pair << ((i - 18) * 40));\\n\\t\\t\\t\\t} else if (i < 30) {\\n\\t\\t\\t\\t\\ttmp_sigs_04 = tmp_sigs_04 | (pair << ((i - 24) * 40));\\n\\t\\t\\t\\t} else if (i < 36) {\\n\\t\\t\\t\\t\\ttmp_sigs_05 = tmp_sigs_05 | (pair << ((i - 30) * 40));\\n\\t\\t\\t\\t} else if (i < 42) {\\n\\t\\t\\t\\t\\ttmp_sigs_06 = tmp_sigs_06 | (pair << ((i - 36) * 40));\\n\\t\\t\\t\\t} else if (i < 48) {\\n\\t\\t\\t\\t\\ttmp_sigs_07 = tmp_sigs_07 | (pair << ((i - 42) * 40));\\n\\t\\t\\t\\t} else if (i < 54) {\\n\\t\\t\\t\\t\\ttmp_sigs_07 = tmp_sigs_08 | (pair << ((i - 48) * 40));\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\ttmp_sigs_07 = tmp_sigs_09 | (pair << ((i - 54) * 40));\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\tsigs_00 = tmp_sigs_00;\\n\\t\\t\\tsigs_01 = tmp_sigs_01;\\n\\t\\t\\tsigs_02 = tmp_sigs_02;\\n\\t\\t\\tsigs_03 = tmp_sigs_03;\\n\\t\\t\\tsigs_04 = tmp_sigs_04;\\n\\t\\t\\tsigs_05 = tmp_sigs_05;\\n\\t\\t\\tsigs_06 = tmp_sigs_06;\\n\\t\\t\\tsigs_07 = tmp_sigs_07;\\n\\t\\t\\tsigs_08 = tmp_sigs_08;\\n\\t\\t\\tsigs_09 = tmp_sigs_09;\\n\\n\\t\\t\\tsigs_count = numSigs;\\n\\t\\t}\\n\\n\\t\\tfallback_implementation = routes.fallbackImplementation;\\n\\t}\\n\\n\\tfallback() external payable {\\n\\t\\tuint32 sig = uint32(msg.sig);\\n\\t\\tuint256 implementationIndex;\\n\\t\\tuint256 left = 0;\\n \\tuint256 right = sigs_count - 1;\\n\\t\\twhile (left <= right) {\\n\\t\\t\\tuint256 i = (left + right) / 2;\\n\\t\\t\\tuint40 pair;\\n\\t\\t\\tif (i < 6) {\\n\\t\\t\\t\\tpair = uint40((sigs_00 >> (i * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t} else if (i < 12) {\\n\\t\\t\\t\\tpair = uint40((sigs_01 >> ((i - 6) * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t} else if (i < 18) {\\n\\t\\t\\t\\tpair = uint40((sigs_02 >> ((i - 12) * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t} else if (i < 24) {\\n\\t\\t\\t\\tpair = uint40((sigs_03 >> ((i - 18) * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t} else if (i < 30) {\\n\\t\\t\\t\\tpair = uint40((sigs_04 >> ((i - 24) * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t} else if (i < 36) {\\n\\t\\t\\t\\tpair = uint40((sigs_05 >> ((i - 30) * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t} else if (i < 42) {\\n\\t\\t\\t\\tpair = uint40((sigs_06 >> ((i - 36) * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t} else if (i < 48) {\\n\\t\\t\\t\\tpair = uint40((sigs_07 >> ((i - 42) * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t} else if (i < 54) {\\n\\t\\t\\t\\tpair = uint40((sigs_08 >> ((i - 48) * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tpair = uint40((sigs_09 >> ((i - 54) * 40)) & 0xFFFFFFFFFF);\\n\\t\\t\\t}\\n\\t\\t\\tuint32 value = uint32(pair >> 8);\\n\\t\\t\\tif (value > sig) {\\n\\t\\t\\t\\tright = i -1;\\n\\t\\t\\t} else if (value < sig) {\\n\\t\\t\\t\\tleft = i + 1;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\timplementationIndex = uint256(pair & 0xFF) + 1;\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\taddress implementation;\\n\\t\\tif (implementationIndex == 1) {\\n\\t\\t\\timplementation = implementation_00;\\n\\t\\t} else if (implementationIndex == 2) {\\n\\t\\t\\timplementation = implementation_01;\\n\\t\\t} else if (implementationIndex == 3) {\\n\\t\\t\\timplementation = implementation_02;\\n\\t\\t} else if (implementationIndex == 4) {\\n\\t\\t\\timplementation = implementation_03;\\n\\t\\t} else if (implementationIndex == 5) {\\n\\t\\t\\timplementation = implementation_04;\\n\\t\\t} else if (implementationIndex == 6) {\\n\\t\\t\\timplementation = implementation_05;\\n\\t\\t} else if (implementationIndex == 7) {\\n\\t\\t\\timplementation = implementation_06;\\n\\t\\t} else if (implementationIndex == 8) {\\n\\t\\t\\timplementation = implementation_07;\\n\\t\\t} else if (implementationIndex == 9) {\\n\\t\\t\\timplementation = implementation_08;\\n\\t\\t} else if (implementationIndex == 10) {\\n\\t\\t\\timplementation = implementation_09;\\n\\t\\t} else {\\n\\t\\t\\timplementation = fallback_implementation;\\n\\t\\t}\\n\\n\\t\\trequire(implementation != address(0), 'UNKNOWN_METHOD');\\n\\n\\t\\t// taken from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/8cab922347e79732f6a532a75da5081ba7447a71/contracts/proxy/Proxy.sol#L22-L45\\n\\t\\tassembly {\\n\\t\\t\\t// Copy msg.data. We take full control of memory in this inline assembly\\n\\t\\t\\t// block because it will not return to Solidity code. We overwrite the\\n\\t\\t\\t// Solidity scratch pad at memory position 0.\\n\\t\\t\\tcalldatacopy(0, 0, calldatasize())\\n\\n\\t\\t\\t// Call the implementation.\\n\\t\\t\\t// out and outsize are 0 because we don't know the size yet.\\n\\t\\t\\tlet result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n\\t\\t\\t// Copy the returned data.\\n\\t\\t\\treturndatacopy(0, 0, returndatasize())\\n\\n\\t\\t\\tswitch result\\n\\t\\t\\t// delegatecall returns 0 on error.\\n\\t\\t\\tcase 0 {\\n\\t\\t\\t\\trevert(0, returndatasize())\\n\\t\\t\\t}\\n\\t\\t\\tdefault {\\n\\t\\t\\t\\treturn(0, returndatasize())\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\",\"keccak256\":\"0x8f51b7932023299088698f99c6f75f54cf880417d4a42c38548e17b7850d8646\",\"license\":\"MIT\"}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": { + "constructor": { + "notice": "This Router implementation only support at max 10 implementations and 60 function selectors" + } + }, + "notice": "Create an immutable route and delegate function call to their respective implementations", + "version": 1 + }, + "argsData": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000082f6cc7f0bcc32bb27c75b56db90aa5bcbdd8c70000000000000000000000000efe0a109697c36352128890d3d30d747b916dc39000000000000000000000000d51b777835d43a660e080ffd46ff3ad5ebd47d55000000000000000000000000000000000000000000000000000000000000002401ffc9a70100000000000000000000000000000000000000000000000000000006fdde0301000000000000000000000000000000000000000000000000000000081812fc01000000000000000000000000000000000000000000000000000000095ea7b3010000000000000000000000000000000000000000000000000000000a8bcdb900000000000000000000000000000000000000000000000000000000145165a900000000000000000000000000000000000000000000000000000000206848f60000000000000000000000000000000000000000000000000000000023b872dd0100000000000000000000000000000000000000000000000000000024a27240000000000000000000000000000000000000000000000000000000002779347e020000000000000000000000000000000000000000000000000000003c9a2a1a0200000000000000000000000000000000000000000000000000000042842e0e0100000000000000000000000000000000000000000000000000000048f3c51c010000000000000000000000000000000000000000000000000000004dd3ab23000000000000000000000000000000000000000000000000000000006352211e0100000000000000000000000000000000000000000000000000000070a082310100000000000000000000000000000000000000000000000000000081ca54b9000000000000000000000000000000000000000000000000000000008b8fc3a10000000000000000000000000000000000000000000000000000000095d89b4101000000000000000000000000000000000000000000000000000000990b050900000000000000000000000000000000000000000000000000000000a22cb46501000000000000000000000000000000000000000000000000000000afa1e2d100000000000000000000000000000000000000000000000000000000b301577300000000000000000000000000000000000000000000000000000000b80777ea02000000000000000000000000000000000000000000000000000000b88d4fde01000000000000000000000000000000000000000000000000000000c0e7538700000000000000000000000000000000000000000000000000000000c3f909d400000000000000000000000000000000000000000000000000000000c87b56dd01000000000000000000000000000000000000000000000000000000cd315b0802000000000000000000000000000000000000000000000000000000d671011200000000000000000000000000000000000000000000000000000000d703f50a02000000000000000000000000000000000000000000000000000000df97113402000000000000000000000000000000000000000000000000000000e985e9c501000000000000000000000000000000000000000000000000000000f18885ce00000000000000000000000000000000000000000000000000000000f394528201000000000000000000000000000000000000000000000000000000fa1026dd00000000000000000000000000000000000000000000000000000000", + "transaction": { + "hash": "0x117fade325857655fd3eadbcb0ce147cdb1797e9ef6ca4145b5abaed27f8d105", + "nonce": "0x8b", + "origin": "0x61c461ecc993aadeb7e4b47e96d1b8cc37314b20" + } +} \ No newline at end of file diff --git a/contracts/deployments/sepolia/Stratagems_Implementation_Router_Core_Route.json b/contracts/deployments/sepolia/Stratagems_Implementation_Router_Core_Route.json new file mode 100644 index 00000000..afc0e6ec --- /dev/null +++ b/contracts/deployments/sepolia/Stratagems_Implementation_Router_Core_Route.json @@ -0,0 +1,1324 @@ +{ + "address": "0x82f6cc7f0bcc32bb27c75b56db90aa5bcbdd8c70", + "abi": [ + { + "inputs": [ + { + "components": [ + { + "internalType": "contract IERC20WithIERC2612", + "name": "tokens", + "type": "address" + }, + { + "internalType": "address payable", + "name": "burnAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "commitPhaseDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "resolutionPhaseDuration", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "maxLife", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "numTokensPerGems", + "type": "uint256" + } + ], + "internalType": "struct UsingStratagemsTypes.Config", + "name": "config", + "type": "tuple" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "CanStillResolve", + "type": "error" + }, + { + "inputs": [], + "name": "CommitmentHashNotMatching", + "type": "error" + }, + { + "inputs": [], + "name": "GameNotStarted", + "type": "error" + }, + { + "inputs": [], + "name": "InCommitmentPhase", + "type": "error" + }, + { + "inputs": [], + "name": "InResolutionPhase", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidEpoch", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidFurtherMoves", + "type": "error" + }, + { + "inputs": [], + "name": "NothingToResolve", + "type": "error" + }, + { + "inputs": [], + "name": "PreviousCommitmentNotResolved", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "inReserve", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "ReserveTooLow", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint24", + "name": "epoch", + "type": "uint24" + } + ], + "name": "CommitmentCancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint24", + "name": "epoch", + "type": "uint24" + }, + { + "indexed": false, + "internalType": "bytes24", + "name": "commitmentHash", + "type": "bytes24" + } + ], + "name": "CommitmentMade", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint24", + "name": "epoch", + "type": "uint24" + }, + { + "indexed": true, + "internalType": "bytes24", + "name": "commitmentHash", + "type": "bytes24" + }, + { + "components": [ + { + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + } + ], + "indexed": false, + "internalType": "struct UsingStratagemsTypes.Move[]", + "name": "moves", + "type": "tuple[]" + }, + { + "indexed": false, + "internalType": "bytes24", + "name": "furtherMoves", + "type": "bytes24" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newReserveAmount", + "type": "uint256" + } + ], + "name": "CommitmentResolved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint24", + "name": "epoch", + "type": "uint24" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountBurnt", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes24", + "name": "furtherMoves", + "type": "bytes24" + } + ], + "name": "CommitmentVoid", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum UsingStratagemsTypes.Color", + "name": "oldColor", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "enum UsingStratagemsTypes.Color", + "name": "newColor", + "type": "uint8" + } + ], + "name": "MoveProcessed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountDeposited", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newAmount", + "type": "uint256" + } + ], + "name": "ReserveDeposited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountWithdrawn", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newAmount", + "type": "uint256" + } + ], + "name": "ReserveWithdrawn", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "secret", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + } + ], + "internalType": "struct UsingStratagemsTypes.Move[]", + "name": "moves", + "type": "tuple[]" + }, + { + "internalType": "bytes24", + "name": "furtherMoves", + "type": "bytes24" + } + ], + "name": "acknowledgeMissedResolution", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "acknowledgeMissedResolutionByBurningAllReserve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokensAmountToAdd", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "internalType": "struct UsingStratagemsTypes.Permit", + "name": "permit", + "type": "tuple" + } + ], + "name": "addToReserve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "cancelCommitment", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "getCell", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint24", + "name": "lastEpochUpdate", + "type": "uint24" + }, + { + "internalType": "uint24", + "name": "epochWhenTokenIsAdded", + "type": "uint24" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "life", + "type": "uint8" + }, + { + "internalType": "int8", + "name": "delta", + "type": "int8" + }, + { + "internalType": "uint8", + "name": "enemyMap", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "distribution", + "type": "uint8" + } + ], + "internalType": "struct UsingStratagemsTypes.FullCell", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + } + ], + "name": "getCells", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint24", + "name": "lastEpochUpdate", + "type": "uint24" + }, + { + "internalType": "uint24", + "name": "epochWhenTokenIsAdded", + "type": "uint24" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "life", + "type": "uint8" + }, + { + "internalType": "int8", + "name": "delta", + "type": "int8" + }, + { + "internalType": "uint8", + "name": "enemyMap", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "distribution", + "type": "uint8" + } + ], + "internalType": "struct UsingStratagemsTypes.FullCell[]", + "name": "cells", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getCommitment", + "outputs": [ + { + "components": [ + { + "internalType": "bytes24", + "name": "hash", + "type": "bytes24" + }, + { + "internalType": "uint24", + "name": "epoch", + "type": "uint24" + } + ], + "internalType": "struct UsingStratagemsTypes.Commitment", + "name": "commitment", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getConfig", + "outputs": [ + { + "components": [ + { + "internalType": "contract IERC20WithIERC2612", + "name": "tokens", + "type": "address" + }, + { + "internalType": "address payable", + "name": "burnAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "commitPhaseDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "resolutionPhaseDuration", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "maxLife", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "numTokensPerGems", + "type": "uint256" + } + ], + "internalType": "struct UsingStratagemsTypes.Config", + "name": "config", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getTokensInReserve", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes24", + "name": "commitmentHash", + "type": "bytes24" + } + ], + "name": "makeCommitment", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes24", + "name": "commitmentHash", + "type": "bytes24" + }, + { + "internalType": "uint256", + "name": "tokensAmountToAdd", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "internalType": "struct UsingStratagemsTypes.Permit", + "name": "permit", + "type": "tuple" + } + ], + "name": "makeCommitmentWithExtraReserve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "position", + "type": "uint64" + } + ], + "name": "poke", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64[]", + "name": "positions", + "type": "uint64[]" + } + ], + "name": "pokeMultiple", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "secret", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + } + ], + "internalType": "struct UsingStratagemsTypes.Move[]", + "name": "moves", + "type": "tuple[]" + }, + { + "internalType": "bytes24", + "name": "furtherMoves", + "type": "bytes24" + }, + { + "internalType": "bool", + "name": "useReserve", + "type": "bool" + } + ], + "name": "resolve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "withdrawFromReserve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "contractName": "StratagemsGameplay", + "sourceName": "src/game/routes/StratagemsGameplay.sol", + "bytecode": "0x61016060405234801562000011575f80fd5b5060405162004fc638038062004fc68339810160408190526200003491620000b0565b80516001600160a01b039081166080908152602083015190911661014052604082015160a0908152606083015160c09081529183015160e05282015160ff166101005201516101205262000158565b80516001600160a01b03811681146200009a575f80fd5b919050565b805160ff811681146200009a575f80fd5b5f60e08284031215620000c1575f80fd5b60405160e081016001600160401b0381118282101715620000f057634e487b7160e01b5f52604160045260245ffd5b604052620000fe8362000083565b81526200010e6020840162000083565b60208201526040830151604082015260608301516060820152608083015160808201526200013f60a084016200009f565b60a082015260c083015160c08201528091505092915050565b60805160a05160c05160e051610100516101205161014051614d19620002ad5f395f8181610af401528181610e90015281816114be0152611f8501525f8181611580015281816123640152818161241d015281816128450152818161289a01528181612ade01528181612b3701528181612b9501528181612cd001528181612d1901528181613744015261380701525f818161155901528181612a580152818161305a01528181613091015281816130ff015261312d01525f8181611531015261197101525f818161150b015281816119920152611a6301525f81816114e5015281816119c50152611a2301525f818161050d01528181610b2301528181610c3001528181610ebf015281816110820152818161122e0152818161135901528181611499015281816115f70152818161171c01528181611d5001528181611ec301528181611fb5015261207f0152614d195ff3fe608060405234801561000f575f80fd5b50600436106100f0575f3560e01c8063990b050911610093578063c3f909d411610063578063c3f909d4146101f7578063d671011214610271578063f18885ce14610284578063fa1026dd146102a4575f80fd5b8063990b050914610186578063afa1e2d1146101c9578063b3015773146101d1578063c0e75387146101e4575f80fd5b806324a27240116100ce57806324a27240146101455780634dd3ab231461014d57806381ca54b9146101605780638b8fc3a114610173575f80fd5b80630a8bcdb9146100f4578063145165a914610109578063206848f61461011c575b5f80fd5b610107610102366004614062565b610389565b005b610107610117366004614120565b6105ba565b61012f61012a366004614062565b6108dc565b60405161013c9190614289565b60405180910390f35b6101076109ab565b61010761015b3660046142af565b610bd4565b61010761016e3660046142cf565b610c59565b610107610181366004614339565b610fae565b6101bb6101943660046143a8565b73ffffffffffffffffffffffffffffffffffffffff165f9081526002602052604090205490565b60405190815260200161013c565b6101076110ad565b6101076101df3660046143c1565b6111ba565b6101076101f23660046143f0565b6111d8565b6101ff61141a565b60405161013c91905f60e08201905073ffffffffffffffffffffffffffffffffffffffff8084511683528060208501511660208401525060408301516040830152606083015160608301526080830151608083015260ff60a08401511660a083015260c083015160c083015292915050565b61010761027f36600461442a565b6115a7565b6102976102923660046144d1565b6117dc565b60405161013c9190614572565b6103476102b23660046143a8565b604080518082019091525f80825260208201525073ffffffffffffffffffffffffffffffffffffffff165f908152600360209081526040918290208251808401845290549283901b7fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000168152780100000000000000000000000000000000000000000000000090920462ffffff169082015290565b6040805182517fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016815260209283015162ffffff16928101929092520161013c565b335f90815260036020526040812090806103a1611969565b845491935091507801000000000000000000000000000000000000000000000000900462ffffff161580159061040457508015806104045750825462ffffff83811678010000000000000000000000000000000000000000000000009092041614155b1561043b576040517fea27126e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f908152600260205260409020546001850161045a5793505f6104b0565b848110156104a3576040517f78fe52a600000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044015b60405180910390fd5b6104ad85826145ed565b90505b335f8181526002602052604090819020839055517fa9059cbb00000000000000000000000000000000000000000000000000000000815260048101919091526024810186905273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015610553573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105779190614600565b50604080518681526020810183905233917ff7aeb382a1e87f84aa69637a22868c2e12be1261273f04cdf40a262a8b890031910160405180910390a25050505050565b73ffffffffffffffffffffffffffffffffffffffff86165f90815260036020526040812090806105e8611969565b915091508015610624576040517f24f7f40f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82547801000000000000000000000000000000000000000000000000900462ffffff165f0361067f576040517f99c04fd700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825462ffffff838116780100000000000000000000000000000000000000000000000090920416146106dd576040517fd5b25b6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8254604080516020808a0282018101835289825261073e9390921b918b91908b908b9081905f9085015b828210156107335761072460408302860136819003810190614629565b81526020019060010190610707565b505050505088611ab1565b5f6107a78a848a8a808060200260200160405190810160405280939291908181526020015f905b828210156107915761078260408302860136819003810190614629565b81526020019060010190610765565b5050505050886107a1578d611bde565b5f611bde565b845490915060401b7fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008716156108425760208814610811576040517fcc586b4500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffff00000000000000000000000000000000000000000000000016604088901c178555610869565b84547fffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff1685555b8067ffffffffffffffff19168462ffffff168c73ffffffffffffffffffffffffffffffffffffffff167f1a98c747a021d0d5f559e6beea9f0e9f36e11c5f218f85fda0bd665b6b0273548c8c8c886040516108c79493929190614682565b60405180910390a45050505050505050505050565b6108e4613fe1565b5f6108ed611969565b5090505f6108fb84836120f7565b905060405180610100016040528061091e865f9081526001602052604090205490565b73ffffffffffffffffffffffffffffffffffffffff168152602001825f015162ffffff168152602001826020015162ffffff1681526020018260400151600681111561096c5761096c61419d565b8152602001826060015160ff16815260200182608001515f0b81526020018260a0015160ff1681526020018260c0015160ff1681525092505050919050565b335f908152600360205260408120906109c2611969565b5082549091507801000000000000000000000000000000000000000000000000900462ffffff165f03610a21576040517f99c04fd700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815462ffffff80831678010000000000000000000000000000000000000000000000009092041603610a7f576040517f53a4c7b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81547fffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff168255335f908152600260205260408082208054929055517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015610b69573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8d9190614600565b50604080518281525f602082015262ffffff84169133917f6337d70daadadd11f8be7f6e7b38e6c04d28710b1f2a2894bb14d8e3eaa8cdb6910160405180910390a3505050565b60408051600581830181815261010083019093525f928291816020015b604080518082019091525f8082526020820152815260200190600190039081610bf157505081525f6020909101529050610c2b8183612226565b610c557f0000000000000000000000000000000000000000000000000000000000000000826125fc565b5050565b73ffffffffffffffffffffffffffffffffffffffff85165f90815260036020526040812090610c86611969565b5082549091507801000000000000000000000000000000000000000000000000900462ffffff161580610cdd5750815462ffffff828116780100000000000000000000000000000000000000000000000090920416145b15610d14576040517f53a4c7b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81546040805160208088028201810183528782528793610d74931b918a918a90869081905f9085015b82821015610d6957610d5a60408302860136819003810190614629565b81526020019060010190610d3d565b505050505087611ab1565b7fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000841615610e075760208114610dd6576040517fcc586b4500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82547fffffffffffffffff00000000000000000000000000000000000000000000000016604085901c178355610e2e565b82547fffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff1683555b335f90815260026020526040812080548792839291610e4e9084906145ed565b90915550506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015610f05573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f299190614600565b50604080518281527fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008716602082015262ffffff85169173ffffffffffffffffffffffffffffffffffffffff8c16917f6337d70daadadd11f8be7f6e7b38e6c04d28710b1f2a2894bb14d8e3eaa8cdb6910160405180910390a3505050505050505050565b6040805180820190915281905f9080610fc8846005614716565b67ffffffffffffffff811115610fe057610fe0614455565b60405190808252806020026020018201604052801561102457816020015b604080518082019091525f8082526020820152815260200190600190039081610ffe5790505b5081526020015f81525090505f5b8281101561107c5761106a828686848181106110505761105061472d565b905060200201602081019061106591906142af565b612226565b806110748161475a565b915050611032565b506110a77f0000000000000000000000000000000000000000000000000000000000000000826125fc565b50505050565b335f90815260036020526040812090806110c5611969565b9150915080611100576040517f9713090900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825462ffffff8381167801000000000000000000000000000000000000000000000000909204161461115e576040517fea27126e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82547fffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff16835560405162ffffff83169033907f619ef9650648da30c9647d0b77a0de24a51da0630c3533d54cc1eb3d798e1eaa905f90a3505050565b335f818152600260205260409020546111d5919083906126fd565b50565b335f908152600260205260409020546111f18382614791565b335f8181526002602052604090208290559091506112109085836126fd565b8135156113185773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663d505accf33308535602087013561126c6060890160408a016147a4565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b16815273ffffffffffffffffffffffffffffffffffffffff95861660048201529490931660248501526044840191909152606483015260ff166084820152606085013560a4820152608085013560c482015260e4015f604051808303815f87803b158015611301575f80fd5b505af1158015611313573d5f803e3d5ffd5b505050505b82156110a7576040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303815f875af11580156113b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113d89190614600565b50604080518481526020810183905233917f9705a8ff16374359785d31b0f1862c27f983645496f40760d180a9830eeaf2e8910160405180910390a250505050565b6114826040518060e001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81526020015f60ff1681526020015f81525090565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811682527f00000000000000000000000000000000000000000000000000000000000000001660208201527f000000000000000000000000000000000000000000000000000000000000000060408201527f000000000000000000000000000000000000000000000000000000000000000060608201527f0000000000000000000000000000000000000000000000000000000000000000608082015260ff7f00000000000000000000000000000000000000000000000000000000000000001660a08201527f000000000000000000000000000000000000000000000000000000000000000060c082015290565b8115610c5557335f908152600260205260409020546115c68382614791565b335f90815260026020526040902081905590508135156116e15773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663d505accf3330853560208701356116356060890160408a016147a4565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b16815273ffffffffffffffffffffffffffffffffffffffff95861660048201529490931660248501526044840191909152606483015260ff166084820152606085013560a4820152608085013560c482015260e4015f604051808303815f87803b1580156116ca575f80fd5b505af11580156116dc573d5f803e3d5ffd5b505050505b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303815f875af1158015611777573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061179b9190614600565b50604080518481526020810183905233917f9705a8ff16374359785d31b0f1862c27f983645496f40760d180a9830eeaf2e8910160405180910390a2505050565b60605f6117e7611969565b5083519091508067ffffffffffffffff81111561180657611806614455565b60405190808252806020026020018201604052801561183f57816020015b61182c613fe1565b8152602001906001900390816118245790505b5092505f5b81811015611961575f6118708683815181106118625761186261472d565b6020026020010151856120f7565b90506040518061010001604052806118ac8885815181106118935761189361472d565b60200260200101515f9081526001602052604090205490565b73ffffffffffffffffffffffffffffffffffffffff168152602001825f015162ffffff168152602001826020015162ffffff168152602001826040015160068111156118fa576118fa61419d565b8152602001826060015160ff16815260200182608001515f0b81526020018260a0015160ff1681526020018260c0015160ff168152508583815181106119425761194261472d565b60200260200101819052505080806119599061475a565b915050611844565b505050919050565b5f80806119b67f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000614791565b90505f6119c1612942565b90507f0000000000000000000000000000000000000000000000000000000000000000811015611a1d576040517f3a5f7b5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611a487f0000000000000000000000000000000000000000000000000000000000000000836145ed565b9050611a5483826147f1565b611a5f906002614791565b94507f000000000000000000000000000000000000000000000000000000000000000083611a8e600288614804565b62ffffff16611a9d9190614716565b611aa790836145ed565b1093505050509091565b7fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000811615611b5c575f838383604051602001611aef9392919061487f565b6040516020818303038152906040528051906020012090508067ffffffffffffffff19168567ffffffffffffffff191614611b56576040517fd13415b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506110a7565b5f8383604051602001611b709291906148c9565b6040516020818303038152906040528051906020012090508067ffffffffffffffff19168567ffffffffffffffff191614611bd7576040517fd13415b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b5f80604051806040016040528085516005611bf99190614716565b67ffffffffffffffff811115611c1157611c11614455565b604051908082528060200260200182016040528015611c5557816020015b604080518082019091525f8082526020820152815260200190600190039081611c2f5790505b5081526020015f8152509050611c8260405180606001604052805f81526020015f81526020015f81525090565b5f5b8551811015611d15575f805f611cb5868c8c8c8881518110611ca857611ca861472d565b6020026020010151612976565b92509250925082855f01818151611ccc9190614791565b905250602085018051839190611ce3908390614791565b905250604085018051829190611cfa908390614791565b905250839250611d0d915082905061475a565b915050611c84565b5060408051808201909152600781527f7265736f6c766500000000000000000000000000000000000000000000000000602090910152611d757f0000000000000000000000000000000000000000000000000000000000000000836125fc565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260026020908152604090912054908201518251919450611daf91614791565b831015611e0357602081015181518491611dc891614791565b6040517f78fe52a60000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161049a565b73ffffffffffffffffffffffffffffffffffffffff8416611e675760208101518151611e2f9190614791565b611e3990846145ed565b73ffffffffffffffffffffffffffffffffffffffff88165f9081526002602052604090208190559250612023565b805115611f315780516040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015230602483015260448201929092527f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303815f875af1158015611f0b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f2f9190614600565b505b6020810151156120235760208101516040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f00000000000000000000000000000000000000000000000000000000000000008116602483015260448201929092527f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303815f875af1158015611ffd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120219190614600565b505b6040810151156120ed5760408181015190517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015260248201929092527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af11580156120c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120eb9190614600565b505b5050949350505050565b6120ff614025565b67ffffffffffffffff83165f9081526020818152604091829020825160e081018452815462ffffff8082168352630100000082041693820193909352929091908301906601000000000000900460ff1660068111156121605761216061419d565b60068111156121715761217161419d565b8152905460ff6701000000000000008204811660208401526801000000000000000082045f0b60408401526901000000000000000000820481166060808501919091526a010000000000000000000090920416608092830152825191830151908301519293509091600162ffffff8416108015906121f157505f8160ff16115b1561221d575f80612209858760a0015186868b612fc9565b60ff909116606088015262ffffff16865250505b50505092915050565b5f61222f611969565b5090505f61223d83836120f7565b90506122a25f6122518462ffffff1661322c565b6040516020016122619190614916565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0019052525067ffffffffffffffff84165f526001602052565b60c0810151606082015160ff161580156122c15750815162ffffff1615155b156122ef576122d38260a001516132e8565b60048360a0015160ff16901b6122e99190614947565b5f835290505b5f8061230686868660400151876040015187613319565b9094509250505060ff821615612393576123938760405180604001604052806123448a67ffffffffffffffff165f9081526001602052604090205490565b73ffffffffffffffffffffffffffffffffffffffff16815260200161238c7f000000000000000000000000000000000000000000000000000000000000000060ff8816614716565b9052613578565b5f5b60048160ff161015612456575f8260ff8316600481106123b7576123b761472d565b602002015173ffffffffffffffffffffffffffffffffffffffff161461244457612444886040518060400160405280858560ff16600481106123fb576123fb61472d565b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020017f0000000000000000000000000000000000000000000000000000000000000000815250613578565b8061244e81614960565b915050612395565b505f60c0850181905267ffffffffffffffff871681526020818152604091829020865181549288015162ffffff9081166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000009094169116179190911780825591860151869282907fffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff1666010000000000008360068111156124fe576124fe61419d565b021790555060608201518154608084015160a085015160c0909501517fffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff90921667010000000000000060ff948516027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16176801000000000000000091841691909102177fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff166901000000000000000000948316949094027fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff16939093176a0100000000000000000000919093160291909117905550505050505050565b5f5b81602001518110156126f8578273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb835f0151838151811061263b5761263b61472d565b60200260200101515f0151845f0151848151811061265b5761265b61472d565b6020026020010151602001516040518363ffffffff1660e01b81526004016126a592919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af11580156126c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126e59190614600565b50806126f08161475a565b9150506125fe565b505050565b73ffffffffffffffffffffffffffffffffffffffff83165f908152600360205260408120908061272b611969565b9150915080612766576040517f9713090900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82547801000000000000000000000000000000000000000000000000900462ffffff16158015906127bc5750825462ffffff83811678010000000000000000000000000000000000000000000000009092041614155b156127f3576040517fea27126e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825462ffffff83167801000000000000000000000000000000000000000000000000027fffffffffff000000000000000000000000000000000000000000000000000000909116604087901c171783557f00000000000000000000000000000000000000000000000000000000000000008410156128c6576040517f78fe52a6000000000000000000000000000000000000000000000000000000008152600481018590527f0000000000000000000000000000000000000000000000000000000000000000602482015260440161049a565b6040517fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008616815262ffffff83169073ffffffffffffffffffffffffffffffffffffffff8816907fe3c45ded79e3db74b160b9a697d75f465f68d287a678532ed0a9fb691553b93d9060200160405180910390a3505050505050565b7f0112c413de07a110ce0a9ace0c01e41b5b59462770325b042f0dc72c337f55f2545f906129708142614791565b91505090565b5f805f80612987855f0151876120f7565b90506129ed5f61299b8862ffffff1661322c565b6040516020016129ab919061497e565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00190525250855167ffffffffffffffff165f526001602052565b60c0810151606082015160ff16158015612a0c5750815162ffffff1615155b15612a3a57612a1e8260a001516132e8565b60048360a0015160ff16901b612a349190614947565b5f835290505b5f86602001516006811115612a5157612a5161419d565b03612b63577f000000000000000000000000000000000000000000000000000000000000000060ff16826060015160ff16141580612ad55750855167ffffffffffffffff165f9081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff89169073ffffffffffffffffffffffffffffffffffffffff1614155b15612b0a575f807f00000000000000000000000000000000000000000000000000000000000000009450945094505050612fbf565b612b5e8960405180604001604052808b73ffffffffffffffffffffffffffffffffffffffff1681526020017f0000000000000000000000000000000000000000000000000000000000000000815250613578565b612bc1565b8662ffffff16826020015162ffffff1603612bc157606082015160ff1615612b915760066020870152612bc1565b5f807f00000000000000000000000000000000000000000000000000000000000000009450945094505050612fbf565b5f80612bd48b898b8760400151876136c4565b915091508973ffffffffffffffffffffffffffffffffffffffff16885f015167ffffffffffffffff167f17b85ded3fb12432ee427abc34a3026e1fbbb8bc431e3dbe51bc81215655c25c86604001518b60200151604051612c369291906149af565b60405180910390a3876020015184604001906006811115612c5957612c5961419d565b90816006811115612c6c57612c6c61419d565b9052505f60c0850181905262ffffff8a16602086015284604001516006811115612c9857612c9861419d565b03612cf6575f606085018190528085526080850181905260a08501819052885167ffffffffffffffff168152600160205260408120557f00000000000000000000000000000000000000000000000000000000000000009450612dbf565b60ff811660a08501525f82900b60808501526001606085015262ffffff891684527f00000000000000000000000000000000000000000000000000000000000000009650600684604001516006811115612d5257612d5261419d565b03612d8c57875167ffffffffffffffff165f90815260016020526040902073ffffffffffffffffffffffffffffffffffffffff9055612dbf565b875167ffffffffffffffff165f90815260016020526040902073ffffffffffffffffffffffffffffffffffffffff8b1690555b875167ffffffffffffffff165f9081526020818152604091829020865181549288015162ffffff9081166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000009094169116179190911780825591860151869282907fffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff166601000000000000836006811115612e6157612e6161419d565b021790555060608201518154608084015160a085015160c0909501517fffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff90921667010000000000000060ff948516027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16176801000000000000000091841691909102177fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff166901000000000000000000948316949094027fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff16939093176a01000000000000000000009190931602919091179055612fba5f612f6862ffffff8c1661322c565b604051602001612f7891906149ca565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00190525250885167ffffffffffffffff165f526001602052565b505050505b9450945094915050565b5f85600162ffffff821610801590612fe357505f8460ff16115b15613222575f612ff38885614804565b62ffffff1690508015613219575f865f0b5f03613030577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613032565b865b90505f815f0b128015613046575060ff8816155b1561304e57505f5b5f815f0b131561316f577f000000000000000000000000000000000000000000000000000000000000000060ff168660ff161015613164575f816001816130b58a7f00000000000000000000000000000000000000000000000000000000000000006149fb565b6130bf9190614947565b6130c991906149fb565b6130d39190614a14565b90508060ff168311156130e7578060ff1692505b6130f18284614a35565b6130fb9088614947565b96507f000000000000000000000000000000000000000000000000000000000000000060ff168760ff16111561314f577f000000000000000000000000000000000000000000000000000000000000000096505b86945061315c838b614a51565b935050613213565b859350889250613213565b5f815f0b121561320c575f61318382614a6d565b600161318e84614a6d565b613198908a614947565b6131a291906149fb565b6131ac9190614a14565b90508060ff168311156131c0578060ff1692505b5f6131ca83614a6d565b6131d49085614a35565b90508760ff168160ff1611156131ec575f95506131f9565b6131f681896149fb565b95505b613203848c614a51565b94505050613213565b8593508492505b50613220565b8492508791505b505b9550959350505050565b60605f61323883613854565b60010190505f8167ffffffffffffffff81111561325757613257614455565b6040519080825280601f01601f191660200182016040528015613281576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461328b57509392505050565b5f5b60ff821615613314576132fe6001836149fb565b909116908061330c81614960565b9150506132ea565b919050565b5f805f613324614044565b63ffffffff808a16600390810b9160208c811c90911690910b905f9081907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8401901b8401613377818e60028f8f613936565b90935091505f83810b121561338d578760011797505b9581019560048a811c811690036133d05767ffffffffffffffff81165f9081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1686525b5096810196602083901b84017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161340c818e60038f8f613936565b90935091505f83810b1215613422578760021797505b95810195600860048b901c8116900361346a5767ffffffffffffffff81165f9081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1660208701525b50968101966001830160201b8401613485818e5f8f8f613936565b90935091505f83810b121561349b578760041797505b95810195600160048b901c811690036134e35767ffffffffffffffff81165f9081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1660408701525b8289019850505f84600101602085901b019050613504818e60018f8f613936565b90935091505f83810b121561351a578760081797505b95810195600260048b901c811690036135625767ffffffffffffffff81165f9081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1660608701525b8289019850505050505095509550955095915050565b5f5b826020015181101561362657815f015173ffffffffffffffffffffffffffffffffffffffff16835f015182815181106135b5576135b561472d565b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff160361361457602082015183518051839081106135f4576135f461472d565b602002602001015160200181815161360c9190614791565b905250505050565b8061361e8161475a565b91505061357a565b50805182516020840151815181106136405761364061472d565b60200260200101515f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508060200151825f015183602001518151811061369b5761369b61472d565b602002602001015160200181815250508160200180518091906136bd9061475a565b9052505050565b5f805f805f806136de8a5f01518a8a8d602001518b613319565b93509350935093505f8260ff161115613776576137768b60405180604001604052806137228e5f015167ffffffffffffffff165f9081526001602052604090205490565b73ffffffffffffffffffffffffffffffffffffffff168152602001600c61376c7f000000000000000000000000000000000000000000000000000000000000000060ff8916614716565b61238c91906147f1565b5f5b60048160ff161015613842575f8260ff83166004811061379a5761379a61472d565b602002015173ffffffffffffffffffffffffffffffffffffffff1614613830576138308c6040518060400160405280858560ff16600481106137de576137de61472d565b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018b600f1660ff167f000000000000000000000000000000000000000000000000000000000000000061238c91906147f1565b8061383a81614960565b915050613778565b50929a91995090975050505050505050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061389c577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106138c8576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106138e657662386f26fc10000830492506010015b6305f5e10083106138fe576305f5e100830492506008015b612710831061391257612710830492506004015b60648310613924576064830492506002015b600a8310613930576001015b92915050565b67ffffffffffffffff85165f90815260208181526040808320815160e081018352815462ffffff8082168352630100000082041694820194909452849384939192918301906601000000000000900460ff1660068111156139995761399961419d565b60068111156139aa576139aa61419d565b8152905460ff6701000000000000008204811660208401526801000000000000000082045f90810b60408086019190915269010000000000000000008404831660608601526a01000000000000000000009093049091166080909301929092528251908301519293509190816006811115613a2757613a2761419d565b14613a8157856006811115613a3e57613a3e61419d565b816006811115613a5057613a5061419d565b14613a7b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613a7e565b60015b94505b60018262ffffff1610158015613aa857505f816006811115613aa557613aa561419d565b14155b15613b1e575f836060015160ff16118015613acc57508862ffffff168262ffffff16105b15613b08575f80613aec848660a00151876080015188606001518f612fc9565b91509150613aff8c8684848e8e8e613b2b565b95505050613b1e565b613b1b8a8485606001518c8c8c8c613b2b565b93505b5050509550959350505050565b5f80876060015160ff16118015613b43575060ff8616155b15613b7457613b558760a001516132e8565b60048860a0015160ff16901b613b6b9190614947565b60ff1660c08801525b613bd55f613b848660ff1661322c565b604051602001613b949190614aa8565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0019052525067ffffffffffffffff89165f526001602052565b613be0846002614bf7565b613beb856002614bf7565b60c089015160041c16600f1603613c535760c0870151613c0f90600f16600c614a14565b60c0880151909150600f166004613c2a60ff87166002614c05565b1960048a60c0015160ff16901c60ff161660ff16901b613c4a9190614947565b60ff1660c08801525b816006811115613c6557613c6561419d565b836006811115613c7757613c7761419d565b14613e0d575f826006811115613c8f57613c8f61419d565b03613d1457826006811115613ca657613ca661419d565b87604001516006811115613cbc57613cbc61419d565b03613cde57600187608001818151613cd49190614c10565b5f0b905250613e0d565b600187608001818151613cf19190614c4e565b5f0b90525060a087018051600160ff8781169190911b8118909116169052613e0d565b826006811115613d2657613d2661419d565b87604001516006811115613d3c57613d3c61419d565b03613d6d5760a087018051600160ff8781169190911b90911716905260808701805160029190613cd4908390614c10565b816006811115613d7f57613d7f61419d565b87604001516006811115613d9557613d9561419d565b03613dc5575f836006811115613dad57613dad61419d565b14613cde57600287608001818151613cf19190614c4e565b5f836006811115613dd857613dd861419d565b03613e0d57600187608001818151613df09190614c10565b5f0b90525060a087018051600160ff8781169190911b9091171690525b62ffffff8516875260ff8087166060890152613e40905f90613e3090871661322c565b604051602001613b949190614c8c565b67ffffffffffffffff88165f908152602081815260409182902089518154928b015162ffffff9081166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000009094169116179190911780825591890151899282907fffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff166601000000000000836006811115613ee157613ee161419d565b021790555060608201518154608084015160a085015160c0909501517fffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff90921667010000000000000060ff948516027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16176801000000000000000091841691909102177fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff166901000000000000000000948316949094027fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff16939093176a01000000000000000000009190931602919091179055979650505050505050565b60408051610100810182525f808252602082018190529181018290529060608201905b81525f60208201819052604082018190526060820181905260809091015290565b6040805160e0810182525f808252602082018190529091820190614004565b60405180608001604052806004906020820280368337509192915050565b5f60208284031215614072575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114613314575f80fd5b5f8083601f8401126140ac575f80fd5b50813567ffffffffffffffff8111156140c3575f80fd5b6020830191508360208260061b85010111156140dd575f80fd5b9250929050565b80357fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000081168114613314575f80fd5b80151581146111d5575f80fd5b5f805f805f8060a08789031215614135575f80fd5b61413e87614079565b955060208701359450604087013567ffffffffffffffff811115614160575f80fd5b61416c89828a0161409c565b909550935061417f9050606088016140e4565b9150608087013561418f81614113565b809150509295509295509295565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600781106141ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b73ffffffffffffffffffffffffffffffffffffffff8151168252602081015162ffffff80821660208501528060408401511660408501525050606081015161424e60608401826141ca565b5060ff608082015116608083015260a08101515f0b60a083015260ff60c08201511660c083015260e08101516126f860e084018260ff169052565b61010081016139308284614203565b803567ffffffffffffffff81168114613314575f80fd5b5f602082840312156142bf575f80fd5b6142c882614298565b9392505050565b5f805f805f608086880312156142e3575f80fd5b6142ec86614079565b945060208601359350604086013567ffffffffffffffff81111561430e575f80fd5b61431a8882890161409c565b909450925061432d9050606087016140e4565b90509295509295909350565b5f806020838503121561434a575f80fd5b823567ffffffffffffffff80821115614361575f80fd5b818501915085601f830112614374575f80fd5b813581811115614382575f80fd5b8660208260051b8501011115614396575f80fd5b60209290920196919550909350505050565b5f602082840312156143b8575f80fd5b6142c882614079565b5f602082840312156143d1575f80fd5b6142c8826140e4565b5f60a082840312156143ea575f80fd5b50919050565b5f805f60e08486031215614402575f80fd5b61440b846140e4565b92506020840135915061442185604086016143da565b90509250925092565b5f8060c0838503121561443b575f80fd5b8235915061444c84602085016143da565b90509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156144c9576144c9614455565b604052919050565b5f60208083850312156144e2575f80fd5b823567ffffffffffffffff808211156144f9575f80fd5b818501915085601f83011261450c575f80fd5b81358181111561451e5761451e614455565b8060051b915061452f848301614482565b8181529183018401918481019088841115614548575f80fd5b938501935b838510156145665784358252938501939085019061454d565b98975050505050505050565b602080825282518282018190525f9190848201906040850190845b818110156145b4576145a0838551614203565b92840192610100929092019160010161458d565b50909695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115613930576139306145c0565b5f60208284031215614610575f80fd5b81516142c881614113565b803560078110613314575f80fd5b5f60408284031215614639575f80fd5b6040516040810181811067ffffffffffffffff8211171561465c5761465c614455565b60405261466883614298565b81526146766020840161461b565b60208201529392505050565b606080825281018490525f8560808301825b878110156146df5767ffffffffffffffff6146ae84614298565b16825260206146be81850161461b565b6146ca828501826141ca565b50506040928301929190910190600101614694565b507fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000095909516602084015250506040015292915050565b8082028115828204841417613930576139306145c0565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361478a5761478a6145c0565b5060010190565b80820180821115613930576139306145c0565b5f602082840312156147b4575f80fd5b813560ff811681146142c8575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f826147ff576147ff6147c4565b500490565b62ffffff828116828216039080821115614820576148206145c0565b5092915050565b5f8151808452602080850194508084015f5b83811015614874578151805167ffffffffffffffff168852830151614860848901826141ca565b506040969096019590820190600101614839565b509495945050505050565b838152606060208201525f6148976060830185614827565b90507fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000083166040830152949350505050565b828152604060208201525f6148e16040830184614827565b949350505050565b5f81515f5b8181101561490857602081850181015186830152016148ee565b505f93019283525090919050565b7f5f706f6b652061742065706f636820000000000000000000000000000000000081525f6142c8600f8301846148e9565b60ff8181168382160190811115613930576139306145c0565b5f60ff821660ff8103614975576149756145c0565b60010192915050565b7f5f636f6d707574654d6f76652061742065706f6368200000000000000000000081525f6142c860168301846148e9565b604081016149bd82856141ca565b6142c860208301846141ca565b7f414654455220000000000000000000000000000000000000000000000000000081525f6142c860068301846148e9565b60ff8281168282160390811115613930576139306145c0565b5f60ff831680614a2657614a266147c4565b8060ff84160491505092915050565b60ff8181168382160290811690818114614820576148206145c0565b62ffffff818116838216019080821115614820576148206145c0565b5f815f0b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808103614aa057614aa06145c0565b5f0392915050565b7f5f75706461746543656c6c46726f6d4e65696768626f722020696e646578000081525f6142c8601e8301846148e9565b600181815b80851115614b3257817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614b1857614b186145c0565b80851615614b2557918102915b93841c9390800290614ade565b509250929050565b5f82614b4857506001613930565b81614b5457505f613930565b8160018114614b6a5760028114614b7457614b90565b6001915050613930565b60ff841115614b8557614b856145c0565b50506001821b613930565b5060208310610133831016604e8410600b8410161715614bb3575081810a613930565b614bbd8383614ad9565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614bef57614bef6145c0565b029392505050565b5f6142c860ff841683614b3a565b5f6142c88383614b3a565b5f82810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808112607f82131715613930576139306145c0565b5f81810b9083900b01607f81137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8082121715613930576139306145c0565b7f4146544552205f75706461746543656c6c46726f6d4e65696768626f7220206981527f6e6465780000000000000000000000000000000000000000000000000000000060208201525f6142c860248301846148e956fea2646970667358221220cf1ac55cca884e4666a0e2e61145f92ba34cc5b8fbb4102d0cd1b79e3345145464736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100f0575f3560e01c8063990b050911610093578063c3f909d411610063578063c3f909d4146101f7578063d671011214610271578063f18885ce14610284578063fa1026dd146102a4575f80fd5b8063990b050914610186578063afa1e2d1146101c9578063b3015773146101d1578063c0e75387146101e4575f80fd5b806324a27240116100ce57806324a27240146101455780634dd3ab231461014d57806381ca54b9146101605780638b8fc3a114610173575f80fd5b80630a8bcdb9146100f4578063145165a914610109578063206848f61461011c575b5f80fd5b610107610102366004614062565b610389565b005b610107610117366004614120565b6105ba565b61012f61012a366004614062565b6108dc565b60405161013c9190614289565b60405180910390f35b6101076109ab565b61010761015b3660046142af565b610bd4565b61010761016e3660046142cf565b610c59565b610107610181366004614339565b610fae565b6101bb6101943660046143a8565b73ffffffffffffffffffffffffffffffffffffffff165f9081526002602052604090205490565b60405190815260200161013c565b6101076110ad565b6101076101df3660046143c1565b6111ba565b6101076101f23660046143f0565b6111d8565b6101ff61141a565b60405161013c91905f60e08201905073ffffffffffffffffffffffffffffffffffffffff8084511683528060208501511660208401525060408301516040830152606083015160608301526080830151608083015260ff60a08401511660a083015260c083015160c083015292915050565b61010761027f36600461442a565b6115a7565b6102976102923660046144d1565b6117dc565b60405161013c9190614572565b6103476102b23660046143a8565b604080518082019091525f80825260208201525073ffffffffffffffffffffffffffffffffffffffff165f908152600360209081526040918290208251808401845290549283901b7fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000168152780100000000000000000000000000000000000000000000000090920462ffffff169082015290565b6040805182517fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016815260209283015162ffffff16928101929092520161013c565b335f90815260036020526040812090806103a1611969565b845491935091507801000000000000000000000000000000000000000000000000900462ffffff161580159061040457508015806104045750825462ffffff83811678010000000000000000000000000000000000000000000000009092041614155b1561043b576040517fea27126e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f908152600260205260409020546001850161045a5793505f6104b0565b848110156104a3576040517f78fe52a600000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044015b60405180910390fd5b6104ad85826145ed565b90505b335f8181526002602052604090819020839055517fa9059cbb00000000000000000000000000000000000000000000000000000000815260048101919091526024810186905273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015610553573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105779190614600565b50604080518681526020810183905233917ff7aeb382a1e87f84aa69637a22868c2e12be1261273f04cdf40a262a8b890031910160405180910390a25050505050565b73ffffffffffffffffffffffffffffffffffffffff86165f90815260036020526040812090806105e8611969565b915091508015610624576040517f24f7f40f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82547801000000000000000000000000000000000000000000000000900462ffffff165f0361067f576040517f99c04fd700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825462ffffff838116780100000000000000000000000000000000000000000000000090920416146106dd576040517fd5b25b6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8254604080516020808a0282018101835289825261073e9390921b918b91908b908b9081905f9085015b828210156107335761072460408302860136819003810190614629565b81526020019060010190610707565b505050505088611ab1565b5f6107a78a848a8a808060200260200160405190810160405280939291908181526020015f905b828210156107915761078260408302860136819003810190614629565b81526020019060010190610765565b5050505050886107a1578d611bde565b5f611bde565b845490915060401b7fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008716156108425760208814610811576040517fcc586b4500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffff00000000000000000000000000000000000000000000000016604088901c178555610869565b84547fffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff1685555b8067ffffffffffffffff19168462ffffff168c73ffffffffffffffffffffffffffffffffffffffff167f1a98c747a021d0d5f559e6beea9f0e9f36e11c5f218f85fda0bd665b6b0273548c8c8c886040516108c79493929190614682565b60405180910390a45050505050505050505050565b6108e4613fe1565b5f6108ed611969565b5090505f6108fb84836120f7565b905060405180610100016040528061091e865f9081526001602052604090205490565b73ffffffffffffffffffffffffffffffffffffffff168152602001825f015162ffffff168152602001826020015162ffffff1681526020018260400151600681111561096c5761096c61419d565b8152602001826060015160ff16815260200182608001515f0b81526020018260a0015160ff1681526020018260c0015160ff1681525092505050919050565b335f908152600360205260408120906109c2611969565b5082549091507801000000000000000000000000000000000000000000000000900462ffffff165f03610a21576040517f99c04fd700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815462ffffff80831678010000000000000000000000000000000000000000000000009092041603610a7f576040517f53a4c7b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81547fffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff168255335f908152600260205260408082208054929055517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015610b69573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8d9190614600565b50604080518281525f602082015262ffffff84169133917f6337d70daadadd11f8be7f6e7b38e6c04d28710b1f2a2894bb14d8e3eaa8cdb6910160405180910390a3505050565b60408051600581830181815261010083019093525f928291816020015b604080518082019091525f8082526020820152815260200190600190039081610bf157505081525f6020909101529050610c2b8183612226565b610c557f0000000000000000000000000000000000000000000000000000000000000000826125fc565b5050565b73ffffffffffffffffffffffffffffffffffffffff85165f90815260036020526040812090610c86611969565b5082549091507801000000000000000000000000000000000000000000000000900462ffffff161580610cdd5750815462ffffff828116780100000000000000000000000000000000000000000000000090920416145b15610d14576040517f53a4c7b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81546040805160208088028201810183528782528793610d74931b918a918a90869081905f9085015b82821015610d6957610d5a60408302860136819003810190614629565b81526020019060010190610d3d565b505050505087611ab1565b7fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000841615610e075760208114610dd6576040517fcc586b4500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82547fffffffffffffffff00000000000000000000000000000000000000000000000016604085901c178355610e2e565b82547fffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff1683555b335f90815260026020526040812080548792839291610e4e9084906145ed565b90915550506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015610f05573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f299190614600565b50604080518281527fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008716602082015262ffffff85169173ffffffffffffffffffffffffffffffffffffffff8c16917f6337d70daadadd11f8be7f6e7b38e6c04d28710b1f2a2894bb14d8e3eaa8cdb6910160405180910390a3505050505050505050565b6040805180820190915281905f9080610fc8846005614716565b67ffffffffffffffff811115610fe057610fe0614455565b60405190808252806020026020018201604052801561102457816020015b604080518082019091525f8082526020820152815260200190600190039081610ffe5790505b5081526020015f81525090505f5b8281101561107c5761106a828686848181106110505761105061472d565b905060200201602081019061106591906142af565b612226565b806110748161475a565b915050611032565b506110a77f0000000000000000000000000000000000000000000000000000000000000000826125fc565b50505050565b335f90815260036020526040812090806110c5611969565b9150915080611100576040517f9713090900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825462ffffff8381167801000000000000000000000000000000000000000000000000909204161461115e576040517fea27126e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82547fffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff16835560405162ffffff83169033907f619ef9650648da30c9647d0b77a0de24a51da0630c3533d54cc1eb3d798e1eaa905f90a3505050565b335f818152600260205260409020546111d5919083906126fd565b50565b335f908152600260205260409020546111f18382614791565b335f8181526002602052604090208290559091506112109085836126fd565b8135156113185773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663d505accf33308535602087013561126c6060890160408a016147a4565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b16815273ffffffffffffffffffffffffffffffffffffffff95861660048201529490931660248501526044840191909152606483015260ff166084820152606085013560a4820152608085013560c482015260e4015f604051808303815f87803b158015611301575f80fd5b505af1158015611313573d5f803e3d5ffd5b505050505b82156110a7576040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303815f875af11580156113b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113d89190614600565b50604080518481526020810183905233917f9705a8ff16374359785d31b0f1862c27f983645496f40760d180a9830eeaf2e8910160405180910390a250505050565b6114826040518060e001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81526020015f60ff1681526020015f81525090565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811682527f00000000000000000000000000000000000000000000000000000000000000001660208201527f000000000000000000000000000000000000000000000000000000000000000060408201527f000000000000000000000000000000000000000000000000000000000000000060608201527f0000000000000000000000000000000000000000000000000000000000000000608082015260ff7f00000000000000000000000000000000000000000000000000000000000000001660a08201527f000000000000000000000000000000000000000000000000000000000000000060c082015290565b8115610c5557335f908152600260205260409020546115c68382614791565b335f90815260026020526040902081905590508135156116e15773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663d505accf3330853560208701356116356060890160408a016147a4565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b16815273ffffffffffffffffffffffffffffffffffffffff95861660048201529490931660248501526044840191909152606483015260ff166084820152606085013560a4820152608085013560c482015260e4015f604051808303815f87803b1580156116ca575f80fd5b505af11580156116dc573d5f803e3d5ffd5b505050505b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303815f875af1158015611777573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061179b9190614600565b50604080518481526020810183905233917f9705a8ff16374359785d31b0f1862c27f983645496f40760d180a9830eeaf2e8910160405180910390a2505050565b60605f6117e7611969565b5083519091508067ffffffffffffffff81111561180657611806614455565b60405190808252806020026020018201604052801561183f57816020015b61182c613fe1565b8152602001906001900390816118245790505b5092505f5b81811015611961575f6118708683815181106118625761186261472d565b6020026020010151856120f7565b90506040518061010001604052806118ac8885815181106118935761189361472d565b60200260200101515f9081526001602052604090205490565b73ffffffffffffffffffffffffffffffffffffffff168152602001825f015162ffffff168152602001826020015162ffffff168152602001826040015160068111156118fa576118fa61419d565b8152602001826060015160ff16815260200182608001515f0b81526020018260a0015160ff1681526020018260c0015160ff168152508583815181106119425761194261472d565b60200260200101819052505080806119599061475a565b915050611844565b505050919050565b5f80806119b67f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000614791565b90505f6119c1612942565b90507f0000000000000000000000000000000000000000000000000000000000000000811015611a1d576040517f3a5f7b5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611a487f0000000000000000000000000000000000000000000000000000000000000000836145ed565b9050611a5483826147f1565b611a5f906002614791565b94507f000000000000000000000000000000000000000000000000000000000000000083611a8e600288614804565b62ffffff16611a9d9190614716565b611aa790836145ed565b1093505050509091565b7fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000811615611b5c575f838383604051602001611aef9392919061487f565b6040516020818303038152906040528051906020012090508067ffffffffffffffff19168567ffffffffffffffff191614611b56576040517fd13415b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506110a7565b5f8383604051602001611b709291906148c9565b6040516020818303038152906040528051906020012090508067ffffffffffffffff19168567ffffffffffffffff191614611bd7576040517fd13415b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b5f80604051806040016040528085516005611bf99190614716565b67ffffffffffffffff811115611c1157611c11614455565b604051908082528060200260200182016040528015611c5557816020015b604080518082019091525f8082526020820152815260200190600190039081611c2f5790505b5081526020015f8152509050611c8260405180606001604052805f81526020015f81526020015f81525090565b5f5b8551811015611d15575f805f611cb5868c8c8c8881518110611ca857611ca861472d565b6020026020010151612976565b92509250925082855f01818151611ccc9190614791565b905250602085018051839190611ce3908390614791565b905250604085018051829190611cfa908390614791565b905250839250611d0d915082905061475a565b915050611c84565b5060408051808201909152600781527f7265736f6c766500000000000000000000000000000000000000000000000000602090910152611d757f0000000000000000000000000000000000000000000000000000000000000000836125fc565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260026020908152604090912054908201518251919450611daf91614791565b831015611e0357602081015181518491611dc891614791565b6040517f78fe52a60000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161049a565b73ffffffffffffffffffffffffffffffffffffffff8416611e675760208101518151611e2f9190614791565b611e3990846145ed565b73ffffffffffffffffffffffffffffffffffffffff88165f9081526002602052604090208190559250612023565b805115611f315780516040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015230602483015260448201929092527f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303815f875af1158015611f0b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f2f9190614600565b505b6020810151156120235760208101516040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f00000000000000000000000000000000000000000000000000000000000000008116602483015260448201929092527f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303815f875af1158015611ffd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120219190614600565b505b6040810151156120ed5760408181015190517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015260248201929092527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af11580156120c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120eb9190614600565b505b5050949350505050565b6120ff614025565b67ffffffffffffffff83165f9081526020818152604091829020825160e081018452815462ffffff8082168352630100000082041693820193909352929091908301906601000000000000900460ff1660068111156121605761216061419d565b60068111156121715761217161419d565b8152905460ff6701000000000000008204811660208401526801000000000000000082045f0b60408401526901000000000000000000820481166060808501919091526a010000000000000000000090920416608092830152825191830151908301519293509091600162ffffff8416108015906121f157505f8160ff16115b1561221d575f80612209858760a0015186868b612fc9565b60ff909116606088015262ffffff16865250505b50505092915050565b5f61222f611969565b5090505f61223d83836120f7565b90506122a25f6122518462ffffff1661322c565b6040516020016122619190614916565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0019052525067ffffffffffffffff84165f526001602052565b60c0810151606082015160ff161580156122c15750815162ffffff1615155b156122ef576122d38260a001516132e8565b60048360a0015160ff16901b6122e99190614947565b5f835290505b5f8061230686868660400151876040015187613319565b9094509250505060ff821615612393576123938760405180604001604052806123448a67ffffffffffffffff165f9081526001602052604090205490565b73ffffffffffffffffffffffffffffffffffffffff16815260200161238c7f000000000000000000000000000000000000000000000000000000000000000060ff8816614716565b9052613578565b5f5b60048160ff161015612456575f8260ff8316600481106123b7576123b761472d565b602002015173ffffffffffffffffffffffffffffffffffffffff161461244457612444886040518060400160405280858560ff16600481106123fb576123fb61472d565b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020017f0000000000000000000000000000000000000000000000000000000000000000815250613578565b8061244e81614960565b915050612395565b505f60c0850181905267ffffffffffffffff871681526020818152604091829020865181549288015162ffffff9081166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000009094169116179190911780825591860151869282907fffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff1666010000000000008360068111156124fe576124fe61419d565b021790555060608201518154608084015160a085015160c0909501517fffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff90921667010000000000000060ff948516027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16176801000000000000000091841691909102177fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff166901000000000000000000948316949094027fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff16939093176a0100000000000000000000919093160291909117905550505050505050565b5f5b81602001518110156126f8578273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb835f0151838151811061263b5761263b61472d565b60200260200101515f0151845f0151848151811061265b5761265b61472d565b6020026020010151602001516040518363ffffffff1660e01b81526004016126a592919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af11580156126c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126e59190614600565b50806126f08161475a565b9150506125fe565b505050565b73ffffffffffffffffffffffffffffffffffffffff83165f908152600360205260408120908061272b611969565b9150915080612766576040517f9713090900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82547801000000000000000000000000000000000000000000000000900462ffffff16158015906127bc5750825462ffffff83811678010000000000000000000000000000000000000000000000009092041614155b156127f3576040517fea27126e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825462ffffff83167801000000000000000000000000000000000000000000000000027fffffffffff000000000000000000000000000000000000000000000000000000909116604087901c171783557f00000000000000000000000000000000000000000000000000000000000000008410156128c6576040517f78fe52a6000000000000000000000000000000000000000000000000000000008152600481018590527f0000000000000000000000000000000000000000000000000000000000000000602482015260440161049a565b6040517fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008616815262ffffff83169073ffffffffffffffffffffffffffffffffffffffff8816907fe3c45ded79e3db74b160b9a697d75f465f68d287a678532ed0a9fb691553b93d9060200160405180910390a3505050505050565b7f0112c413de07a110ce0a9ace0c01e41b5b59462770325b042f0dc72c337f55f2545f906129708142614791565b91505090565b5f805f80612987855f0151876120f7565b90506129ed5f61299b8862ffffff1661322c565b6040516020016129ab919061497e565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00190525250855167ffffffffffffffff165f526001602052565b60c0810151606082015160ff16158015612a0c5750815162ffffff1615155b15612a3a57612a1e8260a001516132e8565b60048360a0015160ff16901b612a349190614947565b5f835290505b5f86602001516006811115612a5157612a5161419d565b03612b63577f000000000000000000000000000000000000000000000000000000000000000060ff16826060015160ff16141580612ad55750855167ffffffffffffffff165f9081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff89169073ffffffffffffffffffffffffffffffffffffffff1614155b15612b0a575f807f00000000000000000000000000000000000000000000000000000000000000009450945094505050612fbf565b612b5e8960405180604001604052808b73ffffffffffffffffffffffffffffffffffffffff1681526020017f0000000000000000000000000000000000000000000000000000000000000000815250613578565b612bc1565b8662ffffff16826020015162ffffff1603612bc157606082015160ff1615612b915760066020870152612bc1565b5f807f00000000000000000000000000000000000000000000000000000000000000009450945094505050612fbf565b5f80612bd48b898b8760400151876136c4565b915091508973ffffffffffffffffffffffffffffffffffffffff16885f015167ffffffffffffffff167f17b85ded3fb12432ee427abc34a3026e1fbbb8bc431e3dbe51bc81215655c25c86604001518b60200151604051612c369291906149af565b60405180910390a3876020015184604001906006811115612c5957612c5961419d565b90816006811115612c6c57612c6c61419d565b9052505f60c0850181905262ffffff8a16602086015284604001516006811115612c9857612c9861419d565b03612cf6575f606085018190528085526080850181905260a08501819052885167ffffffffffffffff168152600160205260408120557f00000000000000000000000000000000000000000000000000000000000000009450612dbf565b60ff811660a08501525f82900b60808501526001606085015262ffffff891684527f00000000000000000000000000000000000000000000000000000000000000009650600684604001516006811115612d5257612d5261419d565b03612d8c57875167ffffffffffffffff165f90815260016020526040902073ffffffffffffffffffffffffffffffffffffffff9055612dbf565b875167ffffffffffffffff165f90815260016020526040902073ffffffffffffffffffffffffffffffffffffffff8b1690555b875167ffffffffffffffff165f9081526020818152604091829020865181549288015162ffffff9081166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000009094169116179190911780825591860151869282907fffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff166601000000000000836006811115612e6157612e6161419d565b021790555060608201518154608084015160a085015160c0909501517fffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff90921667010000000000000060ff948516027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16176801000000000000000091841691909102177fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff166901000000000000000000948316949094027fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff16939093176a01000000000000000000009190931602919091179055612fba5f612f6862ffffff8c1661322c565b604051602001612f7891906149ca565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00190525250885167ffffffffffffffff165f526001602052565b505050505b9450945094915050565b5f85600162ffffff821610801590612fe357505f8460ff16115b15613222575f612ff38885614804565b62ffffff1690508015613219575f865f0b5f03613030577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613032565b865b90505f815f0b128015613046575060ff8816155b1561304e57505f5b5f815f0b131561316f577f000000000000000000000000000000000000000000000000000000000000000060ff168660ff161015613164575f816001816130b58a7f00000000000000000000000000000000000000000000000000000000000000006149fb565b6130bf9190614947565b6130c991906149fb565b6130d39190614a14565b90508060ff168311156130e7578060ff1692505b6130f18284614a35565b6130fb9088614947565b96507f000000000000000000000000000000000000000000000000000000000000000060ff168760ff16111561314f577f000000000000000000000000000000000000000000000000000000000000000096505b86945061315c838b614a51565b935050613213565b859350889250613213565b5f815f0b121561320c575f61318382614a6d565b600161318e84614a6d565b613198908a614947565b6131a291906149fb565b6131ac9190614a14565b90508060ff168311156131c0578060ff1692505b5f6131ca83614a6d565b6131d49085614a35565b90508760ff168160ff1611156131ec575f95506131f9565b6131f681896149fb565b95505b613203848c614a51565b94505050613213565b8593508492505b50613220565b8492508791505b505b9550959350505050565b60605f61323883613854565b60010190505f8167ffffffffffffffff81111561325757613257614455565b6040519080825280601f01601f191660200182016040528015613281576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461328b57509392505050565b5f5b60ff821615613314576132fe6001836149fb565b909116908061330c81614960565b9150506132ea565b919050565b5f805f613324614044565b63ffffffff808a16600390810b9160208c811c90911690910b905f9081907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8401901b8401613377818e60028f8f613936565b90935091505f83810b121561338d578760011797505b9581019560048a811c811690036133d05767ffffffffffffffff81165f9081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1686525b5096810196602083901b84017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161340c818e60038f8f613936565b90935091505f83810b1215613422578760021797505b95810195600860048b901c8116900361346a5767ffffffffffffffff81165f9081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1660208701525b50968101966001830160201b8401613485818e5f8f8f613936565b90935091505f83810b121561349b578760041797505b95810195600160048b901c811690036134e35767ffffffffffffffff81165f9081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1660408701525b8289019850505f84600101602085901b019050613504818e60018f8f613936565b90935091505f83810b121561351a578760081797505b95810195600260048b901c811690036135625767ffffffffffffffff81165f9081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1660608701525b8289019850505050505095509550955095915050565b5f5b826020015181101561362657815f015173ffffffffffffffffffffffffffffffffffffffff16835f015182815181106135b5576135b561472d565b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff160361361457602082015183518051839081106135f4576135f461472d565b602002602001015160200181815161360c9190614791565b905250505050565b8061361e8161475a565b91505061357a565b50805182516020840151815181106136405761364061472d565b60200260200101515f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508060200151825f015183602001518151811061369b5761369b61472d565b602002602001015160200181815250508160200180518091906136bd9061475a565b9052505050565b5f805f805f806136de8a5f01518a8a8d602001518b613319565b93509350935093505f8260ff161115613776576137768b60405180604001604052806137228e5f015167ffffffffffffffff165f9081526001602052604090205490565b73ffffffffffffffffffffffffffffffffffffffff168152602001600c61376c7f000000000000000000000000000000000000000000000000000000000000000060ff8916614716565b61238c91906147f1565b5f5b60048160ff161015613842575f8260ff83166004811061379a5761379a61472d565b602002015173ffffffffffffffffffffffffffffffffffffffff1614613830576138308c6040518060400160405280858560ff16600481106137de576137de61472d565b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018b600f1660ff167f000000000000000000000000000000000000000000000000000000000000000061238c91906147f1565b8061383a81614960565b915050613778565b50929a91995090975050505050505050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061389c577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106138c8576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106138e657662386f26fc10000830492506010015b6305f5e10083106138fe576305f5e100830492506008015b612710831061391257612710830492506004015b60648310613924576064830492506002015b600a8310613930576001015b92915050565b67ffffffffffffffff85165f90815260208181526040808320815160e081018352815462ffffff8082168352630100000082041694820194909452849384939192918301906601000000000000900460ff1660068111156139995761399961419d565b60068111156139aa576139aa61419d565b8152905460ff6701000000000000008204811660208401526801000000000000000082045f90810b60408086019190915269010000000000000000008404831660608601526a01000000000000000000009093049091166080909301929092528251908301519293509190816006811115613a2757613a2761419d565b14613a8157856006811115613a3e57613a3e61419d565b816006811115613a5057613a5061419d565b14613a7b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613a7e565b60015b94505b60018262ffffff1610158015613aa857505f816006811115613aa557613aa561419d565b14155b15613b1e575f836060015160ff16118015613acc57508862ffffff168262ffffff16105b15613b08575f80613aec848660a00151876080015188606001518f612fc9565b91509150613aff8c8684848e8e8e613b2b565b95505050613b1e565b613b1b8a8485606001518c8c8c8c613b2b565b93505b5050509550959350505050565b5f80876060015160ff16118015613b43575060ff8616155b15613b7457613b558760a001516132e8565b60048860a0015160ff16901b613b6b9190614947565b60ff1660c08801525b613bd55f613b848660ff1661322c565b604051602001613b949190614aa8565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0019052525067ffffffffffffffff89165f526001602052565b613be0846002614bf7565b613beb856002614bf7565b60c089015160041c16600f1603613c535760c0870151613c0f90600f16600c614a14565b60c0880151909150600f166004613c2a60ff87166002614c05565b1960048a60c0015160ff16901c60ff161660ff16901b613c4a9190614947565b60ff1660c08801525b816006811115613c6557613c6561419d565b836006811115613c7757613c7761419d565b14613e0d575f826006811115613c8f57613c8f61419d565b03613d1457826006811115613ca657613ca661419d565b87604001516006811115613cbc57613cbc61419d565b03613cde57600187608001818151613cd49190614c10565b5f0b905250613e0d565b600187608001818151613cf19190614c4e565b5f0b90525060a087018051600160ff8781169190911b8118909116169052613e0d565b826006811115613d2657613d2661419d565b87604001516006811115613d3c57613d3c61419d565b03613d6d5760a087018051600160ff8781169190911b90911716905260808701805160029190613cd4908390614c10565b816006811115613d7f57613d7f61419d565b87604001516006811115613d9557613d9561419d565b03613dc5575f836006811115613dad57613dad61419d565b14613cde57600287608001818151613cf19190614c4e565b5f836006811115613dd857613dd861419d565b03613e0d57600187608001818151613df09190614c10565b5f0b90525060a087018051600160ff8781169190911b9091171690525b62ffffff8516875260ff8087166060890152613e40905f90613e3090871661322c565b604051602001613b949190614c8c565b67ffffffffffffffff88165f908152602081815260409182902089518154928b015162ffffff9081166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000009094169116179190911780825591890151899282907fffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff166601000000000000836006811115613ee157613ee161419d565b021790555060608201518154608084015160a085015160c0909501517fffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff90921667010000000000000060ff948516027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16176801000000000000000091841691909102177fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff166901000000000000000000948316949094027fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff16939093176a01000000000000000000009190931602919091179055979650505050505050565b60408051610100810182525f808252602082018190529181018290529060608201905b81525f60208201819052604082018190526060820181905260809091015290565b6040805160e0810182525f808252602082018190529091820190614004565b60405180608001604052806004906020820280368337509192915050565b5f60208284031215614072575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114613314575f80fd5b5f8083601f8401126140ac575f80fd5b50813567ffffffffffffffff8111156140c3575f80fd5b6020830191508360208260061b85010111156140dd575f80fd5b9250929050565b80357fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000081168114613314575f80fd5b80151581146111d5575f80fd5b5f805f805f8060a08789031215614135575f80fd5b61413e87614079565b955060208701359450604087013567ffffffffffffffff811115614160575f80fd5b61416c89828a0161409c565b909550935061417f9050606088016140e4565b9150608087013561418f81614113565b809150509295509295509295565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600781106141ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b73ffffffffffffffffffffffffffffffffffffffff8151168252602081015162ffffff80821660208501528060408401511660408501525050606081015161424e60608401826141ca565b5060ff608082015116608083015260a08101515f0b60a083015260ff60c08201511660c083015260e08101516126f860e084018260ff169052565b61010081016139308284614203565b803567ffffffffffffffff81168114613314575f80fd5b5f602082840312156142bf575f80fd5b6142c882614298565b9392505050565b5f805f805f608086880312156142e3575f80fd5b6142ec86614079565b945060208601359350604086013567ffffffffffffffff81111561430e575f80fd5b61431a8882890161409c565b909450925061432d9050606087016140e4565b90509295509295909350565b5f806020838503121561434a575f80fd5b823567ffffffffffffffff80821115614361575f80fd5b818501915085601f830112614374575f80fd5b813581811115614382575f80fd5b8660208260051b8501011115614396575f80fd5b60209290920196919550909350505050565b5f602082840312156143b8575f80fd5b6142c882614079565b5f602082840312156143d1575f80fd5b6142c8826140e4565b5f60a082840312156143ea575f80fd5b50919050565b5f805f60e08486031215614402575f80fd5b61440b846140e4565b92506020840135915061442185604086016143da565b90509250925092565b5f8060c0838503121561443b575f80fd5b8235915061444c84602085016143da565b90509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156144c9576144c9614455565b604052919050565b5f60208083850312156144e2575f80fd5b823567ffffffffffffffff808211156144f9575f80fd5b818501915085601f83011261450c575f80fd5b81358181111561451e5761451e614455565b8060051b915061452f848301614482565b8181529183018401918481019088841115614548575f80fd5b938501935b838510156145665784358252938501939085019061454d565b98975050505050505050565b602080825282518282018190525f9190848201906040850190845b818110156145b4576145a0838551614203565b92840192610100929092019160010161458d565b50909695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115613930576139306145c0565b5f60208284031215614610575f80fd5b81516142c881614113565b803560078110613314575f80fd5b5f60408284031215614639575f80fd5b6040516040810181811067ffffffffffffffff8211171561465c5761465c614455565b60405261466883614298565b81526146766020840161461b565b60208201529392505050565b606080825281018490525f8560808301825b878110156146df5767ffffffffffffffff6146ae84614298565b16825260206146be81850161461b565b6146ca828501826141ca565b50506040928301929190910190600101614694565b507fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000095909516602084015250506040015292915050565b8082028115828204841417613930576139306145c0565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361478a5761478a6145c0565b5060010190565b80820180821115613930576139306145c0565b5f602082840312156147b4575f80fd5b813560ff811681146142c8575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f826147ff576147ff6147c4565b500490565b62ffffff828116828216039080821115614820576148206145c0565b5092915050565b5f8151808452602080850194508084015f5b83811015614874578151805167ffffffffffffffff168852830151614860848901826141ca565b506040969096019590820190600101614839565b509495945050505050565b838152606060208201525f6148976060830185614827565b90507fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000083166040830152949350505050565b828152604060208201525f6148e16040830184614827565b949350505050565b5f81515f5b8181101561490857602081850181015186830152016148ee565b505f93019283525090919050565b7f5f706f6b652061742065706f636820000000000000000000000000000000000081525f6142c8600f8301846148e9565b60ff8181168382160190811115613930576139306145c0565b5f60ff821660ff8103614975576149756145c0565b60010192915050565b7f5f636f6d707574654d6f76652061742065706f6368200000000000000000000081525f6142c860168301846148e9565b604081016149bd82856141ca565b6142c860208301846141ca565b7f414654455220000000000000000000000000000000000000000000000000000081525f6142c860068301846148e9565b60ff8281168282160390811115613930576139306145c0565b5f60ff831680614a2657614a266147c4565b8060ff84160491505092915050565b60ff8181168382160290811690818114614820576148206145c0565b62ffffff818116838216019080821115614820576148206145c0565b5f815f0b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808103614aa057614aa06145c0565b5f0392915050565b7f5f75706461746543656c6c46726f6d4e65696768626f722020696e646578000081525f6142c8601e8301846148e9565b600181815b80851115614b3257817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614b1857614b186145c0565b80851615614b2557918102915b93841c9390800290614ade565b509250929050565b5f82614b4857506001613930565b81614b5457505f613930565b8160018114614b6a5760028114614b7457614b90565b6001915050613930565b60ff841115614b8557614b856145c0565b50506001821b613930565b5060208310610133831016604e8410600b8410161715614bb3575081810a613930565b614bbd8383614ad9565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614bef57614bef6145c0565b029392505050565b5f6142c860ff841683614b3a565b5f6142c88383614b3a565b5f82810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808112607f82131715613930576139306145c0565b5f81810b9083900b01607f81137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8082121715613930576139306145c0565b7f4146544552205f75706461746543656c6c46726f6d4e65696768626f7220206981527f6e6465780000000000000000000000000000000000000000000000000000000060208201525f6142c860248301846148e956fea2646970667358221220cf1ac55cca884e4666a0e2e61145f92ba34cc5b8fbb4102d0cd1b79e3345145464736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {}, + "devdoc": { + "errors": { + "ReserveTooLow(uint256,uint256)": [ + { + "params": { + "expected": "amount required to proceed", + "inReserve": "amount in reserver as the time of the call" + } + } + ] + }, + "events": { + "CommitmentCancelled(address,uint24)": { + "params": { + "epoch": "epoch number on which this commit belongs to", + "player": "account taking the staking risk (can be a different account than the one controlling the gems)" + } + }, + "CommitmentMade(address,uint24,bytes24)": { + "params": { + "commitmentHash": "the hash of moves", + "epoch": "epoch number on which this commit belongs to", + "player": "account taking the staking risk (can be a different account than the one controlling the gems)" + } + }, + "CommitmentResolved(address,uint24,bytes24,(uint64,uint8)[],bytes24,uint256)": { + "params": { + "commitmentHash": "the hash of the moves", + "epoch": "epoch number on which this commit belongs to", + "furtherMoves": "hash of further moves, unless bytes32(0) which indicate end.", + "moves": "the moves", + "player": "account who commited" + } + }, + "CommitmentVoid(address,uint24,uint256,bytes24)": { + "params": { + "amountBurnt": "amount of token to burn", + "epoch": "epoch number on which this commit belongs to", + "furtherMoves": "hash of further moves, unless bytes32(0) which indicate end.", + "player": "the account that made the commitment" + } + }, + "MoveProcessed(uint64,address,uint8,uint8)": { + "params": { + "newColor": "color that takes over", + "oldColor": "previous color of the cell", + "player": "account making the move", + "position": "cell at which the move take place" + } + }, + "ReserveDeposited(address,uint256,uint256)": { + "params": { + "amountDeposited": "the number of tokens deposited", + "newAmount": "the number of tokens in reserver as a result", + "player": "account receiving the token in the reserve" + } + }, + "ReserveWithdrawn(address,uint256,uint256)": { + "params": { + "amountWithdrawn": "the number of tokens withdrawnn", + "newAmount": "the number of tokens in reserver as a result", + "player": "account withdrawing the tokens" + } + } + }, + "kind": "dev", + "methods": { + "acknowledgeMissedResolution(address,bytes32,(uint64,uint8)[],bytes24)": { + "params": { + "furtherMoves": "if moves cannot be contained in one tx, further moves are represented by a hash to resolve too", + "moves": "the actual moves", + "player": "the account who committed the move", + "secret": "the secret used to make the commit" + } + }, + "addToReserve(uint256,(uint256,uint256,uint8,bytes32,bytes32))": { + "params": { + "permit": "permit EIP2612, .value = zero if not needed", + "tokensAmountToAdd": "amount of tokens to add" + } + }, + "getCell(uint256)": { + "params": { + "id": "the cell id" + } + }, + "getCells(uint256[])": { + "params": { + "ids": "the list of cell ids" + } + }, + "getCommitment(address)": { + "params": { + "account": "the address of which to retrieve the commitment" + } + }, + "getTokensInReserve(address)": { + "params": { + "account": "the address to retrived the amount in reserve of." + } + }, + "makeCommitment(bytes24)": { + "params": { + "commitmentHash": "the hash of the moves" + } + }, + "makeCommitmentWithExtraReserve(bytes24,uint256,(uint256,uint256,uint8,bytes32,bytes32))": { + "params": { + "commitmentHash": "the has of the moves", + "permit": "permit EIP2612, value = zero if not needed", + "tokensAmountToAdd": "amount of tokens to add to the reserve. the resulting total must be enough to cover the moves" + } + }, + "poke(uint64)": { + "params": { + "position": "the cell position" + } + }, + "pokeMultiple(uint64[])": { + "params": { + "positions": "cell positions to collect from" + } + }, + "resolve(address,bytes32,(uint64,uint8)[],bytes24,bool)": { + "params": { + "furtherMoves": "if moves cannot be contained in one tx, further moves are represented by a hash to resolve too Note that you have to that have enough moves (specified by MAX_NUM_MOVES_PER_HASH = 32)", + "moves": "the actual moves", + "player": "the account who committed the move", + "secret": "the secret used to make the commit", + "useReserve": "whether the tokens are taken from the reserve or from approvals. This allow player to keep their reserve intact and use it on their next move. Note that this require the Stratagems contract to have enough allowance." + } + }, + "withdrawFromReserve(uint256)": { + "params": { + "amount": "number of tokens to withdraw" + } + } + }, + "version": 1 + }, + "evm": { + "gasEstimates": { + "creation": { + "codeDepositCost": "3947400", + "executionCost": "infinite", + "totalCost": "infinite" + }, + "external": { + "acknowledgeMissedResolution(address,bytes32,(uint64,uint8)[],bytes24)": "infinite", + "acknowledgeMissedResolutionByBurningAllReserve()": "infinite", + "addToReserve(uint256,(uint256,uint256,uint8,bytes32,bytes32))": "infinite", + "cancelCommitment()": "infinite", + "getCell(uint256)": "infinite", + "getCells(uint256[])": "infinite", + "getCommitment(address)": "2808", + "getConfig()": "infinite", + "getTokensInReserve(address)": "2533", + "makeCommitment(bytes24)": "infinite", + "makeCommitmentWithExtraReserve(bytes24,uint256,(uint256,uint256,uint8,bytes32,bytes32))": "infinite", + "poke(uint64)": "infinite", + "pokeMultiple(uint64[])": "infinite", + "resolve(address,bytes32,(uint64,uint8)[],bytes24,bool)": "infinite", + "withdrawFromReserve(uint256)": "infinite" + } + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"contract IERC20WithIERC2612\",\"name\":\"tokens\",\"type\":\"address\"},{\"internalType\":\"address payable\",\"name\":\"burnAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"commitPhaseDuration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"resolutionPhaseDuration\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"maxLife\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"numTokensPerGems\",\"type\":\"uint256\"}],\"internalType\":\"struct UsingStratagemsTypes.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CanStillResolve\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommitmentHashNotMatching\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GameNotStarted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InCommitmentPhase\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InResolutionPhase\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidEpoch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidFurtherMoves\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NothingToResolve\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PreviousCommitmentNotResolved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"inReserve\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"}],\"name\":\"ReserveTooLow\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"player\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint24\",\"name\":\"epoch\",\"type\":\"uint24\"}],\"name\":\"CommitmentCancelled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"player\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint24\",\"name\":\"epoch\",\"type\":\"uint24\"},{\"indexed\":false,\"internalType\":\"bytes24\",\"name\":\"commitmentHash\",\"type\":\"bytes24\"}],\"name\":\"CommitmentMade\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"player\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint24\",\"name\":\"epoch\",\"type\":\"uint24\"},{\"indexed\":true,\"internalType\":\"bytes24\",\"name\":\"commitmentHash\",\"type\":\"bytes24\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"position\",\"type\":\"uint64\"},{\"internalType\":\"enum UsingStratagemsTypes.Color\",\"name\":\"color\",\"type\":\"uint8\"}],\"indexed\":false,\"internalType\":\"struct UsingStratagemsTypes.Move[]\",\"name\":\"moves\",\"type\":\"tuple[]\"},{\"indexed\":false,\"internalType\":\"bytes24\",\"name\":\"furtherMoves\",\"type\":\"bytes24\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newReserveAmount\",\"type\":\"uint256\"}],\"name\":\"CommitmentResolved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"player\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint24\",\"name\":\"epoch\",\"type\":\"uint24\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountBurnt\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes24\",\"name\":\"furtherMoves\",\"type\":\"bytes24\"}],\"name\":\"CommitmentVoid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"position\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"player\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"enum UsingStratagemsTypes.Color\",\"name\":\"oldColor\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"enum UsingStratagemsTypes.Color\",\"name\":\"newColor\",\"type\":\"uint8\"}],\"name\":\"MoveProcessed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"player\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountDeposited\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newAmount\",\"type\":\"uint256\"}],\"name\":\"ReserveDeposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"player\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountWithdrawn\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newAmount\",\"type\":\"uint256\"}],\"name\":\"ReserveWithdrawn\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"player\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"secret\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"position\",\"type\":\"uint64\"},{\"internalType\":\"enum UsingStratagemsTypes.Color\",\"name\":\"color\",\"type\":\"uint8\"}],\"internalType\":\"struct UsingStratagemsTypes.Move[]\",\"name\":\"moves\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes24\",\"name\":\"furtherMoves\",\"type\":\"bytes24\"}],\"name\":\"acknowledgeMissedResolution\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acknowledgeMissedResolutionByBurningAllReserve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokensAmountToAdd\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"struct UsingStratagemsTypes.Permit\",\"name\":\"permit\",\"type\":\"tuple\"}],\"name\":\"addToReserve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cancelCommitment\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getCell\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"lastEpochUpdate\",\"type\":\"uint24\"},{\"internalType\":\"uint24\",\"name\":\"epochWhenTokenIsAdded\",\"type\":\"uint24\"},{\"internalType\":\"enum UsingStratagemsTypes.Color\",\"name\":\"color\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"life\",\"type\":\"uint8\"},{\"internalType\":\"int8\",\"name\":\"delta\",\"type\":\"int8\"},{\"internalType\":\"uint8\",\"name\":\"enemyMap\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"distribution\",\"type\":\"uint8\"}],\"internalType\":\"struct UsingStratagemsTypes.FullCell\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"}],\"name\":\"getCells\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"lastEpochUpdate\",\"type\":\"uint24\"},{\"internalType\":\"uint24\",\"name\":\"epochWhenTokenIsAdded\",\"type\":\"uint24\"},{\"internalType\":\"enum UsingStratagemsTypes.Color\",\"name\":\"color\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"life\",\"type\":\"uint8\"},{\"internalType\":\"int8\",\"name\":\"delta\",\"type\":\"int8\"},{\"internalType\":\"uint8\",\"name\":\"enemyMap\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"distribution\",\"type\":\"uint8\"}],\"internalType\":\"struct UsingStratagemsTypes.FullCell[]\",\"name\":\"cells\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getCommitment\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes24\",\"name\":\"hash\",\"type\":\"bytes24\"},{\"internalType\":\"uint24\",\"name\":\"epoch\",\"type\":\"uint24\"}],\"internalType\":\"struct UsingStratagemsTypes.Commitment\",\"name\":\"commitment\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"contract IERC20WithIERC2612\",\"name\":\"tokens\",\"type\":\"address\"},{\"internalType\":\"address payable\",\"name\":\"burnAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"commitPhaseDuration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"resolutionPhaseDuration\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"maxLife\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"numTokensPerGems\",\"type\":\"uint256\"}],\"internalType\":\"struct UsingStratagemsTypes.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getTokensInReserve\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes24\",\"name\":\"commitmentHash\",\"type\":\"bytes24\"}],\"name\":\"makeCommitment\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes24\",\"name\":\"commitmentHash\",\"type\":\"bytes24\"},{\"internalType\":\"uint256\",\"name\":\"tokensAmountToAdd\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"struct UsingStratagemsTypes.Permit\",\"name\":\"permit\",\"type\":\"tuple\"}],\"name\":\"makeCommitmentWithExtraReserve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"position\",\"type\":\"uint64\"}],\"name\":\"poke\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64[]\",\"name\":\"positions\",\"type\":\"uint64[]\"}],\"name\":\"pokeMultiple\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"player\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"secret\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"position\",\"type\":\"uint64\"},{\"internalType\":\"enum UsingStratagemsTypes.Color\",\"name\":\"color\",\"type\":\"uint8\"}],\"internalType\":\"struct UsingStratagemsTypes.Move[]\",\"name\":\"moves\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes24\",\"name\":\"furtherMoves\",\"type\":\"bytes24\"},{\"internalType\":\"bool\",\"name\":\"useReserve\",\"type\":\"bool\"}],\"name\":\"resolve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawFromReserve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ReserveTooLow(uint256,uint256)\":[{\"params\":{\"expected\":\"amount required to proceed\",\"inReserve\":\"amount in reserver as the time of the call\"}}]},\"events\":{\"CommitmentCancelled(address,uint24)\":{\"params\":{\"epoch\":\"epoch number on which this commit belongs to\",\"player\":\"account taking the staking risk (can be a different account than the one controlling the gems)\"}},\"CommitmentMade(address,uint24,bytes24)\":{\"params\":{\"commitmentHash\":\"the hash of moves\",\"epoch\":\"epoch number on which this commit belongs to\",\"player\":\"account taking the staking risk (can be a different account than the one controlling the gems)\"}},\"CommitmentResolved(address,uint24,bytes24,(uint64,uint8)[],bytes24,uint256)\":{\"params\":{\"commitmentHash\":\"the hash of the moves\",\"epoch\":\"epoch number on which this commit belongs to\",\"furtherMoves\":\"hash of further moves, unless bytes32(0) which indicate end.\",\"moves\":\"the moves\",\"player\":\"account who commited\"}},\"CommitmentVoid(address,uint24,uint256,bytes24)\":{\"params\":{\"amountBurnt\":\"amount of token to burn\",\"epoch\":\"epoch number on which this commit belongs to\",\"furtherMoves\":\"hash of further moves, unless bytes32(0) which indicate end.\",\"player\":\"the account that made the commitment\"}},\"MoveProcessed(uint64,address,uint8,uint8)\":{\"params\":{\"newColor\":\"color that takes over\",\"oldColor\":\"previous color of the cell\",\"player\":\"account making the move\",\"position\":\"cell at which the move take place\"}},\"ReserveDeposited(address,uint256,uint256)\":{\"params\":{\"amountDeposited\":\"the number of tokens deposited\",\"newAmount\":\"the number of tokens in reserver as a result\",\"player\":\"account receiving the token in the reserve\"}},\"ReserveWithdrawn(address,uint256,uint256)\":{\"params\":{\"amountWithdrawn\":\"the number of tokens withdrawnn\",\"newAmount\":\"the number of tokens in reserver as a result\",\"player\":\"account withdrawing the tokens\"}}},\"kind\":\"dev\",\"methods\":{\"acknowledgeMissedResolution(address,bytes32,(uint64,uint8)[],bytes24)\":{\"params\":{\"furtherMoves\":\"if moves cannot be contained in one tx, further moves are represented by a hash to resolve too\",\"moves\":\"the actual moves\",\"player\":\"the account who committed the move\",\"secret\":\"the secret used to make the commit\"}},\"addToReserve(uint256,(uint256,uint256,uint8,bytes32,bytes32))\":{\"params\":{\"permit\":\"permit EIP2612, .value = zero if not needed\",\"tokensAmountToAdd\":\"amount of tokens to add\"}},\"getCell(uint256)\":{\"params\":{\"id\":\"the cell id\"}},\"getCells(uint256[])\":{\"params\":{\"ids\":\"the list of cell ids\"}},\"getCommitment(address)\":{\"params\":{\"account\":\"the address of which to retrieve the commitment\"}},\"getTokensInReserve(address)\":{\"params\":{\"account\":\"the address to retrived the amount in reserve of.\"}},\"makeCommitment(bytes24)\":{\"params\":{\"commitmentHash\":\"the hash of the moves\"}},\"makeCommitmentWithExtraReserve(bytes24,uint256,(uint256,uint256,uint8,bytes32,bytes32))\":{\"params\":{\"commitmentHash\":\"the has of the moves\",\"permit\":\"permit EIP2612, value = zero if not needed\",\"tokensAmountToAdd\":\"amount of tokens to add to the reserve. the resulting total must be enough to cover the moves\"}},\"poke(uint64)\":{\"params\":{\"position\":\"the cell position\"}},\"pokeMultiple(uint64[])\":{\"params\":{\"positions\":\"cell positions to collect from\"}},\"resolve(address,bytes32,(uint64,uint8)[],bytes24,bool)\":{\"params\":{\"furtherMoves\":\"if moves cannot be contained in one tx, further moves are represented by a hash to resolve too Note that you have to that have enough moves (specified by MAX_NUM_MOVES_PER_HASH = 32)\",\"moves\":\"the actual moves\",\"player\":\"the account who committed the move\",\"secret\":\"the secret used to make the commit\",\"useReserve\":\"whether the tokens are taken from the reserve or from approvals. This allow player to keep their reserve intact and use it on their next move. Note that this require the Stratagems contract to have enough allowance.\"}},\"withdrawFromReserve(uint256)\":{\"params\":{\"amount\":\"number of tokens to withdraw\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"CanStillResolve()\":[{\"notice\":\"Player have to resolve if they can Stratagems will prevent them from acknowledging missed resolution if there is still time to resolve.\"}],\"CommitmentHashNotMatching()\":[{\"notice\":\"Player have to reveal their commitment using the exact same move values If they provide different value, the commitment hash will differ and Stratagems will reject their resolution.\"}],\"GameNotStarted()\":[{\"notice\":\"Game has not started yet, can't perform any action\"}],\"InCommitmentPhase()\":[{\"notice\":\"When in Commit phase, player can make new commitment but they cannot resolve their move yet.\"}],\"InResolutionPhase()\":[{\"notice\":\"When in Resolution phase, it is not possible to commit new moves or cancel previous commitment During Resolution phase, players have to reveal their commitment, if not already done.\"}],\"InvalidEpoch()\":[{\"notice\":\"Player can only resolve their move in the same epoch they commited.abi If a player resolve later it can only do to minimize the reserve burn cost by calling : `acknowledgeMissedResolution`\"}],\"InvalidFurtherMoves()\":[{\"notice\":\"Player can make arbitrary number of moves per epoch. To do so they group moves into (MAX_NUM_MOVES_PER_HASH = 32) moves This result in a recursive series of hash that they can then submit in turn while resolving. The limit (MAX_NUM_MOVES_PER_HASH = 32) ensure a resolution batch fits in a block.\"}],\"NothingToResolve()\":[{\"notice\":\"Player can only resolve moves they commited.\"}],\"PreviousCommitmentNotResolved()\":[{\"notice\":\"Previous commitment need to be resolved before making a new one. Even if the corresponding reveal phase has passed.\\\\ It is also not possible to withdraw any amount from reserve until the commitment is revealed.\\\\If player lost the information to reveal, it can acknowledge failure which will burn all its reserve.\\\\\"}],\"ReserveTooLow(uint256,uint256)\":[{\"notice\":\"to make a commitment you always need at least one `config.numTokensPerGems` amount in reserve Player also need one `config.numTokensPerGems` per moves during the resolution phase.\"}]},\"events\":{\"CommitmentCancelled(address,uint24)\":{\"notice\":\"A player has cancelled its current commitment (before it reached the resolution phase)\"},\"CommitmentMade(address,uint24,bytes24)\":{\"notice\":\"A player has commited to make a move and resolve it on the resolution phase\"},\"CommitmentResolved(address,uint24,bytes24,(uint64,uint8)[],bytes24,uint256)\":{\"notice\":\"Player has resolved its previous commitment\"},\"CommitmentVoid(address,uint24,uint256,bytes24)\":{\"notice\":\"A player has canceled a previous commitment by burning some tokens\"},\"MoveProcessed(uint64,address,uint8,uint8)\":{\"notice\":\"A move has been resolved.\"},\"ReserveDeposited(address,uint256,uint256)\":{\"notice\":\"Player has deposited token in the reserve, allowing it to use that much in game\"},\"ReserveWithdrawn(address,uint256,uint256)\":{\"notice\":\"Player have withdrawn token from the reserve\"}},\"kind\":\"user\",\"methods\":{\"acknowledgeMissedResolution(address,bytes32,(uint64,uint8)[],bytes24)\":{\"notice\":\"called by player if they missed the resolution phase and want to minimze the token loss. By providing the moves, they will be slashed only the amount of token required to make the moves\"},\"acknowledgeMissedResolutionByBurningAllReserve()\":{\"notice\":\"should only be called as last resort this will burn all tokens in reserve If player has access to the secret, better call `acknowledgeMissedResolution`\"},\"addToReserve(uint256,(uint256,uint256,uint8,bytes32,bytes32))\":{\"notice\":\"called by players to add tokens to their reserve\"},\"cancelCommitment()\":{\"notice\":\"called by players to cancel their current commitment Can only be called during the commit phase in which the commitment was made It cannot be called afterward\"},\"getCell(uint256)\":{\"notice\":\"return updated cell (based on current epoch)\"},\"getCells(uint256[])\":{\"notice\":\"return the list of updated cells (based on current epoch) whose ids is given\"},\"getCommitment(address)\":{\"notice\":\"The commitment to be resolved. zeroed if no commitment need to be made.\"},\"getConfig()\":{\"notice\":\"return the config used to initialise the Game\"},\"getTokensInReserve(address)\":{\"notice\":\"the number of token in reserve per account This is used to slash player who do not resolve their commit The amount can be greater than the number of token required for the next move This allow player to potentially hide their intention.\"},\"makeCommitment(bytes24)\":{\"notice\":\"called by players to commit their moves this can be called multiple time in the same epoch, the last call overriding the previous. When a commitment is made, it needs to be resolved in the resolution phase of the same epoch.abi If missed, player can still reveal its moves but none of them will be resolved. The player would lose its associated reserved amount.\"},\"makeCommitmentWithExtraReserve(bytes24,uint256,(uint256,uint256,uint8,bytes32,bytes32))\":{\"notice\":\"called to make a commitment along with tokens to add to the reserve\"},\"pokeMultiple(uint64[])\":{\"notice\":\"poke and collect the tokens won across multiple cells\"},\"resolve(address,bytes32,(uint64,uint8)[],bytes24,bool)\":{\"notice\":\"called by player to resolve their commitment this is where the core logic of the game takes place This is where the game board evolves The game is designed so that resolution order do not matter\"},\"withdrawFromReserve(uint256)\":{\"notice\":\"called by players to withdraw tokens from the reserve can only be called if no commitments are pending Note that while you can withdraw after commiting, note that if you do not have enough tokens you'll have your commitment failing.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/game/routes/StratagemsGameplay.sol\":\"StratagemsGameplay\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toString(int256 value) internal pure returns (string memory) {\\n return string(abi.encodePacked(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value))));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1, \\\"Math: mulDiv overflow\\\");\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.4.22 <0.9.0;\\n\\nlibrary console {\\n address constant CONSOLE_ADDRESS =\\n 0x000000000000000000636F6e736F6c652e6c6f67;\\n\\n function _sendLogPayloadImplementation(bytes memory payload) internal view {\\n address consoleAddress = CONSOLE_ADDRESS;\\n /// @solidity memory-safe-assembly\\n assembly {\\n pop(\\n staticcall(\\n gas(),\\n consoleAddress,\\n add(payload, 32),\\n mload(payload),\\n 0,\\n 0\\n )\\n )\\n }\\n }\\n\\n function _castToPure(\\n function(bytes memory) internal view fnIn\\n ) internal pure returns (function(bytes memory) pure fnOut) {\\n assembly {\\n fnOut := fnIn\\n }\\n }\\n\\n function _sendLogPayload(bytes memory payload) internal pure {\\n _castToPure(_sendLogPayloadImplementation)(payload);\\n }\\n\\n function log() internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n }\\n function logInt(int256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n }\\n\\n function logUint(uint256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n }\\n\\n function logString(string memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n }\\n\\n function logBool(bool p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n }\\n\\n function logAddress(address p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n }\\n\\n function logBytes(bytes memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n }\\n\\n function logBytes1(bytes1 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n }\\n\\n function logBytes2(bytes2 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n }\\n\\n function logBytes3(bytes3 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n }\\n\\n function logBytes4(bytes4 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n }\\n\\n function logBytes5(bytes5 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n }\\n\\n function logBytes6(bytes6 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n }\\n\\n function logBytes7(bytes7 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n }\\n\\n function logBytes8(bytes8 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n }\\n\\n function logBytes9(bytes9 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n }\\n\\n function logBytes10(bytes10 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n }\\n\\n function logBytes11(bytes11 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n }\\n\\n function logBytes12(bytes12 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n }\\n\\n function logBytes13(bytes13 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n }\\n\\n function logBytes14(bytes14 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n }\\n\\n function logBytes15(bytes15 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n }\\n\\n function logBytes16(bytes16 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n }\\n\\n function logBytes17(bytes17 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n }\\n\\n function logBytes18(bytes18 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n }\\n\\n function logBytes19(bytes19 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n }\\n\\n function logBytes20(bytes20 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n }\\n\\n function logBytes21(bytes21 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n }\\n\\n function logBytes22(bytes22 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n }\\n\\n function logBytes23(bytes23 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n }\\n\\n function logBytes24(bytes24 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n }\\n\\n function logBytes25(bytes25 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n }\\n\\n function logBytes26(bytes26 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n }\\n\\n function logBytes27(bytes27 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n }\\n\\n function logBytes28(bytes28 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n }\\n\\n function logBytes29(bytes29 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n }\\n\\n function logBytes30(bytes30 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n }\\n\\n function logBytes31(bytes31 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n }\\n\\n function logBytes32(bytes32 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n }\\n\\n function log(uint256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n }\\n\\n function log(string memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n }\\n\\n function log(bool p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n }\\n\\n function log(address p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n }\\n\\n function log(uint256 p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n }\\n\\n function log(bool p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n }\\n\\n function log(bool p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n }\\n\\n function log(bool p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n }\\n\\n function log(bool p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n }\\n\\n function log(address p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n }\\n\\n function log(address p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n }\\n\\n function log(address p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n }\\n\\n function log(address p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n}\\n\",\"keccak256\":\"0x7434453e6d3b7d0e5d0eb7846ffdbc27f0ccf3b163591263739b628074dc103a\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC165/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface IERC165 {\\n\\t/// @notice Query if a contract implements an interface\\n\\t/// @param interfaceID The interface identifier, as specified in ERC-165\\n\\t/// @dev Interface identification is specified in ERC-165. This function\\n\\t/// uses less than 30,000 gas.\\n\\t/// @return `true` if the contract implements `interfaceID` and\\n\\t/// `interfaceID` is not 0xffffffff, `false` otherwise\\n\\tfunction supportsInterface(bytes4 interfaceID) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x036eb02f585d3f298df9fc1470e1d761b74e86793b6c27d8d8608620146b3cf9\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/ERC2612/interfaces/IERC20WithIERC2612.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/IERC20.sol\\\";\\nimport \\\"./IERC2612.sol\\\";\\n\\ninterface IERC20WithIERC2612 is IERC20, IERC2612 {}\\n\",\"keccak256\":\"0x66100d98de50a396d46feb17a2b2b400b13f033f5e01b45e95901e61a4feef05\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/ERC2612/interfaces/IERC2612.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/IERC20Errors.sol\\\";\\n\\ninterface IERC2612 {\\n\\t/// @notice The signature do not match the expected signer\\n\\terror InvalidSignature();\\n\\t/// @notice The permit has expired\\n\\t/// @param currentTime time at which the error happen\\n\\t/// @param deadline the deadline\\n\\terror DeadlineOver(uint256 currentTime, uint256 deadline);\\n\\n\\t/// @notice allow `spender` to spend `value` amount of token on behalf of `owner`\\n\\t/// @param owner owner of the tokens\\n\\t/// @param spender address allowed to spend on behalf of the owner.\\n\\t/// @param value amount of token allowed to be spent\\n\\t/// @param deadline timestamp in seconds after which the permit is not valid.\\n\\t/// @param v signature part v\\n\\t/// @param r signature part r\\n\\t/// @param s signature part s\\n\\tfunction permit(\\n\\t\\taddress owner,\\n\\t\\taddress spender,\\n\\t\\tuint256 value,\\n\\t\\tuint256 deadline,\\n\\t\\tuint8 v,\\n\\t\\tbytes32 r,\\n\\t\\tbytes32 s\\n\\t) external;\\n\\n\\t/// @notice return the current nonce of the owner\\n\\t/// @param owner address queried\\n\\t/// @return nonce nonce value\\n\\tfunction nonces(address owner) external view returns (uint256 nonce);\\n\\n\\t/// @notice EIP-712 Domain separator hash\\n\\tfunction DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xe610994a34db6e750ee555ab2011292a980ec650e9afb7619fb0bc3fcad75095\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IERC20Errors.sol\\\";\\n\\ninterface IERC20 {\\n\\t/// @notice trigger when tokens are transferred, including zero value transfers.\\n\\t/// @param from the account the tokens are sent from\\n\\t/// @param to the account the tokens are sent to\\n\\t/// @param value number of tokens sent\\n\\tevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n\\t/// @notice trigger on approval amount being set.\\n\\t/// Note that Transfer events need to be considered to compute the current allowance.\\n\\t/// @param owner the account approving the `spender`\\n\\t/// @param spender the account allowed to spend\\n\\t/// @param value the amount granted\\n\\tevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n\\t/// @notice Returns the total token supply.\\n\\tfunction totalSupply() external view returns (uint256);\\n\\n\\t/// @notice Returns the number of decimals the token uses.\\n\\tfunction decimals() external view returns (uint8);\\n\\n\\t/// @notice Returns the symbol of the token.\\n\\tfunction symbol() external view returns (string memory);\\n\\n\\t/// @notice Returns the name of the token.\\n\\tfunction name() external view returns (string memory);\\n\\n\\t/// @notice Returns the account balance of another account with address `owner`.\\n\\tfunction balanceOf(address owner) external view returns (uint256);\\n\\n\\t/// @notice Transfers `amount` of tokens to address `to`.\\n\\tfunction transfer(address to, uint256 amount) external returns (bool);\\n\\n\\t/// @notice Returns the amount which `spender` is still allowed to withdraw from `owner`.\\n\\tfunction allowance(address owner, address spender) external view returns (uint256);\\n\\n\\t/// @notice Allows `spender` to withdraw from your account multiple times, up to `amount`.\\n\\tfunction approve(address spender, uint256 amount) external returns (bool);\\n\\n\\t/// @notice Transfers `amount` tokens from address `from` to address `to`.\\n\\tfunction transferFrom(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 amount\\n\\t) external returns (bool);\\n}\\n\",\"keccak256\":\"0x68034c81cd7775e19a5bb75dd33022da7add3bc1852309eed9f797f1ff835507\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/interfaces/IERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/// @notice The msg value do not match the expected value\\n/// @param provided msg.value amount provided\\n/// @param expected value expected\\nerror InvalidMsgValue(uint256 provided, uint256 expected);\\n/// @notice The total amount provided do not match the expected value\\n/// @param provided msg.value amount provided\\n/// @param expected value expected\\nerror InvalidTotalAmount(uint256 provided, uint256 expected);\\n/// @notice An invalid address is specified (for example: zero address)\\n/// @param addr invalid address\\nerror InvalidAddress(address addr);\\n/// @notice the amount requested exceed the allowance\\n/// @param currentAllowance the current allowance\\n/// @param expected amount expected\\nerror NotAuthorizedAllowance(uint256 currentAllowance, uint256 expected);\\n/// @notice the amount requested exceed the balance\\n/// @param currentBalance the current balance\\n/// @param expected amount expected\\nerror NotEnoughTokens(uint256 currentBalance, uint256 expected);\\n\",\"keccak256\":\"0xc8ab4cfee19338da32d2fc5473e1ee740bf608c59196ebd16de74294c4813ae9\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../ERC165/interfaces/IERC165.sol\\\";\\nimport \\\"../../utils/GenericErrors.sol\\\";\\n\\ninterface IERC721Supply {\\n\\t/// @notice return the total number of token in existence\\n\\tfunction totalSupply() external view returns (uint256);\\n}\\n\\ninterface IERC721 is IERC165 {\\n\\t/// @notice Triggered when a token is transferred\\n\\t/// @param from the account the token is sent from\\n\\t/// @param to the account the token is sent to\\n\\t/// @param tokenID id of the token being sent\\n\\tevent Transfer(address indexed from, address indexed to, uint256 indexed tokenID);\\n\\n\\t/// @notice Triggered when a token is approved to be sent by another account\\n\\t/// Note tat the approval get reset when a Transfer event for that same token is emitted.\\n\\t/// @param owner current owner of the token\\n\\t/// @param approved account who can know transfer on the owner's behalf\\n\\t/// @param tokenID id of the token being approved\\n\\tevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenID);\\n\\n\\t/// @notice Triggered when an account approve or disaprove another to transfer on its behalf\\n\\t/// @param owner the account granting rights over all of its token\\n\\t/// @param operator account who can know transfer on the owner's behalf\\n\\t/// @param approved whether it is approved or not\\n\\tevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n\\t/// @notice The token does not exist\\n\\t/// @param tokenID id of the expected token\\n\\terror NonExistentToken(uint256 tokenID);\\n\\t/// @notice The address from which the token is sent is not the current owner\\n\\t/// @param provided the address expected to be the current owner\\n\\t/// @param currentOwner the current owner\\n\\terror NotOwner(address provided, address currentOwner);\\n\\t/// @notice An invalid address is specified (for example: zero address)\\n\\t/// @param addr invalid address\\n\\terror InvalidAddress(address addr);\\n\\t/// @notice The Transfer was rejected by the destination\\n\\terror TransferRejected();\\n\\t/// @notice The Nonce overflowed, make a transfer to self to allow new nonces.\\n\\terror NonceOverflow();\\n\\n\\t/// @notice Get the number of tokens owned by an address.\\n\\t/// @param owner The address to look for.\\n\\t/// @return balance The number of tokens owned by the address.\\n\\tfunction balanceOf(address owner) external view returns (uint256 balance);\\n\\n\\t/// @notice Get the owner of a token.\\n\\t/// @param tokenID The id of the token.\\n\\t/// @return owner The address of the token owner.\\n\\tfunction ownerOf(uint256 tokenID) external view returns (address owner);\\n\\n\\t/// @notice Transfer a token between 2 addresses letting the receiver knows of the transfer.\\n\\t/// @param from The sender of the token.\\n\\t/// @param to The recipient of the token.\\n\\t/// @param tokenID The id of the token.\\n\\t/// @param data Additional data.\\n\\tfunction safeTransferFrom(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 tokenID,\\n\\t\\tbytes calldata data\\n\\t) external;\\n\\n\\t/// @notice Transfer a token between 2 addresses letting the receiver know of the transfer.\\n\\t/// @param from The send of the token.\\n\\t/// @param to The recipient of the token.\\n\\t/// @param tokenID The id of the token.\\n\\tfunction safeTransferFrom(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 tokenID\\n\\t) external;\\n\\n\\t/// @notice Transfer a token between 2 addresses.\\n\\t/// @param from The sender of the token.\\n\\t/// @param to The recipient of the token.\\n\\t/// @param tokenID The id of the token.\\n\\tfunction transferFrom(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 tokenID\\n\\t) external;\\n\\n\\t/// @notice Approve an operator to transfer a specific token on the senders behalf.\\n\\t/// @param operator The address receiving the approval.\\n\\t/// @param tokenID The id of the token.\\n\\tfunction approve(address operator, uint256 tokenID) external;\\n\\n\\t/// @notice Set the approval for an operator to manage all the tokens of the sender.\\n\\t/// @param operator The address receiving the approval.\\n\\t/// @param approved The determination of the approval.\\n\\tfunction setApprovalForAll(address operator, bool approved) external;\\n\\n\\t/// @notice Get the approved operator for a specific token.\\n\\t/// @param tokenID The id of the token.\\n\\t/// @return operator The address of the operator.\\n\\tfunction getApproved(uint256 tokenID) external view returns (address operator);\\n\\n\\t/// @notice Check if the sender approved the operator to transfer any of its tokens.\\n\\t/// @param owner The address of the owner.\\n\\t/// @param operator The address of the operator.\\n\\t/// @return isOperator The status of the approval.\\n\\tfunction isApprovedForAll(address owner, address operator) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4df60787dd909ce77b09140217d364b2892756586b187f74035082e47ecfcd17\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC721.sol\\\";\\n\\ninterface IERC721Metadata is IERC721 {\\n\\t/// @notice A descriptive name for a collection of NFTs in this contract\\n\\tfunction name() external view returns (string memory name);\\n\\n\\t/// @notice An abbreviated name for NFTs in this contract\\n\\tfunction symbol() external view returns (string memory symbol);\\n\\n\\t/// @notice A distinct Uniform Resource Identifier (URI) for a given asset.\\n\\t/// @dev Throws if `tokenID` is not a valid NFT. URIs are defined in RFC\\n\\t/// 3986. The URI may point to a JSON file that conforms to the \\\"ERC721\\n\\t/// Metadata JSON Schema\\\".\\n\\t/// @param tokenID id of the token being queried.\\n\\tfunction tokenURI(uint256 tokenID) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0x540dda3ba75aa5ce30d01925acdeba36c0dbe806ac45d292b78afd39e16937a4\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/utils/GenericErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/// @notice Not authorized to perform this operation\\nerror NotAuthorized();\\n\",\"keccak256\":\"0x333aa48943e66849a9350384e7ec2553b93e8a8a12b8ad300d3341f7c98b60fd\",\"license\":\"MIT\"},\"src/game/interface/IStratagems.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nimport 'solidity-kit/solc_0.8/ERC721/interfaces/IERC721.sol';\\nimport 'solidity-kit/solc_0.8/ERC721/interfaces/IERC721Metadata.sol';\\nimport 'solidity-kit/solc_0.8/ERC165/interfaces/IERC165.sol';\\nimport './UsingStratagemsTypes.sol';\\nimport './UsingStratagemsEvents.sol';\\n\\ninterface IStratagemsGameplay is UsingStratagemsTypes, UsingStratagemsEvents {\\n\\t/// @notice return updated cell (based on current epoch)\\n\\t/// @param id the cell id\\n\\tfunction getCell(uint256 id) external view returns (FullCell memory cell);\\n\\n\\t/// @notice return the list of updated cells (based on current epoch) whose ids is given\\n\\t/// @param ids the list of cell ids\\n\\tfunction getCells(uint256[] memory ids) external view returns (FullCell[] memory cells);\\n\\n\\t/// @notice the number of token in reserve per account\\n\\t/// This is used to slash player who do not resolve their commit\\n\\t/// The amount can be greater than the number of token required for the next move\\n\\t/// This allow player to potentially hide their intention.\\n\\t/// @param account the address to retrived the amount in reserve of.\\n\\tfunction getTokensInReserve(address account) external view returns (uint256 amount);\\n\\n\\t/// @notice The commitment to be resolved. zeroed if no commitment need to be made.\\n\\t/// @param account the address of which to retrieve the commitment\\n\\tfunction getCommitment(address account) external view returns (Commitment memory commitment);\\n\\n\\t/// @notice return the config used to initialise the Game\\n\\tfunction getConfig() external view returns (Config memory config);\\n\\n\\t/// @notice called by players to add tokens to their reserve\\n\\t/// @param tokensAmountToAdd amount of tokens to add\\n\\t/// @param permit permit EIP2612, .value = zero if not needed\\n\\tfunction addToReserve(uint256 tokensAmountToAdd, Permit calldata permit) external;\\n\\n\\t/// @notice called by players to commit their moves\\n\\t/// this can be called multiple time in the same epoch, the last call overriding the previous.\\n\\t/// When a commitment is made, it needs to be resolved in the resolution phase of the same epoch.abi\\n\\t/// If missed, player can still reveal its moves but none of them will be resolved.\\n\\t/// The player would lose its associated reserved amount.\\n\\t/// @param commitmentHash the hash of the moves\\n\\tfunction makeCommitment(bytes24 commitmentHash) external;\\n\\n\\t/// @notice called by players to cancel their current commitment\\n\\t/// Can only be called during the commit phase in which the commitment was made\\n\\t/// It cannot be called afterward\\n\\tfunction cancelCommitment() external;\\n\\n\\t/// @notice called to make a commitment along with tokens to add to the reserve\\n\\t/// @param commitmentHash the has of the moves\\n\\t/// @param tokensAmountToAdd amount of tokens to add to the reserve. the resulting total must be enough to cover the moves\\n\\t/// @param permit permit EIP2612, value = zero if not needed\\n\\tfunction makeCommitmentWithExtraReserve(\\n\\t\\tbytes24 commitmentHash,\\n\\t\\tuint256 tokensAmountToAdd,\\n\\t\\tPermit calldata permit\\n\\t) external;\\n\\n\\t/// @notice called by players to withdraw tokens from the reserve\\n\\t/// can only be called if no commitments are pending\\n\\t/// Note that while you can withdraw after commiting, note that if you do not have enough tokens\\n\\t/// you'll have your commitment failing.\\n\\t/// @param amount number of tokens to withdraw\\n\\tfunction withdrawFromReserve(uint256 amount) external;\\n\\n\\t/// @notice called by player to resolve their commitment\\n\\t/// this is where the core logic of the game takes place\\n\\t/// This is where the game board evolves\\n\\t/// The game is designed so that resolution order do not matter\\n\\t/// @param player the account who committed the move\\n\\t/// @param secret the secret used to make the commit\\n\\t/// @param moves the actual moves\\n\\t/// @param furtherMoves if moves cannot be contained in one tx, further moves are represented by a hash to resolve too\\n\\t/// Note that you have to that have enough moves (specified by MAX_NUM_MOVES_PER_HASH = 32)\\n\\t/// @param useReserve whether the tokens are taken from the reserve or from approvals.\\n\\t/// This allow player to keep their reserve intact and use it on their next move.\\n\\t/// Note that this require the Stratagems contract to have enough allowance.\\n\\tfunction resolve(\\n\\t\\taddress player,\\n\\t\\tbytes32 secret,\\n\\t\\tMove[] calldata moves,\\n\\t\\tbytes24 furtherMoves,\\n\\t\\tbool useReserve\\n\\t) external;\\n\\n\\t/// @notice called by player if they missed the resolution phase and want to minimze the token loss.\\n\\t/// By providing the moves, they will be slashed only the amount of token required to make the moves\\n\\t/// @param player the account who committed the move\\n\\t/// @param secret the secret used to make the commit\\n\\t/// @param moves the actual moves\\n\\t/// @param furtherMoves if moves cannot be contained in one tx, further moves are represented by a hash to resolve too\\n\\tfunction acknowledgeMissedResolution(\\n\\t\\taddress player,\\n\\t\\tbytes32 secret,\\n\\t\\tMove[] calldata moves,\\n\\t\\tbytes24 furtherMoves\\n\\t) external;\\n\\n\\t/// @notice should only be called as last resort\\n\\t/// this will burn all tokens in reserve\\n\\t/// If player has access to the secret, better call `acknowledgeMissedResolution`\\n\\tfunction acknowledgeMissedResolutionByBurningAllReserve() external;\\n\\n\\t/// @notice poke a position, resolving its virtual state.\\n\\t// If dead as a result, it will reward neighboor enemies colors\\n\\t/// @param position the cell position\\n\\tfunction poke(uint64 position) external;\\n\\n\\t/// @notice poke and collect the tokens won across multiple cells\\n\\t/// @param positions cell positions to collect from\\n\\tfunction pokeMultiple(uint64[] calldata positions) external;\\n}\\n\\ninterface IStratagems is IStratagemsGameplay, IERC721, IERC721Metadata {}\\n\",\"keccak256\":\"0xb53f04089efb5231dbe0504347774c50dbb073d80e2ee7b654b6d6fac7ee4ae3\",\"license\":\"AGPL-3.0\"},\"src/game/interface/UsingStratagemsErrors.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\ninterface UsingStratagemsErrors {\\n\\t/// @notice Game has not started yet, can't perform any action\\n\\terror GameNotStarted();\\n\\n\\t/// @notice When in Resolution phase, it is not possible to commit new moves or cancel previous commitment\\n\\t/// During Resolution phase, players have to reveal their commitment, if not already done.\\n\\terror InResolutionPhase();\\n\\n\\t/// @notice When in Commit phase, player can make new commitment but they cannot resolve their move yet.\\n\\terror InCommitmentPhase();\\n\\n\\t/// @notice Previous commitment need to be resolved before making a new one. Even if the corresponding reveal phase has passed.\\\\\\n\\t/// It is also not possible to withdraw any amount from reserve until the commitment is revealed.\\\\\\n\\t/// @notice If player lost the information to reveal, it can acknowledge failure which will burn all its reserve.\\\\\\n\\terror PreviousCommitmentNotResolved();\\n\\n\\t/// @notice to make a commitment you always need at least one `config.numTokensPerGems` amount in reserve\\n\\t/// Player also need one `config.numTokensPerGems` per moves during the resolution phase.\\n\\t/// @param inReserve amount in reserver as the time of the call\\n\\t/// @param expected amount required to proceed\\n\\terror ReserveTooLow(uint256 inReserve, uint256 expected);\\n\\n\\t/// @notice Player have to reveal their commitment using the exact same move values\\n\\t/// If they provide different value, the commitment hash will differ and Stratagems will reject their resolution.\\n\\terror CommitmentHashNotMatching();\\n\\n\\t/// @notice Player can only resolve moves they commited.\\n\\terror NothingToResolve();\\n\\n\\t/// @notice Player can only resolve their move in the same epoch they commited.abi\\n\\t/// If a player resolve later it can only do to minimize the reserve burn cost by calling : `acknowledgeMissedResolution`\\n\\terror InvalidEpoch();\\n\\n\\t/// @notice Player can make arbitrary number of moves per epoch. To do so they group moves into (MAX_NUM_MOVES_PER_HASH = 32) moves\\n\\t/// This result in a recursive series of hash that they can then submit in turn while resolving.\\n\\t/// The limit (MAX_NUM_MOVES_PER_HASH = 32) ensure a resolution batch fits in a block.\\n\\terror InvalidFurtherMoves();\\n\\n\\t/// @notice Player have to resolve if they can\\n\\t/// Stratagems will prevent them from acknowledging missed resolution if there is still time to resolve.\\n\\terror CanStillResolve();\\n}\\n\",\"keccak256\":\"0x8075ff688eea39ef831a10548de6b225f0e71293e48708ba7b7a6b5c8e45e020\",\"license\":\"AGPL-3.0\"},\"src/game/interface/UsingStratagemsEvents.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nimport './UsingStratagemsTypes.sol';\\n\\ninterface UsingStratagemsEvents is UsingStratagemsTypes {\\n\\t/// @notice A player has commited to make a move and resolve it on the resolution phase\\n\\t/// @param player account taking the staking risk (can be a different account than the one controlling the gems)\\n\\t/// @param epoch epoch number on which this commit belongs to\\n\\t/// @param commitmentHash the hash of moves\\n\\tevent CommitmentMade(address indexed player, uint24 indexed epoch, bytes24 commitmentHash);\\n\\n\\t/// @notice A player has cancelled its current commitment (before it reached the resolution phase)\\n\\t/// @param player account taking the staking risk (can be a different account than the one controlling the gems)\\n\\t/// @param epoch epoch number on which this commit belongs to\\n\\tevent CommitmentCancelled(address indexed player, uint24 indexed epoch);\\n\\n\\t/// @notice A player has canceled a previous commitment by burning some tokens\\n\\t/// @param player the account that made the commitment\\n\\t/// @param epoch epoch number on which this commit belongs to\\n\\t/// @param amountBurnt amount of token to burn\\n\\t/// @param furtherMoves hash of further moves, unless bytes32(0) which indicate end.\\n\\tevent CommitmentVoid(address indexed player, uint24 indexed epoch, uint256 amountBurnt, bytes24 furtherMoves);\\n\\n\\t/// @notice Player has resolved its previous commitment\\n\\t/// @param player account who commited\\n\\t/// @param epoch epoch number on which this commit belongs to\\n\\t/// @param commitmentHash the hash of the moves\\n\\t/// @param moves the moves\\n\\t/// @param furtherMoves hash of further moves, unless bytes32(0) which indicate end.\\n\\tevent CommitmentResolved(\\n\\t\\taddress indexed player,\\n\\t\\tuint24 indexed epoch,\\n\\t\\tbytes24 indexed commitmentHash,\\n\\t\\tMove[] moves,\\n\\t\\tbytes24 furtherMoves,\\n\\t\\tuint256 newReserveAmount\\n\\t);\\n\\n\\t/// @notice Player have withdrawn token from the reserve\\n\\t/// @param player account withdrawing the tokens\\n\\t/// @param amountWithdrawn the number of tokens withdrawnn\\n\\t/// @param newAmount the number of tokens in reserver as a result\\n\\tevent ReserveWithdrawn(address indexed player, uint256 amountWithdrawn, uint256 newAmount);\\n\\n\\t/// @notice Player has deposited token in the reserve, allowing it to use that much in game\\n\\t/// @param player account receiving the token in the reserve\\n\\t/// @param amountDeposited the number of tokens deposited\\n\\t/// @param newAmount the number of tokens in reserver as a result\\n\\tevent ReserveDeposited(address indexed player, uint256 amountDeposited, uint256 newAmount);\\n\\n\\t// --------------------------------------------------------------------------------------------\\n\\t// Event to make it easier to check what is happening\\n\\t// TODO get rid ?\\n\\t// --------------------------------------------------------------------------------------------\\n\\t/// @notice A move has been resolved.\\n\\t/// @param position cell at which the move take place\\n\\t/// @param player account making the move\\n\\t/// @param oldColor previous color of the cell\\n\\t/// @param newColor color that takes over\\n\\tevent MoveProcessed(uint64 indexed position, address indexed player, Color oldColor, Color newColor);\\n}\\n\",\"keccak256\":\"0x44d4cce8966d48be8edd16b28515757b16574463382f8df8301d80721509bb32\",\"license\":\"AGPL-3.0\"},\"src/game/interface/UsingStratagemsTypes.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nimport 'solidity-kit/solc_0.8/ERC721/interfaces/IERC721.sol';\\nimport 'solidity-kit/solc_0.8/ERC165/interfaces/IERC165.sol';\\nimport 'solidity-kit/solc_0.8/ERC20/ERC2612/interfaces/IERC20WithIERC2612.sol';\\n\\ninterface UsingStratagemsTypes {\\n\\t// --------------------------------------------------------------------------------------------\\n\\t// EXTERNAL TYPES\\n\\t// --------------------------------------------------------------------------------------------\\n\\n\\t/// @notice The set of possible color (None indicate the Cell is empty)\\n\\tenum Color {\\n\\t\\tNone,\\n\\t\\tBlue,\\n\\t\\tRed,\\n\\t\\tGreen,\\n\\t\\tYellow,\\n\\t\\tPurple,\\n\\t\\tEvil\\n\\t}\\n\\n\\t/// @notice Move struct that define position and color\\n\\tstruct Move {\\n\\t\\tuint64 position; // TODO make it bigger ? uint32 * uint32 is probably infinitely big enough\\n\\t\\tColor color;\\n\\t}\\n\\n\\t/// @notice Permit struct to authorize EIP2612 ERC20 contracts\\n\\tstruct Permit {\\n\\t\\tuint256 value;\\n\\t\\tuint256 deadline;\\n\\t\\tuint8 v;\\n\\t\\tbytes32 r;\\n\\t\\tbytes32 s;\\n\\t}\\n\\n\\t/// @notice Config struct to configure the game instance\\n\\tstruct Config {\\n\\t\\tIERC20WithIERC2612 tokens;\\n\\t\\taddress payable burnAddress;\\n\\t\\tuint256 startTime;\\n\\t\\tuint256 commitPhaseDuration;\\n\\t\\tuint256 resolutionPhaseDuration;\\n\\t\\tuint8 maxLife;\\n\\t\\tuint256 numTokensPerGems;\\n\\t}\\n\\n\\t/// @notice Cell struct representing the current state of a cell\\n\\tstruct FullCell {\\n\\t\\taddress owner;\\n\\t\\tuint24 lastEpochUpdate;\\n\\t\\tuint24 epochWhenTokenIsAdded;\\n\\t\\tColor color;\\n\\t\\tuint8 life;\\n\\t\\tint8 delta;\\n\\t\\tuint8 enemyMap;\\n\\t\\tuint8 distribution;\\n\\t}\\n\\n\\t// --------------------------------------------------------------------------------------------\\n\\t// STORAGE TYPES\\n\\t// --------------------------------------------------------------------------------------------\\n\\tstruct Cell {\\n\\t\\tuint24 lastEpochUpdate;\\n\\t\\tuint24 epochWhenTokenIsAdded;\\n\\t\\tColor color;\\n\\t\\tuint8 life;\\n\\t\\tint8 delta;\\n\\t\\tuint8 enemyMap;\\n\\t\\tuint8 distribution; // this encode who is left to be given reward (4 left most bits) and the reard (4 most right bits)\\n\\t}\\n\\n\\tstruct Commitment {\\n\\t\\tbytes24 hash;\\n\\t\\tuint24 epoch;\\n\\t}\\n\\n\\t// --------------------------------------------------------------------------------------------\\n\\t// INTERNAL TYPES\\n\\t// --------------------------------------------------------------------------------------------\\n\\n\\tstruct TokenTransfer {\\n\\t\\taddress payable to;\\n\\t\\tuint256 amount;\\n\\t}\\n\\n\\tstruct TokenTransferCollection {\\n\\t\\tTokenTransfer[] transfers;\\n\\t\\tuint256 numTransfers;\\n\\t}\\n\\n\\tstruct MoveTokens {\\n\\t\\tuint256 tokensPlaced;\\n\\t\\tuint256 tokensBurnt;\\n\\t\\tuint256 tokensReturned;\\n\\t}\\n}\\n\",\"keccak256\":\"0xc60a8b6fa0a4e29bd62ec6cda0ee731285dd1c2f4860fcee93f8a512bc185c60\",\"license\":\"AGPL-3.0\"},\"src/game/internal/UsingStratagemsSetters.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nimport './UsingStratagemsState.sol';\\nimport '../interface/UsingStratagemsEvents.sol';\\nimport './UsingStratagemsUtils.sol';\\n\\nabstract contract UsingStratagemsSetters is UsingStratagemsState, UsingStratagemsUtils {\\n\\tconstructor(Config memory config) UsingStratagemsState(config) {}\\n\\n\\tfunction _makeCommitment(address player, bytes24 commitmentHash, uint256 inReserve) internal {\\n\\t\\tCommitment storage commitment = _commitments[player];\\n\\n\\t\\t(uint24 epoch, bool commiting) = _epoch();\\n\\n\\t\\tif (!commiting) {\\n\\t\\t\\trevert InResolutionPhase();\\n\\t\\t}\\n\\t\\tif (commitment.epoch != 0 && commitment.epoch != epoch) {\\n\\t\\t\\trevert PreviousCommitmentNotResolved();\\n\\t\\t}\\n\\n\\t\\tcommitment.hash = commitmentHash;\\n\\t\\tcommitment.epoch = epoch;\\n\\n\\t\\t// for withdrawal, we still require a minimal reserve so player cannot change their mind without losing at least one token\\n\\t\\t// TODO we might want to increase that value to 10x as 10 moves might quite common, at least on some networks\\n\\t\\tif (inReserve < NUM_TOKENS_PER_GEMS) {\\n\\t\\t\\t// TODO? special error for this case ?\\n\\t\\t\\trevert ReserveTooLow(inReserve, NUM_TOKENS_PER_GEMS);\\n\\t\\t}\\n\\n\\t\\temit CommitmentMade(player, epoch, commitmentHash);\\n\\t}\\n\\n\\tfunction _resolveMoves(\\n\\t\\taddress player,\\n\\t\\tuint24 epoch,\\n\\t\\tMove[] memory moves,\\n\\t\\taddress tokenGiver\\n\\t) internal returns (uint256 newReserveAmount) {\\n\\t\\t// max number of transfer is (4+1) * moves.length\\n\\t\\t// (for each move's cell's neighbours potentially being a different account)\\n\\t\\t// limiting the number of move per commitment resolution to 32 or, even more probably, should cover this unlikely scenario\\n\\t\\tTokenTransferCollection memory transferCollection = TokenTransferCollection({\\n\\t\\t\\ttransfers: new TokenTransfer[](moves.length * 5),\\n\\t\\t\\tnumTransfers: 0\\n\\t\\t});\\n\\t\\tMoveTokens memory tokens;\\n\\t\\tfor (uint256 i = 0; i < moves.length; i++) {\\n\\t\\t\\t(uint256 placed, uint256 burnt, uint256 returned) = _computeMove(\\n\\t\\t\\t\\ttransferCollection,\\n\\t\\t\\t\\tplayer,\\n\\t\\t\\t\\tepoch,\\n\\t\\t\\t\\tmoves[i]\\n\\t\\t\\t);\\n\\n\\t\\t\\ttokens.tokensPlaced += placed;\\n\\t\\t\\ttokens.tokensBurnt += burnt;\\n\\t\\t\\ttokens.tokensReturned += returned;\\n\\t\\t}\\n\\n\\t\\tlogger.logTransfers(0, 'resolve', transferCollection);\\n\\n\\t\\t_multiTransfer(TOKENS, transferCollection);\\n\\n\\t\\tnewReserveAmount = _tokensInReserve[player];\\n\\n\\t\\t// Note: even if funds can comes from outside the reserve, we still check it\\n\\t\\t// This ensure player have to have a reserve and cannot escape the slash if not\\n\\t\\tif (newReserveAmount < tokens.tokensPlaced + tokens.tokensBurnt) {\\n\\t\\t\\trevert ReserveTooLow(newReserveAmount, tokens.tokensPlaced + tokens.tokensBurnt);\\n\\t\\t}\\n\\t\\tif (tokenGiver == address(0)) {\\n\\t\\t\\tnewReserveAmount -= tokens.tokensPlaced + tokens.tokensBurnt;\\n\\t\\t\\t_tokensInReserve[player] = newReserveAmount;\\n\\t\\t} else {\\n\\t\\t\\tif (tokens.tokensPlaced != 0) {\\n\\t\\t\\t\\t// TODO use TransferCollection too here\\n\\t\\t\\t\\tTOKENS.transferFrom(tokenGiver, address(this), tokens.tokensPlaced);\\n\\t\\t\\t}\\n\\t\\t\\tif (tokens.tokensBurnt != 0) {\\n\\t\\t\\t\\t// TODO use TransferCollection too here\\n\\t\\t\\t\\tTOKENS.transferFrom(tokenGiver, BURN_ADDRESS, tokens.tokensBurnt);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t// option to return in reserve ?\\n\\t\\t// TODO use TransferCollection too here\\n\\t\\tif (tokens.tokensReturned != 0) {\\n\\t\\t\\t// console.log(\\\"tokensReturned\\\");\\n\\t\\t\\t// console.log(tokens.tokensReturned);\\n\\t\\t\\tTOKENS.transfer(player, tokens.tokensReturned);\\n\\t\\t}\\n\\t}\\n\\n\\tfunction _countBits(uint8 n) internal pure returns (uint8 count) {\\n\\t\\twhile (n != 0) {\\n\\t\\t\\tn = n & (n - 1);\\n\\t\\t\\tcount++;\\n\\t\\t}\\n\\t}\\n\\n\\t// Note on COLLISION\\n\\t// If one color was used more than other, we could consider the cell having N owner and N times the number of tokens\\n\\t// such cells would be a good target for others\\n\\t// On the other end, on winning agains other cells, owner of such cell would have to divide the winnings\\n\\t// TODO revisit this\\n\\t// we could also refund the part\\n\\t// so if there is 3 green 2 blue and 1 red, then green win and the cell become green\\n\\t// player we put blue or red get refunded their respective gems\\n\\t// the players we put green get refunded 2/3 so that the cell still contains only 1\\n\\t// if there was 3 green and 3 blue and 1 red then the cell becomes black\\n\\t// every player get refunded 6/7 so that the black cell only has 1\\n\\t// note that the issue with green winning above is that winnings need to be distributed to all 3 players we put green\\n\\t// and since the number is technically unbounded, we have to use a splitter contract where player withdraw their winnings\\n\\t// this add UX complexity and some cost for withdrawals\\n\\tfunction _computeMove(\\n\\t\\tTokenTransferCollection memory transferCollection,\\n\\t\\taddress player,\\n\\t\\tuint24 epoch,\\n\\t\\tMove memory move\\n\\t) internal returns (uint256 tokensPlaced, uint256 tokensBurnt, uint256 tokensReturned) {\\n\\t\\tCell memory currentState = _getUpdatedCell(move.position, epoch);\\n\\n\\t\\tlogger.logCell(\\n\\t\\t\\t0,\\n\\t\\t\\tstring.concat('_computeMove at epoch ', Strings.toString(epoch)),\\n\\t\\t\\tmove.position,\\n\\t\\t\\tcurrentState,\\n\\t\\t\\taddress(uint160(_owners[move.position]))\\n\\t\\t);\\n\\n\\t\\t// we might have distribution still to do\\n\\t\\tuint8 distribution = currentState.distribution;\\n\\t\\tif (currentState.life == 0 && currentState.lastEpochUpdate != 0) {\\n\\t\\t\\t// if we just died, currentState.lastEpochUpdate > 0\\n\\t\\t\\t// we have to distribute to all\\n\\t\\t\\tdistribution = (currentState.enemyMap << 4) + _countBits(currentState.enemyMap);\\n\\n\\t\\t\\t/// we are now dead for real\\n\\t\\t\\tcurrentState.lastEpochUpdate = 0;\\n\\t\\t}\\n\\n\\t\\t// we then apply our move:\\n\\n\\t\\t// first we do some validity checks\\n\\t\\tif (move.color == Color.None) {\\n\\t\\t\\tif (currentState.life != MAX_LIFE || _ownerOf(move.position) != player) {\\n\\t\\t\\t\\t// invalid move\\n\\t\\t\\t\\treturn (0, 0, NUM_TOKENS_PER_GEMS);\\n\\t\\t\\t}\\n\\n\\t\\t\\t_collectTransfer(transferCollection, TokenTransfer({to: payable(player), amount: NUM_TOKENS_PER_GEMS}));\\n\\t\\t}\\n\\t\\t// then we consider the case of collision and transform such move as Color Evil\\n\\t\\telse if (currentState.epochWhenTokenIsAdded == epoch) {\\n\\t\\t\\tif (currentState.life != 0) {\\n\\t\\t\\t\\tmove.color = Color.Evil;\\n\\t\\t\\t\\t// TODO Add further stake, or do we burn? or return?\\n\\t\\t\\t} else {\\n\\t\\t\\t\\t// invalid move, on top of a MAX, that become None ?\\n\\t\\t\\t\\treturn (0, 0, NUM_TOKENS_PER_GEMS);\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t(int8 newDelta, uint8 newEnemyMap) = _propagate(\\n\\t\\t\\ttransferCollection,\\n\\t\\t\\tmove,\\n\\t\\t\\tepoch,\\n\\t\\t\\tcurrentState.color,\\n\\t\\t\\tdistribution\\n\\t\\t);\\n\\n\\t\\temit MoveProcessed(move.position, player, currentState.color, move.color);\\n\\t\\tcurrentState.color = move.color;\\n\\t\\tcurrentState.distribution = 0;\\n\\t\\tcurrentState.epochWhenTokenIsAdded = epoch; // used to prevent overwriting, even Color.None\\n\\n\\t\\tif (currentState.color == Color.None) {\\n\\t\\t\\tcurrentState.life = 0;\\n\\t\\t\\tcurrentState.lastEpochUpdate = 0;\\n\\t\\t\\tcurrentState.delta = 0;\\n\\t\\t\\tcurrentState.enemyMap = 0;\\n\\t\\t\\t_owners[move.position] = 0;\\n\\t\\t\\ttokensReturned = NUM_TOKENS_PER_GEMS;\\n\\t\\t} else {\\n\\t\\t\\ttokensPlaced = NUM_TOKENS_PER_GEMS;\\n\\n\\t\\t\\tcurrentState.enemyMap = newEnemyMap;\\n\\n\\t\\t\\tcurrentState.delta = newDelta;\\n\\t\\t\\tcurrentState.life = 1;\\n\\t\\t\\tcurrentState.lastEpochUpdate = epoch;\\n\\t\\t\\tif (currentState.color == Color.Evil) {\\n\\t\\t\\t\\t_owners[move.position] = uint256(uint160(0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF));\\n\\t\\t\\t} else {\\n\\t\\t\\t\\t_owners[move.position] = uint256(uint160(player));\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t_cells[move.position] = currentState;\\n\\n\\t\\tlogger.logCell(\\n\\t\\t\\t0,\\n\\t\\t\\tstring.concat('AFTER ', Strings.toString(epoch)),\\n\\t\\t\\tmove.position,\\n\\t\\t\\tcurrentState,\\n\\t\\t\\taddress(uint160(_owners[move.position]))\\n\\t\\t);\\n\\t}\\n\\n\\tfunction _propagate(\\n\\t\\tTokenTransferCollection memory transferCollection,\\n\\t\\tMove memory move,\\n\\t\\tuint24 epoch,\\n\\t\\tColor color,\\n\\t\\tuint8 distribution\\n\\t) internal returns (int8 newDelta, uint8 newEnemyMap) {\\n\\t\\t(\\n\\t\\t\\tint8 newComputedDelta,\\n\\t\\t\\tuint8 newComputedEnemyMap,\\n\\t\\t\\tuint8 numDue,\\n\\t\\t\\taddress[4] memory ownersToPay\\n\\t\\t) = _updateNeighbours(move.position, epoch, color, move.color, distribution);\\n\\n\\t\\tif (numDue > 0) {\\n\\t\\t\\t_collectTransfer(\\n\\t\\t\\t\\ttransferCollection,\\n\\t\\t\\t\\tTokenTransfer({to: payable(_ownerOf(move.position)), amount: (numDue * NUM_TOKENS_PER_GEMS) / 12})\\n\\t\\t\\t);\\n\\t\\t}\\n\\t\\tfor (uint8 i = 0; i < 4; i++) {\\n\\t\\t\\tif (ownersToPay[i] != address(0)) {\\n\\t\\t\\t\\t_collectTransfer(\\n\\t\\t\\t\\t\\ttransferCollection,\\n\\t\\t\\t\\t\\tTokenTransfer({to: payable(ownersToPay[i]), amount: (NUM_TOKENS_PER_GEMS / (distribution & 0x0f))})\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tnewDelta = newComputedDelta;\\n\\t\\tnewEnemyMap = newComputedEnemyMap;\\n\\t}\\n\\n\\tfunction _poke(TokenTransferCollection memory transferCollection, uint64 position) internal {\\n\\t\\t(uint24 epoch, ) = _epoch();\\n\\t\\tCell memory currentState = _getUpdatedCell(position, epoch);\\n\\n\\t\\tlogger.logCell(\\n\\t\\t\\t0,\\n\\t\\t\\tstring.concat('_poke at epoch ', Strings.toString(epoch)),\\n\\t\\t\\tposition,\\n\\t\\t\\tcurrentState,\\n\\t\\t\\taddress(uint160(_owners[position]))\\n\\t\\t);\\n\\n\\t\\t// we might have distribution still to do\\n\\t\\tuint8 distribution = currentState.distribution;\\n\\t\\tif (currentState.life == 0 && currentState.lastEpochUpdate != 0) {\\n\\t\\t\\t// if we just died, currentState.lastEpochUpdate > 0\\n\\t\\t\\t// we have to distribute to all\\n\\t\\t\\tdistribution = (currentState.enemyMap << 4) + _countBits(currentState.enemyMap);\\n\\n\\t\\t\\t/// we are now dead for real\\n\\t\\t\\tcurrentState.lastEpochUpdate = 0;\\n\\t\\t}\\n\\n\\t\\t(, , uint8 numDue, address[4] memory ownersToPay) = _updateNeighbours(\\n\\t\\t\\tposition,\\n\\t\\t\\tepoch,\\n\\t\\t\\tcurrentState.color,\\n\\t\\t\\tcurrentState.color,\\n\\t\\t\\tdistribution\\n\\t\\t);\\n\\n\\t\\tif (numDue > 0) {\\n\\t\\t\\t_collectTransfer(\\n\\t\\t\\t\\ttransferCollection,\\n\\t\\t\\t\\tTokenTransfer({to: payable(_ownerOf(position)), amount: numDue * NUM_TOKENS_PER_GEMS})\\n\\t\\t\\t);\\n\\t\\t}\\n\\t\\tfor (uint8 i = 0; i < 4; i++) {\\n\\t\\t\\tif (ownersToPay[i] != address(0)) {\\n\\t\\t\\t\\t_collectTransfer(\\n\\t\\t\\t\\t\\ttransferCollection,\\n\\t\\t\\t\\t\\tTokenTransfer({to: payable(ownersToPay[i]), amount: NUM_TOKENS_PER_GEMS})\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tcurrentState.distribution = 0;\\n\\t\\t_cells[position] = currentState;\\n\\t}\\n\\n\\tfunction _updateNeighbours(\\n\\t\\tuint64 position,\\n\\t\\tuint24 epoch,\\n\\t\\tColor oldColor,\\n\\t\\tColor newColor,\\n\\t\\tuint8 distribution\\n\\t) internal returns (int8 newDelta, uint8 newenemyMap, uint8 numDue, address[4] memory ownersToPay) {\\n\\t\\tunchecked {\\n\\t\\t\\tint256 x = int256(int32(int256(uint256(position) & 0xFFFFFFFF)));\\n\\t\\t\\tint256 y = int256(int32(int256(uint256(position) >> 32)));\\n\\n\\t\\t\\tint8 enemyOrFriend;\\n\\t\\t\\tuint8 due;\\n\\t\\t\\t{\\n\\t\\t\\t\\tuint64 upPosition = uint64((uint256(y - 1) << 32) + uint256(x));\\n\\t\\t\\t\\t(enemyOrFriend, due) = _updateCell(upPosition, epoch, 2, oldColor, newColor);\\n\\t\\t\\t\\tif (enemyOrFriend < 0) {\\n\\t\\t\\t\\t\\tnewenemyMap = newenemyMap | 1;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnumDue += due;\\n\\t\\t\\t\\tif ((distribution >> 4) & 4 == 4) {\\n\\t\\t\\t\\t\\t// TODO?: if we decide to group owner in the cell struct, we should get the cell in memory in that function\\n\\t\\t\\t\\t\\townersToPay[0] = _ownerOf(upPosition);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnewDelta += enemyOrFriend;\\n\\t\\t\\t}\\n\\t\\t\\t{\\n\\t\\t\\t\\tuint64 leftPosition = uint64((uint256(y) << 32) + uint256(x - 1));\\n\\n\\t\\t\\t\\t(enemyOrFriend, due) = _updateCell(leftPosition, epoch, 3, oldColor, newColor);\\n\\t\\t\\t\\tif (enemyOrFriend < 0) {\\n\\t\\t\\t\\t\\tnewenemyMap = newenemyMap | 2;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnumDue += due;\\n\\t\\t\\t\\tif ((distribution >> 4) & 8 == 8) {\\n\\t\\t\\t\\t\\townersToPay[1] = _ownerOf(leftPosition);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnewDelta += enemyOrFriend;\\n\\t\\t\\t}\\n\\n\\t\\t\\t{\\n\\t\\t\\t\\tuint64 downPosition = uint64((uint256(y + 1) << 32) + uint256(x));\\n\\t\\t\\t\\t(enemyOrFriend, due) = _updateCell(downPosition, epoch, 0, oldColor, newColor);\\n\\t\\t\\t\\tif (enemyOrFriend < 0) {\\n\\t\\t\\t\\t\\tnewenemyMap = newenemyMap | 4;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnumDue += due;\\n\\t\\t\\t\\tif ((distribution >> 4) & 1 == 1) {\\n\\t\\t\\t\\t\\townersToPay[2] = _ownerOf(downPosition);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnewDelta += enemyOrFriend;\\n\\t\\t\\t}\\n\\t\\t\\t{\\n\\t\\t\\t\\tuint64 rightPosition = uint64((uint256(y) << 32) + uint256(x + 1));\\n\\t\\t\\t\\t(enemyOrFriend, due) = _updateCell(rightPosition, epoch, 1, oldColor, newColor);\\n\\t\\t\\t\\tif (enemyOrFriend < 0) {\\n\\t\\t\\t\\t\\tnewenemyMap = newenemyMap | 8;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnumDue += due;\\n\\t\\t\\t\\tif ((distribution >> 4) & 2 == 2) {\\n\\t\\t\\t\\t\\townersToPay[3] = _ownerOf(rightPosition);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnewDelta += enemyOrFriend;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t/// @dev This update the cell in storage\\n\\tfunction _updateCell(\\n\\t\\tuint64 position,\\n\\t\\tuint24 epoch,\\n\\t\\tuint8 neighbourIndex,\\n\\t\\tColor oldColor,\\n\\t\\tColor newColor\\n\\t) internal returns (int8 enemyOrFriend, uint8 due) {\\n\\t\\tCell memory cell = _cells[position];\\n\\n\\t\\tuint24 lastUpdate = cell.lastEpochUpdate;\\n\\t\\tColor color = cell.color;\\n\\t\\tif (color != Color.None) {\\n\\t\\t\\tenemyOrFriend = color == newColor ? int8(1) : int8(-1);\\n\\t\\t}\\n\\t\\tif (lastUpdate >= 1 && color != Color.None) {\\n\\t\\t\\t// we only consider cell with color that are not dead\\n\\t\\t\\tif (cell.life > 0 && lastUpdate < epoch) {\\n\\t\\t\\t\\t// of there is life to update we compute the new life\\n\\t\\t\\t\\t(uint8 newLife, uint24 epochUsed) = _computeNewLife(\\n\\t\\t\\t\\t\\tlastUpdate,\\n\\t\\t\\t\\t\\tcell.enemyMap,\\n\\t\\t\\t\\t\\tcell.delta,\\n\\t\\t\\t\\t\\tcell.life,\\n\\t\\t\\t\\t\\tepoch\\n\\t\\t\\t\\t);\\n\\t\\t\\t\\tdue = _updateCellFromNeighbor(position, cell, newLife, epochUsed, neighbourIndex, oldColor, newColor);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tdue = _updateCellFromNeighbor(position, cell, cell.life, epoch, neighbourIndex, oldColor, newColor);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tfunction _updateCellFromNeighbor(\\n\\t\\tuint64 position, // position of the cell to be updated\\n\\t\\tCell memory cell, // cell to be updated\\n\\t\\tuint8 newLife, // new life value for the celll\\n\\t\\tuint24 epoch, // epoch at which the update occured (epochUsed TODO: confirm its use)\\n\\t\\tuint8 neighbourIndex, // the neighbor triggering the update and for which we return whether it should receive its due\\n\\t\\tColor oldColor, // old color of that neighbor\\n\\t\\tColor newColor // new color of that neighbor\\n\\t) internal returns (uint8 due) {\\n\\t\\tif (cell.life > 0 && newLife == 0) {\\n\\t\\t\\t// we just died, we establish the distributionMap and counts\\n\\t\\t\\tcell.distribution = (cell.enemyMap << 4) + _countBits(cell.enemyMap);\\n\\t\\t}\\n\\n\\t\\tlogger.logCell(\\n\\t\\t\\t0,\\n\\t\\t\\tstring.concat('_updateCellFromNeighbor index', Strings.toString(neighbourIndex)),\\n\\t\\t\\tposition,\\n\\t\\t\\tcell,\\n\\t\\t\\taddress(uint160(_owners[position]))\\n\\t\\t);\\n\\n\\t\\tif ((cell.distribution >> 4) & (2 ** neighbourIndex) == 2 ** neighbourIndex) {\\n\\t\\t\\tdue = 12 / (cell.distribution & 0x0f);\\n\\t\\t\\tcell.distribution =\\n\\t\\t\\t\\t(uint8(uint256(cell.distribution >> 4) & (~(2 ** uint256(neighbourIndex)))) << 4) +\\n\\t\\t\\t\\t(cell.distribution & 0x0f);\\n\\t\\t}\\n\\n\\t\\tif (oldColor != newColor) {\\n\\t\\t\\tif (newColor == Color.None) {\\n\\t\\t\\t\\tif (cell.color == oldColor) {\\n\\t\\t\\t\\t\\tcell.delta -= 1;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tcell.delta += 1;\\n\\t\\t\\t\\t\\tcell.enemyMap = cell.enemyMap & uint8((1 << neighbourIndex) ^ 0xFF);\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else if (cell.color == oldColor) {\\n\\t\\t\\t\\t// then newColor is different (see assert above)\\n\\t\\t\\t\\tcell.enemyMap = cell.enemyMap | uint8(1 << neighbourIndex);\\n\\t\\t\\t\\tcell.delta -= 2;\\n\\t\\t\\t} else if (cell.color == newColor) {\\n\\t\\t\\t\\t// then old color was different\\n\\t\\t\\t\\tcell.delta += (oldColor == Color.None ? int8(1) : int8(2));\\n\\t\\t\\t\\tcell.enemyMap = cell.enemyMap & uint8((1 << neighbourIndex) ^ 0xFF);\\n\\t\\t\\t} else if (oldColor == Color.None) {\\n\\t\\t\\t\\t// if there were no oldCOlor and the newColor is not your (already checked in previous if clause)\\n\\t\\t\\t\\tcell.delta -= 1;\\n\\t\\t\\t\\tcell.enemyMap = cell.enemyMap | uint8(1 << neighbourIndex);\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tcell.lastEpochUpdate = epoch;\\n\\t\\tcell.life = newLife;\\n\\n\\t\\tlogger.logCell(\\n\\t\\t\\t0,\\n\\t\\t\\tstring.concat('AFTER _updateCellFromNeighbor index', Strings.toString(neighbourIndex)),\\n\\t\\t\\tposition,\\n\\t\\t\\tcell,\\n\\t\\t\\taddress(uint160(_owners[position]))\\n\\t\\t);\\n\\n\\t\\t_cells[position] = cell;\\n\\t}\\n}\\n\",\"keccak256\":\"0xb3431344216d678974e84e5870b55f021059015b8add0dba32848686e8371dd2\",\"license\":\"AGPL-3.0\"},\"src/game/internal/UsingStratagemsState.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nimport './UsingStratagemsStore.sol';\\nimport '../interface/UsingStratagemsEvents.sol';\\nimport '../interface/UsingStratagemsErrors.sol';\\nimport './UsingVirtualTime.sol';\\n\\n// TODO use hardhat-preprocessor\\nimport 'hardhat/console.sol';\\nimport '@openzeppelin/contracts/utils/Strings.sol';\\n\\nlibrary logger {\\n\\taddress constant CONSOLE_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67;\\n\\n\\tfunction _sendLogPayload(bytes memory payload) private view {\\n\\t\\taddress consoleAddress = CONSOLE_ADDRESS;\\n\\t\\t/// @solidity memory-safe-assembly\\n\\t\\tassembly {\\n\\t\\t\\tpop(staticcall(gas(), consoleAddress, add(payload, 32), mload(payload), 0, 0))\\n\\t\\t}\\n\\t}\\n\\n\\t// _sendLogPayload(abi.encodeWithSignature('log(string,int256,int256)', 'cell %s', x, y));\\n\\n\\tfunction logCell(\\n\\t\\tuint8 ii,\\n\\t\\tstring memory title,\\n\\t\\tuint64 id,\\n\\t\\tUsingStratagemsTypes.Cell memory cell,\\n\\t\\taddress owner\\n\\t) internal view {\\n\\t\\t// string memory indent = ii == 0 ? '' : ii == 1 ? ' ' : ii == 2 ? ' ' : ' ';\\n\\t\\t// // string memory indent = '';\\n\\t\\t// console.log('%s%s', indent, title);\\n\\t\\t// int256 x = int256(int32(int256(uint256(id) & 0xFFFFFFFF)));\\n\\t\\t// int256 y = int256(int32(int256(uint256(id) >> 32)));\\n\\t\\t// console.log('%s-------------------------------------------------------------', indent);\\n\\t\\t// console.log('%scell (%s,%s)', indent, Strings.toString(x), Strings.toString(y));\\n\\t\\t// console.log('%s-------------------------------------------------------------', indent);\\n\\t\\t// console.log('%s - lastEpochUpdate: %s', indent, cell.lastEpochUpdate);\\n\\t\\t// console.log('%s - epochWhenTokenIsAdded: %s', indent, cell.epochWhenTokenIsAdded);\\n\\t\\t// console.log('%s - color: %s', indent, uint8(cell.color));\\n\\t\\t// console.log('%s - life: %s', indent, cell.life);\\n\\t\\t// console.log('%s - distribution: %s', indent, cell.distribution);\\n\\t\\t// console.log('%s - owner: %s', indent, owner);\\n\\t\\t// console.log('%s - delta: %s', indent, Strings.toString(cell.delta));\\n\\t\\t// console.log('%s - enemyMap: %s', indent, cell.enemyMap);\\n\\t\\t// console.log('%s-------------------------------------------------------------', indent);\\n\\t}\\n\\n\\tfunction logTransfers(\\n\\t\\tuint8 ii,\\n\\t\\tstring memory title,\\n\\t\\tUsingStratagemsTypes.TokenTransferCollection memory transferCollection\\n\\t) internal pure {\\n\\t\\t// string memory indent = ii == 0 ? '' : ii == 1 ? ' ' : ii == 2 ? ' ' : ' ';\\n\\t\\t// // string memory indent = '';\\n\\t\\t// console.log('%s%s', indent, title);\\n\\t\\t// console.log('%s-------------------------------------------------------------', indent);\\n\\t\\t// for (uint256 i = 0; i < transferCollection.numTransfers; i++) {\\n\\t\\t// \\tconsole.log(\\n\\t\\t// \\t\\t'%stransfer (%s,%s)',\\n\\t\\t// \\t\\tindent,\\n\\t\\t// \\t\\ttransferCollection.transfers[i].to,\\n\\t\\t// \\t\\tStrings.toString(transferCollection.transfers[i].amount)\\n\\t\\t// \\t);\\n\\t\\t// }\\n\\t\\t// console.log('%s-------------------------------------------------------------', indent);\\n\\t}\\n}\\n\\nabstract contract UsingStratagemsState is\\n\\tUsingStratagemsStore,\\n\\tUsingStratagemsEvents,\\n\\tUsingStratagemsErrors,\\n\\tUsingVirtualTime\\n{\\n\\t/// @notice The token used for the game. Each gems on the board contains that token\\n\\tIERC20WithIERC2612 internal immutable TOKENS;\\n\\t/// @notice the timestamp (in seconds) at which the game start, it start in the commit phase\\n\\tuint256 internal immutable START_TIME;\\n\\t/// @notice the duration of the commit phase in seconds\\n\\tuint256 internal immutable COMMIT_PHASE_DURATION;\\n\\t/// @notice the duration of the resolution phase in seconds\\n\\tuint256 internal immutable RESOLUTION_PHASE_DURATION;\\n\\t/// @notice the max number of level a cell can reach in the game\\n\\tuint8 internal immutable MAX_LIFE;\\n\\t/// @notice the number of tokens underlying each gems on the board.\\n\\tuint256 internal immutable NUM_TOKENS_PER_GEMS;\\n\\t/// @notice the address to send the token to when burning\\n\\taddress payable internal immutable BURN_ADDRESS;\\n\\n\\t/// @notice the number of moves a hash represent, after that players make use of furtherMoves\\n\\tuint8 internal constant MAX_NUM_MOVES_PER_HASH = 32;\\n\\n\\t/// @notice Create an instance of a Stratagems game\\n\\t/// @param config configuration options for the game\\n\\tconstructor(Config memory config) {\\n\\t\\tTOKENS = config.tokens;\\n\\t\\tBURN_ADDRESS = config.burnAddress;\\n\\t\\tSTART_TIME = config.startTime;\\n\\t\\tCOMMIT_PHASE_DURATION = config.commitPhaseDuration;\\n\\t\\tRESOLUTION_PHASE_DURATION = config.resolutionPhaseDuration;\\n\\t\\tMAX_LIFE = config.maxLife;\\n\\t\\tNUM_TOKENS_PER_GEMS = config.numTokensPerGems;\\n\\t}\\n\\n\\tfunction _epoch() internal view virtual returns (uint24 epoch, bool commiting) {\\n\\t\\tuint256 epochDuration = COMMIT_PHASE_DURATION + RESOLUTION_PHASE_DURATION;\\n\\t\\tuint256 time = _timestamp();\\n\\t\\tif (time < START_TIME) {\\n\\t\\t\\trevert GameNotStarted();\\n\\t\\t}\\n\\t\\tuint256 timePassed = time - START_TIME;\\n\\t\\tepoch = uint24(timePassed / epochDuration + 2); // epoch start at 2, this make the hypothetical previous resolution phase's epoch to be 1\\n\\t\\tcommiting = timePassed - ((epoch - 2) * epochDuration) < COMMIT_PHASE_DURATION;\\n\\t}\\n\\n\\tfunction _computeNewLife(\\n\\t\\tuint24 lastUpdate,\\n\\t\\tuint8 enemyMap,\\n\\t\\tint8 delta,\\n\\t\\tuint8 life,\\n\\t\\tuint24 epoch\\n\\t) internal view returns (uint8 newLife, uint24 epochUsed) {\\n\\t\\tepochUsed = lastUpdate;\\n\\t\\tif (lastUpdate >= 1 && life > 0) {\\n\\t\\t\\tuint256 epochDelta = epoch - lastUpdate;\\n\\t\\t\\tif (epochDelta > 0) {\\n\\t\\t\\t\\tint8 effectiveDelta = delta != 0 ? delta : -1;\\n\\t\\t\\t\\tif (effectiveDelta < 0 && enemyMap == 0) {\\n\\t\\t\\t\\t\\teffectiveDelta = 0;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif (effectiveDelta > 0) {\\n\\t\\t\\t\\t\\tif (life < MAX_LIFE) {\\n\\t\\t\\t\\t\\t\\tuint8 maxEpoch = ((MAX_LIFE - life) + uint8(effectiveDelta) - 1) / uint8(effectiveDelta);\\n\\t\\t\\t\\t\\t\\tif (epochDelta > maxEpoch) {\\n\\t\\t\\t\\t\\t\\t\\tepochDelta = maxEpoch;\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\tlife += uint8(epochDelta) * uint8(effectiveDelta);\\n\\t\\t\\t\\t\\t\\tif (life > MAX_LIFE) {\\n\\t\\t\\t\\t\\t\\t\\tlife = MAX_LIFE;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tnewLife = life;\\n\\t\\t\\t\\t\\t\\tepochUsed = lastUpdate + uint24(epochDelta);\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tnewLife = life;\\n\\t\\t\\t\\t\\t\\tepochUsed = lastUpdate;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} else if (effectiveDelta < 0) {\\n\\t\\t\\t\\t\\tuint8 numEpochBeforeDying = (life + uint8(-effectiveDelta) - 1) / uint8(-effectiveDelta);\\n\\t\\t\\t\\t\\tif (epochDelta > numEpochBeforeDying) {\\n\\t\\t\\t\\t\\t\\tepochDelta = numEpochBeforeDying;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tuint8 lifeLoss = uint8(epochDelta) * uint8(-effectiveDelta);\\n\\t\\t\\t\\t\\tif (lifeLoss > life) {\\n\\t\\t\\t\\t\\t\\tnewLife = 0;\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tnewLife = life - lifeLoss;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tepochUsed = lastUpdate + uint24(epochDelta);\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tnewLife = life;\\n\\t\\t\\t\\t\\tepochUsed = epoch;\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tnewLife = life;\\n\\t\\t\\t\\tepochUsed = lastUpdate;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tfunction _getUpdatedCell(uint64 position, uint24 epoch) internal view returns (Cell memory updatedCell) {\\n\\t\\t// load from state\\n\\t\\tupdatedCell = _cells[position];\\n\\t\\tuint24 lastUpdate = updatedCell.lastEpochUpdate;\\n\\t\\tint8 delta = updatedCell.delta;\\n\\t\\tuint8 life = updatedCell.life;\\n\\t\\t// logger.logCell(0, 'before update', position, updatedCell, address(uint160(_owners[position])));\\n\\t\\tif (lastUpdate >= 1 && life > 0) {\\n\\t\\t\\t(uint8 newLife, uint24 epochUsed) = _computeNewLife(lastUpdate, updatedCell.enemyMap, delta, life, epoch);\\n\\t\\t\\tupdatedCell.life = newLife;\\n\\t\\t\\tupdatedCell.lastEpochUpdate = epochUsed; // TODO check if this is useful to cap it to epoch where it died\\n\\t\\t}\\n\\t}\\n\\n\\t/// @dev Get the owner of a token.\\n\\t/// @param tokenID The token to query.\\n\\tfunction _ownerOf(uint256 tokenID) internal view virtual returns (address owner) {\\n\\t\\towner = address(uint160(_owners[tokenID]));\\n\\t}\\n}\\n\",\"keccak256\":\"0x93630a64cfb85f8cab1d9971293bf41718c3f6457cd2de39c68bead638803f85\",\"license\":\"AGPL-3.0\"},\"src/game/internal/UsingStratagemsStore.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nimport '../interface/UsingStratagemsTypes.sol';\\n\\ncontract UsingStratagemsStore is UsingStratagemsTypes {\\n\\tmapping(uint256 => Cell) internal _cells;\\n\\tmapping(uint256 => uint256) internal _owners; //owner + approval + ... erc721\\n\\n\\tmapping(address => uint256) internal _tokensInReserve;\\n\\tmapping(address => Commitment) internal _commitments;\\n\\n\\t// Operators (also used by ERC721)\\n\\tmapping(address => mapping(address => bool)) internal _operatorsForAll;\\n\\tmapping(uint256 => address) internal _operators;\\n\\n\\t// ERC721 balanceOf\\n\\t// mapping(address => uint256) internal _balances;\\n}\\n\",\"keccak256\":\"0x67d22bbc7eb4513799c8038a35e581d90ee2cb213051850ebd59f4e78cc44a2d\",\"license\":\"AGPL-3.0\"},\"src/game/internal/UsingStratagemsUtils.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nimport '../interface/UsingStratagemsTypes.sol';\\nimport '../interface/UsingStratagemsErrors.sol';\\n\\nabstract contract UsingStratagemsUtils is UsingStratagemsTypes, UsingStratagemsErrors {\\n\\tfunction _checkHash(\\n\\t\\tbytes24 commitmentHash,\\n\\t\\tbytes32 secret,\\n\\t\\tMove[] memory moves,\\n\\t\\tbytes24 furtherMoves\\n\\t) internal pure {\\n\\t\\tif (furtherMoves != bytes24(0)) {\\n\\t\\t\\tbytes24 computedHash = bytes24(keccak256(abi.encode(secret, moves, furtherMoves)));\\n\\t\\t\\tif (commitmentHash != computedHash) {\\n\\t\\t\\t\\trevert CommitmentHashNotMatching();\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\tbytes24 computedHash = bytes24(keccak256(abi.encode(secret, moves)));\\n\\t\\t\\tif (commitmentHash != computedHash) {\\n\\t\\t\\t\\trevert CommitmentHashNotMatching();\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tfunction _collectTransfer(\\n\\t\\tTokenTransferCollection memory transferCollection,\\n\\t\\tTokenTransfer memory newTransfer\\n\\t) internal pure {\\n\\t\\t// we look for the newTransfer address in case it is already present\\n\\t\\tfor (uint256 k = 0; k < transferCollection.numTransfers; k++) {\\n\\t\\t\\tif (transferCollection.transfers[k].to == newTransfer.to) {\\n\\t\\t\\t\\t// if we found we add the amount\\n\\t\\t\\t\\ttransferCollection.transfers[k].amount += newTransfer.amount;\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t// if we did not find that address we add it to the end\\n\\t\\ttransferCollection.transfers[transferCollection.numTransfers].to = newTransfer.to;\\n\\t\\ttransferCollection.transfers[transferCollection.numTransfers].amount = newTransfer.amount;\\n\\t\\t// and increase the size to lookup for next time\\n\\t\\ttransferCollection.numTransfers++;\\n\\t}\\n\\n\\tfunction _multiTransfer(IERC20WithIERC2612 token, TokenTransferCollection memory transferCollection) internal {\\n\\t\\tfor (uint256 i = 0; i < transferCollection.numTransfers; i++) {\\n\\t\\t\\ttoken.transfer(transferCollection.transfers[i].to, transferCollection.transfers[i].amount);\\n\\t\\t}\\n\\t}\\n}\\n\",\"keccak256\":\"0x20ffcba1168cd6bf7b408c0265c79c8b56f022d36068e8188833ec3d1a06831d\",\"license\":\"AGPL-3.0\"},\"src/game/internal/UsingVirtualTime.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nabstract contract UsingVirtualTime {\\n\\t// TODO use hardhat-preprocessor\\n\\n\\tfunction _timestamp() internal view returns (uint256) {\\n\\t\\tuint256 delta;\\n\\t\\tassembly {\\n\\t\\t\\t// keccak256(\\\"time\\\") - 1\\n\\t\\t\\tdelta := sload(0x112c413de07a110ce0a9ace0c01e41b5b59462770325b042f0dc72c337f55f2)\\n\\t\\t}\\n\\t\\treturn block.timestamp + delta;\\n\\t}\\n}\\n\",\"keccak256\":\"0x4eec90855ba4ef869425250bdd97a93693ee65d94d96697b953345cd08c51048\",\"license\":\"AGPL-3.0\"},\"src/game/routes/StratagemsGameplay.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nimport '../interface/IStratagems.sol';\\nimport '../internal/UsingStratagemsSetters.sol';\\nimport '../internal/UsingStratagemsUtils.sol';\\n\\ncontract StratagemsGameplay is IStratagemsGameplay, UsingStratagemsSetters {\\n\\tconstructor(Config memory config) UsingStratagemsSetters(config) {}\\n\\n\\t// --------------------------------------------------------------------------------------------\\n\\t// Getters\\n\\t// --------------------------------------------------------------------------------------------\\n\\n\\t/// @inheritdoc IStratagemsGameplay\\n\\tfunction getCell(uint256 id) external view returns (FullCell memory) {\\n\\t\\t(uint24 epoch, ) = _epoch();\\n\\t\\t// console.log('epoch %s', epoch);\\n\\t\\tCell memory updatedCell = _getUpdatedCell(uint64(id), epoch);\\n\\t\\treturn\\n\\t\\t\\tFullCell({\\n\\t\\t\\t\\towner: _ownerOf(id),\\n\\t\\t\\t\\tlastEpochUpdate: updatedCell.lastEpochUpdate,\\n\\t\\t\\t\\tepochWhenTokenIsAdded: updatedCell.epochWhenTokenIsAdded,\\n\\t\\t\\t\\tcolor: updatedCell.color,\\n\\t\\t\\t\\tlife: updatedCell.life,\\n\\t\\t\\t\\tdelta: updatedCell.delta,\\n\\t\\t\\t\\tenemyMap: updatedCell.enemyMap,\\n\\t\\t\\t\\tdistribution: updatedCell.distribution\\n\\t\\t\\t});\\n\\t}\\n\\n\\t/// @inheritdoc IStratagemsGameplay\\n\\tfunction getCells(uint256[] memory ids) external view returns (FullCell[] memory cells) {\\n\\t\\t(uint24 epoch, ) = _epoch();\\n\\t\\tuint256 numCells = ids.length;\\n\\t\\tcells = new FullCell[](numCells);\\n\\t\\tfor (uint256 i = 0; i < numCells; i++) {\\n\\t\\t\\tCell memory updatedCell = _getUpdatedCell(uint64(ids[i]), epoch);\\n\\t\\t\\tcells[i] = FullCell({\\n\\t\\t\\t\\towner: _ownerOf(ids[i]),\\n\\t\\t\\t\\tlastEpochUpdate: updatedCell.lastEpochUpdate,\\n\\t\\t\\t\\tepochWhenTokenIsAdded: updatedCell.epochWhenTokenIsAdded,\\n\\t\\t\\t\\tcolor: updatedCell.color,\\n\\t\\t\\t\\tlife: updatedCell.life,\\n\\t\\t\\t\\tdelta: updatedCell.delta,\\n\\t\\t\\t\\tenemyMap: updatedCell.enemyMap,\\n\\t\\t\\t\\tdistribution: updatedCell.distribution\\n\\t\\t\\t});\\n\\t\\t}\\n\\t}\\n\\n\\t/// @inheritdoc IStratagemsGameplay\\n\\tfunction getTokensInReserve(address account) external view returns (uint256 amount) {\\n\\t\\treturn _tokensInReserve[account];\\n\\t}\\n\\n\\t/// @inheritdoc IStratagemsGameplay\\n\\tfunction getCommitment(address account) external view returns (Commitment memory commitment) {\\n\\t\\treturn _commitments[account];\\n\\t}\\n\\n\\t/// @inheritdoc IStratagemsGameplay\\n\\tfunction getConfig() external view returns (Config memory config) {\\n\\t\\tconfig.tokens = TOKENS;\\n\\t\\tconfig.burnAddress = BURN_ADDRESS;\\n\\t\\tconfig.startTime = START_TIME;\\n\\t\\tconfig.commitPhaseDuration = COMMIT_PHASE_DURATION;\\n\\t\\tconfig.resolutionPhaseDuration = RESOLUTION_PHASE_DURATION;\\n\\t\\tconfig.maxLife = MAX_LIFE;\\n\\t\\tconfig.numTokensPerGems = NUM_TOKENS_PER_GEMS;\\n\\t}\\n\\n\\t// --------------------------------------------------------------------------------------------\\n\\t// Setters\\n\\t// --------------------------------------------------------------------------------------------\\n\\n\\t/// @inheritdoc IStratagemsGameplay\\n\\tfunction addToReserve(uint256 tokensAmountToAdd, Permit calldata permit) external {\\n\\t\\tif (tokensAmountToAdd > 0) {\\n\\t\\t\\tuint256 newAmount = _tokensInReserve[msg.sender];\\n\\t\\t\\tnewAmount += tokensAmountToAdd;\\n\\t\\t\\t_tokensInReserve[msg.sender] = newAmount;\\n\\n\\t\\t\\tif (permit.value > 0) {\\n\\t\\t\\t\\tTOKENS.permit(msg.sender, address(this), permit.value, permit.deadline, permit.v, permit.r, permit.s);\\n\\t\\t\\t}\\n\\t\\t\\tTOKENS.transferFrom(msg.sender, address(this), tokensAmountToAdd);\\n\\t\\t\\temit ReserveDeposited(msg.sender, tokensAmountToAdd, newAmount);\\n\\t\\t}\\n\\t}\\n\\n\\t/// @inheritdoc IStratagemsGameplay\\n\\tfunction makeCommitment(bytes24 commitmentHash) external {\\n\\t\\t_makeCommitment(msg.sender, commitmentHash, _tokensInReserve[msg.sender]);\\n\\t}\\n\\n\\t/// @inheritdoc IStratagemsGameplay\\n\\tfunction makeCommitmentWithExtraReserve(\\n\\t\\tbytes24 commitmentHash,\\n\\t\\tuint256 tokensAmountToAdd,\\n\\t\\tPermit calldata permit\\n\\t) external {\\n\\t\\tuint256 inReserve = _tokensInReserve[msg.sender];\\n\\t\\tinReserve += tokensAmountToAdd;\\n\\t\\t_tokensInReserve[msg.sender] = inReserve;\\n\\n\\t\\t_makeCommitment(msg.sender, commitmentHash, inReserve);\\n\\n\\t\\t// bytes32 PERMIT_TYPEHASH = keccak256(\\n\\t\\t// \\t'Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)'\\n\\t\\t// );\\n\\t\\t// bytes32 digest = keccak256(\\n\\t\\t// \\tabi.encodePacked(\\n\\t\\t// \\t\\t'\\\\x19\\\\x01',\\n\\t\\t// \\t\\tTOKENS.DOMAIN_SEPARATOR(),\\n\\t\\t// \\t\\tkeccak256(abi.encode(PERMIT_TYPEHASH, msg.sender, address(this), permit.value, 0, 0))\\n\\t\\t// \\t)\\n\\t\\t// );\\n\\n\\t\\tif (permit.value > 0) {\\n\\t\\t\\tTOKENS.permit(msg.sender, address(this), permit.value, permit.deadline, permit.v, permit.r, permit.s);\\n\\t\\t}\\n\\n\\t\\tif (tokensAmountToAdd > 0) {\\n\\t\\t\\tTOKENS.transferFrom(msg.sender, address(this), tokensAmountToAdd);\\n\\t\\t\\temit ReserveDeposited(msg.sender, tokensAmountToAdd, inReserve);\\n\\t\\t}\\n\\t}\\n\\n\\t/// @inheritdoc IStratagemsGameplay\\n\\tfunction cancelCommitment() external {\\n\\t\\tCommitment storage commitment = _commitments[msg.sender];\\n\\t\\t(uint24 epoch, bool commiting) = _epoch();\\n\\t\\tif (!commiting) {\\n\\t\\t\\trevert InResolutionPhase();\\n\\t\\t}\\n\\t\\tif (commitment.epoch != epoch) {\\n\\t\\t\\trevert PreviousCommitmentNotResolved();\\n\\t\\t}\\n\\n\\t\\t// Note that we do not reset the hash\\n\\t\\t// This ensure the slot do not get reset and keep the gas cost consistent across execution\\n\\t\\tcommitment.epoch = 0;\\n\\n\\t\\temit CommitmentCancelled(msg.sender, epoch);\\n\\t}\\n\\n\\t/// @inheritdoc IStratagemsGameplay\\n\\tfunction withdrawFromReserve(uint256 amount) external {\\n\\t\\tCommitment storage commitment = _commitments[msg.sender];\\n\\n\\t\\t(uint24 epoch, bool commiting) = _epoch();\\n\\n\\t\\tif (commitment.epoch != 0 && (!commiting || commitment.epoch != epoch)) {\\n\\t\\t\\trevert PreviousCommitmentNotResolved();\\n\\t\\t}\\n\\n\\t\\tuint256 inReserve = _tokensInReserve[msg.sender];\\n\\t\\tif (amount == type(uint256).max) {\\n\\t\\t\\tamount = inReserve;\\n\\t\\t\\tinReserve = 0;\\n\\t\\t} else {\\n\\t\\t\\tif (inReserve < amount) {\\n\\t\\t\\t\\trevert ReserveTooLow(inReserve, amount);\\n\\t\\t\\t}\\n\\t\\t\\tinReserve -= amount;\\n\\t\\t}\\n\\t\\t_tokensInReserve[msg.sender] = inReserve;\\n\\t\\tTOKENS.transfer(msg.sender, amount);\\n\\t\\temit ReserveWithdrawn(msg.sender, amount, inReserve);\\n\\t}\\n\\n\\t/// @inheritdoc IStratagemsGameplay\\n\\tfunction resolve(\\n\\t\\taddress player,\\n\\t\\tbytes32 secret,\\n\\t\\tMove[] calldata moves,\\n\\t\\tbytes24 furtherMoves,\\n\\t\\tbool useReserve\\n\\t) external {\\n\\t\\tCommitment storage commitment = _commitments[player];\\n\\t\\t(uint24 epoch, bool commiting) = _epoch();\\n\\n\\t\\tif (commiting) {\\n\\t\\t\\trevert InCommitmentPhase();\\n\\t\\t}\\n\\t\\tif (commitment.epoch == 0) {\\n\\t\\t\\trevert NothingToResolve();\\n\\t\\t}\\n\\t\\tif (commitment.epoch != epoch) {\\n\\t\\t\\trevert InvalidEpoch();\\n\\t\\t}\\n\\n\\t\\t_checkHash(commitment.hash, secret, moves, furtherMoves);\\n\\n\\t\\tuint256 newReserveAmount = _resolveMoves(player, epoch, moves, useReserve ? address(0) : player);\\n\\n\\t\\tbytes24 hashResolved = commitment.hash;\\n\\t\\tif (furtherMoves != bytes24(0)) {\\n\\t\\t\\tif (moves.length != MAX_NUM_MOVES_PER_HASH) {\\n\\t\\t\\t\\trevert InvalidFurtherMoves();\\n\\t\\t\\t}\\n\\t\\t\\tcommitment.hash = furtherMoves;\\n\\t\\t} else {\\n\\t\\t\\tcommitment.epoch = 0; // used\\n\\t\\t}\\n\\n\\t\\temit CommitmentResolved(player, epoch, hashResolved, moves, furtherMoves, newReserveAmount);\\n\\t}\\n\\n\\t/// @inheritdoc IStratagemsGameplay\\n\\tfunction acknowledgeMissedResolution(\\n\\t\\taddress player,\\n\\t\\tbytes32 secret,\\n\\t\\tMove[] calldata moves,\\n\\t\\tbytes24 furtherMoves\\n\\t) external {\\n\\t\\tCommitment storage commitment = _commitments[player];\\n\\t\\t(uint24 epoch, ) = _epoch();\\n\\t\\tif (commitment.epoch == 0 || commitment.epoch == epoch) {\\n\\t\\t\\trevert CanStillResolve();\\n\\t\\t}\\n\\n\\t\\tuint256 numMoves = moves.length;\\n\\n\\t\\t_checkHash(commitment.hash, secret, moves, furtherMoves);\\n\\n\\t\\tif (furtherMoves != bytes24(0)) {\\n\\t\\t\\tif (numMoves != MAX_NUM_MOVES_PER_HASH) {\\n\\t\\t\\t\\trevert InvalidFurtherMoves();\\n\\t\\t\\t}\\n\\t\\t\\tcommitment.hash = furtherMoves;\\n\\t\\t} else {\\n\\t\\t\\tcommitment.epoch = 0; // used\\n\\t\\t}\\n\\n\\t\\tuint256 amount = moves.length;\\n\\t\\t_tokensInReserve[msg.sender] -= amount;\\n\\t\\tTOKENS.transfer(BURN_ADDRESS, amount);\\n\\t\\temit CommitmentVoid(player, epoch, amount, furtherMoves);\\n\\t}\\n\\n\\t/// @inheritdoc IStratagemsGameplay\\n\\tfunction acknowledgeMissedResolutionByBurningAllReserve() external {\\n\\t\\tCommitment storage commitment = _commitments[msg.sender];\\n\\t\\t(uint24 epoch, ) = _epoch();\\n\\n\\t\\tif (commitment.epoch == 0) {\\n\\t\\t\\trevert NothingToResolve();\\n\\t\\t}\\n\\n\\t\\tif (commitment.epoch == epoch) {\\n\\t\\t\\trevert CanStillResolve();\\n\\t\\t}\\n\\n\\t\\tcommitment.epoch = 0;\\n\\t\\tuint256 amount = _tokensInReserve[msg.sender];\\n\\t\\t_tokensInReserve[msg.sender] = 0;\\n\\t\\tTOKENS.transfer(BURN_ADDRESS, amount);\\n\\n\\t\\t// here we cannot know whether there were further move or even any moves\\n\\t\\t// we just burn all tokens in reserve\\n\\t\\temit CommitmentVoid(msg.sender, epoch, amount, bytes24(0));\\n\\t}\\n\\n\\t/// @inheritdoc IStratagemsGameplay\\n\\tfunction poke(uint64 position) external {\\n\\t\\t// max number of transfer is 5 (for each neighbour's potentially being a different account + own cell)\\n\\n\\t\\tTokenTransferCollection memory transferCollection = TokenTransferCollection({\\n\\t\\t\\ttransfers: new TokenTransfer[](5),\\n\\t\\t\\tnumTransfers: 0\\n\\t\\t});\\n\\t\\t_poke(transferCollection, position);\\n\\n\\t\\t_multiTransfer(TOKENS, transferCollection);\\n\\t\\t// TODO events?\\n\\t}\\n\\n\\t/// @inheritdoc IStratagemsGameplay\\n\\tfunction pokeMultiple(uint64[] calldata positions) external {\\n\\t\\tuint256 numCells = positions.length;\\n\\t\\t// max number of transfer is 4 * numCells (for each cell's neighbours potentially being a different account + own cell)\\n\\t\\tTokenTransferCollection memory transferCollection = TokenTransferCollection({\\n\\t\\t\\ttransfers: new TokenTransfer[](numCells * 5),\\n\\t\\t\\tnumTransfers: 0\\n\\t\\t});\\n\\t\\tfor (uint256 i = 0; i < numCells; i++) {\\n\\t\\t\\t_poke(transferCollection, positions[i]);\\n\\t\\t}\\n\\t\\t_multiTransfer(TOKENS, transferCollection);\\n\\t\\t// TODO events?\\n\\t}\\n}\\n\",\"keccak256\":\"0x5d7da7d710515748cc171467a95ddf0242895933ea06be492356ae50dfa43fac\",\"license\":\"AGPL-3.0\"}},\"version\":1}", + "storageLayout": { + "storage": [ + { + "astId": 12262, + "contract": "src/game/routes/StratagemsGameplay.sol:StratagemsGameplay", + "label": "_cells", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_uint256,t_struct(Cell)10007_storage)" + }, + { + "astId": 12266, + "contract": "src/game/routes/StratagemsGameplay.sol:StratagemsGameplay", + "label": "_owners", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_uint256,t_uint256)" + }, + { + "astId": 12270, + "contract": "src/game/routes/StratagemsGameplay.sol:StratagemsGameplay", + "label": "_tokensInReserve", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 12275, + "contract": "src/game/routes/StratagemsGameplay.sol:StratagemsGameplay", + "label": "_commitments", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Commitment)10012_storage)" + }, + { + "astId": 12281, + "contract": "src/game/routes/StratagemsGameplay.sol:StratagemsGameplay", + "label": "_operatorsForAll", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))" + }, + { + "astId": 12285, + "contract": "src/game/routes/StratagemsGameplay.sol:StratagemsGameplay", + "label": "_operators", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_uint256,t_address)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes24": { + "encoding": "inplace", + "label": "bytes24", + "numberOfBytes": "24" + }, + "t_enum(Color)9936": { + "encoding": "inplace", + "label": "enum UsingStratagemsTypes.Color", + "numberOfBytes": "1" + }, + "t_int8": { + "encoding": "inplace", + "label": "int8", + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_bool)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_address,t_mapping(t_address,t_bool))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => bool))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_bool)" + }, + "t_mapping(t_address,t_struct(Commitment)10012_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => struct UsingStratagemsTypes.Commitment)", + "numberOfBytes": "32", + "value": "t_struct(Commitment)10012_storage" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_mapping(t_uint256,t_address)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => address)", + "numberOfBytes": "32", + "value": "t_address" + }, + "t_mapping(t_uint256,t_struct(Cell)10007_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => struct UsingStratagemsTypes.Cell)", + "numberOfBytes": "32", + "value": "t_struct(Cell)10007_storage" + }, + "t_mapping(t_uint256,t_uint256)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_struct(Cell)10007_storage": { + "encoding": "inplace", + "label": "struct UsingStratagemsTypes.Cell", + "members": [ + { + "astId": 9993, + "contract": "src/game/routes/StratagemsGameplay.sol:StratagemsGameplay", + "label": "lastEpochUpdate", + "offset": 0, + "slot": "0", + "type": "t_uint24" + }, + { + "astId": 9995, + "contract": "src/game/routes/StratagemsGameplay.sol:StratagemsGameplay", + "label": "epochWhenTokenIsAdded", + "offset": 3, + "slot": "0", + "type": "t_uint24" + }, + { + "astId": 9998, + "contract": "src/game/routes/StratagemsGameplay.sol:StratagemsGameplay", + "label": "color", + "offset": 6, + "slot": "0", + "type": "t_enum(Color)9936" + }, + { + "astId": 10000, + "contract": "src/game/routes/StratagemsGameplay.sol:StratagemsGameplay", + "label": "life", + "offset": 7, + "slot": "0", + "type": "t_uint8" + }, + { + "astId": 10002, + "contract": "src/game/routes/StratagemsGameplay.sol:StratagemsGameplay", + "label": "delta", + "offset": 8, + "slot": "0", + "type": "t_int8" + }, + { + "astId": 10004, + "contract": "src/game/routes/StratagemsGameplay.sol:StratagemsGameplay", + "label": "enemyMap", + "offset": 9, + "slot": "0", + "type": "t_uint8" + }, + { + "astId": 10006, + "contract": "src/game/routes/StratagemsGameplay.sol:StratagemsGameplay", + "label": "distribution", + "offset": 10, + "slot": "0", + "type": "t_uint8" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Commitment)10012_storage": { + "encoding": "inplace", + "label": "struct UsingStratagemsTypes.Commitment", + "members": [ + { + "astId": 10009, + "contract": "src/game/routes/StratagemsGameplay.sol:StratagemsGameplay", + "label": "hash", + "offset": 0, + "slot": "0", + "type": "t_bytes24" + }, + { + "astId": 10011, + "contract": "src/game/routes/StratagemsGameplay.sol:StratagemsGameplay", + "label": "epoch", + "offset": 24, + "slot": "0", + "type": "t_uint24" + } + ], + "numberOfBytes": "32" + }, + "t_uint24": { + "encoding": "inplace", + "label": "uint24", + "numberOfBytes": "3" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "encoding": "inplace", + "label": "uint8", + "numberOfBytes": "1" + } + } + }, + "userdoc": { + "errors": { + "CanStillResolve()": [ + { + "notice": "Player have to resolve if they can Stratagems will prevent them from acknowledging missed resolution if there is still time to resolve." + } + ], + "CommitmentHashNotMatching()": [ + { + "notice": "Player have to reveal their commitment using the exact same move values If they provide different value, the commitment hash will differ and Stratagems will reject their resolution." + } + ], + "GameNotStarted()": [ + { + "notice": "Game has not started yet, can't perform any action" + } + ], + "InCommitmentPhase()": [ + { + "notice": "When in Commit phase, player can make new commitment but they cannot resolve their move yet." + } + ], + "InResolutionPhase()": [ + { + "notice": "When in Resolution phase, it is not possible to commit new moves or cancel previous commitment During Resolution phase, players have to reveal their commitment, if not already done." + } + ], + "InvalidEpoch()": [ + { + "notice": "Player can only resolve their move in the same epoch they commited.abi If a player resolve later it can only do to minimize the reserve burn cost by calling : `acknowledgeMissedResolution`" + } + ], + "InvalidFurtherMoves()": [ + { + "notice": "Player can make arbitrary number of moves per epoch. To do so they group moves into (MAX_NUM_MOVES_PER_HASH = 32) moves This result in a recursive series of hash that they can then submit in turn while resolving. The limit (MAX_NUM_MOVES_PER_HASH = 32) ensure a resolution batch fits in a block." + } + ], + "NothingToResolve()": [ + { + "notice": "Player can only resolve moves they commited." + } + ], + "PreviousCommitmentNotResolved()": [ + { + "notice": "Previous commitment need to be resolved before making a new one. Even if the corresponding reveal phase has passed.\\ It is also not possible to withdraw any amount from reserve until the commitment is revealed.\\If player lost the information to reveal, it can acknowledge failure which will burn all its reserve.\\" + } + ], + "ReserveTooLow(uint256,uint256)": [ + { + "notice": "to make a commitment you always need at least one `config.numTokensPerGems` amount in reserve Player also need one `config.numTokensPerGems` per moves during the resolution phase." + } + ] + }, + "events": { + "CommitmentCancelled(address,uint24)": { + "notice": "A player has cancelled its current commitment (before it reached the resolution phase)" + }, + "CommitmentMade(address,uint24,bytes24)": { + "notice": "A player has commited to make a move and resolve it on the resolution phase" + }, + "CommitmentResolved(address,uint24,bytes24,(uint64,uint8)[],bytes24,uint256)": { + "notice": "Player has resolved its previous commitment" + }, + "CommitmentVoid(address,uint24,uint256,bytes24)": { + "notice": "A player has canceled a previous commitment by burning some tokens" + }, + "MoveProcessed(uint64,address,uint8,uint8)": { + "notice": "A move has been resolved." + }, + "ReserveDeposited(address,uint256,uint256)": { + "notice": "Player has deposited token in the reserve, allowing it to use that much in game" + }, + "ReserveWithdrawn(address,uint256,uint256)": { + "notice": "Player have withdrawn token from the reserve" + } + }, + "kind": "user", + "methods": { + "acknowledgeMissedResolution(address,bytes32,(uint64,uint8)[],bytes24)": { + "notice": "called by player if they missed the resolution phase and want to minimze the token loss. By providing the moves, they will be slashed only the amount of token required to make the moves" + }, + "acknowledgeMissedResolutionByBurningAllReserve()": { + "notice": "should only be called as last resort this will burn all tokens in reserve If player has access to the secret, better call `acknowledgeMissedResolution`" + }, + "addToReserve(uint256,(uint256,uint256,uint8,bytes32,bytes32))": { + "notice": "called by players to add tokens to their reserve" + }, + "cancelCommitment()": { + "notice": "called by players to cancel their current commitment Can only be called during the commit phase in which the commitment was made It cannot be called afterward" + }, + "getCell(uint256)": { + "notice": "return updated cell (based on current epoch)" + }, + "getCells(uint256[])": { + "notice": "return the list of updated cells (based on current epoch) whose ids is given" + }, + "getCommitment(address)": { + "notice": "The commitment to be resolved. zeroed if no commitment need to be made." + }, + "getConfig()": { + "notice": "return the config used to initialise the Game" + }, + "getTokensInReserve(address)": { + "notice": "the number of token in reserve per account This is used to slash player who do not resolve their commit The amount can be greater than the number of token required for the next move This allow player to potentially hide their intention." + }, + "makeCommitment(bytes24)": { + "notice": "called by players to commit their moves this can be called multiple time in the same epoch, the last call overriding the previous. When a commitment is made, it needs to be resolved in the resolution phase of the same epoch.abi If missed, player can still reveal its moves but none of them will be resolved. The player would lose its associated reserved amount." + }, + "makeCommitmentWithExtraReserve(bytes24,uint256,(uint256,uint256,uint8,bytes32,bytes32))": { + "notice": "called to make a commitment along with tokens to add to the reserve" + }, + "pokeMultiple(uint64[])": { + "notice": "poke and collect the tokens won across multiple cells" + }, + "resolve(address,bytes32,(uint64,uint8)[],bytes24,bool)": { + "notice": "called by player to resolve their commitment this is where the core logic of the game takes place This is where the game board evolves The game is designed so that resolution order do not matter" + }, + "withdrawFromReserve(uint256)": { + "notice": "called by players to withdraw tokens from the reserve can only be called if no commitments are pending Note that while you can withdraw after commiting, note that if you do not have enough tokens you'll have your commitment failing." + } + }, + "version": 1 + }, + "argsData": "0x0000000000000000000000004c78783faac7636c0d55605ae5bd1d6b9a62f496000000000000000000000000deaddeaddeaddeaddeaddeaddeaddeaddeaddead000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000143700000000000000000000000000000000000000000000000000000000000000e1000000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000de0b6b3a7640000", + "transaction": { + "hash": "0x459cbd5c3d934803951a4c092cf9c9839b38ba9c5d409e0ca0fc88580b08389c", + "nonce": "0x88", + "origin": "0x61c461ecc993aadeb7e4b47e96d1b8cc37314b20" + } +} \ No newline at end of file diff --git a/contracts/deployments/sepolia/Stratagems_Implementation_Router_Debug_Route.json b/contracts/deployments/sepolia/Stratagems_Implementation_Router_Debug_Route.json new file mode 100644 index 00000000..09300d46 --- /dev/null +++ b/contracts/deployments/sepolia/Stratagems_Implementation_Router_Debug_Route.json @@ -0,0 +1,1092 @@ +{ + "address": "0xd51b777835d43a660e080ffd46ff3ad5ebd47d55", + "abi": [ + { + "inputs": [ + { + "components": [ + { + "internalType": "contract IERC20WithIERC2612", + "name": "tokens", + "type": "address" + }, + { + "internalType": "address payable", + "name": "burnAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "commitPhaseDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "resolutionPhaseDuration", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "maxLife", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "numTokensPerGems", + "type": "uint256" + } + ], + "internalType": "struct UsingStratagemsTypes.Config", + "name": "config", + "type": "tuple" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "CanStillResolve", + "type": "error" + }, + { + "inputs": [], + "name": "CommitmentHashNotMatching", + "type": "error" + }, + { + "inputs": [], + "name": "GameNotStarted", + "type": "error" + }, + { + "inputs": [], + "name": "InCommitmentPhase", + "type": "error" + }, + { + "inputs": [], + "name": "InResolutionPhase", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidCellOverwrite", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidEpoch", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidFurtherMoves", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "life", + "type": "uint256" + }, + { + "internalType": "int32", + "name": "x", + "type": "int32" + }, + { + "internalType": "int32", + "name": "y", + "type": "int32" + } + ], + "name": "InvalidLifeConfiguration", + "type": "error" + }, + { + "inputs": [], + "name": "NotAuthorized", + "type": "error" + }, + { + "inputs": [], + "name": "NothingToResolve", + "type": "error" + }, + { + "inputs": [], + "name": "PreviousCommitmentNotResolved", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "inReserve", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "ReserveTooLow", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint24", + "name": "epoch", + "type": "uint24" + } + ], + "name": "CommitmentCancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint24", + "name": "epoch", + "type": "uint24" + }, + { + "indexed": false, + "internalType": "bytes24", + "name": "commitmentHash", + "type": "bytes24" + } + ], + "name": "CommitmentMade", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint24", + "name": "epoch", + "type": "uint24" + }, + { + "indexed": true, + "internalType": "bytes24", + "name": "commitmentHash", + "type": "bytes24" + }, + { + "components": [ + { + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + } + ], + "indexed": false, + "internalType": "struct UsingStratagemsTypes.Move[]", + "name": "moves", + "type": "tuple[]" + }, + { + "indexed": false, + "internalType": "bytes24", + "name": "furtherMoves", + "type": "bytes24" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newReserveAmount", + "type": "uint256" + } + ], + "name": "CommitmentResolved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint24", + "name": "epoch", + "type": "uint24" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountBurnt", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes24", + "name": "furtherMoves", + "type": "bytes24" + } + ], + "name": "CommitmentVoid", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "components": [ + { + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint24", + "name": "lastEpochUpdate", + "type": "uint24" + }, + { + "internalType": "uint24", + "name": "epochWhenTokenIsAdded", + "type": "uint24" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "life", + "type": "uint8" + }, + { + "internalType": "int8", + "name": "delta", + "type": "int8" + }, + { + "internalType": "uint8", + "name": "enemyMap", + "type": "uint8" + } + ], + "indexed": false, + "internalType": "struct IStratagemsDebug.DebugCell[]", + "name": "cells", + "type": "tuple[]" + } + ], + "name": "ForceCells", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint24", + "name": "epoch", + "type": "uint24" + }, + { + "components": [ + { + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "life", + "type": "uint8" + } + ], + "indexed": false, + "internalType": "struct IStratagemsDebug.SimpleCell[]", + "name": "cells", + "type": "tuple[]" + } + ], + "name": "ForceSimpleCells", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum UsingStratagemsTypes.Color", + "name": "oldColor", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "enum UsingStratagemsTypes.Color", + "name": "newColor", + "type": "uint8" + } + ], + "name": "MoveProcessed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountDeposited", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newAmount", + "type": "uint256" + } + ], + "name": "ReserveDeposited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountWithdrawn", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newAmount", + "type": "uint256" + } + ], + "name": "ReserveWithdrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newTime", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "delta", + "type": "uint256" + } + ], + "name": "TimeIncreased", + "type": "event" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint24", + "name": "lastEpochUpdate", + "type": "uint24" + }, + { + "internalType": "uint24", + "name": "epochWhenTokenIsAdded", + "type": "uint24" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "life", + "type": "uint8" + }, + { + "internalType": "int8", + "name": "delta", + "type": "int8" + }, + { + "internalType": "uint8", + "name": "enemyMap", + "type": "uint8" + } + ], + "internalType": "struct IStratagemsDebug.DebugCell[]", + "name": "cells", + "type": "tuple[]" + } + ], + "name": "forceCells", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + } + ], + "internalType": "struct UsingStratagemsTypes.Move[]", + "name": "moves", + "type": "tuple[]" + } + ], + "name": "forceMoves", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "life", + "type": "uint8" + } + ], + "internalType": "struct IStratagemsDebug.SimpleCell[]", + "name": "cells", + "type": "tuple[]" + } + ], + "name": "forceSimpleCells", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "getRawCell", + "outputs": [ + { + "components": [ + { + "internalType": "uint24", + "name": "lastEpochUpdate", + "type": "uint24" + }, + { + "internalType": "uint24", + "name": "epochWhenTokenIsAdded", + "type": "uint24" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "life", + "type": "uint8" + }, + { + "internalType": "int8", + "name": "delta", + "type": "int8" + }, + { + "internalType": "uint8", + "name": "enemyMap", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "distribution", + "type": "uint8" + } + ], + "internalType": "struct UsingStratagemsTypes.Cell", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "delta", + "type": "uint256" + } + ], + "name": "increaseTime", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "timestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "contractName": "StratagemsDebug", + "sourceName": "src/game/debug/StratagemsDebug.sol", + "bytecode": "0x61016060405234801562000011575f80fd5b50604051620045bb380380620045bb8339810160408190526200003491620000b0565b80516001600160a01b039081166080908152602083015190911661014052604082015160a0908152606083015160c09081529183015160e05282015160ff166101005201516101205262000158565b80516001600160a01b03811681146200009a575f80fd5b919050565b805160ff811681146200009a575f80fd5b5f60e08284031215620000c1575f80fd5b60405160e081016001600160401b0381118282101715620000f057634e487b7160e01b5f52604160045260245ffd5b604052620000fe8362000083565b81526200010e6020840162000083565b60208201526040830151604082015260608301516060820152608083015160808201526200013f60a084016200009f565b60a082015260c083015160c08201528091505092915050565b60805160a05160c05160e051610100516101205161014051614385620002365f395f61169d01525f81816101a9015281816106b201528181611f9901528181611ff2015281816120500152818161218b015281816121d401528181612f0d0152612fd701525f8181610b2d01528181611f13015281816130b5015281816130ec0152818161315a015261318801525f6111b601525f81816111d701526112a801525f818161120a015261126801525f8181610210015281816106d801528181611468015281816115db015281816116cd015261179701526143855ff3fe608060405234801561000f575f80fd5b506004361061006f575f3560e01c8063cd315b081161004d578063cd315b08146100b6578063d703f50a146100d6578063df971134146100e9575f80fd5b80632779347e146100735780633c9a2a1a14610088578063b80777ea1461009b575b5f80fd5b610086610081366004613850565b6100fc565b005b610086610096366004613925565b6102de565b6100a3610437565b6040519081526020015b60405180910390f35b6100c96100c4366004613925565b61046f565b6040516100ad91906139a2565b6100866100e4366004613a1c565b610569565b6100866100f7366004613b0f565b610e6f565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610182576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8061018c6111ae565b9150915080156101a457816101a081613c60565b9250505b5f83517f00000000000000000000000000000000000000000000000000000000000000006101d29190613c9c565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018290529091507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303815f875af115801561026b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061028f9190613cb3565b5073ffffffffffffffffffffffffffffffffffffffff85165f90815260026020526040812080548392906102c4908490613cd9565b909155506102d69050858486336112f6565b505050505050565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064015b60405180910390fd5b5f816103c37f0112c413de07a110ce0a9ace0c01e41b5b59462770325b042f0dc72c337f55f25490565b6103cd9190613cd9565b9050807f0112c413de07a110ce0a9ace0c01e41b5b59462770325b042f0dc72c337f55f2557f36e7cd7cbe0c64c4f819149d7127212cc2ebb56e948ae958ef18f6d1535871c961041b610437565b6040805191825260208201859052015b60405180910390a15050565b5f6104607f0112c413de07a110ce0a9ace0c01e41b5b59462770325b042f0dc72c337f55f25490565b61046a9042613cd9565b905090565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091525f8281526020818152604091829020825160e081018452815462ffffff8082168352630100000082041693820193909352929091908301906601000000000000900460ff1660068111156104fd576104fd61393c565b600681111561050e5761050e61393c565b8152905460ff6701000000000000008204811660208401526801000000000000000082045f0b604084015269010000000000000000008204811660608401526a01000000000000000000009091041660809091015292915050565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105ef576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6105f86111ae565b5090505f5b82518110156109b9575f83828151811061061957610619613cec565b602090810291909101810151805167ffffffffffffffff165f9081529182905260409091205490915062ffffff161561067e576040517ff9e4d84a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201527f000000000000000000000000000000000000000000000000000000000000000060448201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303815f875af1158015610733573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107579190613cb3565b505f8061076c835f015184604001518761180f565b915091506040518060e001604052808662ffffff1681526020018662ffffff168152602001846040015160068111156107a7576107a761393c565b815260608086015160ff9081166020808501919091525f87810b604080870191909152928716938501939093526080909301829052865167ffffffffffffffff16825281835290819020835181549385015162ffffff9081166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000090951691161792909217808355908301519082907fffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff1666010000000000008360068111156108775761087761393c565b021790555060608201518154608084015160a085015160c0909501517fffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff90921667010000000000000060ff948516027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16176801000000000000000091841691909102177fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff166901000000000000000000948316949094027fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff16939093176a010000000000000000000091909316029190911790555050602081810151915167ffffffffffffffff165f90815260019091526040902073ffffffffffffffffffffffffffffffffffffffff9091169055806109b181613d19565b9150506105fd565b505f5b8251811015610e3d575f8382815181106109d8576109d8613cec565b6020908102919091018101515167ffffffffffffffff165f8181528083526040808220815160e081018352815462ffffff80821683526301000000820416968201969096529395509193908301906601000000000000900460ff166006811115610a4457610a4461393c565b6006811115610a5557610a5561393c565b8152905460ff6701000000000000008204811660208401526801000000000000000082045f90810b604085015269010000000000000000008304821660608501526a0100000000000000000000909204166080928301529082015191925090810b8103610ae2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610ae8565b81608001515b90505f815f0b128015610b00575060a082015160ff16155b15610b0857505f5b5f815f0b836060015160ff16610b1e9190613d50565b90505f811215610b2b57505f5b7f000000000000000000000000000000000000000000000000000000000000000060ff16811115610bac576040517fa21143880000000000000000000000000000000000000000000000000000000081526004810182905263ffffffff8516600381810b6024840152602087901c9081900b60448401529091606401610390565b60ff811660608401526040805160e081019091525f9080610bce60018a613d76565b62ffffff168152602001610be360018a613d76565b62ffffff16815260200185604001516006811115610c0357610c0361393c565b815260608087015160ff9081166020808501919091526080808a01515f90810b60408088019190915260a08c01519094169486019490945290930182905288825281835290819020835181549385015162ffffff9081166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000909516911617929092178083559083015192935083929082907fffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff166601000000000000836006811115610cd657610cd661393c565b021790555060608201518154608084015160a085015160c0909501517fffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff90921667010000000000000060ff948516027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16176801000000000000000091841691909102177fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff166901000000000000000000948316949094027fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff16939093176a01000000000000000000009190931602919091179055610e255f610ddd62ffffff8a16611d41565b604051602001610ded9190613dbf565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001905252505f8690526001602052565b50505050508080610e3590613d19565b9150506109bc565b507f8e1d006b2d362a7e606e2a6f90b3faefd938725a74cfe85918c68a8d67d625ec818360405161042b929190613df0565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ef5576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8151811015611173575f828281518110610f1357610f13613cec565b602002602001015190506040518060e00160405280826040015162ffffff168152602001826060015162ffffff16815260200182608001516006811115610f5c57610f5c61393c565b815260a083015160ff90811660208084019190915260c08501515f90810b60408086019190915260e087015190931660608501526080909301839052845167ffffffffffffffff16835282815291819020835181549385015162ffffff9081166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000090951691161792909217808355908301519082907fffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff1666010000000000008360068111156110335761103361393c565b021790555060608201518154608084015160a085015160c0909501517fffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff90921667010000000000000060ff948516027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16176801000000000000000091841691909102177fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff166901000000000000000000948316949094027fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff16939093176a01000000000000000000009190931602919091179055602081810151915167ffffffffffffffff165f90815260019091526040902073ffffffffffffffffffffffffffffffffffffffff90911690558061116b81613d19565b915050610ef7565b507f3c0a1b33060cb27164a8675b8ef0947a312efd921ef674321eb29f0dcbf63876816040516111a39190613e8b565b60405180910390a150565b5f80806111fb7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613cd9565b90505f611206611dfd565b90507f0000000000000000000000000000000000000000000000000000000000000000811015611262576040517f3a5f7b5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61128d7f000000000000000000000000000000000000000000000000000000000000000083613f60565b90506112998382613fa0565b6112a4906002613cd9565b94507f0000000000000000000000000000000000000000000000000000000000000000836112d3600288613d76565b62ffffff166112e29190613c9c565b6112ec9083613f60565b1093505050509091565b5f806040518060400160405280855160056113119190613c9c565b67ffffffffffffffff8111156113295761132961371c565b60405190808252806020026020018201604052801561136d57816020015b604080518082019091525f80825260208201528152602001906001900390816113475790505b5081526020015f815250905061139a60405180606001604052805f81526020015f81526020015f81525090565b5f5b855181101561142d575f805f6113cd868c8c8c88815181106113c0576113c0613cec565b6020026020010151611e31565b92509250925082855f018181516113e49190613cd9565b9052506020850180518391906113fb908390613cd9565b905250604085018051829190611412908390613cd9565b9052508392506114259150829050613d19565b91505061139c565b5060408051808201909152600781527f7265736f6c76650000000000000000000000000000000000000000000000000060209091015261148d7f000000000000000000000000000000000000000000000000000000000000000083612489565b73ffffffffffffffffffffffffffffffffffffffff87165f908152600260209081526040909120549082015182519194506114c791613cd9565b83101561151b576020810151815184916114e091613cd9565b6040517f78fe52a600000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610390565b73ffffffffffffffffffffffffffffffffffffffff841661157f57602081015181516115479190613cd9565b6115519084613f60565b73ffffffffffffffffffffffffffffffffffffffff88165f908152600260205260409020819055925061173b565b8051156116495780516040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015230602483015260448201929092527f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303815f875af1158015611623573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116479190613cb3565b505b60208101511561173b5760208101516040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f00000000000000000000000000000000000000000000000000000000000000008116602483015260448201929092527f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303815f875af1158015611715573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117399190613cb3565b505b6040810151156118055760408181015190517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015260248201929092527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af11580156117df573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118039190613cb3565b505b5050949350505050565b67ffffffffffffffff63ffffffff808516600390810b602087811c9390931690910b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101831b82019384165f9081528084526040808220815160e081018352815462ffffff80821683526301000000820416978201979097529296879690938793909291908301906601000000000000900460ff1660068111156118b6576118b661393c565b60068111156118c7576118c761393c565b8152905460ff6701000000000000008204811660208401526801000000000000000082045f90810b604085015269010000000000000000008304821660608501526a0100000000000000000000909204166080909201919091529091508160400151600681111561193a5761193a61393c565b1461197d575f61194e898360400151612585565b90505f815f0b1215611961578560011795505b808701965061197a838384606001518b60025f8f61261f565b50505b505067ffffffffffffffff602082811b84017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019182165f9081528082526040808220815160e081018352815462ffffff80821683526301000000820416958201959095529293909183019060ff6601000000000000909104166006811115611a0857611a0861393c565b6006811115611a1957611a1961393c565b8152905460ff6701000000000000008204811660208401526801000000000000000082045f90810b604085015269010000000000000000008304821660608501526a01000000000000000000009092041660809092019190915290915081604001516006811115611a8c57611a8c61393c565b14611acf575f611aa0898360400151612585565b90505f815f0b1215611ab3578560021795505b8087019650611acc838384606001518b60035f8f61261f565b50505b505067ffffffffffffffff60018201602090811b84019182165f9081528082526040808220815160e081018352815462ffffff80821683526301000000820416958201959095529293909183019060ff6601000000000000909104166006811115611b3c57611b3c61393c565b6006811115611b4d57611b4d61393c565b8152905460ff6701000000000000008204811660208401526801000000000000000082045f90810b604085015269010000000000000000008304821660608501526a01000000000000000000009092041660809092019190915290915081604001516006811115611bc057611bc061393c565b14611c02575f611bd4898360400151612585565b90505f815f0b1215611be7578560041795505b8087019650611bff838384606001518b5f808f61261f565b50505b505067ffffffffffffffff602082811b84016001019182165f9081528082526040808220815160e081018352815462ffffff80821683526301000000820416958201959095529293909183019060ff6601000000000000909104166006811115611c6e57611c6e61393c565b6006811115611c7f57611c7f61393c565b8152905460ff6701000000000000008204811660208401526801000000000000000082045f90810b604085015269010000000000000000008304821660608501526a01000000000000000000009092041660809092019190915290915081604001516006811115611cf257611cf261393c565b14611d35575f611d06898360400151612585565b90505f815f0b1215611d19578560081795505b8087019650611d32838384606001518b60015f8f61261f565b50505b50505050935093915050565b60605f611d4d83612ad5565b60010190505f8167ffffffffffffffff811115611d6c57611d6c61371c565b6040519080825280601f01601f191660200182016040528015611d96576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084611da057509392505050565b7f0112c413de07a110ce0a9ace0c01e41b5b59462770325b042f0dc72c337f55f2545f90611e2b8142613cd9565b91505090565b5f805f80611e42855f015187612bb6565b9050611ea85f611e568862ffffff16611d41565b604051602001611e669190613fb3565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00190525250855167ffffffffffffffff165f526001602052565b60c0810151606082015160ff16158015611ec75750815162ffffff1615155b15611ef557611ed98260a00151612d10565b60048360a0015160ff16901b611eef9190613fe4565b5f835290505b5f86602001516006811115611f0c57611f0c61393c565b0361201e577f000000000000000000000000000000000000000000000000000000000000000060ff16826060015160ff16141580611f905750855167ffffffffffffffff165f9081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff89169073ffffffffffffffffffffffffffffffffffffffff1614155b15611fc5575f807f0000000000000000000000000000000000000000000000000000000000000000945094509450505061247a565b6120198960405180604001604052808b73ffffffffffffffffffffffffffffffffffffffff1681526020017f0000000000000000000000000000000000000000000000000000000000000000815250612d41565b61207c565b8662ffffff16826020015162ffffff160361207c57606082015160ff161561204c576006602087015261207c565b5f807f0000000000000000000000000000000000000000000000000000000000000000945094509450505061247a565b5f8061208f8b898b876040015187612e8d565b915091508973ffffffffffffffffffffffffffffffffffffffff16885f015167ffffffffffffffff167f17b85ded3fb12432ee427abc34a3026e1fbbb8bc431e3dbe51bc81215655c25c86604001518b602001516040516120f1929190613ffd565b60405180910390a38760200151846040019060068111156121145761211461393c565b908160068111156121275761212761393c565b9052505f60c0850181905262ffffff8a166020860152846040015160068111156121535761215361393c565b036121b1575f606085018190528085526080850181905260a08501819052885167ffffffffffffffff168152600160205260408120557f0000000000000000000000000000000000000000000000000000000000000000945061227a565b60ff811660a08501525f82900b60808501526001606085015262ffffff891684527f0000000000000000000000000000000000000000000000000000000000000000965060068460400151600681111561220d5761220d61393c565b0361224757875167ffffffffffffffff165f90815260016020526040902073ffffffffffffffffffffffffffffffffffffffff905561227a565b875167ffffffffffffffff165f90815260016020526040902073ffffffffffffffffffffffffffffffffffffffff8b1690555b875167ffffffffffffffff165f9081526020818152604091829020865181549288015162ffffff9081166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000009094169116179190911780825591860151869282907fffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff16660100000000000083600681111561231c5761231c61393c565b021790555060608201518154608084015160a085015160c0909501517fffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff90921667010000000000000060ff948516027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16176801000000000000000091841691909102177fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff166901000000000000000000948316949094027fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff16939093176a010000000000000000000091909316029190911790556124755f61242362ffffff8c16611d41565b6040516020016124339190614018565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00190525250885167ffffffffffffffff165f526001602052565b505050505b9450945094915050565b505050565b5f5b8160200151811015612484578273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb835f015183815181106124c8576124c8613cec565b60200260200101515f0151845f015184815181106124e8576124e8613cec565b6020026020010151602001516040518363ffffffff1660e01b815260040161253292919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af115801561254e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125729190613cb3565b508061257d81613d19565b91505061248b565b5f808360068111156125995761259961393c565b141580156125b857505f8260068111156125b5576125b561393c565b14155b15612616578160068111156125cf576125cf61393c565b8360068111156125e1576125e161393c565b1461260c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61260f565b60015b9050612619565b505f5b92915050565b5f80876060015160ff16118015612637575060ff8616155b15612668576126498760a00151612d10565b60048860a0015160ff16901b61265f9190613fe4565b60ff1660c08801525b6126c95f6126788660ff16611d41565b6040516020016126889190614049565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0019052525067ffffffffffffffff89165f526001602052565b6126d4846002614198565b6126df856002614198565b60c089015160041c16600f16036127475760c087015161270390600f16600c6141a6565b60c0880151909150600f16600461271e60ff871660026141c7565b1960048a60c0015160ff16901c60ff161660ff16901b61273e9190613fe4565b60ff1660c08801525b8160068111156127595761275961393c565b83600681111561276b5761276b61393c565b14612901575f8260068111156127835761278361393c565b036128085782600681111561279a5761279a61393c565b876040015160068111156127b0576127b061393c565b036127d2576001876080018181516127c891906141d2565b5f0b905250612901565b6001876080018181516127e59190614210565b5f0b90525060a087018051600160ff8781169190911b8118909116169052612901565b82600681111561281a5761281a61393c565b876040015160068111156128305761283061393c565b036128615760a087018051600160ff8781169190911b909117169052608087018051600291906127c89083906141d2565b8160068111156128735761287361393c565b876040015160068111156128895761288961393c565b036128b9575f8360068111156128a1576128a161393c565b146127d2576002876080018181516127e59190614210565b5f8360068111156128cc576128cc61393c565b03612901576001876080018181516128e491906141d2565b5f0b90525060a087018051600160ff8781169190911b9091171690525b62ffffff8516875260ff8087166060890152612934905f90612924908716611d41565b604051602001612688919061424e565b67ffffffffffffffff88165f908152602081815260409182902089518154928b015162ffffff9081166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000009094169116179190911780825591890151899282907fffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff1666010000000000008360068111156129d5576129d561393c565b021790555060608201518154608084015160a085015160c0909501517fffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff90921667010000000000000060ff948516027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16176801000000000000000091841691909102177fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff166901000000000000000000948316949094027fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff16939093176a01000000000000000000009190931602919091179055979650505050505050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612b1d577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310612b49576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310612b6757662386f26fc10000830492506010015b6305f5e1008310612b7f576305f5e100830492506008015b6127108310612b9357612710830492506004015b60648310612ba5576064830492506002015b600a83106126195760010192915050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905267ffffffffffffffff871682528181529084902084519283018552805462ffffff808216855263010000008204169284019290925292939192918301906601000000000000900460ff166006811115612c4a57612c4a61393c565b6006811115612c5b57612c5b61393c565b8152905460ff6701000000000000008204811660208401526801000000000000000082045f0b60408401526901000000000000000000820481166060808501919091526a010000000000000000000090920416608092830152825191830151908301519293509091600162ffffff841610801590612cdb57505f8160ff16115b15612d07575f80612cf3858760a0015186868b613024565b60ff909116606088015262ffffff16865250505b50505092915050565b5f5b60ff821615612d3c57612d266001836142a5565b9091169080612d34816142be565b915050612d12565b919050565b5f5b8260200151811015612def57815f015173ffffffffffffffffffffffffffffffffffffffff16835f01518281518110612d7e57612d7e613cec565b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1603612ddd5760208201518351805183908110612dbd57612dbd613cec565b6020026020010151602001818151612dd59190613cd9565b905250505050565b80612de781613d19565b915050612d43565b5080518251602084015181518110612e0957612e09613cec565b60200260200101515f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508060200151825f0151836020015181518110612e6457612e64613cec565b60200260200101516020018181525050816020018051809190612e8690613d19565b9052505050565b5f805f805f80612ea78a5f01518a8a8d602001518b613287565b93509350935093505f8260ff161115612f4657612f468b6040518060400160405280612eeb8e5f015167ffffffffffffffff165f9081526001602052604090205490565b73ffffffffffffffffffffffffffffffffffffffff168152602001600c612f357f000000000000000000000000000000000000000000000000000000000000000060ff8916613c9c565b612f3f9190613fa0565b9052612d41565b5f5b60048160ff161015613012575f8260ff831660048110612f6a57612f6a613cec565b602002015173ffffffffffffffffffffffffffffffffffffffff1614613000576130008c6040518060400160405280858560ff1660048110612fae57612fae613cec565b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018b600f1660ff167f0000000000000000000000000000000000000000000000000000000000000000612f3f9190613fa0565b8061300a816142be565b915050612f48565b50929a91995090975050505050505050565b5f85600162ffffff82161080159061303e57505f8460ff16115b1561327d575f61304e8885613d76565b62ffffff1690508015613274575f865f0b5f0361308b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61308d565b865b90505f815f0b1280156130a1575060ff8816155b156130a957505f5b5f815f0b13156131ca577f000000000000000000000000000000000000000000000000000000000000000060ff168660ff1610156131bf575f816001816131108a7f00000000000000000000000000000000000000000000000000000000000000006142a5565b61311a9190613fe4565b61312491906142a5565b61312e91906141a6565b90508060ff16831115613142578060ff1692505b61314c82846142dc565b6131569088613fe4565b96507f000000000000000000000000000000000000000000000000000000000000000060ff168760ff1611156131aa577f000000000000000000000000000000000000000000000000000000000000000096505b8694506131b7838b6142f8565b93505061326e565b85935088925061326e565b5f815f0b1215613267575f6131de82614314565b60016131e984614314565b6131f3908a613fe4565b6131fd91906142a5565b61320791906141a6565b90508060ff1683111561321b578060ff1692505b5f61322583614314565b61322f90856142dc565b90508760ff168160ff161115613247575f9550613254565b61325181896142a5565b95505b61325e848c6142f8565b9450505061326e565b8593508492505b5061327b565b8492508791505b505b9550959350505050565b5f805f6132926136db565b63ffffffff808a16600390810b9160208c811c90911690910b905f9081907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8401901b84016132e5818e60028f8f6134e6565b90935091505f83810b12156132fb578760011797505b9581019560048a811c8116900361333e5767ffffffffffffffff81165f9081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1686525b5096810196602083901b84017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161337a818e60038f8f6134e6565b90935091505f83810b1215613390578760021797505b95810195600860048b901c811690036133d85767ffffffffffffffff81165f9081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1660208701525b50968101966001830160201b84016133f3818e5f8f8f6134e6565b90935091505f83810b1215613409578760041797505b95810195600160048b901c811690036134515767ffffffffffffffff81165f9081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1660408701525b8289019850505f84600101602085901b019050613472818e60018f8f6134e6565b90935091505f83810b1215613488578760081797505b95810195600260048b901c811690036134d05767ffffffffffffffff81165f9081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1660608701525b8289019850505050505095509550955095915050565b67ffffffffffffffff85165f90815260208181526040808320815160e081018352815462ffffff8082168352630100000082041694820194909452849384939192918301906601000000000000900460ff1660068111156135495761354961393c565b600681111561355a5761355a61393c565b8152905460ff6701000000000000008204811660208401526801000000000000000082045f90810b60408086019190915269010000000000000000008404831660608601526a010000000000000000000090930490911660809093019290925282519083015192935091908160068111156135d7576135d761393c565b14613631578560068111156135ee576135ee61393c565b8160068111156136005761360061393c565b1461362b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61362e565b60015b94505b60018262ffffff161015801561365857505f8160068111156136555761365561393c565b14155b156136ce575f836060015160ff1611801561367c57508862ffffff168262ffffff16105b156136b8575f8061369c848660a00151876080015188606001518f613024565b915091506136af8c8684848e8e8e61261f565b955050506136ce565b6136cb8a8485606001518c8c8c8c61261f565b93505b5050509550959350505050565b60405180608001604052806004906020820280368337509192915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612d3c575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff8111828210171561376c5761376c61371c565b60405290565b6040516080810167ffffffffffffffff8111828210171561376c5761376c61371c565b604051610100810167ffffffffffffffff8111828210171561376c5761376c61371c565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156138005761380061371c565b604052919050565b5f67ffffffffffffffff8211156138215761382161371c565b5060051b60200190565b803567ffffffffffffffff81168114612d3c575f80fd5b803560078110612d3c575f80fd5b5f806040808486031215613862575f80fd5b61386b846136f9565b925060208085013567ffffffffffffffff811115613887575f80fd5b8501601f81018713613897575f80fd5b80356138aa6138a582613808565b6137b9565b81815260069190911b820183019083810190898311156138c8575f80fd5b928401925b828410156139155785848b0312156138e4575f8081fd5b6138ec613749565b6138f58561382b565b8152613902868601613842565b81870152825292850192908401906138cd565b8096505050505050509250929050565b5f60208284031215613935575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6007811061399e577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b5f60e08201905062ffffff8084511683528060208501511660208401525060408301516139d26040840182613969565b5060ff606084015116606083015260808301515f0b608083015260ff60a08401511660a083015260ff60c08401511660c083015292915050565b803560ff81168114612d3c575f80fd5b5f6020808385031215613a2d575f80fd5b823567ffffffffffffffff811115613a43575f80fd5b8301601f81018513613a53575f80fd5b8035613a616138a582613808565b81815260079190911b82018301908381019087831115613a7f575f80fd5b928401925b82841015613af25760808489031215613a9c575f8081fd5b613aa4613772565b613aad8561382b565b8152613aba8686016136f9565b868201526040613acb818701613842565b908201526060613adc868201613a0c565b9082015282526080939093019290840190613a84565b979650505050505050565b803562ffffff81168114612d3c575f80fd5b5f6020808385031215613b20575f80fd5b823567ffffffffffffffff811115613b36575f80fd5b8301601f81018513613b46575f80fd5b8035613b546138a582613808565b81815260089190911b82018301908381019087831115613b72575f80fd5b928401925b82841015613af2576101008489031215613b90575f8081fd5b613b98613795565b613ba18561382b565b8152613bae8686016136f9565b868201526040613bbf818701613afd565b908201526060613bd0868201613afd565b908201526080613be1868201613842565b9082015260a0613bf2868201613a0c565b9082015260c0858101355f81810b8214613c0a578081fd5b509082015260e0613c1c868201613a0c565b908201528252610100939093019290840190613b77565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f62ffffff821680613c7457613c74613c33565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b808202811582820484141761261957612619613c33565b5f60208284031215613cc3575f80fd5b81518015158114613cd2575f80fd5b9392505050565b8082018082111561261957612619613c33565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d4957613d49613c33565b5060010190565b8181035f831280158383131683831282161715613d6f57613d6f613c33565b5092915050565b62ffffff828116828216039080821115613d6f57613d6f613c33565b5f81515f5b81811015613db15760208185018101518683015201613d97565b505f93019283525090919050565b7f666f72636553696d706c6543656c6c732061742065706f63682000000000000081525f613cd2601a830184613d92565b5f604080830162ffffff86168452602082818601528186518084526060935083870191508288015f5b82811015613e7c57815167ffffffffffffffff815116855273ffffffffffffffffffffffffffffffffffffffff86820151168686015287810151613e5f89870182613969565b5086015160ff168487015260809093019290840190600101613e19565b50919998505050505050505050565b602080825282518282018190525f919060409081850190868401855b82811015613f5357815167ffffffffffffffff815116855273ffffffffffffffffffffffffffffffffffffffff87820151168786015262ffffff868201511686860152606080820151613f008288018262ffffff169052565b5050608080820151613f1482880182613969565b505060a08181015160ff169086015260c0808201515f81900b82880152505060e09081015160ff16908501526101009093019290850190600101613ea7565b5091979650505050505050565b8181038181111561261957612619613c33565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82613fae57613fae613f73565b500490565b7f5f636f6d707574654d6f76652061742065706f6368200000000000000000000081525f613cd26016830184613d92565b60ff818116838216019081111561261957612619613c33565b6040810161400b8285613969565b613cd26020830184613969565b7f414654455220000000000000000000000000000000000000000000000000000081525f613cd26006830184613d92565b7f5f75706461746543656c6c46726f6d4e65696768626f722020696e646578000081525f613cd2601e830184613d92565b600181815b808511156140d357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156140b9576140b9613c33565b808516156140c657918102915b93841c939080029061407f565b509250929050565b5f826140e957506001612619565b816140f557505f612619565b816001811461410b576002811461411557614131565b6001915050612619565b60ff84111561412657614126613c33565b50506001821b612619565b5060208310610133831016604e8410600b8410161715614154575081810a612619565b61415e838361407a565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561419057614190613c33565b029392505050565b5f613cd260ff8416836140db565b5f60ff8316806141b8576141b8613f73565b8060ff84160491505092915050565b5f613cd283836140db565b5f82810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808112607f8213171561261957612619613c33565b5f81810b9083900b01607f81137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808212171561261957612619613c33565b7f4146544552205f75706461746543656c6c46726f6d4e65696768626f7220206981527f6e6465780000000000000000000000000000000000000000000000000000000060208201525f613cd26024830184613d92565b60ff828116828216039081111561261957612619613c33565b5f60ff821660ff81036142d3576142d3613c33565b60010192915050565b60ff8181168382160290811690818114613d6f57613d6f613c33565b62ffffff818116838216019080821115613d6f57613d6f613c33565b5f815f0b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80810361434757614347613c33565b5f039291505056fea2646970667358221220c0c16baaf8e818b65713d67ddc57fbe523f726f46d1bad6b76b802127a67850c64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061006f575f3560e01c8063cd315b081161004d578063cd315b08146100b6578063d703f50a146100d6578063df971134146100e9575f80fd5b80632779347e146100735780633c9a2a1a14610088578063b80777ea1461009b575b5f80fd5b610086610081366004613850565b6100fc565b005b610086610096366004613925565b6102de565b6100a3610437565b6040519081526020015b60405180910390f35b6100c96100c4366004613925565b61046f565b6040516100ad91906139a2565b6100866100e4366004613a1c565b610569565b6100866100f7366004613b0f565b610e6f565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610182576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8061018c6111ae565b9150915080156101a457816101a081613c60565b9250505b5f83517f00000000000000000000000000000000000000000000000000000000000000006101d29190613c9c565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018290529091507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303815f875af115801561026b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061028f9190613cb3565b5073ffffffffffffffffffffffffffffffffffffffff85165f90815260026020526040812080548392906102c4908490613cd9565b909155506102d69050858486336112f6565b505050505050565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064015b60405180910390fd5b5f816103c37f0112c413de07a110ce0a9ace0c01e41b5b59462770325b042f0dc72c337f55f25490565b6103cd9190613cd9565b9050807f0112c413de07a110ce0a9ace0c01e41b5b59462770325b042f0dc72c337f55f2557f36e7cd7cbe0c64c4f819149d7127212cc2ebb56e948ae958ef18f6d1535871c961041b610437565b6040805191825260208201859052015b60405180910390a15050565b5f6104607f0112c413de07a110ce0a9ace0c01e41b5b59462770325b042f0dc72c337f55f25490565b61046a9042613cd9565b905090565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091525f8281526020818152604091829020825160e081018452815462ffffff8082168352630100000082041693820193909352929091908301906601000000000000900460ff1660068111156104fd576104fd61393c565b600681111561050e5761050e61393c565b8152905460ff6701000000000000008204811660208401526801000000000000000082045f0b604084015269010000000000000000008204811660608401526a01000000000000000000009091041660809091015292915050565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105ef576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6105f86111ae565b5090505f5b82518110156109b9575f83828151811061061957610619613cec565b602090810291909101810151805167ffffffffffffffff165f9081529182905260409091205490915062ffffff161561067e576040517ff9e4d84a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201527f000000000000000000000000000000000000000000000000000000000000000060448201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303815f875af1158015610733573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107579190613cb3565b505f8061076c835f015184604001518761180f565b915091506040518060e001604052808662ffffff1681526020018662ffffff168152602001846040015160068111156107a7576107a761393c565b815260608086015160ff9081166020808501919091525f87810b604080870191909152928716938501939093526080909301829052865167ffffffffffffffff16825281835290819020835181549385015162ffffff9081166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000090951691161792909217808355908301519082907fffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff1666010000000000008360068111156108775761087761393c565b021790555060608201518154608084015160a085015160c0909501517fffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff90921667010000000000000060ff948516027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16176801000000000000000091841691909102177fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff166901000000000000000000948316949094027fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff16939093176a010000000000000000000091909316029190911790555050602081810151915167ffffffffffffffff165f90815260019091526040902073ffffffffffffffffffffffffffffffffffffffff9091169055806109b181613d19565b9150506105fd565b505f5b8251811015610e3d575f8382815181106109d8576109d8613cec565b6020908102919091018101515167ffffffffffffffff165f8181528083526040808220815160e081018352815462ffffff80821683526301000000820416968201969096529395509193908301906601000000000000900460ff166006811115610a4457610a4461393c565b6006811115610a5557610a5561393c565b8152905460ff6701000000000000008204811660208401526801000000000000000082045f90810b604085015269010000000000000000008304821660608501526a0100000000000000000000909204166080928301529082015191925090810b8103610ae2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610ae8565b81608001515b90505f815f0b128015610b00575060a082015160ff16155b15610b0857505f5b5f815f0b836060015160ff16610b1e9190613d50565b90505f811215610b2b57505f5b7f000000000000000000000000000000000000000000000000000000000000000060ff16811115610bac576040517fa21143880000000000000000000000000000000000000000000000000000000081526004810182905263ffffffff8516600381810b6024840152602087901c9081900b60448401529091606401610390565b60ff811660608401526040805160e081019091525f9080610bce60018a613d76565b62ffffff168152602001610be360018a613d76565b62ffffff16815260200185604001516006811115610c0357610c0361393c565b815260608087015160ff9081166020808501919091526080808a01515f90810b60408088019190915260a08c01519094169486019490945290930182905288825281835290819020835181549385015162ffffff9081166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000909516911617929092178083559083015192935083929082907fffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff166601000000000000836006811115610cd657610cd661393c565b021790555060608201518154608084015160a085015160c0909501517fffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff90921667010000000000000060ff948516027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16176801000000000000000091841691909102177fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff166901000000000000000000948316949094027fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff16939093176a01000000000000000000009190931602919091179055610e255f610ddd62ffffff8a16611d41565b604051602001610ded9190613dbf565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001905252505f8690526001602052565b50505050508080610e3590613d19565b9150506109bc565b507f8e1d006b2d362a7e606e2a6f90b3faefd938725a74cfe85918c68a8d67d625ec818360405161042b929190613df0565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ef5576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8151811015611173575f828281518110610f1357610f13613cec565b602002602001015190506040518060e00160405280826040015162ffffff168152602001826060015162ffffff16815260200182608001516006811115610f5c57610f5c61393c565b815260a083015160ff90811660208084019190915260c08501515f90810b60408086019190915260e087015190931660608501526080909301839052845167ffffffffffffffff16835282815291819020835181549385015162ffffff9081166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000090951691161792909217808355908301519082907fffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff1666010000000000008360068111156110335761103361393c565b021790555060608201518154608084015160a085015160c0909501517fffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff90921667010000000000000060ff948516027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16176801000000000000000091841691909102177fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff166901000000000000000000948316949094027fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff16939093176a01000000000000000000009190931602919091179055602081810151915167ffffffffffffffff165f90815260019091526040902073ffffffffffffffffffffffffffffffffffffffff90911690558061116b81613d19565b915050610ef7565b507f3c0a1b33060cb27164a8675b8ef0947a312efd921ef674321eb29f0dcbf63876816040516111a39190613e8b565b60405180910390a150565b5f80806111fb7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613cd9565b90505f611206611dfd565b90507f0000000000000000000000000000000000000000000000000000000000000000811015611262576040517f3a5f7b5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61128d7f000000000000000000000000000000000000000000000000000000000000000083613f60565b90506112998382613fa0565b6112a4906002613cd9565b94507f0000000000000000000000000000000000000000000000000000000000000000836112d3600288613d76565b62ffffff166112e29190613c9c565b6112ec9083613f60565b1093505050509091565b5f806040518060400160405280855160056113119190613c9c565b67ffffffffffffffff8111156113295761132961371c565b60405190808252806020026020018201604052801561136d57816020015b604080518082019091525f80825260208201528152602001906001900390816113475790505b5081526020015f815250905061139a60405180606001604052805f81526020015f81526020015f81525090565b5f5b855181101561142d575f805f6113cd868c8c8c88815181106113c0576113c0613cec565b6020026020010151611e31565b92509250925082855f018181516113e49190613cd9565b9052506020850180518391906113fb908390613cd9565b905250604085018051829190611412908390613cd9565b9052508392506114259150829050613d19565b91505061139c565b5060408051808201909152600781527f7265736f6c76650000000000000000000000000000000000000000000000000060209091015261148d7f000000000000000000000000000000000000000000000000000000000000000083612489565b73ffffffffffffffffffffffffffffffffffffffff87165f908152600260209081526040909120549082015182519194506114c791613cd9565b83101561151b576020810151815184916114e091613cd9565b6040517f78fe52a600000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610390565b73ffffffffffffffffffffffffffffffffffffffff841661157f57602081015181516115479190613cd9565b6115519084613f60565b73ffffffffffffffffffffffffffffffffffffffff88165f908152600260205260409020819055925061173b565b8051156116495780516040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015230602483015260448201929092527f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303815f875af1158015611623573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116479190613cb3565b505b60208101511561173b5760208101516040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f00000000000000000000000000000000000000000000000000000000000000008116602483015260448201929092527f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303815f875af1158015611715573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117399190613cb3565b505b6040810151156118055760408181015190517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015260248201929092527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af11580156117df573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118039190613cb3565b505b5050949350505050565b67ffffffffffffffff63ffffffff808516600390810b602087811c9390931690910b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101831b82019384165f9081528084526040808220815160e081018352815462ffffff80821683526301000000820416978201979097529296879690938793909291908301906601000000000000900460ff1660068111156118b6576118b661393c565b60068111156118c7576118c761393c565b8152905460ff6701000000000000008204811660208401526801000000000000000082045f90810b604085015269010000000000000000008304821660608501526a0100000000000000000000909204166080909201919091529091508160400151600681111561193a5761193a61393c565b1461197d575f61194e898360400151612585565b90505f815f0b1215611961578560011795505b808701965061197a838384606001518b60025f8f61261f565b50505b505067ffffffffffffffff602082811b84017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019182165f9081528082526040808220815160e081018352815462ffffff80821683526301000000820416958201959095529293909183019060ff6601000000000000909104166006811115611a0857611a0861393c565b6006811115611a1957611a1961393c565b8152905460ff6701000000000000008204811660208401526801000000000000000082045f90810b604085015269010000000000000000008304821660608501526a01000000000000000000009092041660809092019190915290915081604001516006811115611a8c57611a8c61393c565b14611acf575f611aa0898360400151612585565b90505f815f0b1215611ab3578560021795505b8087019650611acc838384606001518b60035f8f61261f565b50505b505067ffffffffffffffff60018201602090811b84019182165f9081528082526040808220815160e081018352815462ffffff80821683526301000000820416958201959095529293909183019060ff6601000000000000909104166006811115611b3c57611b3c61393c565b6006811115611b4d57611b4d61393c565b8152905460ff6701000000000000008204811660208401526801000000000000000082045f90810b604085015269010000000000000000008304821660608501526a01000000000000000000009092041660809092019190915290915081604001516006811115611bc057611bc061393c565b14611c02575f611bd4898360400151612585565b90505f815f0b1215611be7578560041795505b8087019650611bff838384606001518b5f808f61261f565b50505b505067ffffffffffffffff602082811b84016001019182165f9081528082526040808220815160e081018352815462ffffff80821683526301000000820416958201959095529293909183019060ff6601000000000000909104166006811115611c6e57611c6e61393c565b6006811115611c7f57611c7f61393c565b8152905460ff6701000000000000008204811660208401526801000000000000000082045f90810b604085015269010000000000000000008304821660608501526a01000000000000000000009092041660809092019190915290915081604001516006811115611cf257611cf261393c565b14611d35575f611d06898360400151612585565b90505f815f0b1215611d19578560081795505b8087019650611d32838384606001518b60015f8f61261f565b50505b50505050935093915050565b60605f611d4d83612ad5565b60010190505f8167ffffffffffffffff811115611d6c57611d6c61371c565b6040519080825280601f01601f191660200182016040528015611d96576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084611da057509392505050565b7f0112c413de07a110ce0a9ace0c01e41b5b59462770325b042f0dc72c337f55f2545f90611e2b8142613cd9565b91505090565b5f805f80611e42855f015187612bb6565b9050611ea85f611e568862ffffff16611d41565b604051602001611e669190613fb3565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00190525250855167ffffffffffffffff165f526001602052565b60c0810151606082015160ff16158015611ec75750815162ffffff1615155b15611ef557611ed98260a00151612d10565b60048360a0015160ff16901b611eef9190613fe4565b5f835290505b5f86602001516006811115611f0c57611f0c61393c565b0361201e577f000000000000000000000000000000000000000000000000000000000000000060ff16826060015160ff16141580611f905750855167ffffffffffffffff165f9081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff89169073ffffffffffffffffffffffffffffffffffffffff1614155b15611fc5575f807f0000000000000000000000000000000000000000000000000000000000000000945094509450505061247a565b6120198960405180604001604052808b73ffffffffffffffffffffffffffffffffffffffff1681526020017f0000000000000000000000000000000000000000000000000000000000000000815250612d41565b61207c565b8662ffffff16826020015162ffffff160361207c57606082015160ff161561204c576006602087015261207c565b5f807f0000000000000000000000000000000000000000000000000000000000000000945094509450505061247a565b5f8061208f8b898b876040015187612e8d565b915091508973ffffffffffffffffffffffffffffffffffffffff16885f015167ffffffffffffffff167f17b85ded3fb12432ee427abc34a3026e1fbbb8bc431e3dbe51bc81215655c25c86604001518b602001516040516120f1929190613ffd565b60405180910390a38760200151846040019060068111156121145761211461393c565b908160068111156121275761212761393c565b9052505f60c0850181905262ffffff8a166020860152846040015160068111156121535761215361393c565b036121b1575f606085018190528085526080850181905260a08501819052885167ffffffffffffffff168152600160205260408120557f0000000000000000000000000000000000000000000000000000000000000000945061227a565b60ff811660a08501525f82900b60808501526001606085015262ffffff891684527f0000000000000000000000000000000000000000000000000000000000000000965060068460400151600681111561220d5761220d61393c565b0361224757875167ffffffffffffffff165f90815260016020526040902073ffffffffffffffffffffffffffffffffffffffff905561227a565b875167ffffffffffffffff165f90815260016020526040902073ffffffffffffffffffffffffffffffffffffffff8b1690555b875167ffffffffffffffff165f9081526020818152604091829020865181549288015162ffffff9081166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000009094169116179190911780825591860151869282907fffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff16660100000000000083600681111561231c5761231c61393c565b021790555060608201518154608084015160a085015160c0909501517fffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff90921667010000000000000060ff948516027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16176801000000000000000091841691909102177fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff166901000000000000000000948316949094027fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff16939093176a010000000000000000000091909316029190911790556124755f61242362ffffff8c16611d41565b6040516020016124339190614018565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00190525250885167ffffffffffffffff165f526001602052565b505050505b9450945094915050565b505050565b5f5b8160200151811015612484578273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb835f015183815181106124c8576124c8613cec565b60200260200101515f0151845f015184815181106124e8576124e8613cec565b6020026020010151602001516040518363ffffffff1660e01b815260040161253292919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af115801561254e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125729190613cb3565b508061257d81613d19565b91505061248b565b5f808360068111156125995761259961393c565b141580156125b857505f8260068111156125b5576125b561393c565b14155b15612616578160068111156125cf576125cf61393c565b8360068111156125e1576125e161393c565b1461260c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61260f565b60015b9050612619565b505f5b92915050565b5f80876060015160ff16118015612637575060ff8616155b15612668576126498760a00151612d10565b60048860a0015160ff16901b61265f9190613fe4565b60ff1660c08801525b6126c95f6126788660ff16611d41565b6040516020016126889190614049565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0019052525067ffffffffffffffff89165f526001602052565b6126d4846002614198565b6126df856002614198565b60c089015160041c16600f16036127475760c087015161270390600f16600c6141a6565b60c0880151909150600f16600461271e60ff871660026141c7565b1960048a60c0015160ff16901c60ff161660ff16901b61273e9190613fe4565b60ff1660c08801525b8160068111156127595761275961393c565b83600681111561276b5761276b61393c565b14612901575f8260068111156127835761278361393c565b036128085782600681111561279a5761279a61393c565b876040015160068111156127b0576127b061393c565b036127d2576001876080018181516127c891906141d2565b5f0b905250612901565b6001876080018181516127e59190614210565b5f0b90525060a087018051600160ff8781169190911b8118909116169052612901565b82600681111561281a5761281a61393c565b876040015160068111156128305761283061393c565b036128615760a087018051600160ff8781169190911b909117169052608087018051600291906127c89083906141d2565b8160068111156128735761287361393c565b876040015160068111156128895761288961393c565b036128b9575f8360068111156128a1576128a161393c565b146127d2576002876080018181516127e59190614210565b5f8360068111156128cc576128cc61393c565b03612901576001876080018181516128e491906141d2565b5f0b90525060a087018051600160ff8781169190911b9091171690525b62ffffff8516875260ff8087166060890152612934905f90612924908716611d41565b604051602001612688919061424e565b67ffffffffffffffff88165f908152602081815260409182902089518154928b015162ffffff9081166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000009094169116179190911780825591890151899282907fffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff1666010000000000008360068111156129d5576129d561393c565b021790555060608201518154608084015160a085015160c0909501517fffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff90921667010000000000000060ff948516027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16176801000000000000000091841691909102177fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff166901000000000000000000948316949094027fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff16939093176a01000000000000000000009190931602919091179055979650505050505050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612b1d577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310612b49576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310612b6757662386f26fc10000830492506010015b6305f5e1008310612b7f576305f5e100830492506008015b6127108310612b9357612710830492506004015b60648310612ba5576064830492506002015b600a83106126195760010192915050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905267ffffffffffffffff871682528181529084902084519283018552805462ffffff808216855263010000008204169284019290925292939192918301906601000000000000900460ff166006811115612c4a57612c4a61393c565b6006811115612c5b57612c5b61393c565b8152905460ff6701000000000000008204811660208401526801000000000000000082045f0b60408401526901000000000000000000820481166060808501919091526a010000000000000000000090920416608092830152825191830151908301519293509091600162ffffff841610801590612cdb57505f8160ff16115b15612d07575f80612cf3858760a0015186868b613024565b60ff909116606088015262ffffff16865250505b50505092915050565b5f5b60ff821615612d3c57612d266001836142a5565b9091169080612d34816142be565b915050612d12565b919050565b5f5b8260200151811015612def57815f015173ffffffffffffffffffffffffffffffffffffffff16835f01518281518110612d7e57612d7e613cec565b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1603612ddd5760208201518351805183908110612dbd57612dbd613cec565b6020026020010151602001818151612dd59190613cd9565b905250505050565b80612de781613d19565b915050612d43565b5080518251602084015181518110612e0957612e09613cec565b60200260200101515f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508060200151825f0151836020015181518110612e6457612e64613cec565b60200260200101516020018181525050816020018051809190612e8690613d19565b9052505050565b5f805f805f80612ea78a5f01518a8a8d602001518b613287565b93509350935093505f8260ff161115612f4657612f468b6040518060400160405280612eeb8e5f015167ffffffffffffffff165f9081526001602052604090205490565b73ffffffffffffffffffffffffffffffffffffffff168152602001600c612f357f000000000000000000000000000000000000000000000000000000000000000060ff8916613c9c565b612f3f9190613fa0565b9052612d41565b5f5b60048160ff161015613012575f8260ff831660048110612f6a57612f6a613cec565b602002015173ffffffffffffffffffffffffffffffffffffffff1614613000576130008c6040518060400160405280858560ff1660048110612fae57612fae613cec565b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018b600f1660ff167f0000000000000000000000000000000000000000000000000000000000000000612f3f9190613fa0565b8061300a816142be565b915050612f48565b50929a91995090975050505050505050565b5f85600162ffffff82161080159061303e57505f8460ff16115b1561327d575f61304e8885613d76565b62ffffff1690508015613274575f865f0b5f0361308b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61308d565b865b90505f815f0b1280156130a1575060ff8816155b156130a957505f5b5f815f0b13156131ca577f000000000000000000000000000000000000000000000000000000000000000060ff168660ff1610156131bf575f816001816131108a7f00000000000000000000000000000000000000000000000000000000000000006142a5565b61311a9190613fe4565b61312491906142a5565b61312e91906141a6565b90508060ff16831115613142578060ff1692505b61314c82846142dc565b6131569088613fe4565b96507f000000000000000000000000000000000000000000000000000000000000000060ff168760ff1611156131aa577f000000000000000000000000000000000000000000000000000000000000000096505b8694506131b7838b6142f8565b93505061326e565b85935088925061326e565b5f815f0b1215613267575f6131de82614314565b60016131e984614314565b6131f3908a613fe4565b6131fd91906142a5565b61320791906141a6565b90508060ff1683111561321b578060ff1692505b5f61322583614314565b61322f90856142dc565b90508760ff168160ff161115613247575f9550613254565b61325181896142a5565b95505b61325e848c6142f8565b9450505061326e565b8593508492505b5061327b565b8492508791505b505b9550959350505050565b5f805f6132926136db565b63ffffffff808a16600390810b9160208c811c90911690910b905f9081907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8401901b84016132e5818e60028f8f6134e6565b90935091505f83810b12156132fb578760011797505b9581019560048a811c8116900361333e5767ffffffffffffffff81165f9081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1686525b5096810196602083901b84017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161337a818e60038f8f6134e6565b90935091505f83810b1215613390578760021797505b95810195600860048b901c811690036133d85767ffffffffffffffff81165f9081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1660208701525b50968101966001830160201b84016133f3818e5f8f8f6134e6565b90935091505f83810b1215613409578760041797505b95810195600160048b901c811690036134515767ffffffffffffffff81165f9081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1660408701525b8289019850505f84600101602085901b019050613472818e60018f8f6134e6565b90935091505f83810b1215613488578760081797505b95810195600260048b901c811690036134d05767ffffffffffffffff81165f9081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1660608701525b8289019850505050505095509550955095915050565b67ffffffffffffffff85165f90815260208181526040808320815160e081018352815462ffffff8082168352630100000082041694820194909452849384939192918301906601000000000000900460ff1660068111156135495761354961393c565b600681111561355a5761355a61393c565b8152905460ff6701000000000000008204811660208401526801000000000000000082045f90810b60408086019190915269010000000000000000008404831660608601526a010000000000000000000090930490911660809093019290925282519083015192935091908160068111156135d7576135d761393c565b14613631578560068111156135ee576135ee61393c565b8160068111156136005761360061393c565b1461362b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61362e565b60015b94505b60018262ffffff161015801561365857505f8160068111156136555761365561393c565b14155b156136ce575f836060015160ff1611801561367c57508862ffffff168262ffffff16105b156136b8575f8061369c848660a00151876080015188606001518f613024565b915091506136af8c8684848e8e8e61261f565b955050506136ce565b6136cb8a8485606001518c8c8c8c61261f565b93505b5050509550959350505050565b60405180608001604052806004906020820280368337509192915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612d3c575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff8111828210171561376c5761376c61371c565b60405290565b6040516080810167ffffffffffffffff8111828210171561376c5761376c61371c565b604051610100810167ffffffffffffffff8111828210171561376c5761376c61371c565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156138005761380061371c565b604052919050565b5f67ffffffffffffffff8211156138215761382161371c565b5060051b60200190565b803567ffffffffffffffff81168114612d3c575f80fd5b803560078110612d3c575f80fd5b5f806040808486031215613862575f80fd5b61386b846136f9565b925060208085013567ffffffffffffffff811115613887575f80fd5b8501601f81018713613897575f80fd5b80356138aa6138a582613808565b6137b9565b81815260069190911b820183019083810190898311156138c8575f80fd5b928401925b828410156139155785848b0312156138e4575f8081fd5b6138ec613749565b6138f58561382b565b8152613902868601613842565b81870152825292850192908401906138cd565b8096505050505050509250929050565b5f60208284031215613935575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6007811061399e577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b5f60e08201905062ffffff8084511683528060208501511660208401525060408301516139d26040840182613969565b5060ff606084015116606083015260808301515f0b608083015260ff60a08401511660a083015260ff60c08401511660c083015292915050565b803560ff81168114612d3c575f80fd5b5f6020808385031215613a2d575f80fd5b823567ffffffffffffffff811115613a43575f80fd5b8301601f81018513613a53575f80fd5b8035613a616138a582613808565b81815260079190911b82018301908381019087831115613a7f575f80fd5b928401925b82841015613af25760808489031215613a9c575f8081fd5b613aa4613772565b613aad8561382b565b8152613aba8686016136f9565b868201526040613acb818701613842565b908201526060613adc868201613a0c565b9082015282526080939093019290840190613a84565b979650505050505050565b803562ffffff81168114612d3c575f80fd5b5f6020808385031215613b20575f80fd5b823567ffffffffffffffff811115613b36575f80fd5b8301601f81018513613b46575f80fd5b8035613b546138a582613808565b81815260089190911b82018301908381019087831115613b72575f80fd5b928401925b82841015613af2576101008489031215613b90575f8081fd5b613b98613795565b613ba18561382b565b8152613bae8686016136f9565b868201526040613bbf818701613afd565b908201526060613bd0868201613afd565b908201526080613be1868201613842565b9082015260a0613bf2868201613a0c565b9082015260c0858101355f81810b8214613c0a578081fd5b509082015260e0613c1c868201613a0c565b908201528252610100939093019290840190613b77565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f62ffffff821680613c7457613c74613c33565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b808202811582820484141761261957612619613c33565b5f60208284031215613cc3575f80fd5b81518015158114613cd2575f80fd5b9392505050565b8082018082111561261957612619613c33565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d4957613d49613c33565b5060010190565b8181035f831280158383131683831282161715613d6f57613d6f613c33565b5092915050565b62ffffff828116828216039080821115613d6f57613d6f613c33565b5f81515f5b81811015613db15760208185018101518683015201613d97565b505f93019283525090919050565b7f666f72636553696d706c6543656c6c732061742065706f63682000000000000081525f613cd2601a830184613d92565b5f604080830162ffffff86168452602082818601528186518084526060935083870191508288015f5b82811015613e7c57815167ffffffffffffffff815116855273ffffffffffffffffffffffffffffffffffffffff86820151168686015287810151613e5f89870182613969565b5086015160ff168487015260809093019290840190600101613e19565b50919998505050505050505050565b602080825282518282018190525f919060409081850190868401855b82811015613f5357815167ffffffffffffffff815116855273ffffffffffffffffffffffffffffffffffffffff87820151168786015262ffffff868201511686860152606080820151613f008288018262ffffff169052565b5050608080820151613f1482880182613969565b505060a08181015160ff169086015260c0808201515f81900b82880152505060e09081015160ff16908501526101009093019290850190600101613ea7565b5091979650505050505050565b8181038181111561261957612619613c33565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82613fae57613fae613f73565b500490565b7f5f636f6d707574654d6f76652061742065706f6368200000000000000000000081525f613cd26016830184613d92565b60ff818116838216019081111561261957612619613c33565b6040810161400b8285613969565b613cd26020830184613969565b7f414654455220000000000000000000000000000000000000000000000000000081525f613cd26006830184613d92565b7f5f75706461746543656c6c46726f6d4e65696768626f722020696e646578000081525f613cd2601e830184613d92565b600181815b808511156140d357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156140b9576140b9613c33565b808516156140c657918102915b93841c939080029061407f565b509250929050565b5f826140e957506001612619565b816140f557505f612619565b816001811461410b576002811461411557614131565b6001915050612619565b60ff84111561412657614126613c33565b50506001821b612619565b5060208310610133831016604e8410600b8410161715614154575081810a612619565b61415e838361407a565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561419057614190613c33565b029392505050565b5f613cd260ff8416836140db565b5f60ff8316806141b8576141b8613f73565b8060ff84160491505092915050565b5f613cd283836140db565b5f82810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808112607f8213171561261957612619613c33565b5f81810b9083900b01607f81137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808212171561261957612619613c33565b7f4146544552205f75706461746543656c6c46726f6d4e65696768626f7220206981527f6e6465780000000000000000000000000000000000000000000000000000000060208201525f613cd26024830184613d92565b60ff828116828216039081111561261957612619613c33565b5f60ff821660ff81036142d3576142d3613c33565b60010192915050565b60ff8181168382160290811690818114613d6f57613d6f613c33565b62ffffff818116838216019080821115613d6f57613d6f613c33565b5f815f0b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80810361434757614347613c33565b5f039291505056fea2646970667358221220c0c16baaf8e818b65713d67ddc57fbe523f726f46d1bad6b76b802127a67850c64736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {}, + "devdoc": { + "errors": { + "ReserveTooLow(uint256,uint256)": [ + { + "params": { + "expected": "amount required to proceed", + "inReserve": "amount in reserver as the time of the call" + } + } + ] + }, + "events": { + "CommitmentCancelled(address,uint24)": { + "params": { + "epoch": "epoch number on which this commit belongs to", + "player": "account taking the staking risk (can be a different account than the one controlling the gems)" + } + }, + "CommitmentMade(address,uint24,bytes24)": { + "params": { + "commitmentHash": "the hash of moves", + "epoch": "epoch number on which this commit belongs to", + "player": "account taking the staking risk (can be a different account than the one controlling the gems)" + } + }, + "CommitmentResolved(address,uint24,bytes24,(uint64,uint8)[],bytes24,uint256)": { + "params": { + "commitmentHash": "the hash of the moves", + "epoch": "epoch number on which this commit belongs to", + "furtherMoves": "hash of further moves, unless bytes32(0) which indicate end.", + "moves": "the moves", + "player": "account who commited" + } + }, + "CommitmentVoid(address,uint24,uint256,bytes24)": { + "params": { + "amountBurnt": "amount of token to burn", + "epoch": "epoch number on which this commit belongs to", + "furtherMoves": "hash of further moves, unless bytes32(0) which indicate end.", + "player": "the account that made the commitment" + } + }, + "MoveProcessed(uint64,address,uint8,uint8)": { + "params": { + "newColor": "color that takes over", + "oldColor": "previous color of the cell", + "player": "account making the move", + "position": "cell at which the move take place" + } + }, + "ReserveDeposited(address,uint256,uint256)": { + "params": { + "amountDeposited": "the number of tokens deposited", + "newAmount": "the number of tokens in reserver as a result", + "player": "account receiving the token in the reserve" + } + }, + "ReserveWithdrawn(address,uint256,uint256)": { + "params": { + "amountWithdrawn": "the number of tokens withdrawnn", + "newAmount": "the number of tokens in reserver as a result", + "player": "account withdrawing the tokens" + } + } + }, + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "gasEstimates": { + "creation": { + "codeDepositCost": "3457000", + "executionCost": "infinite", + "totalCost": "infinite" + }, + "external": { + "forceCells((uint64,address,uint24,uint24,uint8,uint8,int8,uint8)[])": "infinite", + "forceMoves(address,(uint64,uint8)[])": "infinite", + "forceSimpleCells((uint64,address,uint8,uint8)[])": "infinite", + "getRawCell(uint256)": "5351", + "increaseTime(uint256)": "infinite", + "timestamp()": "2436" + }, + "internal": { + "_computeDelta(uint64,enum UsingStratagemsTypes.Color)": "infinite", + "_getOwner()": "infinite", + "_updateNeighbosrDelta(uint64,enum UsingStratagemsTypes.Color,uint24)": "infinite", + "isEnemyOrFriend(enum UsingStratagemsTypes.Color,enum UsingStratagemsTypes.Color)": "240" + } + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"contract IERC20WithIERC2612\",\"name\":\"tokens\",\"type\":\"address\"},{\"internalType\":\"address payable\",\"name\":\"burnAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"commitPhaseDuration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"resolutionPhaseDuration\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"maxLife\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"numTokensPerGems\",\"type\":\"uint256\"}],\"internalType\":\"struct UsingStratagemsTypes.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CanStillResolve\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommitmentHashNotMatching\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GameNotStarted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InCommitmentPhase\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InResolutionPhase\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCellOverwrite\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidEpoch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidFurtherMoves\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"life\",\"type\":\"uint256\"},{\"internalType\":\"int32\",\"name\":\"x\",\"type\":\"int32\"},{\"internalType\":\"int32\",\"name\":\"y\",\"type\":\"int32\"}],\"name\":\"InvalidLifeConfiguration\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotAuthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NothingToResolve\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PreviousCommitmentNotResolved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"inReserve\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"}],\"name\":\"ReserveTooLow\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"player\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint24\",\"name\":\"epoch\",\"type\":\"uint24\"}],\"name\":\"CommitmentCancelled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"player\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint24\",\"name\":\"epoch\",\"type\":\"uint24\"},{\"indexed\":false,\"internalType\":\"bytes24\",\"name\":\"commitmentHash\",\"type\":\"bytes24\"}],\"name\":\"CommitmentMade\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"player\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint24\",\"name\":\"epoch\",\"type\":\"uint24\"},{\"indexed\":true,\"internalType\":\"bytes24\",\"name\":\"commitmentHash\",\"type\":\"bytes24\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"position\",\"type\":\"uint64\"},{\"internalType\":\"enum UsingStratagemsTypes.Color\",\"name\":\"color\",\"type\":\"uint8\"}],\"indexed\":false,\"internalType\":\"struct UsingStratagemsTypes.Move[]\",\"name\":\"moves\",\"type\":\"tuple[]\"},{\"indexed\":false,\"internalType\":\"bytes24\",\"name\":\"furtherMoves\",\"type\":\"bytes24\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newReserveAmount\",\"type\":\"uint256\"}],\"name\":\"CommitmentResolved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"player\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint24\",\"name\":\"epoch\",\"type\":\"uint24\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountBurnt\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes24\",\"name\":\"furtherMoves\",\"type\":\"bytes24\"}],\"name\":\"CommitmentVoid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"position\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"lastEpochUpdate\",\"type\":\"uint24\"},{\"internalType\":\"uint24\",\"name\":\"epochWhenTokenIsAdded\",\"type\":\"uint24\"},{\"internalType\":\"enum UsingStratagemsTypes.Color\",\"name\":\"color\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"life\",\"type\":\"uint8\"},{\"internalType\":\"int8\",\"name\":\"delta\",\"type\":\"int8\"},{\"internalType\":\"uint8\",\"name\":\"enemyMap\",\"type\":\"uint8\"}],\"indexed\":false,\"internalType\":\"struct IStratagemsDebug.DebugCell[]\",\"name\":\"cells\",\"type\":\"tuple[]\"}],\"name\":\"ForceCells\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint24\",\"name\":\"epoch\",\"type\":\"uint24\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"position\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"enum UsingStratagemsTypes.Color\",\"name\":\"color\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"life\",\"type\":\"uint8\"}],\"indexed\":false,\"internalType\":\"struct IStratagemsDebug.SimpleCell[]\",\"name\":\"cells\",\"type\":\"tuple[]\"}],\"name\":\"ForceSimpleCells\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"position\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"player\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"enum UsingStratagemsTypes.Color\",\"name\":\"oldColor\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"enum UsingStratagemsTypes.Color\",\"name\":\"newColor\",\"type\":\"uint8\"}],\"name\":\"MoveProcessed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"player\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountDeposited\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newAmount\",\"type\":\"uint256\"}],\"name\":\"ReserveDeposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"player\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountWithdrawn\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newAmount\",\"type\":\"uint256\"}],\"name\":\"ReserveWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newTime\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"delta\",\"type\":\"uint256\"}],\"name\":\"TimeIncreased\",\"type\":\"event\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"position\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"lastEpochUpdate\",\"type\":\"uint24\"},{\"internalType\":\"uint24\",\"name\":\"epochWhenTokenIsAdded\",\"type\":\"uint24\"},{\"internalType\":\"enum UsingStratagemsTypes.Color\",\"name\":\"color\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"life\",\"type\":\"uint8\"},{\"internalType\":\"int8\",\"name\":\"delta\",\"type\":\"int8\"},{\"internalType\":\"uint8\",\"name\":\"enemyMap\",\"type\":\"uint8\"}],\"internalType\":\"struct IStratagemsDebug.DebugCell[]\",\"name\":\"cells\",\"type\":\"tuple[]\"}],\"name\":\"forceCells\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"player\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"position\",\"type\":\"uint64\"},{\"internalType\":\"enum UsingStratagemsTypes.Color\",\"name\":\"color\",\"type\":\"uint8\"}],\"internalType\":\"struct UsingStratagemsTypes.Move[]\",\"name\":\"moves\",\"type\":\"tuple[]\"}],\"name\":\"forceMoves\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"position\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"enum UsingStratagemsTypes.Color\",\"name\":\"color\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"life\",\"type\":\"uint8\"}],\"internalType\":\"struct IStratagemsDebug.SimpleCell[]\",\"name\":\"cells\",\"type\":\"tuple[]\"}],\"name\":\"forceSimpleCells\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getRawCell\",\"outputs\":[{\"components\":[{\"internalType\":\"uint24\",\"name\":\"lastEpochUpdate\",\"type\":\"uint24\"},{\"internalType\":\"uint24\",\"name\":\"epochWhenTokenIsAdded\",\"type\":\"uint24\"},{\"internalType\":\"enum UsingStratagemsTypes.Color\",\"name\":\"color\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"life\",\"type\":\"uint8\"},{\"internalType\":\"int8\",\"name\":\"delta\",\"type\":\"int8\"},{\"internalType\":\"uint8\",\"name\":\"enemyMap\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"distribution\",\"type\":\"uint8\"}],\"internalType\":\"struct UsingStratagemsTypes.Cell\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"delta\",\"type\":\"uint256\"}],\"name\":\"increaseTime\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ReserveTooLow(uint256,uint256)\":[{\"params\":{\"expected\":\"amount required to proceed\",\"inReserve\":\"amount in reserver as the time of the call\"}}]},\"events\":{\"CommitmentCancelled(address,uint24)\":{\"params\":{\"epoch\":\"epoch number on which this commit belongs to\",\"player\":\"account taking the staking risk (can be a different account than the one controlling the gems)\"}},\"CommitmentMade(address,uint24,bytes24)\":{\"params\":{\"commitmentHash\":\"the hash of moves\",\"epoch\":\"epoch number on which this commit belongs to\",\"player\":\"account taking the staking risk (can be a different account than the one controlling the gems)\"}},\"CommitmentResolved(address,uint24,bytes24,(uint64,uint8)[],bytes24,uint256)\":{\"params\":{\"commitmentHash\":\"the hash of the moves\",\"epoch\":\"epoch number on which this commit belongs to\",\"furtherMoves\":\"hash of further moves, unless bytes32(0) which indicate end.\",\"moves\":\"the moves\",\"player\":\"account who commited\"}},\"CommitmentVoid(address,uint24,uint256,bytes24)\":{\"params\":{\"amountBurnt\":\"amount of token to burn\",\"epoch\":\"epoch number on which this commit belongs to\",\"furtherMoves\":\"hash of further moves, unless bytes32(0) which indicate end.\",\"player\":\"the account that made the commitment\"}},\"MoveProcessed(uint64,address,uint8,uint8)\":{\"params\":{\"newColor\":\"color that takes over\",\"oldColor\":\"previous color of the cell\",\"player\":\"account making the move\",\"position\":\"cell at which the move take place\"}},\"ReserveDeposited(address,uint256,uint256)\":{\"params\":{\"amountDeposited\":\"the number of tokens deposited\",\"newAmount\":\"the number of tokens in reserver as a result\",\"player\":\"account receiving the token in the reserve\"}},\"ReserveWithdrawn(address,uint256,uint256)\":{\"params\":{\"amountWithdrawn\":\"the number of tokens withdrawnn\",\"newAmount\":\"the number of tokens in reserver as a result\",\"player\":\"account withdrawing the tokens\"}}},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"errors\":{\"CanStillResolve()\":[{\"notice\":\"Player have to resolve if they can Stratagems will prevent them from acknowledging missed resolution if there is still time to resolve.\"}],\"CommitmentHashNotMatching()\":[{\"notice\":\"Player have to reveal their commitment using the exact same move values If they provide different value, the commitment hash will differ and Stratagems will reject their resolution.\"}],\"GameNotStarted()\":[{\"notice\":\"Game has not started yet, can't perform any action\"}],\"InCommitmentPhase()\":[{\"notice\":\"When in Commit phase, player can make new commitment but they cannot resolve their move yet.\"}],\"InResolutionPhase()\":[{\"notice\":\"When in Resolution phase, it is not possible to commit new moves or cancel previous commitment During Resolution phase, players have to reveal their commitment, if not already done.\"}],\"InvalidEpoch()\":[{\"notice\":\"Player can only resolve their move in the same epoch they commited.abi If a player resolve later it can only do to minimize the reserve burn cost by calling : `acknowledgeMissedResolution`\"}],\"InvalidFurtherMoves()\":[{\"notice\":\"Player can make arbitrary number of moves per epoch. To do so they group moves into (MAX_NUM_MOVES_PER_HASH = 32) moves This result in a recursive series of hash that they can then submit in turn while resolving. The limit (MAX_NUM_MOVES_PER_HASH = 32) ensure a resolution batch fits in a block.\"}],\"NotAuthorized()\":[{\"notice\":\"Not authorized to perform this operation\"}],\"NothingToResolve()\":[{\"notice\":\"Player can only resolve moves they commited.\"}],\"PreviousCommitmentNotResolved()\":[{\"notice\":\"Previous commitment need to be resolved before making a new one. Even if the corresponding reveal phase has passed.\\\\ It is also not possible to withdraw any amount from reserve until the commitment is revealed.\\\\If player lost the information to reveal, it can acknowledge failure which will burn all its reserve.\\\\\"}],\"ReserveTooLow(uint256,uint256)\":[{\"notice\":\"to make a commitment you always need at least one `config.numTokensPerGems` amount in reserve Player also need one `config.numTokensPerGems` per moves during the resolution phase.\"}]},\"events\":{\"CommitmentCancelled(address,uint24)\":{\"notice\":\"A player has cancelled its current commitment (before it reached the resolution phase)\"},\"CommitmentMade(address,uint24,bytes24)\":{\"notice\":\"A player has commited to make a move and resolve it on the resolution phase\"},\"CommitmentResolved(address,uint24,bytes24,(uint64,uint8)[],bytes24,uint256)\":{\"notice\":\"Player has resolved its previous commitment\"},\"CommitmentVoid(address,uint24,uint256,bytes24)\":{\"notice\":\"A player has canceled a previous commitment by burning some tokens\"},\"MoveProcessed(uint64,address,uint8,uint8)\":{\"notice\":\"A move has been resolved.\"},\"ReserveDeposited(address,uint256,uint256)\":{\"notice\":\"Player has deposited token in the reserve, allowing it to use that much in game\"},\"ReserveWithdrawn(address,uint256,uint256)\":{\"notice\":\"Player have withdrawn token from the reserve\"}},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/game/debug/StratagemsDebug.sol\":\"StratagemsDebug\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toString(int256 value) internal pure returns (string memory) {\\n return string(abi.encodePacked(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value))));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1, \\\"Math: mulDiv overflow\\\");\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.4.22 <0.9.0;\\n\\nlibrary console {\\n address constant CONSOLE_ADDRESS =\\n 0x000000000000000000636F6e736F6c652e6c6f67;\\n\\n function _sendLogPayloadImplementation(bytes memory payload) internal view {\\n address consoleAddress = CONSOLE_ADDRESS;\\n /// @solidity memory-safe-assembly\\n assembly {\\n pop(\\n staticcall(\\n gas(),\\n consoleAddress,\\n add(payload, 32),\\n mload(payload),\\n 0,\\n 0\\n )\\n )\\n }\\n }\\n\\n function _castToPure(\\n function(bytes memory) internal view fnIn\\n ) internal pure returns (function(bytes memory) pure fnOut) {\\n assembly {\\n fnOut := fnIn\\n }\\n }\\n\\n function _sendLogPayload(bytes memory payload) internal pure {\\n _castToPure(_sendLogPayloadImplementation)(payload);\\n }\\n\\n function log() internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n }\\n function logInt(int256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n }\\n\\n function logUint(uint256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n }\\n\\n function logString(string memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n }\\n\\n function logBool(bool p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n }\\n\\n function logAddress(address p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n }\\n\\n function logBytes(bytes memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n }\\n\\n function logBytes1(bytes1 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n }\\n\\n function logBytes2(bytes2 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n }\\n\\n function logBytes3(bytes3 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n }\\n\\n function logBytes4(bytes4 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n }\\n\\n function logBytes5(bytes5 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n }\\n\\n function logBytes6(bytes6 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n }\\n\\n function logBytes7(bytes7 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n }\\n\\n function logBytes8(bytes8 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n }\\n\\n function logBytes9(bytes9 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n }\\n\\n function logBytes10(bytes10 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n }\\n\\n function logBytes11(bytes11 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n }\\n\\n function logBytes12(bytes12 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n }\\n\\n function logBytes13(bytes13 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n }\\n\\n function logBytes14(bytes14 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n }\\n\\n function logBytes15(bytes15 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n }\\n\\n function logBytes16(bytes16 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n }\\n\\n function logBytes17(bytes17 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n }\\n\\n function logBytes18(bytes18 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n }\\n\\n function logBytes19(bytes19 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n }\\n\\n function logBytes20(bytes20 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n }\\n\\n function logBytes21(bytes21 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n }\\n\\n function logBytes22(bytes22 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n }\\n\\n function logBytes23(bytes23 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n }\\n\\n function logBytes24(bytes24 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n }\\n\\n function logBytes25(bytes25 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n }\\n\\n function logBytes26(bytes26 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n }\\n\\n function logBytes27(bytes27 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n }\\n\\n function logBytes28(bytes28 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n }\\n\\n function logBytes29(bytes29 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n }\\n\\n function logBytes30(bytes30 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n }\\n\\n function logBytes31(bytes31 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n }\\n\\n function logBytes32(bytes32 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n }\\n\\n function log(uint256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n }\\n\\n function log(string memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n }\\n\\n function log(bool p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n }\\n\\n function log(address p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n }\\n\\n function log(uint256 p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n }\\n\\n function log(bool p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n }\\n\\n function log(bool p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n }\\n\\n function log(bool p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n }\\n\\n function log(bool p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n }\\n\\n function log(address p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n }\\n\\n function log(address p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n }\\n\\n function log(address p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n }\\n\\n function log(address p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n}\\n\",\"keccak256\":\"0x7434453e6d3b7d0e5d0eb7846ffdbc27f0ccf3b163591263739b628074dc103a\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC165/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface IERC165 {\\n\\t/// @notice Query if a contract implements an interface\\n\\t/// @param interfaceID The interface identifier, as specified in ERC-165\\n\\t/// @dev Interface identification is specified in ERC-165. This function\\n\\t/// uses less than 30,000 gas.\\n\\t/// @return `true` if the contract implements `interfaceID` and\\n\\t/// `interfaceID` is not 0xffffffff, `false` otherwise\\n\\tfunction supportsInterface(bytes4 interfaceID) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x036eb02f585d3f298df9fc1470e1d761b74e86793b6c27d8d8608620146b3cf9\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC173/internal/UsingInternalOwner.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nabstract contract UsingInternalOwner {\\n\\tfunction _getOwner() internal view virtual returns (address);\\n}\\n\",\"keccak256\":\"0x39dc46012792c68fddc262df6721c58955a40282d223de8f71e8d473785a1aa6\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/ERC2612/interfaces/IERC20WithIERC2612.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/IERC20.sol\\\";\\nimport \\\"./IERC2612.sol\\\";\\n\\ninterface IERC20WithIERC2612 is IERC20, IERC2612 {}\\n\",\"keccak256\":\"0x66100d98de50a396d46feb17a2b2b400b13f033f5e01b45e95901e61a4feef05\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/ERC2612/interfaces/IERC2612.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/IERC20Errors.sol\\\";\\n\\ninterface IERC2612 {\\n\\t/// @notice The signature do not match the expected signer\\n\\terror InvalidSignature();\\n\\t/// @notice The permit has expired\\n\\t/// @param currentTime time at which the error happen\\n\\t/// @param deadline the deadline\\n\\terror DeadlineOver(uint256 currentTime, uint256 deadline);\\n\\n\\t/// @notice allow `spender` to spend `value` amount of token on behalf of `owner`\\n\\t/// @param owner owner of the tokens\\n\\t/// @param spender address allowed to spend on behalf of the owner.\\n\\t/// @param value amount of token allowed to be spent\\n\\t/// @param deadline timestamp in seconds after which the permit is not valid.\\n\\t/// @param v signature part v\\n\\t/// @param r signature part r\\n\\t/// @param s signature part s\\n\\tfunction permit(\\n\\t\\taddress owner,\\n\\t\\taddress spender,\\n\\t\\tuint256 value,\\n\\t\\tuint256 deadline,\\n\\t\\tuint8 v,\\n\\t\\tbytes32 r,\\n\\t\\tbytes32 s\\n\\t) external;\\n\\n\\t/// @notice return the current nonce of the owner\\n\\t/// @param owner address queried\\n\\t/// @return nonce nonce value\\n\\tfunction nonces(address owner) external view returns (uint256 nonce);\\n\\n\\t/// @notice EIP-712 Domain separator hash\\n\\tfunction DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xe610994a34db6e750ee555ab2011292a980ec650e9afb7619fb0bc3fcad75095\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IERC20Errors.sol\\\";\\n\\ninterface IERC20 {\\n\\t/// @notice trigger when tokens are transferred, including zero value transfers.\\n\\t/// @param from the account the tokens are sent from\\n\\t/// @param to the account the tokens are sent to\\n\\t/// @param value number of tokens sent\\n\\tevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n\\t/// @notice trigger on approval amount being set.\\n\\t/// Note that Transfer events need to be considered to compute the current allowance.\\n\\t/// @param owner the account approving the `spender`\\n\\t/// @param spender the account allowed to spend\\n\\t/// @param value the amount granted\\n\\tevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n\\t/// @notice Returns the total token supply.\\n\\tfunction totalSupply() external view returns (uint256);\\n\\n\\t/// @notice Returns the number of decimals the token uses.\\n\\tfunction decimals() external view returns (uint8);\\n\\n\\t/// @notice Returns the symbol of the token.\\n\\tfunction symbol() external view returns (string memory);\\n\\n\\t/// @notice Returns the name of the token.\\n\\tfunction name() external view returns (string memory);\\n\\n\\t/// @notice Returns the account balance of another account with address `owner`.\\n\\tfunction balanceOf(address owner) external view returns (uint256);\\n\\n\\t/// @notice Transfers `amount` of tokens to address `to`.\\n\\tfunction transfer(address to, uint256 amount) external returns (bool);\\n\\n\\t/// @notice Returns the amount which `spender` is still allowed to withdraw from `owner`.\\n\\tfunction allowance(address owner, address spender) external view returns (uint256);\\n\\n\\t/// @notice Allows `spender` to withdraw from your account multiple times, up to `amount`.\\n\\tfunction approve(address spender, uint256 amount) external returns (bool);\\n\\n\\t/// @notice Transfers `amount` tokens from address `from` to address `to`.\\n\\tfunction transferFrom(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 amount\\n\\t) external returns (bool);\\n}\\n\",\"keccak256\":\"0x68034c81cd7775e19a5bb75dd33022da7add3bc1852309eed9f797f1ff835507\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/interfaces/IERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/// @notice The msg value do not match the expected value\\n/// @param provided msg.value amount provided\\n/// @param expected value expected\\nerror InvalidMsgValue(uint256 provided, uint256 expected);\\n/// @notice The total amount provided do not match the expected value\\n/// @param provided msg.value amount provided\\n/// @param expected value expected\\nerror InvalidTotalAmount(uint256 provided, uint256 expected);\\n/// @notice An invalid address is specified (for example: zero address)\\n/// @param addr invalid address\\nerror InvalidAddress(address addr);\\n/// @notice the amount requested exceed the allowance\\n/// @param currentAllowance the current allowance\\n/// @param expected amount expected\\nerror NotAuthorizedAllowance(uint256 currentAllowance, uint256 expected);\\n/// @notice the amount requested exceed the balance\\n/// @param currentBalance the current balance\\n/// @param expected amount expected\\nerror NotEnoughTokens(uint256 currentBalance, uint256 expected);\\n\",\"keccak256\":\"0xc8ab4cfee19338da32d2fc5473e1ee740bf608c59196ebd16de74294c4813ae9\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../ERC165/interfaces/IERC165.sol\\\";\\nimport \\\"../../utils/GenericErrors.sol\\\";\\n\\ninterface IERC721Supply {\\n\\t/// @notice return the total number of token in existence\\n\\tfunction totalSupply() external view returns (uint256);\\n}\\n\\ninterface IERC721 is IERC165 {\\n\\t/// @notice Triggered when a token is transferred\\n\\t/// @param from the account the token is sent from\\n\\t/// @param to the account the token is sent to\\n\\t/// @param tokenID id of the token being sent\\n\\tevent Transfer(address indexed from, address indexed to, uint256 indexed tokenID);\\n\\n\\t/// @notice Triggered when a token is approved to be sent by another account\\n\\t/// Note tat the approval get reset when a Transfer event for that same token is emitted.\\n\\t/// @param owner current owner of the token\\n\\t/// @param approved account who can know transfer on the owner's behalf\\n\\t/// @param tokenID id of the token being approved\\n\\tevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenID);\\n\\n\\t/// @notice Triggered when an account approve or disaprove another to transfer on its behalf\\n\\t/// @param owner the account granting rights over all of its token\\n\\t/// @param operator account who can know transfer on the owner's behalf\\n\\t/// @param approved whether it is approved or not\\n\\tevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n\\t/// @notice The token does not exist\\n\\t/// @param tokenID id of the expected token\\n\\terror NonExistentToken(uint256 tokenID);\\n\\t/// @notice The address from which the token is sent is not the current owner\\n\\t/// @param provided the address expected to be the current owner\\n\\t/// @param currentOwner the current owner\\n\\terror NotOwner(address provided, address currentOwner);\\n\\t/// @notice An invalid address is specified (for example: zero address)\\n\\t/// @param addr invalid address\\n\\terror InvalidAddress(address addr);\\n\\t/// @notice The Transfer was rejected by the destination\\n\\terror TransferRejected();\\n\\t/// @notice The Nonce overflowed, make a transfer to self to allow new nonces.\\n\\terror NonceOverflow();\\n\\n\\t/// @notice Get the number of tokens owned by an address.\\n\\t/// @param owner The address to look for.\\n\\t/// @return balance The number of tokens owned by the address.\\n\\tfunction balanceOf(address owner) external view returns (uint256 balance);\\n\\n\\t/// @notice Get the owner of a token.\\n\\t/// @param tokenID The id of the token.\\n\\t/// @return owner The address of the token owner.\\n\\tfunction ownerOf(uint256 tokenID) external view returns (address owner);\\n\\n\\t/// @notice Transfer a token between 2 addresses letting the receiver knows of the transfer.\\n\\t/// @param from The sender of the token.\\n\\t/// @param to The recipient of the token.\\n\\t/// @param tokenID The id of the token.\\n\\t/// @param data Additional data.\\n\\tfunction safeTransferFrom(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 tokenID,\\n\\t\\tbytes calldata data\\n\\t) external;\\n\\n\\t/// @notice Transfer a token between 2 addresses letting the receiver know of the transfer.\\n\\t/// @param from The send of the token.\\n\\t/// @param to The recipient of the token.\\n\\t/// @param tokenID The id of the token.\\n\\tfunction safeTransferFrom(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 tokenID\\n\\t) external;\\n\\n\\t/// @notice Transfer a token between 2 addresses.\\n\\t/// @param from The sender of the token.\\n\\t/// @param to The recipient of the token.\\n\\t/// @param tokenID The id of the token.\\n\\tfunction transferFrom(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 tokenID\\n\\t) external;\\n\\n\\t/// @notice Approve an operator to transfer a specific token on the senders behalf.\\n\\t/// @param operator The address receiving the approval.\\n\\t/// @param tokenID The id of the token.\\n\\tfunction approve(address operator, uint256 tokenID) external;\\n\\n\\t/// @notice Set the approval for an operator to manage all the tokens of the sender.\\n\\t/// @param operator The address receiving the approval.\\n\\t/// @param approved The determination of the approval.\\n\\tfunction setApprovalForAll(address operator, bool approved) external;\\n\\n\\t/// @notice Get the approved operator for a specific token.\\n\\t/// @param tokenID The id of the token.\\n\\t/// @return operator The address of the operator.\\n\\tfunction getApproved(uint256 tokenID) external view returns (address operator);\\n\\n\\t/// @notice Check if the sender approved the operator to transfer any of its tokens.\\n\\t/// @param owner The address of the owner.\\n\\t/// @param operator The address of the operator.\\n\\t/// @return isOperator The status of the approval.\\n\\tfunction isApprovedForAll(address owner, address operator) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4df60787dd909ce77b09140217d364b2892756586b187f74035082e47ecfcd17\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC721.sol\\\";\\n\\ninterface IERC721Metadata is IERC721 {\\n\\t/// @notice A descriptive name for a collection of NFTs in this contract\\n\\tfunction name() external view returns (string memory name);\\n\\n\\t/// @notice An abbreviated name for NFTs in this contract\\n\\tfunction symbol() external view returns (string memory symbol);\\n\\n\\t/// @notice A distinct Uniform Resource Identifier (URI) for a given asset.\\n\\t/// @dev Throws if `tokenID` is not a valid NFT. URIs are defined in RFC\\n\\t/// 3986. The URI may point to a JSON file that conforms to the \\\"ERC721\\n\\t/// Metadata JSON Schema\\\".\\n\\t/// @param tokenID id of the token being queried.\\n\\tfunction tokenURI(uint256 tokenID) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0x540dda3ba75aa5ce30d01925acdeba36c0dbe806ac45d292b78afd39e16937a4\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/debug/time/implementations/UsingControlledTime.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../../ERC173/internal/UsingInternalOwner.sol\\\";\\nimport \\\"../interfaces/ITime.sol\\\";\\n\\nabstract contract UsingControlledTime is UsingInternalOwner, ITime, ITimeSetter {\\n\\tfunction timestamp() public view override returns (uint256) {\\n\\t\\treturn block.timestamp + _delta();\\n\\t}\\n\\n\\tfunction increaseTime(uint256 delta) external override {\\n\\t\\trequire(msg.sender == _getOwner(), \\\"NOT_AUTHORIZED\\\");\\n\\t\\tuint256 newDelta = _delta() + delta;\\n\\t\\tassembly {\\n\\t\\t\\tsstore(0x112c413de07a110ce0a9ace0c01e41b5b59462770325b042f0dc72c337f55f2, newDelta)\\n\\t\\t}\\n\\t\\temit TimeIncreased(timestamp(), delta);\\n\\t}\\n\\n\\tfunction _delta() internal view returns (uint256 delta) {\\n\\t\\tassembly {\\n\\t\\t\\t// keccak256(\\\"time\\\") - 1\\n\\t\\t\\tdelta := sload(0x112c413de07a110ce0a9ace0c01e41b5b59462770325b042f0dc72c337f55f2)\\n\\t\\t}\\n\\t}\\n}\\n\",\"keccak256\":\"0x23c91f4cc5dc5dd55d7fd953d0762f5fd43c78d7f22aecffd0746e1854b087a2\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/debug/time/interfaces/ITime.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface ITime {\\n\\tfunction timestamp() external view returns (uint256);\\n}\\n\\ninterface ITimeSetter {\\n\\tevent TimeIncreased(uint256 newTime, uint256 delta);\\n\\n\\tfunction increaseTime(uint256 delta) external;\\n}\\n\",\"keccak256\":\"0xb13d35c26f92b200146dca3ed65024ea59d58be15805fcd38eea31ee4601a0bf\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/utils/GenericErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/// @notice Not authorized to perform this operation\\nerror NotAuthorized();\\n\",\"keccak256\":\"0x333aa48943e66849a9350384e7ec2553b93e8a8a12b8ad300d3341f7c98b60fd\",\"license\":\"MIT\"},\"src/game/debug/IStratagemsWithDebug.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nimport '../interface/IStratagems.sol';\\nimport '../interface/UsingStratagemsTypes.sol';\\nimport 'solidity-kit/solc_0.8/debug/time/interfaces/ITime.sol';\\n\\ninterface IStratagemsDebug is UsingStratagemsTypes, ITime, ITimeSetter {\\n\\terror InvalidCellOverwrite();\\n\\terror InvalidLifeConfiguration(uint256 life, int32 x, int32 y);\\n\\n\\tevent ForceCells(DebugCell[] cells);\\n\\tevent ForceSimpleCells(uint24 epoch, SimpleCell[] cells);\\n\\n\\tfunction forceMoves(address player, Move[] memory moves) external;\\n\\n\\tstruct DebugCell {\\n\\t\\tuint64 position;\\n\\t\\taddress owner;\\n\\t\\tuint24 lastEpochUpdate;\\n\\t\\tuint24 epochWhenTokenIsAdded;\\n\\t\\tColor color;\\n\\t\\tuint8 life;\\n\\t\\tint8 delta;\\n\\t\\tuint8 enemyMap;\\n\\t}\\n\\n\\tfunction forceCells(DebugCell[] memory cells) external;\\n\\n\\tstruct SimpleCell {\\n\\t\\tuint64 position;\\n\\t\\taddress owner;\\n\\t\\tColor color;\\n\\t\\tuint8 life;\\n\\t}\\n\\n\\tfunction forceSimpleCells(SimpleCell[] memory cells) external;\\n\\n\\tfunction getRawCell(uint256 id) external view returns (Cell memory cell);\\n}\\n\\ninterface IStratagemsWithDebug is IStratagems, IStratagemsDebug {}\\n\",\"keccak256\":\"0x5157ff83f99e7e0c1d83982d20c6080f42e76d708f64cf60502fe74cdc191f84\",\"license\":\"AGPL-3.0\"},\"src/game/debug/StratagemsDebug.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nimport 'solidity-kit/solc_0.8/utils/GenericErrors.sol';\\nimport 'solidity-kit/solc_0.8/debug/time/implementations/UsingControlledTime.sol';\\nimport '../internal/UsingStratagemsSetters.sol';\\nimport './IStratagemsWithDebug.sol';\\n\\ncontract StratagemsDebug is UsingStratagemsSetters, UsingControlledTime, IStratagemsDebug {\\n\\tconstructor(Config memory config) UsingStratagemsSetters(config) {}\\n\\n\\tfunction getRawCell(uint256 id) external view returns (Cell memory) {\\n\\t\\treturn _cells[id];\\n\\t}\\n\\n\\tfunction _getOwner() internal view override returns (address ownerAddress) {\\n\\t\\t// solhint-disable-next-line security/no-inline-assembly\\n\\t\\tassembly {\\n\\t\\t\\townerAddress := sload(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103)\\n\\t\\t}\\n\\t}\\n\\n\\tfunction forceMoves(address player, Move[] memory moves) external {\\n\\t\\tif (msg.sender != _getOwner()) {\\n\\t\\t\\trevert NotAuthorized();\\n\\t\\t}\\n\\t\\t(uint24 epoch, bool commiting) = _epoch();\\n\\t\\tif (commiting) {\\n\\t\\t\\tepoch--;\\n\\t\\t}\\n\\n\\t\\tuint256 numTokens = NUM_TOKENS_PER_GEMS * moves.length;\\n\\t\\tTOKENS.transferFrom(msg.sender, address(this), numTokens);\\n\\t\\t_tokensInReserve[player] += numTokens;\\n\\t\\t_resolveMoves(player, epoch, moves, msg.sender);\\n\\t}\\n\\n\\tfunction forceCells(DebugCell[] memory cells) external {\\n\\t\\tif (msg.sender != _getOwner()) {\\n\\t\\t\\trevert NotAuthorized();\\n\\t\\t}\\n\\t\\tfor (uint256 i = 0; i < cells.length; i++) {\\n\\t\\t\\tDebugCell memory debugCell = cells[i];\\n\\t\\t\\t_cells[debugCell.position] = Cell({\\n\\t\\t\\t\\tlastEpochUpdate: debugCell.lastEpochUpdate,\\n\\t\\t\\t\\tepochWhenTokenIsAdded: debugCell.epochWhenTokenIsAdded,\\n\\t\\t\\t\\tcolor: debugCell.color,\\n\\t\\t\\t\\tlife: debugCell.life,\\n\\t\\t\\t\\tdelta: debugCell.delta,\\n\\t\\t\\t\\tenemyMap: debugCell.enemyMap,\\n\\t\\t\\t\\tdistribution: 0 // TODO let debug distribution ?\\n\\t\\t\\t});\\n\\t\\t\\t_owners[debugCell.position] = uint256(uint160(debugCell.owner));\\n\\t\\t}\\n\\t\\temit ForceCells(cells);\\n\\t}\\n\\n\\tfunction forceSimpleCells(SimpleCell[] memory cells) external {\\n\\t\\tif (msg.sender != _getOwner()) {\\n\\t\\t\\trevert NotAuthorized();\\n\\t\\t}\\n\\t\\t(uint24 epoch, ) = _epoch();\\n\\n\\t\\tfor (uint256 i = 0; i < cells.length; i++) {\\n\\t\\t\\tSimpleCell memory simpleCell = cells[i];\\n\\t\\t\\tif (_cells[simpleCell.position].lastEpochUpdate != 0) {\\n\\t\\t\\t\\trevert InvalidCellOverwrite();\\n\\t\\t\\t}\\n\\t\\t\\tTOKENS.transferFrom(msg.sender, address(this), NUM_TOKENS_PER_GEMS);\\n\\n\\t\\t\\t(int8 delta, uint8 enemyMap) = _updateNeighbosrDelta(simpleCell.position, simpleCell.color, epoch);\\n\\n\\t\\t\\t_cells[simpleCell.position] = Cell({\\n\\t\\t\\t\\tlastEpochUpdate: epoch,\\n\\t\\t\\t\\tepochWhenTokenIsAdded: epoch,\\n\\t\\t\\t\\tcolor: simpleCell.color,\\n\\t\\t\\t\\tlife: simpleCell.life,\\n\\t\\t\\t\\tdelta: delta,\\n\\t\\t\\t\\tenemyMap: enemyMap,\\n\\t\\t\\t\\tdistribution: 0\\n\\t\\t\\t});\\n\\t\\t\\t_owners[simpleCell.position] = uint256(uint160(simpleCell.owner));\\n\\t\\t}\\n\\n\\t\\tfor (uint256 i = 0; i < cells.length; i++) {\\n\\t\\t\\tuint256 position = cells[i].position;\\n\\t\\t\\tCell memory cell = _cells[position];\\n\\n\\t\\t\\t// we act as if the token were added in previous epochs\\n\\t\\t\\t// this is so it does not affect the resolution phase\\n\\t\\t\\tint8 effectiveDelta = cell.delta != 0 ? cell.delta : -1;\\n\\t\\t\\tif (effectiveDelta < 0 && cell.enemyMap == 0) {\\n\\t\\t\\t\\teffectiveDelta = 0;\\n\\t\\t\\t}\\n\\t\\t\\tint256 potentialLife = int256(uint256(cell.life)) - effectiveDelta;\\n\\t\\t\\tif (potentialLife < 0) {\\n\\t\\t\\t\\tpotentialLife = 0;\\n\\t\\t\\t}\\n\\t\\t\\tif (uint256(potentialLife) > MAX_LIFE) {\\n\\t\\t\\t\\tunchecked {\\n\\t\\t\\t\\t\\tint32 x = int32(int256(uint256(position) & 0xFFFFFFFF));\\n\\t\\t\\t\\t\\tint32 y = int32(int256(uint256(position) >> 32));\\n\\t\\t\\t\\t\\trevert InvalidLifeConfiguration(uint256(potentialLife), x, y);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\tcell.life = uint8(uint256(potentialLife));\\n\\n\\t\\t\\tCell memory updatedCell = Cell({\\n\\t\\t\\t\\tlastEpochUpdate: epoch - 1,\\n\\t\\t\\t\\tepochWhenTokenIsAdded: epoch - 1,\\n\\t\\t\\t\\tcolor: cell.color,\\n\\t\\t\\t\\tlife: cell.life,\\n\\t\\t\\t\\tdelta: cell.delta,\\n\\t\\t\\t\\tenemyMap: cell.enemyMap,\\n\\t\\t\\t\\tdistribution: 0 // TODO let debug distribution ?\\n\\t\\t\\t});\\n\\t\\t\\t_cells[position] = updatedCell;\\n\\n\\t\\t\\tlogger.logCell(\\n\\t\\t\\t\\t0,\\n\\t\\t\\t\\tstring.concat('forceSimpleCells at epoch ', Strings.toString(epoch)),\\n\\t\\t\\t\\tuint64(position),\\n\\t\\t\\t\\tupdatedCell,\\n\\t\\t\\t\\taddress(uint160(_owners[position]))\\n\\t\\t\\t);\\n\\t\\t}\\n\\n\\t\\temit ForceSimpleCells(epoch, cells);\\n\\t}\\n\\n\\tfunction isEnemyOrFriend(Color a, Color b) internal pure returns (int8) {\\n\\t\\tif (a != Color.None && b != Color.None) {\\n\\t\\t\\treturn a == b ? int8(1) : int8(-1);\\n\\t\\t}\\n\\t\\treturn 0;\\n\\t}\\n\\n\\tfunction _computeDelta(uint64 position, Color color) internal view returns (int8 delta, uint8 enemyMap) {\\n\\t\\tunchecked {\\n\\t\\t\\tint256 x = int256(int32(int256(uint256(position) & 0xFFFFFFFF)));\\n\\t\\t\\tint256 y = int256(int32(int256(uint256(position) >> 32)));\\n\\t\\t\\t{\\n\\t\\t\\t\\tuint64 upPosition = uint64((uint256(y - 1) << 32) + uint256(x));\\n\\t\\t\\t\\tint8 enemyOrFriend = isEnemyOrFriend(color, _cells[upPosition].color);\\n\\t\\t\\t\\tif (enemyOrFriend < 0) {\\n\\t\\t\\t\\t\\tenemyMap = enemyMap | 1;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tdelta += enemyOrFriend;\\n\\t\\t\\t}\\n\\t\\t\\t{\\n\\t\\t\\t\\tuint64 leftPosition = uint64((uint256(y) << 32) + uint256(x - 1));\\n\\t\\t\\t\\tint8 enemyOrFriend = isEnemyOrFriend(color, _cells[leftPosition].color);\\n\\t\\t\\t\\tif (enemyOrFriend < 0) {\\n\\t\\t\\t\\t\\tenemyMap = enemyMap | 1;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tdelta += enemyOrFriend;\\n\\t\\t\\t}\\n\\n\\t\\t\\t{\\n\\t\\t\\t\\tuint64 downPosition = uint64((uint256(y + 1) << 32) + uint256(x));\\n\\t\\t\\t\\tint8 enemyOrFriend = isEnemyOrFriend(color, _cells[downPosition].color);\\n\\t\\t\\t\\tif (enemyOrFriend < 0) {\\n\\t\\t\\t\\t\\tenemyMap = enemyMap | 1;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tdelta += enemyOrFriend;\\n\\t\\t\\t}\\n\\t\\t\\t{\\n\\t\\t\\t\\tuint64 rightPosition = uint64((uint256(y) << 32) + uint256(x + 1));\\n\\t\\t\\t\\tint8 enemyOrFriend = isEnemyOrFriend(color, _cells[rightPosition].color);\\n\\t\\t\\t\\tif (enemyOrFriend < 0) {\\n\\t\\t\\t\\t\\tenemyMap = enemyMap | 1;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tdelta += enemyOrFriend;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tfunction _updateNeighbosrDelta(\\n\\t\\tuint64 center,\\n\\t\\tColor color,\\n\\t\\tuint24 epoch\\n\\t) internal returns (int8 delta, uint8 enemyMap) {\\n\\t\\tunchecked {\\n\\t\\t\\tint256 x = int256(int32(int256(uint256(center) & 0xFFFFFFFF)));\\n\\t\\t\\tint256 y = int256(int32(int256(uint256(center) >> 32)));\\n\\t\\t\\t{\\n\\t\\t\\t\\tuint64 upPosition = uint64((uint256(y - 1) << 32) + uint256(x));\\n\\t\\t\\t\\tCell memory cell = _cells[upPosition];\\n\\t\\t\\t\\tif (cell.color != Color.None) {\\n\\t\\t\\t\\t\\tint8 enemyOrFriend = isEnemyOrFriend(color, cell.color);\\n\\t\\t\\t\\t\\tif (enemyOrFriend < 0) {\\n\\t\\t\\t\\t\\t\\tenemyMap = enemyMap | 1;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tdelta += enemyOrFriend;\\n\\t\\t\\t\\t\\t_updateCellFromNeighbor(upPosition, cell, cell.life, epoch, 2, Color.None, color);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\t{\\n\\t\\t\\t\\tuint64 leftPosition = uint64((uint256(y) << 32) + uint256(x - 1));\\n\\t\\t\\t\\tCell memory cell = _cells[leftPosition];\\n\\t\\t\\t\\tif (cell.color != Color.None) {\\n\\t\\t\\t\\t\\tint8 enemyOrFriend = isEnemyOrFriend(color, cell.color);\\n\\t\\t\\t\\t\\tif (enemyOrFriend < 0) {\\n\\t\\t\\t\\t\\t\\tenemyMap = enemyMap | 2;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tdelta += enemyOrFriend;\\n\\t\\t\\t\\t\\t_updateCellFromNeighbor(leftPosition, cell, cell.life, epoch, 3, Color.None, color);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t{\\n\\t\\t\\t\\tuint64 downPosition = uint64((uint256(y + 1) << 32) + uint256(x));\\n\\t\\t\\t\\tCell memory cell = _cells[downPosition];\\n\\t\\t\\t\\tif (cell.color != Color.None) {\\n\\t\\t\\t\\t\\tint8 enemyOrFriend = isEnemyOrFriend(color, cell.color);\\n\\t\\t\\t\\t\\tif (enemyOrFriend < 0) {\\n\\t\\t\\t\\t\\t\\tenemyMap = enemyMap | 4;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tdelta += enemyOrFriend;\\n\\t\\t\\t\\t\\t_updateCellFromNeighbor(downPosition, cell, cell.life, epoch, 0, Color.None, color);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\t{\\n\\t\\t\\t\\tuint64 rightPosition = uint64((uint256(y) << 32) + uint256(x + 1));\\n\\t\\t\\t\\tCell memory cell = _cells[rightPosition];\\n\\t\\t\\t\\tif (cell.color != Color.None) {\\n\\t\\t\\t\\t\\tint8 enemyOrFriend = isEnemyOrFriend(color, cell.color);\\n\\t\\t\\t\\t\\tif (enemyOrFriend < 0) {\\n\\t\\t\\t\\t\\t\\tenemyMap = enemyMap | 8;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tdelta += enemyOrFriend;\\n\\t\\t\\t\\t\\t_updateCellFromNeighbor(rightPosition, cell, cell.life, epoch, 1, Color.None, color);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\",\"keccak256\":\"0xaa061946fe99794018ff06d1af64f068c82bd3a8211d4973dc2462e31a852387\",\"license\":\"AGPL-3.0\"},\"src/game/interface/IStratagems.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nimport 'solidity-kit/solc_0.8/ERC721/interfaces/IERC721.sol';\\nimport 'solidity-kit/solc_0.8/ERC721/interfaces/IERC721Metadata.sol';\\nimport 'solidity-kit/solc_0.8/ERC165/interfaces/IERC165.sol';\\nimport './UsingStratagemsTypes.sol';\\nimport './UsingStratagemsEvents.sol';\\n\\ninterface IStratagemsGameplay is UsingStratagemsTypes, UsingStratagemsEvents {\\n\\t/// @notice return updated cell (based on current epoch)\\n\\t/// @param id the cell id\\n\\tfunction getCell(uint256 id) external view returns (FullCell memory cell);\\n\\n\\t/// @notice return the list of updated cells (based on current epoch) whose ids is given\\n\\t/// @param ids the list of cell ids\\n\\tfunction getCells(uint256[] memory ids) external view returns (FullCell[] memory cells);\\n\\n\\t/// @notice the number of token in reserve per account\\n\\t/// This is used to slash player who do not resolve their commit\\n\\t/// The amount can be greater than the number of token required for the next move\\n\\t/// This allow player to potentially hide their intention.\\n\\t/// @param account the address to retrived the amount in reserve of.\\n\\tfunction getTokensInReserve(address account) external view returns (uint256 amount);\\n\\n\\t/// @notice The commitment to be resolved. zeroed if no commitment need to be made.\\n\\t/// @param account the address of which to retrieve the commitment\\n\\tfunction getCommitment(address account) external view returns (Commitment memory commitment);\\n\\n\\t/// @notice return the config used to initialise the Game\\n\\tfunction getConfig() external view returns (Config memory config);\\n\\n\\t/// @notice called by players to add tokens to their reserve\\n\\t/// @param tokensAmountToAdd amount of tokens to add\\n\\t/// @param permit permit EIP2612, .value = zero if not needed\\n\\tfunction addToReserve(uint256 tokensAmountToAdd, Permit calldata permit) external;\\n\\n\\t/// @notice called by players to commit their moves\\n\\t/// this can be called multiple time in the same epoch, the last call overriding the previous.\\n\\t/// When a commitment is made, it needs to be resolved in the resolution phase of the same epoch.abi\\n\\t/// If missed, player can still reveal its moves but none of them will be resolved.\\n\\t/// The player would lose its associated reserved amount.\\n\\t/// @param commitmentHash the hash of the moves\\n\\tfunction makeCommitment(bytes24 commitmentHash) external;\\n\\n\\t/// @notice called by players to cancel their current commitment\\n\\t/// Can only be called during the commit phase in which the commitment was made\\n\\t/// It cannot be called afterward\\n\\tfunction cancelCommitment() external;\\n\\n\\t/// @notice called to make a commitment along with tokens to add to the reserve\\n\\t/// @param commitmentHash the has of the moves\\n\\t/// @param tokensAmountToAdd amount of tokens to add to the reserve. the resulting total must be enough to cover the moves\\n\\t/// @param permit permit EIP2612, value = zero if not needed\\n\\tfunction makeCommitmentWithExtraReserve(\\n\\t\\tbytes24 commitmentHash,\\n\\t\\tuint256 tokensAmountToAdd,\\n\\t\\tPermit calldata permit\\n\\t) external;\\n\\n\\t/// @notice called by players to withdraw tokens from the reserve\\n\\t/// can only be called if no commitments are pending\\n\\t/// Note that while you can withdraw after commiting, note that if you do not have enough tokens\\n\\t/// you'll have your commitment failing.\\n\\t/// @param amount number of tokens to withdraw\\n\\tfunction withdrawFromReserve(uint256 amount) external;\\n\\n\\t/// @notice called by player to resolve their commitment\\n\\t/// this is where the core logic of the game takes place\\n\\t/// This is where the game board evolves\\n\\t/// The game is designed so that resolution order do not matter\\n\\t/// @param player the account who committed the move\\n\\t/// @param secret the secret used to make the commit\\n\\t/// @param moves the actual moves\\n\\t/// @param furtherMoves if moves cannot be contained in one tx, further moves are represented by a hash to resolve too\\n\\t/// Note that you have to that have enough moves (specified by MAX_NUM_MOVES_PER_HASH = 32)\\n\\t/// @param useReserve whether the tokens are taken from the reserve or from approvals.\\n\\t/// This allow player to keep their reserve intact and use it on their next move.\\n\\t/// Note that this require the Stratagems contract to have enough allowance.\\n\\tfunction resolve(\\n\\t\\taddress player,\\n\\t\\tbytes32 secret,\\n\\t\\tMove[] calldata moves,\\n\\t\\tbytes24 furtherMoves,\\n\\t\\tbool useReserve\\n\\t) external;\\n\\n\\t/// @notice called by player if they missed the resolution phase and want to minimze the token loss.\\n\\t/// By providing the moves, they will be slashed only the amount of token required to make the moves\\n\\t/// @param player the account who committed the move\\n\\t/// @param secret the secret used to make the commit\\n\\t/// @param moves the actual moves\\n\\t/// @param furtherMoves if moves cannot be contained in one tx, further moves are represented by a hash to resolve too\\n\\tfunction acknowledgeMissedResolution(\\n\\t\\taddress player,\\n\\t\\tbytes32 secret,\\n\\t\\tMove[] calldata moves,\\n\\t\\tbytes24 furtherMoves\\n\\t) external;\\n\\n\\t/// @notice should only be called as last resort\\n\\t/// this will burn all tokens in reserve\\n\\t/// If player has access to the secret, better call `acknowledgeMissedResolution`\\n\\tfunction acknowledgeMissedResolutionByBurningAllReserve() external;\\n\\n\\t/// @notice poke a position, resolving its virtual state.\\n\\t// If dead as a result, it will reward neighboor enemies colors\\n\\t/// @param position the cell position\\n\\tfunction poke(uint64 position) external;\\n\\n\\t/// @notice poke and collect the tokens won across multiple cells\\n\\t/// @param positions cell positions to collect from\\n\\tfunction pokeMultiple(uint64[] calldata positions) external;\\n}\\n\\ninterface IStratagems is IStratagemsGameplay, IERC721, IERC721Metadata {}\\n\",\"keccak256\":\"0xb53f04089efb5231dbe0504347774c50dbb073d80e2ee7b654b6d6fac7ee4ae3\",\"license\":\"AGPL-3.0\"},\"src/game/interface/UsingStratagemsErrors.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\ninterface UsingStratagemsErrors {\\n\\t/// @notice Game has not started yet, can't perform any action\\n\\terror GameNotStarted();\\n\\n\\t/// @notice When in Resolution phase, it is not possible to commit new moves or cancel previous commitment\\n\\t/// During Resolution phase, players have to reveal their commitment, if not already done.\\n\\terror InResolutionPhase();\\n\\n\\t/// @notice When in Commit phase, player can make new commitment but they cannot resolve their move yet.\\n\\terror InCommitmentPhase();\\n\\n\\t/// @notice Previous commitment need to be resolved before making a new one. Even if the corresponding reveal phase has passed.\\\\\\n\\t/// It is also not possible to withdraw any amount from reserve until the commitment is revealed.\\\\\\n\\t/// @notice If player lost the information to reveal, it can acknowledge failure which will burn all its reserve.\\\\\\n\\terror PreviousCommitmentNotResolved();\\n\\n\\t/// @notice to make a commitment you always need at least one `config.numTokensPerGems` amount in reserve\\n\\t/// Player also need one `config.numTokensPerGems` per moves during the resolution phase.\\n\\t/// @param inReserve amount in reserver as the time of the call\\n\\t/// @param expected amount required to proceed\\n\\terror ReserveTooLow(uint256 inReserve, uint256 expected);\\n\\n\\t/// @notice Player have to reveal their commitment using the exact same move values\\n\\t/// If they provide different value, the commitment hash will differ and Stratagems will reject their resolution.\\n\\terror CommitmentHashNotMatching();\\n\\n\\t/// @notice Player can only resolve moves they commited.\\n\\terror NothingToResolve();\\n\\n\\t/// @notice Player can only resolve their move in the same epoch they commited.abi\\n\\t/// If a player resolve later it can only do to minimize the reserve burn cost by calling : `acknowledgeMissedResolution`\\n\\terror InvalidEpoch();\\n\\n\\t/// @notice Player can make arbitrary number of moves per epoch. To do so they group moves into (MAX_NUM_MOVES_PER_HASH = 32) moves\\n\\t/// This result in a recursive series of hash that they can then submit in turn while resolving.\\n\\t/// The limit (MAX_NUM_MOVES_PER_HASH = 32) ensure a resolution batch fits in a block.\\n\\terror InvalidFurtherMoves();\\n\\n\\t/// @notice Player have to resolve if they can\\n\\t/// Stratagems will prevent them from acknowledging missed resolution if there is still time to resolve.\\n\\terror CanStillResolve();\\n}\\n\",\"keccak256\":\"0x8075ff688eea39ef831a10548de6b225f0e71293e48708ba7b7a6b5c8e45e020\",\"license\":\"AGPL-3.0\"},\"src/game/interface/UsingStratagemsEvents.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nimport './UsingStratagemsTypes.sol';\\n\\ninterface UsingStratagemsEvents is UsingStratagemsTypes {\\n\\t/// @notice A player has commited to make a move and resolve it on the resolution phase\\n\\t/// @param player account taking the staking risk (can be a different account than the one controlling the gems)\\n\\t/// @param epoch epoch number on which this commit belongs to\\n\\t/// @param commitmentHash the hash of moves\\n\\tevent CommitmentMade(address indexed player, uint24 indexed epoch, bytes24 commitmentHash);\\n\\n\\t/// @notice A player has cancelled its current commitment (before it reached the resolution phase)\\n\\t/// @param player account taking the staking risk (can be a different account than the one controlling the gems)\\n\\t/// @param epoch epoch number on which this commit belongs to\\n\\tevent CommitmentCancelled(address indexed player, uint24 indexed epoch);\\n\\n\\t/// @notice A player has canceled a previous commitment by burning some tokens\\n\\t/// @param player the account that made the commitment\\n\\t/// @param epoch epoch number on which this commit belongs to\\n\\t/// @param amountBurnt amount of token to burn\\n\\t/// @param furtherMoves hash of further moves, unless bytes32(0) which indicate end.\\n\\tevent CommitmentVoid(address indexed player, uint24 indexed epoch, uint256 amountBurnt, bytes24 furtherMoves);\\n\\n\\t/// @notice Player has resolved its previous commitment\\n\\t/// @param player account who commited\\n\\t/// @param epoch epoch number on which this commit belongs to\\n\\t/// @param commitmentHash the hash of the moves\\n\\t/// @param moves the moves\\n\\t/// @param furtherMoves hash of further moves, unless bytes32(0) which indicate end.\\n\\tevent CommitmentResolved(\\n\\t\\taddress indexed player,\\n\\t\\tuint24 indexed epoch,\\n\\t\\tbytes24 indexed commitmentHash,\\n\\t\\tMove[] moves,\\n\\t\\tbytes24 furtherMoves,\\n\\t\\tuint256 newReserveAmount\\n\\t);\\n\\n\\t/// @notice Player have withdrawn token from the reserve\\n\\t/// @param player account withdrawing the tokens\\n\\t/// @param amountWithdrawn the number of tokens withdrawnn\\n\\t/// @param newAmount the number of tokens in reserver as a result\\n\\tevent ReserveWithdrawn(address indexed player, uint256 amountWithdrawn, uint256 newAmount);\\n\\n\\t/// @notice Player has deposited token in the reserve, allowing it to use that much in game\\n\\t/// @param player account receiving the token in the reserve\\n\\t/// @param amountDeposited the number of tokens deposited\\n\\t/// @param newAmount the number of tokens in reserver as a result\\n\\tevent ReserveDeposited(address indexed player, uint256 amountDeposited, uint256 newAmount);\\n\\n\\t// --------------------------------------------------------------------------------------------\\n\\t// Event to make it easier to check what is happening\\n\\t// TODO get rid ?\\n\\t// --------------------------------------------------------------------------------------------\\n\\t/// @notice A move has been resolved.\\n\\t/// @param position cell at which the move take place\\n\\t/// @param player account making the move\\n\\t/// @param oldColor previous color of the cell\\n\\t/// @param newColor color that takes over\\n\\tevent MoveProcessed(uint64 indexed position, address indexed player, Color oldColor, Color newColor);\\n}\\n\",\"keccak256\":\"0x44d4cce8966d48be8edd16b28515757b16574463382f8df8301d80721509bb32\",\"license\":\"AGPL-3.0\"},\"src/game/interface/UsingStratagemsTypes.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nimport 'solidity-kit/solc_0.8/ERC721/interfaces/IERC721.sol';\\nimport 'solidity-kit/solc_0.8/ERC165/interfaces/IERC165.sol';\\nimport 'solidity-kit/solc_0.8/ERC20/ERC2612/interfaces/IERC20WithIERC2612.sol';\\n\\ninterface UsingStratagemsTypes {\\n\\t// --------------------------------------------------------------------------------------------\\n\\t// EXTERNAL TYPES\\n\\t// --------------------------------------------------------------------------------------------\\n\\n\\t/// @notice The set of possible color (None indicate the Cell is empty)\\n\\tenum Color {\\n\\t\\tNone,\\n\\t\\tBlue,\\n\\t\\tRed,\\n\\t\\tGreen,\\n\\t\\tYellow,\\n\\t\\tPurple,\\n\\t\\tEvil\\n\\t}\\n\\n\\t/// @notice Move struct that define position and color\\n\\tstruct Move {\\n\\t\\tuint64 position; // TODO make it bigger ? uint32 * uint32 is probably infinitely big enough\\n\\t\\tColor color;\\n\\t}\\n\\n\\t/// @notice Permit struct to authorize EIP2612 ERC20 contracts\\n\\tstruct Permit {\\n\\t\\tuint256 value;\\n\\t\\tuint256 deadline;\\n\\t\\tuint8 v;\\n\\t\\tbytes32 r;\\n\\t\\tbytes32 s;\\n\\t}\\n\\n\\t/// @notice Config struct to configure the game instance\\n\\tstruct Config {\\n\\t\\tIERC20WithIERC2612 tokens;\\n\\t\\taddress payable burnAddress;\\n\\t\\tuint256 startTime;\\n\\t\\tuint256 commitPhaseDuration;\\n\\t\\tuint256 resolutionPhaseDuration;\\n\\t\\tuint8 maxLife;\\n\\t\\tuint256 numTokensPerGems;\\n\\t}\\n\\n\\t/// @notice Cell struct representing the current state of a cell\\n\\tstruct FullCell {\\n\\t\\taddress owner;\\n\\t\\tuint24 lastEpochUpdate;\\n\\t\\tuint24 epochWhenTokenIsAdded;\\n\\t\\tColor color;\\n\\t\\tuint8 life;\\n\\t\\tint8 delta;\\n\\t\\tuint8 enemyMap;\\n\\t\\tuint8 distribution;\\n\\t}\\n\\n\\t// --------------------------------------------------------------------------------------------\\n\\t// STORAGE TYPES\\n\\t// --------------------------------------------------------------------------------------------\\n\\tstruct Cell {\\n\\t\\tuint24 lastEpochUpdate;\\n\\t\\tuint24 epochWhenTokenIsAdded;\\n\\t\\tColor color;\\n\\t\\tuint8 life;\\n\\t\\tint8 delta;\\n\\t\\tuint8 enemyMap;\\n\\t\\tuint8 distribution; // this encode who is left to be given reward (4 left most bits) and the reard (4 most right bits)\\n\\t}\\n\\n\\tstruct Commitment {\\n\\t\\tbytes24 hash;\\n\\t\\tuint24 epoch;\\n\\t}\\n\\n\\t// --------------------------------------------------------------------------------------------\\n\\t// INTERNAL TYPES\\n\\t// --------------------------------------------------------------------------------------------\\n\\n\\tstruct TokenTransfer {\\n\\t\\taddress payable to;\\n\\t\\tuint256 amount;\\n\\t}\\n\\n\\tstruct TokenTransferCollection {\\n\\t\\tTokenTransfer[] transfers;\\n\\t\\tuint256 numTransfers;\\n\\t}\\n\\n\\tstruct MoveTokens {\\n\\t\\tuint256 tokensPlaced;\\n\\t\\tuint256 tokensBurnt;\\n\\t\\tuint256 tokensReturned;\\n\\t}\\n}\\n\",\"keccak256\":\"0xc60a8b6fa0a4e29bd62ec6cda0ee731285dd1c2f4860fcee93f8a512bc185c60\",\"license\":\"AGPL-3.0\"},\"src/game/internal/UsingStratagemsSetters.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nimport './UsingStratagemsState.sol';\\nimport '../interface/UsingStratagemsEvents.sol';\\nimport './UsingStratagemsUtils.sol';\\n\\nabstract contract UsingStratagemsSetters is UsingStratagemsState, UsingStratagemsUtils {\\n\\tconstructor(Config memory config) UsingStratagemsState(config) {}\\n\\n\\tfunction _makeCommitment(address player, bytes24 commitmentHash, uint256 inReserve) internal {\\n\\t\\tCommitment storage commitment = _commitments[player];\\n\\n\\t\\t(uint24 epoch, bool commiting) = _epoch();\\n\\n\\t\\tif (!commiting) {\\n\\t\\t\\trevert InResolutionPhase();\\n\\t\\t}\\n\\t\\tif (commitment.epoch != 0 && commitment.epoch != epoch) {\\n\\t\\t\\trevert PreviousCommitmentNotResolved();\\n\\t\\t}\\n\\n\\t\\tcommitment.hash = commitmentHash;\\n\\t\\tcommitment.epoch = epoch;\\n\\n\\t\\t// for withdrawal, we still require a minimal reserve so player cannot change their mind without losing at least one token\\n\\t\\t// TODO we might want to increase that value to 10x as 10 moves might quite common, at least on some networks\\n\\t\\tif (inReserve < NUM_TOKENS_PER_GEMS) {\\n\\t\\t\\t// TODO? special error for this case ?\\n\\t\\t\\trevert ReserveTooLow(inReserve, NUM_TOKENS_PER_GEMS);\\n\\t\\t}\\n\\n\\t\\temit CommitmentMade(player, epoch, commitmentHash);\\n\\t}\\n\\n\\tfunction _resolveMoves(\\n\\t\\taddress player,\\n\\t\\tuint24 epoch,\\n\\t\\tMove[] memory moves,\\n\\t\\taddress tokenGiver\\n\\t) internal returns (uint256 newReserveAmount) {\\n\\t\\t// max number of transfer is (4+1) * moves.length\\n\\t\\t// (for each move's cell's neighbours potentially being a different account)\\n\\t\\t// limiting the number of move per commitment resolution to 32 or, even more probably, should cover this unlikely scenario\\n\\t\\tTokenTransferCollection memory transferCollection = TokenTransferCollection({\\n\\t\\t\\ttransfers: new TokenTransfer[](moves.length * 5),\\n\\t\\t\\tnumTransfers: 0\\n\\t\\t});\\n\\t\\tMoveTokens memory tokens;\\n\\t\\tfor (uint256 i = 0; i < moves.length; i++) {\\n\\t\\t\\t(uint256 placed, uint256 burnt, uint256 returned) = _computeMove(\\n\\t\\t\\t\\ttransferCollection,\\n\\t\\t\\t\\tplayer,\\n\\t\\t\\t\\tepoch,\\n\\t\\t\\t\\tmoves[i]\\n\\t\\t\\t);\\n\\n\\t\\t\\ttokens.tokensPlaced += placed;\\n\\t\\t\\ttokens.tokensBurnt += burnt;\\n\\t\\t\\ttokens.tokensReturned += returned;\\n\\t\\t}\\n\\n\\t\\tlogger.logTransfers(0, 'resolve', transferCollection);\\n\\n\\t\\t_multiTransfer(TOKENS, transferCollection);\\n\\n\\t\\tnewReserveAmount = _tokensInReserve[player];\\n\\n\\t\\t// Note: even if funds can comes from outside the reserve, we still check it\\n\\t\\t// This ensure player have to have a reserve and cannot escape the slash if not\\n\\t\\tif (newReserveAmount < tokens.tokensPlaced + tokens.tokensBurnt) {\\n\\t\\t\\trevert ReserveTooLow(newReserveAmount, tokens.tokensPlaced + tokens.tokensBurnt);\\n\\t\\t}\\n\\t\\tif (tokenGiver == address(0)) {\\n\\t\\t\\tnewReserveAmount -= tokens.tokensPlaced + tokens.tokensBurnt;\\n\\t\\t\\t_tokensInReserve[player] = newReserveAmount;\\n\\t\\t} else {\\n\\t\\t\\tif (tokens.tokensPlaced != 0) {\\n\\t\\t\\t\\t// TODO use TransferCollection too here\\n\\t\\t\\t\\tTOKENS.transferFrom(tokenGiver, address(this), tokens.tokensPlaced);\\n\\t\\t\\t}\\n\\t\\t\\tif (tokens.tokensBurnt != 0) {\\n\\t\\t\\t\\t// TODO use TransferCollection too here\\n\\t\\t\\t\\tTOKENS.transferFrom(tokenGiver, BURN_ADDRESS, tokens.tokensBurnt);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t// option to return in reserve ?\\n\\t\\t// TODO use TransferCollection too here\\n\\t\\tif (tokens.tokensReturned != 0) {\\n\\t\\t\\t// console.log(\\\"tokensReturned\\\");\\n\\t\\t\\t// console.log(tokens.tokensReturned);\\n\\t\\t\\tTOKENS.transfer(player, tokens.tokensReturned);\\n\\t\\t}\\n\\t}\\n\\n\\tfunction _countBits(uint8 n) internal pure returns (uint8 count) {\\n\\t\\twhile (n != 0) {\\n\\t\\t\\tn = n & (n - 1);\\n\\t\\t\\tcount++;\\n\\t\\t}\\n\\t}\\n\\n\\t// Note on COLLISION\\n\\t// If one color was used more than other, we could consider the cell having N owner and N times the number of tokens\\n\\t// such cells would be a good target for others\\n\\t// On the other end, on winning agains other cells, owner of such cell would have to divide the winnings\\n\\t// TODO revisit this\\n\\t// we could also refund the part\\n\\t// so if there is 3 green 2 blue and 1 red, then green win and the cell become green\\n\\t// player we put blue or red get refunded their respective gems\\n\\t// the players we put green get refunded 2/3 so that the cell still contains only 1\\n\\t// if there was 3 green and 3 blue and 1 red then the cell becomes black\\n\\t// every player get refunded 6/7 so that the black cell only has 1\\n\\t// note that the issue with green winning above is that winnings need to be distributed to all 3 players we put green\\n\\t// and since the number is technically unbounded, we have to use a splitter contract where player withdraw their winnings\\n\\t// this add UX complexity and some cost for withdrawals\\n\\tfunction _computeMove(\\n\\t\\tTokenTransferCollection memory transferCollection,\\n\\t\\taddress player,\\n\\t\\tuint24 epoch,\\n\\t\\tMove memory move\\n\\t) internal returns (uint256 tokensPlaced, uint256 tokensBurnt, uint256 tokensReturned) {\\n\\t\\tCell memory currentState = _getUpdatedCell(move.position, epoch);\\n\\n\\t\\tlogger.logCell(\\n\\t\\t\\t0,\\n\\t\\t\\tstring.concat('_computeMove at epoch ', Strings.toString(epoch)),\\n\\t\\t\\tmove.position,\\n\\t\\t\\tcurrentState,\\n\\t\\t\\taddress(uint160(_owners[move.position]))\\n\\t\\t);\\n\\n\\t\\t// we might have distribution still to do\\n\\t\\tuint8 distribution = currentState.distribution;\\n\\t\\tif (currentState.life == 0 && currentState.lastEpochUpdate != 0) {\\n\\t\\t\\t// if we just died, currentState.lastEpochUpdate > 0\\n\\t\\t\\t// we have to distribute to all\\n\\t\\t\\tdistribution = (currentState.enemyMap << 4) + _countBits(currentState.enemyMap);\\n\\n\\t\\t\\t/// we are now dead for real\\n\\t\\t\\tcurrentState.lastEpochUpdate = 0;\\n\\t\\t}\\n\\n\\t\\t// we then apply our move:\\n\\n\\t\\t// first we do some validity checks\\n\\t\\tif (move.color == Color.None) {\\n\\t\\t\\tif (currentState.life != MAX_LIFE || _ownerOf(move.position) != player) {\\n\\t\\t\\t\\t// invalid move\\n\\t\\t\\t\\treturn (0, 0, NUM_TOKENS_PER_GEMS);\\n\\t\\t\\t}\\n\\n\\t\\t\\t_collectTransfer(transferCollection, TokenTransfer({to: payable(player), amount: NUM_TOKENS_PER_GEMS}));\\n\\t\\t}\\n\\t\\t// then we consider the case of collision and transform such move as Color Evil\\n\\t\\telse if (currentState.epochWhenTokenIsAdded == epoch) {\\n\\t\\t\\tif (currentState.life != 0) {\\n\\t\\t\\t\\tmove.color = Color.Evil;\\n\\t\\t\\t\\t// TODO Add further stake, or do we burn? or return?\\n\\t\\t\\t} else {\\n\\t\\t\\t\\t// invalid move, on top of a MAX, that become None ?\\n\\t\\t\\t\\treturn (0, 0, NUM_TOKENS_PER_GEMS);\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t(int8 newDelta, uint8 newEnemyMap) = _propagate(\\n\\t\\t\\ttransferCollection,\\n\\t\\t\\tmove,\\n\\t\\t\\tepoch,\\n\\t\\t\\tcurrentState.color,\\n\\t\\t\\tdistribution\\n\\t\\t);\\n\\n\\t\\temit MoveProcessed(move.position, player, currentState.color, move.color);\\n\\t\\tcurrentState.color = move.color;\\n\\t\\tcurrentState.distribution = 0;\\n\\t\\tcurrentState.epochWhenTokenIsAdded = epoch; // used to prevent overwriting, even Color.None\\n\\n\\t\\tif (currentState.color == Color.None) {\\n\\t\\t\\tcurrentState.life = 0;\\n\\t\\t\\tcurrentState.lastEpochUpdate = 0;\\n\\t\\t\\tcurrentState.delta = 0;\\n\\t\\t\\tcurrentState.enemyMap = 0;\\n\\t\\t\\t_owners[move.position] = 0;\\n\\t\\t\\ttokensReturned = NUM_TOKENS_PER_GEMS;\\n\\t\\t} else {\\n\\t\\t\\ttokensPlaced = NUM_TOKENS_PER_GEMS;\\n\\n\\t\\t\\tcurrentState.enemyMap = newEnemyMap;\\n\\n\\t\\t\\tcurrentState.delta = newDelta;\\n\\t\\t\\tcurrentState.life = 1;\\n\\t\\t\\tcurrentState.lastEpochUpdate = epoch;\\n\\t\\t\\tif (currentState.color == Color.Evil) {\\n\\t\\t\\t\\t_owners[move.position] = uint256(uint160(0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF));\\n\\t\\t\\t} else {\\n\\t\\t\\t\\t_owners[move.position] = uint256(uint160(player));\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t_cells[move.position] = currentState;\\n\\n\\t\\tlogger.logCell(\\n\\t\\t\\t0,\\n\\t\\t\\tstring.concat('AFTER ', Strings.toString(epoch)),\\n\\t\\t\\tmove.position,\\n\\t\\t\\tcurrentState,\\n\\t\\t\\taddress(uint160(_owners[move.position]))\\n\\t\\t);\\n\\t}\\n\\n\\tfunction _propagate(\\n\\t\\tTokenTransferCollection memory transferCollection,\\n\\t\\tMove memory move,\\n\\t\\tuint24 epoch,\\n\\t\\tColor color,\\n\\t\\tuint8 distribution\\n\\t) internal returns (int8 newDelta, uint8 newEnemyMap) {\\n\\t\\t(\\n\\t\\t\\tint8 newComputedDelta,\\n\\t\\t\\tuint8 newComputedEnemyMap,\\n\\t\\t\\tuint8 numDue,\\n\\t\\t\\taddress[4] memory ownersToPay\\n\\t\\t) = _updateNeighbours(move.position, epoch, color, move.color, distribution);\\n\\n\\t\\tif (numDue > 0) {\\n\\t\\t\\t_collectTransfer(\\n\\t\\t\\t\\ttransferCollection,\\n\\t\\t\\t\\tTokenTransfer({to: payable(_ownerOf(move.position)), amount: (numDue * NUM_TOKENS_PER_GEMS) / 12})\\n\\t\\t\\t);\\n\\t\\t}\\n\\t\\tfor (uint8 i = 0; i < 4; i++) {\\n\\t\\t\\tif (ownersToPay[i] != address(0)) {\\n\\t\\t\\t\\t_collectTransfer(\\n\\t\\t\\t\\t\\ttransferCollection,\\n\\t\\t\\t\\t\\tTokenTransfer({to: payable(ownersToPay[i]), amount: (NUM_TOKENS_PER_GEMS / (distribution & 0x0f))})\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tnewDelta = newComputedDelta;\\n\\t\\tnewEnemyMap = newComputedEnemyMap;\\n\\t}\\n\\n\\tfunction _poke(TokenTransferCollection memory transferCollection, uint64 position) internal {\\n\\t\\t(uint24 epoch, ) = _epoch();\\n\\t\\tCell memory currentState = _getUpdatedCell(position, epoch);\\n\\n\\t\\tlogger.logCell(\\n\\t\\t\\t0,\\n\\t\\t\\tstring.concat('_poke at epoch ', Strings.toString(epoch)),\\n\\t\\t\\tposition,\\n\\t\\t\\tcurrentState,\\n\\t\\t\\taddress(uint160(_owners[position]))\\n\\t\\t);\\n\\n\\t\\t// we might have distribution still to do\\n\\t\\tuint8 distribution = currentState.distribution;\\n\\t\\tif (currentState.life == 0 && currentState.lastEpochUpdate != 0) {\\n\\t\\t\\t// if we just died, currentState.lastEpochUpdate > 0\\n\\t\\t\\t// we have to distribute to all\\n\\t\\t\\tdistribution = (currentState.enemyMap << 4) + _countBits(currentState.enemyMap);\\n\\n\\t\\t\\t/// we are now dead for real\\n\\t\\t\\tcurrentState.lastEpochUpdate = 0;\\n\\t\\t}\\n\\n\\t\\t(, , uint8 numDue, address[4] memory ownersToPay) = _updateNeighbours(\\n\\t\\t\\tposition,\\n\\t\\t\\tepoch,\\n\\t\\t\\tcurrentState.color,\\n\\t\\t\\tcurrentState.color,\\n\\t\\t\\tdistribution\\n\\t\\t);\\n\\n\\t\\tif (numDue > 0) {\\n\\t\\t\\t_collectTransfer(\\n\\t\\t\\t\\ttransferCollection,\\n\\t\\t\\t\\tTokenTransfer({to: payable(_ownerOf(position)), amount: numDue * NUM_TOKENS_PER_GEMS})\\n\\t\\t\\t);\\n\\t\\t}\\n\\t\\tfor (uint8 i = 0; i < 4; i++) {\\n\\t\\t\\tif (ownersToPay[i] != address(0)) {\\n\\t\\t\\t\\t_collectTransfer(\\n\\t\\t\\t\\t\\ttransferCollection,\\n\\t\\t\\t\\t\\tTokenTransfer({to: payable(ownersToPay[i]), amount: NUM_TOKENS_PER_GEMS})\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tcurrentState.distribution = 0;\\n\\t\\t_cells[position] = currentState;\\n\\t}\\n\\n\\tfunction _updateNeighbours(\\n\\t\\tuint64 position,\\n\\t\\tuint24 epoch,\\n\\t\\tColor oldColor,\\n\\t\\tColor newColor,\\n\\t\\tuint8 distribution\\n\\t) internal returns (int8 newDelta, uint8 newenemyMap, uint8 numDue, address[4] memory ownersToPay) {\\n\\t\\tunchecked {\\n\\t\\t\\tint256 x = int256(int32(int256(uint256(position) & 0xFFFFFFFF)));\\n\\t\\t\\tint256 y = int256(int32(int256(uint256(position) >> 32)));\\n\\n\\t\\t\\tint8 enemyOrFriend;\\n\\t\\t\\tuint8 due;\\n\\t\\t\\t{\\n\\t\\t\\t\\tuint64 upPosition = uint64((uint256(y - 1) << 32) + uint256(x));\\n\\t\\t\\t\\t(enemyOrFriend, due) = _updateCell(upPosition, epoch, 2, oldColor, newColor);\\n\\t\\t\\t\\tif (enemyOrFriend < 0) {\\n\\t\\t\\t\\t\\tnewenemyMap = newenemyMap | 1;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnumDue += due;\\n\\t\\t\\t\\tif ((distribution >> 4) & 4 == 4) {\\n\\t\\t\\t\\t\\t// TODO?: if we decide to group owner in the cell struct, we should get the cell in memory in that function\\n\\t\\t\\t\\t\\townersToPay[0] = _ownerOf(upPosition);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnewDelta += enemyOrFriend;\\n\\t\\t\\t}\\n\\t\\t\\t{\\n\\t\\t\\t\\tuint64 leftPosition = uint64((uint256(y) << 32) + uint256(x - 1));\\n\\n\\t\\t\\t\\t(enemyOrFriend, due) = _updateCell(leftPosition, epoch, 3, oldColor, newColor);\\n\\t\\t\\t\\tif (enemyOrFriend < 0) {\\n\\t\\t\\t\\t\\tnewenemyMap = newenemyMap | 2;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnumDue += due;\\n\\t\\t\\t\\tif ((distribution >> 4) & 8 == 8) {\\n\\t\\t\\t\\t\\townersToPay[1] = _ownerOf(leftPosition);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnewDelta += enemyOrFriend;\\n\\t\\t\\t}\\n\\n\\t\\t\\t{\\n\\t\\t\\t\\tuint64 downPosition = uint64((uint256(y + 1) << 32) + uint256(x));\\n\\t\\t\\t\\t(enemyOrFriend, due) = _updateCell(downPosition, epoch, 0, oldColor, newColor);\\n\\t\\t\\t\\tif (enemyOrFriend < 0) {\\n\\t\\t\\t\\t\\tnewenemyMap = newenemyMap | 4;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnumDue += due;\\n\\t\\t\\t\\tif ((distribution >> 4) & 1 == 1) {\\n\\t\\t\\t\\t\\townersToPay[2] = _ownerOf(downPosition);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnewDelta += enemyOrFriend;\\n\\t\\t\\t}\\n\\t\\t\\t{\\n\\t\\t\\t\\tuint64 rightPosition = uint64((uint256(y) << 32) + uint256(x + 1));\\n\\t\\t\\t\\t(enemyOrFriend, due) = _updateCell(rightPosition, epoch, 1, oldColor, newColor);\\n\\t\\t\\t\\tif (enemyOrFriend < 0) {\\n\\t\\t\\t\\t\\tnewenemyMap = newenemyMap | 8;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnumDue += due;\\n\\t\\t\\t\\tif ((distribution >> 4) & 2 == 2) {\\n\\t\\t\\t\\t\\townersToPay[3] = _ownerOf(rightPosition);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnewDelta += enemyOrFriend;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t/// @dev This update the cell in storage\\n\\tfunction _updateCell(\\n\\t\\tuint64 position,\\n\\t\\tuint24 epoch,\\n\\t\\tuint8 neighbourIndex,\\n\\t\\tColor oldColor,\\n\\t\\tColor newColor\\n\\t) internal returns (int8 enemyOrFriend, uint8 due) {\\n\\t\\tCell memory cell = _cells[position];\\n\\n\\t\\tuint24 lastUpdate = cell.lastEpochUpdate;\\n\\t\\tColor color = cell.color;\\n\\t\\tif (color != Color.None) {\\n\\t\\t\\tenemyOrFriend = color == newColor ? int8(1) : int8(-1);\\n\\t\\t}\\n\\t\\tif (lastUpdate >= 1 && color != Color.None) {\\n\\t\\t\\t// we only consider cell with color that are not dead\\n\\t\\t\\tif (cell.life > 0 && lastUpdate < epoch) {\\n\\t\\t\\t\\t// of there is life to update we compute the new life\\n\\t\\t\\t\\t(uint8 newLife, uint24 epochUsed) = _computeNewLife(\\n\\t\\t\\t\\t\\tlastUpdate,\\n\\t\\t\\t\\t\\tcell.enemyMap,\\n\\t\\t\\t\\t\\tcell.delta,\\n\\t\\t\\t\\t\\tcell.life,\\n\\t\\t\\t\\t\\tepoch\\n\\t\\t\\t\\t);\\n\\t\\t\\t\\tdue = _updateCellFromNeighbor(position, cell, newLife, epochUsed, neighbourIndex, oldColor, newColor);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tdue = _updateCellFromNeighbor(position, cell, cell.life, epoch, neighbourIndex, oldColor, newColor);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tfunction _updateCellFromNeighbor(\\n\\t\\tuint64 position, // position of the cell to be updated\\n\\t\\tCell memory cell, // cell to be updated\\n\\t\\tuint8 newLife, // new life value for the celll\\n\\t\\tuint24 epoch, // epoch at which the update occured (epochUsed TODO: confirm its use)\\n\\t\\tuint8 neighbourIndex, // the neighbor triggering the update and for which we return whether it should receive its due\\n\\t\\tColor oldColor, // old color of that neighbor\\n\\t\\tColor newColor // new color of that neighbor\\n\\t) internal returns (uint8 due) {\\n\\t\\tif (cell.life > 0 && newLife == 0) {\\n\\t\\t\\t// we just died, we establish the distributionMap and counts\\n\\t\\t\\tcell.distribution = (cell.enemyMap << 4) + _countBits(cell.enemyMap);\\n\\t\\t}\\n\\n\\t\\tlogger.logCell(\\n\\t\\t\\t0,\\n\\t\\t\\tstring.concat('_updateCellFromNeighbor index', Strings.toString(neighbourIndex)),\\n\\t\\t\\tposition,\\n\\t\\t\\tcell,\\n\\t\\t\\taddress(uint160(_owners[position]))\\n\\t\\t);\\n\\n\\t\\tif ((cell.distribution >> 4) & (2 ** neighbourIndex) == 2 ** neighbourIndex) {\\n\\t\\t\\tdue = 12 / (cell.distribution & 0x0f);\\n\\t\\t\\tcell.distribution =\\n\\t\\t\\t\\t(uint8(uint256(cell.distribution >> 4) & (~(2 ** uint256(neighbourIndex)))) << 4) +\\n\\t\\t\\t\\t(cell.distribution & 0x0f);\\n\\t\\t}\\n\\n\\t\\tif (oldColor != newColor) {\\n\\t\\t\\tif (newColor == Color.None) {\\n\\t\\t\\t\\tif (cell.color == oldColor) {\\n\\t\\t\\t\\t\\tcell.delta -= 1;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tcell.delta += 1;\\n\\t\\t\\t\\t\\tcell.enemyMap = cell.enemyMap & uint8((1 << neighbourIndex) ^ 0xFF);\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else if (cell.color == oldColor) {\\n\\t\\t\\t\\t// then newColor is different (see assert above)\\n\\t\\t\\t\\tcell.enemyMap = cell.enemyMap | uint8(1 << neighbourIndex);\\n\\t\\t\\t\\tcell.delta -= 2;\\n\\t\\t\\t} else if (cell.color == newColor) {\\n\\t\\t\\t\\t// then old color was different\\n\\t\\t\\t\\tcell.delta += (oldColor == Color.None ? int8(1) : int8(2));\\n\\t\\t\\t\\tcell.enemyMap = cell.enemyMap & uint8((1 << neighbourIndex) ^ 0xFF);\\n\\t\\t\\t} else if (oldColor == Color.None) {\\n\\t\\t\\t\\t// if there were no oldCOlor and the newColor is not your (already checked in previous if clause)\\n\\t\\t\\t\\tcell.delta -= 1;\\n\\t\\t\\t\\tcell.enemyMap = cell.enemyMap | uint8(1 << neighbourIndex);\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tcell.lastEpochUpdate = epoch;\\n\\t\\tcell.life = newLife;\\n\\n\\t\\tlogger.logCell(\\n\\t\\t\\t0,\\n\\t\\t\\tstring.concat('AFTER _updateCellFromNeighbor index', Strings.toString(neighbourIndex)),\\n\\t\\t\\tposition,\\n\\t\\t\\tcell,\\n\\t\\t\\taddress(uint160(_owners[position]))\\n\\t\\t);\\n\\n\\t\\t_cells[position] = cell;\\n\\t}\\n}\\n\",\"keccak256\":\"0xb3431344216d678974e84e5870b55f021059015b8add0dba32848686e8371dd2\",\"license\":\"AGPL-3.0\"},\"src/game/internal/UsingStratagemsState.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nimport './UsingStratagemsStore.sol';\\nimport '../interface/UsingStratagemsEvents.sol';\\nimport '../interface/UsingStratagemsErrors.sol';\\nimport './UsingVirtualTime.sol';\\n\\n// TODO use hardhat-preprocessor\\nimport 'hardhat/console.sol';\\nimport '@openzeppelin/contracts/utils/Strings.sol';\\n\\nlibrary logger {\\n\\taddress constant CONSOLE_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67;\\n\\n\\tfunction _sendLogPayload(bytes memory payload) private view {\\n\\t\\taddress consoleAddress = CONSOLE_ADDRESS;\\n\\t\\t/// @solidity memory-safe-assembly\\n\\t\\tassembly {\\n\\t\\t\\tpop(staticcall(gas(), consoleAddress, add(payload, 32), mload(payload), 0, 0))\\n\\t\\t}\\n\\t}\\n\\n\\t// _sendLogPayload(abi.encodeWithSignature('log(string,int256,int256)', 'cell %s', x, y));\\n\\n\\tfunction logCell(\\n\\t\\tuint8 ii,\\n\\t\\tstring memory title,\\n\\t\\tuint64 id,\\n\\t\\tUsingStratagemsTypes.Cell memory cell,\\n\\t\\taddress owner\\n\\t) internal view {\\n\\t\\t// string memory indent = ii == 0 ? '' : ii == 1 ? ' ' : ii == 2 ? ' ' : ' ';\\n\\t\\t// // string memory indent = '';\\n\\t\\t// console.log('%s%s', indent, title);\\n\\t\\t// int256 x = int256(int32(int256(uint256(id) & 0xFFFFFFFF)));\\n\\t\\t// int256 y = int256(int32(int256(uint256(id) >> 32)));\\n\\t\\t// console.log('%s-------------------------------------------------------------', indent);\\n\\t\\t// console.log('%scell (%s,%s)', indent, Strings.toString(x), Strings.toString(y));\\n\\t\\t// console.log('%s-------------------------------------------------------------', indent);\\n\\t\\t// console.log('%s - lastEpochUpdate: %s', indent, cell.lastEpochUpdate);\\n\\t\\t// console.log('%s - epochWhenTokenIsAdded: %s', indent, cell.epochWhenTokenIsAdded);\\n\\t\\t// console.log('%s - color: %s', indent, uint8(cell.color));\\n\\t\\t// console.log('%s - life: %s', indent, cell.life);\\n\\t\\t// console.log('%s - distribution: %s', indent, cell.distribution);\\n\\t\\t// console.log('%s - owner: %s', indent, owner);\\n\\t\\t// console.log('%s - delta: %s', indent, Strings.toString(cell.delta));\\n\\t\\t// console.log('%s - enemyMap: %s', indent, cell.enemyMap);\\n\\t\\t// console.log('%s-------------------------------------------------------------', indent);\\n\\t}\\n\\n\\tfunction logTransfers(\\n\\t\\tuint8 ii,\\n\\t\\tstring memory title,\\n\\t\\tUsingStratagemsTypes.TokenTransferCollection memory transferCollection\\n\\t) internal pure {\\n\\t\\t// string memory indent = ii == 0 ? '' : ii == 1 ? ' ' : ii == 2 ? ' ' : ' ';\\n\\t\\t// // string memory indent = '';\\n\\t\\t// console.log('%s%s', indent, title);\\n\\t\\t// console.log('%s-------------------------------------------------------------', indent);\\n\\t\\t// for (uint256 i = 0; i < transferCollection.numTransfers; i++) {\\n\\t\\t// \\tconsole.log(\\n\\t\\t// \\t\\t'%stransfer (%s,%s)',\\n\\t\\t// \\t\\tindent,\\n\\t\\t// \\t\\ttransferCollection.transfers[i].to,\\n\\t\\t// \\t\\tStrings.toString(transferCollection.transfers[i].amount)\\n\\t\\t// \\t);\\n\\t\\t// }\\n\\t\\t// console.log('%s-------------------------------------------------------------', indent);\\n\\t}\\n}\\n\\nabstract contract UsingStratagemsState is\\n\\tUsingStratagemsStore,\\n\\tUsingStratagemsEvents,\\n\\tUsingStratagemsErrors,\\n\\tUsingVirtualTime\\n{\\n\\t/// @notice The token used for the game. Each gems on the board contains that token\\n\\tIERC20WithIERC2612 internal immutable TOKENS;\\n\\t/// @notice the timestamp (in seconds) at which the game start, it start in the commit phase\\n\\tuint256 internal immutable START_TIME;\\n\\t/// @notice the duration of the commit phase in seconds\\n\\tuint256 internal immutable COMMIT_PHASE_DURATION;\\n\\t/// @notice the duration of the resolution phase in seconds\\n\\tuint256 internal immutable RESOLUTION_PHASE_DURATION;\\n\\t/// @notice the max number of level a cell can reach in the game\\n\\tuint8 internal immutable MAX_LIFE;\\n\\t/// @notice the number of tokens underlying each gems on the board.\\n\\tuint256 internal immutable NUM_TOKENS_PER_GEMS;\\n\\t/// @notice the address to send the token to when burning\\n\\taddress payable internal immutable BURN_ADDRESS;\\n\\n\\t/// @notice the number of moves a hash represent, after that players make use of furtherMoves\\n\\tuint8 internal constant MAX_NUM_MOVES_PER_HASH = 32;\\n\\n\\t/// @notice Create an instance of a Stratagems game\\n\\t/// @param config configuration options for the game\\n\\tconstructor(Config memory config) {\\n\\t\\tTOKENS = config.tokens;\\n\\t\\tBURN_ADDRESS = config.burnAddress;\\n\\t\\tSTART_TIME = config.startTime;\\n\\t\\tCOMMIT_PHASE_DURATION = config.commitPhaseDuration;\\n\\t\\tRESOLUTION_PHASE_DURATION = config.resolutionPhaseDuration;\\n\\t\\tMAX_LIFE = config.maxLife;\\n\\t\\tNUM_TOKENS_PER_GEMS = config.numTokensPerGems;\\n\\t}\\n\\n\\tfunction _epoch() internal view virtual returns (uint24 epoch, bool commiting) {\\n\\t\\tuint256 epochDuration = COMMIT_PHASE_DURATION + RESOLUTION_PHASE_DURATION;\\n\\t\\tuint256 time = _timestamp();\\n\\t\\tif (time < START_TIME) {\\n\\t\\t\\trevert GameNotStarted();\\n\\t\\t}\\n\\t\\tuint256 timePassed = time - START_TIME;\\n\\t\\tepoch = uint24(timePassed / epochDuration + 2); // epoch start at 2, this make the hypothetical previous resolution phase's epoch to be 1\\n\\t\\tcommiting = timePassed - ((epoch - 2) * epochDuration) < COMMIT_PHASE_DURATION;\\n\\t}\\n\\n\\tfunction _computeNewLife(\\n\\t\\tuint24 lastUpdate,\\n\\t\\tuint8 enemyMap,\\n\\t\\tint8 delta,\\n\\t\\tuint8 life,\\n\\t\\tuint24 epoch\\n\\t) internal view returns (uint8 newLife, uint24 epochUsed) {\\n\\t\\tepochUsed = lastUpdate;\\n\\t\\tif (lastUpdate >= 1 && life > 0) {\\n\\t\\t\\tuint256 epochDelta = epoch - lastUpdate;\\n\\t\\t\\tif (epochDelta > 0) {\\n\\t\\t\\t\\tint8 effectiveDelta = delta != 0 ? delta : -1;\\n\\t\\t\\t\\tif (effectiveDelta < 0 && enemyMap == 0) {\\n\\t\\t\\t\\t\\teffectiveDelta = 0;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif (effectiveDelta > 0) {\\n\\t\\t\\t\\t\\tif (life < MAX_LIFE) {\\n\\t\\t\\t\\t\\t\\tuint8 maxEpoch = ((MAX_LIFE - life) + uint8(effectiveDelta) - 1) / uint8(effectiveDelta);\\n\\t\\t\\t\\t\\t\\tif (epochDelta > maxEpoch) {\\n\\t\\t\\t\\t\\t\\t\\tepochDelta = maxEpoch;\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\tlife += uint8(epochDelta) * uint8(effectiveDelta);\\n\\t\\t\\t\\t\\t\\tif (life > MAX_LIFE) {\\n\\t\\t\\t\\t\\t\\t\\tlife = MAX_LIFE;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tnewLife = life;\\n\\t\\t\\t\\t\\t\\tepochUsed = lastUpdate + uint24(epochDelta);\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tnewLife = life;\\n\\t\\t\\t\\t\\t\\tepochUsed = lastUpdate;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} else if (effectiveDelta < 0) {\\n\\t\\t\\t\\t\\tuint8 numEpochBeforeDying = (life + uint8(-effectiveDelta) - 1) / uint8(-effectiveDelta);\\n\\t\\t\\t\\t\\tif (epochDelta > numEpochBeforeDying) {\\n\\t\\t\\t\\t\\t\\tepochDelta = numEpochBeforeDying;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tuint8 lifeLoss = uint8(epochDelta) * uint8(-effectiveDelta);\\n\\t\\t\\t\\t\\tif (lifeLoss > life) {\\n\\t\\t\\t\\t\\t\\tnewLife = 0;\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tnewLife = life - lifeLoss;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tepochUsed = lastUpdate + uint24(epochDelta);\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tnewLife = life;\\n\\t\\t\\t\\t\\tepochUsed = epoch;\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tnewLife = life;\\n\\t\\t\\t\\tepochUsed = lastUpdate;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tfunction _getUpdatedCell(uint64 position, uint24 epoch) internal view returns (Cell memory updatedCell) {\\n\\t\\t// load from state\\n\\t\\tupdatedCell = _cells[position];\\n\\t\\tuint24 lastUpdate = updatedCell.lastEpochUpdate;\\n\\t\\tint8 delta = updatedCell.delta;\\n\\t\\tuint8 life = updatedCell.life;\\n\\t\\t// logger.logCell(0, 'before update', position, updatedCell, address(uint160(_owners[position])));\\n\\t\\tif (lastUpdate >= 1 && life > 0) {\\n\\t\\t\\t(uint8 newLife, uint24 epochUsed) = _computeNewLife(lastUpdate, updatedCell.enemyMap, delta, life, epoch);\\n\\t\\t\\tupdatedCell.life = newLife;\\n\\t\\t\\tupdatedCell.lastEpochUpdate = epochUsed; // TODO check if this is useful to cap it to epoch where it died\\n\\t\\t}\\n\\t}\\n\\n\\t/// @dev Get the owner of a token.\\n\\t/// @param tokenID The token to query.\\n\\tfunction _ownerOf(uint256 tokenID) internal view virtual returns (address owner) {\\n\\t\\towner = address(uint160(_owners[tokenID]));\\n\\t}\\n}\\n\",\"keccak256\":\"0x93630a64cfb85f8cab1d9971293bf41718c3f6457cd2de39c68bead638803f85\",\"license\":\"AGPL-3.0\"},\"src/game/internal/UsingStratagemsStore.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nimport '../interface/UsingStratagemsTypes.sol';\\n\\ncontract UsingStratagemsStore is UsingStratagemsTypes {\\n\\tmapping(uint256 => Cell) internal _cells;\\n\\tmapping(uint256 => uint256) internal _owners; //owner + approval + ... erc721\\n\\n\\tmapping(address => uint256) internal _tokensInReserve;\\n\\tmapping(address => Commitment) internal _commitments;\\n\\n\\t// Operators (also used by ERC721)\\n\\tmapping(address => mapping(address => bool)) internal _operatorsForAll;\\n\\tmapping(uint256 => address) internal _operators;\\n\\n\\t// ERC721 balanceOf\\n\\t// mapping(address => uint256) internal _balances;\\n}\\n\",\"keccak256\":\"0x67d22bbc7eb4513799c8038a35e581d90ee2cb213051850ebd59f4e78cc44a2d\",\"license\":\"AGPL-3.0\"},\"src/game/internal/UsingStratagemsUtils.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nimport '../interface/UsingStratagemsTypes.sol';\\nimport '../interface/UsingStratagemsErrors.sol';\\n\\nabstract contract UsingStratagemsUtils is UsingStratagemsTypes, UsingStratagemsErrors {\\n\\tfunction _checkHash(\\n\\t\\tbytes24 commitmentHash,\\n\\t\\tbytes32 secret,\\n\\t\\tMove[] memory moves,\\n\\t\\tbytes24 furtherMoves\\n\\t) internal pure {\\n\\t\\tif (furtherMoves != bytes24(0)) {\\n\\t\\t\\tbytes24 computedHash = bytes24(keccak256(abi.encode(secret, moves, furtherMoves)));\\n\\t\\t\\tif (commitmentHash != computedHash) {\\n\\t\\t\\t\\trevert CommitmentHashNotMatching();\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\tbytes24 computedHash = bytes24(keccak256(abi.encode(secret, moves)));\\n\\t\\t\\tif (commitmentHash != computedHash) {\\n\\t\\t\\t\\trevert CommitmentHashNotMatching();\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tfunction _collectTransfer(\\n\\t\\tTokenTransferCollection memory transferCollection,\\n\\t\\tTokenTransfer memory newTransfer\\n\\t) internal pure {\\n\\t\\t// we look for the newTransfer address in case it is already present\\n\\t\\tfor (uint256 k = 0; k < transferCollection.numTransfers; k++) {\\n\\t\\t\\tif (transferCollection.transfers[k].to == newTransfer.to) {\\n\\t\\t\\t\\t// if we found we add the amount\\n\\t\\t\\t\\ttransferCollection.transfers[k].amount += newTransfer.amount;\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t// if we did not find that address we add it to the end\\n\\t\\ttransferCollection.transfers[transferCollection.numTransfers].to = newTransfer.to;\\n\\t\\ttransferCollection.transfers[transferCollection.numTransfers].amount = newTransfer.amount;\\n\\t\\t// and increase the size to lookup for next time\\n\\t\\ttransferCollection.numTransfers++;\\n\\t}\\n\\n\\tfunction _multiTransfer(IERC20WithIERC2612 token, TokenTransferCollection memory transferCollection) internal {\\n\\t\\tfor (uint256 i = 0; i < transferCollection.numTransfers; i++) {\\n\\t\\t\\ttoken.transfer(transferCollection.transfers[i].to, transferCollection.transfers[i].amount);\\n\\t\\t}\\n\\t}\\n}\\n\",\"keccak256\":\"0x20ffcba1168cd6bf7b408c0265c79c8b56f022d36068e8188833ec3d1a06831d\",\"license\":\"AGPL-3.0\"},\"src/game/internal/UsingVirtualTime.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nabstract contract UsingVirtualTime {\\n\\t// TODO use hardhat-preprocessor\\n\\n\\tfunction _timestamp() internal view returns (uint256) {\\n\\t\\tuint256 delta;\\n\\t\\tassembly {\\n\\t\\t\\t// keccak256(\\\"time\\\") - 1\\n\\t\\t\\tdelta := sload(0x112c413de07a110ce0a9ace0c01e41b5b59462770325b042f0dc72c337f55f2)\\n\\t\\t}\\n\\t\\treturn block.timestamp + delta;\\n\\t}\\n}\\n\",\"keccak256\":\"0x4eec90855ba4ef869425250bdd97a93693ee65d94d96697b953345cd08c51048\",\"license\":\"AGPL-3.0\"}},\"version\":1}", + "storageLayout": { + "storage": [ + { + "astId": 13922, + "contract": "src/game/debug/StratagemsDebug.sol:StratagemsDebug", + "label": "_cells", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_uint256,t_struct(Cell)11667_storage)" + }, + { + "astId": 13926, + "contract": "src/game/debug/StratagemsDebug.sol:StratagemsDebug", + "label": "_owners", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_uint256,t_uint256)" + }, + { + "astId": 13930, + "contract": "src/game/debug/StratagemsDebug.sol:StratagemsDebug", + "label": "_tokensInReserve", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 13935, + "contract": "src/game/debug/StratagemsDebug.sol:StratagemsDebug", + "label": "_commitments", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Commitment)11672_storage)" + }, + { + "astId": 13941, + "contract": "src/game/debug/StratagemsDebug.sol:StratagemsDebug", + "label": "_operatorsForAll", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))" + }, + { + "astId": 13945, + "contract": "src/game/debug/StratagemsDebug.sol:StratagemsDebug", + "label": "_operators", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_uint256,t_address)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes24": { + "encoding": "inplace", + "label": "bytes24", + "numberOfBytes": "24" + }, + "t_enum(Color)11596": { + "encoding": "inplace", + "label": "enum UsingStratagemsTypes.Color", + "numberOfBytes": "1" + }, + "t_int8": { + "encoding": "inplace", + "label": "int8", + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_bool)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_address,t_mapping(t_address,t_bool))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => bool))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_bool)" + }, + "t_mapping(t_address,t_struct(Commitment)11672_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => struct UsingStratagemsTypes.Commitment)", + "numberOfBytes": "32", + "value": "t_struct(Commitment)11672_storage" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_mapping(t_uint256,t_address)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => address)", + "numberOfBytes": "32", + "value": "t_address" + }, + "t_mapping(t_uint256,t_struct(Cell)11667_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => struct UsingStratagemsTypes.Cell)", + "numberOfBytes": "32", + "value": "t_struct(Cell)11667_storage" + }, + "t_mapping(t_uint256,t_uint256)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_struct(Cell)11667_storage": { + "encoding": "inplace", + "label": "struct UsingStratagemsTypes.Cell", + "members": [ + { + "astId": 11653, + "contract": "src/game/debug/StratagemsDebug.sol:StratagemsDebug", + "label": "lastEpochUpdate", + "offset": 0, + "slot": "0", + "type": "t_uint24" + }, + { + "astId": 11655, + "contract": "src/game/debug/StratagemsDebug.sol:StratagemsDebug", + "label": "epochWhenTokenIsAdded", + "offset": 3, + "slot": "0", + "type": "t_uint24" + }, + { + "astId": 11658, + "contract": "src/game/debug/StratagemsDebug.sol:StratagemsDebug", + "label": "color", + "offset": 6, + "slot": "0", + "type": "t_enum(Color)11596" + }, + { + "astId": 11660, + "contract": "src/game/debug/StratagemsDebug.sol:StratagemsDebug", + "label": "life", + "offset": 7, + "slot": "0", + "type": "t_uint8" + }, + { + "astId": 11662, + "contract": "src/game/debug/StratagemsDebug.sol:StratagemsDebug", + "label": "delta", + "offset": 8, + "slot": "0", + "type": "t_int8" + }, + { + "astId": 11664, + "contract": "src/game/debug/StratagemsDebug.sol:StratagemsDebug", + "label": "enemyMap", + "offset": 9, + "slot": "0", + "type": "t_uint8" + }, + { + "astId": 11666, + "contract": "src/game/debug/StratagemsDebug.sol:StratagemsDebug", + "label": "distribution", + "offset": 10, + "slot": "0", + "type": "t_uint8" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Commitment)11672_storage": { + "encoding": "inplace", + "label": "struct UsingStratagemsTypes.Commitment", + "members": [ + { + "astId": 11669, + "contract": "src/game/debug/StratagemsDebug.sol:StratagemsDebug", + "label": "hash", + "offset": 0, + "slot": "0", + "type": "t_bytes24" + }, + { + "astId": 11671, + "contract": "src/game/debug/StratagemsDebug.sol:StratagemsDebug", + "label": "epoch", + "offset": 24, + "slot": "0", + "type": "t_uint24" + } + ], + "numberOfBytes": "32" + }, + "t_uint24": { + "encoding": "inplace", + "label": "uint24", + "numberOfBytes": "3" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "encoding": "inplace", + "label": "uint8", + "numberOfBytes": "1" + } + } + }, + "userdoc": { + "errors": { + "CanStillResolve()": [ + { + "notice": "Player have to resolve if they can Stratagems will prevent them from acknowledging missed resolution if there is still time to resolve." + } + ], + "CommitmentHashNotMatching()": [ + { + "notice": "Player have to reveal their commitment using the exact same move values If they provide different value, the commitment hash will differ and Stratagems will reject their resolution." + } + ], + "GameNotStarted()": [ + { + "notice": "Game has not started yet, can't perform any action" + } + ], + "InCommitmentPhase()": [ + { + "notice": "When in Commit phase, player can make new commitment but they cannot resolve their move yet." + } + ], + "InResolutionPhase()": [ + { + "notice": "When in Resolution phase, it is not possible to commit new moves or cancel previous commitment During Resolution phase, players have to reveal their commitment, if not already done." + } + ], + "InvalidEpoch()": [ + { + "notice": "Player can only resolve their move in the same epoch they commited.abi If a player resolve later it can only do to minimize the reserve burn cost by calling : `acknowledgeMissedResolution`" + } + ], + "InvalidFurtherMoves()": [ + { + "notice": "Player can make arbitrary number of moves per epoch. To do so they group moves into (MAX_NUM_MOVES_PER_HASH = 32) moves This result in a recursive series of hash that they can then submit in turn while resolving. The limit (MAX_NUM_MOVES_PER_HASH = 32) ensure a resolution batch fits in a block." + } + ], + "NotAuthorized()": [ + { + "notice": "Not authorized to perform this operation" + } + ], + "NothingToResolve()": [ + { + "notice": "Player can only resolve moves they commited." + } + ], + "PreviousCommitmentNotResolved()": [ + { + "notice": "Previous commitment need to be resolved before making a new one. Even if the corresponding reveal phase has passed.\\ It is also not possible to withdraw any amount from reserve until the commitment is revealed.\\If player lost the information to reveal, it can acknowledge failure which will burn all its reserve.\\" + } + ], + "ReserveTooLow(uint256,uint256)": [ + { + "notice": "to make a commitment you always need at least one `config.numTokensPerGems` amount in reserve Player also need one `config.numTokensPerGems` per moves during the resolution phase." + } + ] + }, + "events": { + "CommitmentCancelled(address,uint24)": { + "notice": "A player has cancelled its current commitment (before it reached the resolution phase)" + }, + "CommitmentMade(address,uint24,bytes24)": { + "notice": "A player has commited to make a move and resolve it on the resolution phase" + }, + "CommitmentResolved(address,uint24,bytes24,(uint64,uint8)[],bytes24,uint256)": { + "notice": "Player has resolved its previous commitment" + }, + "CommitmentVoid(address,uint24,uint256,bytes24)": { + "notice": "A player has canceled a previous commitment by burning some tokens" + }, + "MoveProcessed(uint64,address,uint8,uint8)": { + "notice": "A move has been resolved." + }, + "ReserveDeposited(address,uint256,uint256)": { + "notice": "Player has deposited token in the reserve, allowing it to use that much in game" + }, + "ReserveWithdrawn(address,uint256,uint256)": { + "notice": "Player have withdrawn token from the reserve" + } + }, + "kind": "user", + "methods": {}, + "version": 1 + }, + "argsData": "0x0000000000000000000000004c78783faac7636c0d55605ae5bd1d6b9a62f496000000000000000000000000deaddeaddeaddeaddeaddeaddeaddeaddeaddead000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000143700000000000000000000000000000000000000000000000000000000000000e1000000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000de0b6b3a7640000", + "transaction": { + "hash": "0x9435f753bebc1a5b5392adf3f1602c92899af9682bcaf9773d9171ce160bbea1", + "nonce": "0x8a", + "origin": "0x61c461ecc993aadeb7e4b47e96d1b8cc37314b20" + } +} \ No newline at end of file diff --git a/contracts/deployments/sepolia/Stratagems_Implementation_Router_ERC721_Route.json b/contracts/deployments/sepolia/Stratagems_Implementation_Router_ERC721_Route.json new file mode 100644 index 00000000..c35dd6eb --- /dev/null +++ b/contracts/deployments/sepolia/Stratagems_Implementation_Router_ERC721_Route.json @@ -0,0 +1,1411 @@ +{ + "address": "0xefe0a109697c36352128890d3d30d747b916dc39", + "abi": [ + { + "inputs": [ + { + "components": [ + { + "internalType": "contract IERC20WithIERC2612", + "name": "tokens", + "type": "address" + }, + { + "internalType": "address payable", + "name": "burnAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "commitPhaseDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "resolutionPhaseDuration", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "maxLife", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "numTokensPerGems", + "type": "uint256" + } + ], + "internalType": "struct UsingStratagemsTypes.Config", + "name": "config", + "type": "tuple" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "CanStillResolve", + "type": "error" + }, + { + "inputs": [], + "name": "CommitmentHashNotMatching", + "type": "error" + }, + { + "inputs": [], + "name": "GameNotStarted", + "type": "error" + }, + { + "inputs": [], + "name": "InCommitmentPhase", + "type": "error" + }, + { + "inputs": [], + "name": "InResolutionPhase", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "name": "InvalidAddress", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidEpoch", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidFurtherMoves", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "NonExistentToken", + "type": "error" + }, + { + "inputs": [], + "name": "NonceOverflow", + "type": "error" + }, + { + "inputs": [], + "name": "NotAuthorized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "provided", + "type": "address" + }, + { + "internalType": "address", + "name": "currentOwner", + "type": "address" + } + ], + "name": "NotOwner", + "type": "error" + }, + { + "inputs": [], + "name": "NothingToResolve", + "type": "error" + }, + { + "inputs": [], + "name": "PreviousCommitmentNotResolved", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "inReserve", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "ReserveTooLow", + "type": "error" + }, + { + "inputs": [], + "name": "TransferRejected", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "approved", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint24", + "name": "epoch", + "type": "uint24" + } + ], + "name": "CommitmentCancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint24", + "name": "epoch", + "type": "uint24" + }, + { + "indexed": false, + "internalType": "bytes24", + "name": "commitmentHash", + "type": "bytes24" + } + ], + "name": "CommitmentMade", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint24", + "name": "epoch", + "type": "uint24" + }, + { + "indexed": true, + "internalType": "bytes24", + "name": "commitmentHash", + "type": "bytes24" + }, + { + "components": [ + { + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "internalType": "enum UsingStratagemsTypes.Color", + "name": "color", + "type": "uint8" + } + ], + "indexed": false, + "internalType": "struct UsingStratagemsTypes.Move[]", + "name": "moves", + "type": "tuple[]" + }, + { + "indexed": false, + "internalType": "bytes24", + "name": "furtherMoves", + "type": "bytes24" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newReserveAmount", + "type": "uint256" + } + ], + "name": "CommitmentResolved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint24", + "name": "epoch", + "type": "uint24" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountBurnt", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes24", + "name": "furtherMoves", + "type": "bytes24" + } + ], + "name": "CommitmentVoid", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "position", + "type": "uint64" + }, + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum UsingStratagemsTypes.Color", + "name": "oldColor", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "enum UsingStratagemsTypes.Color", + "name": "newColor", + "type": "uint8" + } + ], + "name": "MoveProcessed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountDeposited", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newAmount", + "type": "uint256" + } + ], + "name": "ReserveDeposited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountWithdrawn", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newAmount", + "type": "uint256" + } + ], + "name": "ReserveWithdrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "tokenIDs", + "type": "uint256[]" + } + ], + "name": "ownerAndLastTransferBlockNumberList", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "lastTransferBlockNumber", + "type": "uint256" + } + ], + "internalType": "struct IERC721WithBlocknumber.OwnerData[]", + "name": "ownersData", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "ownerAndLastTransferBlockNumberOf", + "outputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceID", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenID", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "contractName": "StratagemsERC721", + "sourceName": "src/game/routes/StratagemsERC721.sol", + "bytecode": "0x61016060405234801562000011575f80fd5b506040516200177a3803806200177a8339810160408190526200003491620000b0565b80516001600160a01b039081166080908152602083015190911661014052604082015160a0908152606083015160c09081529183015160e05282015160ff166101005201516101205262000158565b80516001600160a01b03811681146200009a575f80fd5b919050565b805160ff811681146200009a575f80fd5b5f60e08284031215620000c1575f80fd5b60405160e081016001600160401b0381118282101715620000f057634e487b7160e01b5f52604160045260245ffd5b604052620000fe8362000083565b81526200010e6020840162000083565b60208201526040830151604082015260608301516060820152608083015160808201526200013f60a084016200009f565b60a082015260c083015160c08201528091505092915050565b60805160a05160c05160e0516101005161012051610140516115e5620001955f395f50505f50505f50505f50505f50505f50505f50506115e55ff3fe608060405234801561000f575f80fd5b50600436106100f0575f3560e01c80636352211e11610093578063b88d4fde11610063578063b88d4fde146102ac578063c87b56dd146102bf578063e985e9c5146102d3578063f39452821461031b575f80fd5b80636352211e1461022c57806370a082311461023f57806395d89b4114610260578063a22cb46514610299575f80fd5b8063095ea7b3116100ce578063095ea7b31461019657806323b872dd146101ab57806342842e0e146101be57806348f3c51c146101d1575f80fd5b806301ffc9a7146100f457806306fdde031461011c578063081812fc1461015e575b5f80fd5b610107610102366004611102565b61033b565b60405190151581526020015b60405180910390f35b60408051808201909152600881527f47656d43656c6c7300000000000000000000000000000000000000000000000060208201525b6040516101139190611185565b61017161016c366004611197565b61041f565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610113565b6101a96101a43660046111d1565b6104e0565b005b6101a96101b93660046111f9565b6105ef565b6101a96101cc3660046111f9565b61086a565b6102006101df366004611197565b5f908152600160205260409020549067ffffffffffffffff60b883901c1690565b6040805173ffffffffffffffffffffffffffffffffffffffff9093168352602083019190915201610113565b61017161023a366004611197565b610889565b61025261024d366004611232565b6108ec565b604051908152602001610113565b60408051808201909152600881527f47454d5f43454c4c0000000000000000000000000000000000000000000000006020820152610151565b6101a96102a736600461124b565b610950565b6101a96102ba3660046112b1565b61095f565b6101516102cd366004611197565b50606090565b6101076102e13660046113a4565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260046020908152604080832093909416825291909152205460ff1690565b61032e6103293660046113d5565b610bdc565b6040516101139190611444565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614806103cd57507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b8061041957507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b5f818152600160205260408120547f80000000000000000000000000000000000000000000000000000000000000008082161473ffffffffffffffffffffffffffffffffffffffff82166104a7576040517f38077a2b000000000000000000000000000000000000000000000000000000008152600481018590526024015b60405180910390fd5b80156104d7575050505f9081526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b505f9392505050565b5f818152600160205260409020546affffffffffffffffffffff60a082901c1673ffffffffffffffffffffffffffffffffffffffff8216610550576040517f38077a2b0000000000000000000000000000000000000000000000000000000081526004810184905260240161049e565b3373ffffffffffffffffffffffffffffffffffffffff8316148015906105a6575073ffffffffffffffffffffffffffffffffffffffff82165f90815260046020908152604080832033845290915290205460ff16155b156105dd576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105e982828686610d0e565b50505050565b5f818152600160205260409020546affffffffffffffffffffff60a082901c167f80000000000000000000000000000000000000000000000000000000000000008083161473ffffffffffffffffffffffffffffffffffffffff8316610684576040517f38077a2b0000000000000000000000000000000000000000000000000000000081526004810185905260240161049e565b8273ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610709576040517f23295f0e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80881660048301528416602482015260440161049e565b73ffffffffffffffffffffffffffffffffffffffff85161580610741575073ffffffffffffffffffffffffffffffffffffffff851630145b15610790576040517f8e4c8aa600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616600482015260240161049e565b3373ffffffffffffffffffffffffffffffffffffffff871614610850578080156107dc57505f8481526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1633145b158015610819575073ffffffffffffffffffffffffffffffffffffffff86165f90815260046020908152604080832033845290915290205460ff16155b15610850576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610862868686601886901c1515610e96565b505050505050565b61088483838360405180602001604052805f81525061095f565b505050565b5f8181526001602052604090205473ffffffffffffffffffffffffffffffffffffffff81166108e7576040517f38077a2b0000000000000000000000000000000000000000000000000000000081526004810183905260240161049e565b919050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e4f545f494d504c454d454e544544000000000000000000000000000000000060448201525f9060640161049e565b61095b338383610ef7565b5050565b5f828152600160205260409020546affffffffffffffffffffff60a082901c167f80000000000000000000000000000000000000000000000000000000000000008083161473ffffffffffffffffffffffffffffffffffffffff83166109f4576040517f38077a2b0000000000000000000000000000000000000000000000000000000081526004810186905260240161049e565b8673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610a79576040517f23295f0e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80891660048301528416602482015260440161049e565b73ffffffffffffffffffffffffffffffffffffffff86161580610ab1575073ffffffffffffffffffffffffffffffffffffffff861630145b15610b00576040517f8e4c8aa600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8716600482015260240161049e565b3373ffffffffffffffffffffffffffffffffffffffff881614610bc057808015610b4c57505f8581526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1633145b158015610b89575073ffffffffffffffffffffffffffffffffffffffff87165f90815260046020908152604080832033845290915290205460ff16155b15610bc0576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bd3878787601886901c151588610f8e565b50505050505050565b60608167ffffffffffffffff811115610bf757610bf7611284565b604051908082528060200260200182016040528015610c3b57816020015b604080518082019091525f8082526020820152815260200190600190039081610c155790505b5090505f5b82811015610d07575f60015f868685818110610c5e57610c5e6114a8565b9050602002013581526020019081526020015f2054905080838381518110610c8857610c886114a8565b60200260200101515f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060b881901c67ffffffffffffffff16838381518110610ce657610ce66114a8565b60209081029190910181015101525080610cff81611502565b915050610c40565b5092915050565b601883901c5f610d1f856001611539565b905081601882901c14610d5e576040517fadc1557200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610daa575f83815260016020526040902060a082901b73ffffffffffffffffffffffffffffffffffffffff8816179055610e33565b5f83815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8a811660a087901b177f800000000000000000000000000000000000000000000000000000000000000017909155600590925290912080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169186169190911790555b828473ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b5f828152600160205260408082204360b81b73ffffffffffffffffffffffffffffffffffffffff80881691821790925591518593918816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a450505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526004602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b610f9a85858585610e96565b73ffffffffffffffffffffffffffffffffffffffff84163b15610ffa57610fc43386868685611001565b610ffa576040517f4e472e5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b5f808473ffffffffffffffffffffffffffffffffffffffff1663150b7a02888887876040518563ffffffff1660e01b8152600401611042949392919061154c565b6020604051808303815f875af115801561105e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110829190611594565b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001491505095945050505050565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146110ff575f80fd5b50565b5f60208284031215611112575f80fd5b813561111d816110d2565b9392505050565b5f81518084525f5b818110156111485760208185018101518683018201520161112c565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61111d6020830184611124565b5f602082840312156111a7575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146108e7575f80fd5b5f80604083850312156111e2575f80fd5b6111eb836111ae565b946020939093013593505050565b5f805f6060848603121561120b575f80fd5b611214846111ae565b9250611222602085016111ae565b9150604084013590509250925092565b5f60208284031215611242575f80fd5b61111d826111ae565b5f806040838503121561125c575f80fd5b611265836111ae565b915060208301358015158114611279575f80fd5b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f805f80608085870312156112c4575f80fd5b6112cd856111ae565b93506112db602086016111ae565b925060408501359150606085013567ffffffffffffffff808211156112fe575f80fd5b818701915087601f830112611311575f80fd5b81358181111561132357611323611284565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561136957611369611284565b816040528281528a6020848701011115611381575f80fd5b826020860160208301375f60208483010152809550505050505092959194509250565b5f80604083850312156113b5575f80fd5b6113be836111ae565b91506113cc602084016111ae565b90509250929050565b5f80602083850312156113e6575f80fd5b823567ffffffffffffffff808211156113fd575f80fd5b818501915085601f830112611410575f80fd5b81358181111561141e575f80fd5b8660208260051b8501011115611432575f80fd5b60209290920196919550909350505050565b602080825282518282018190525f919060409081850190868401855b8281101561149b578151805173ffffffffffffffffffffffffffffffffffffffff168552860151868501529284019290850190600101611460565b5091979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611532576115326114d5565b5060010190565b80820180821115610419576104196114d5565b5f73ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261158a6080830184611124565b9695505050505050565b5f602082840312156115a4575f80fd5b815161111d816110d256fea264697066735822122048a30bcf14c8db8943aaac997a4cb0fe02b6efb06798bd008ae4f537e935283764736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100f0575f3560e01c80636352211e11610093578063b88d4fde11610063578063b88d4fde146102ac578063c87b56dd146102bf578063e985e9c5146102d3578063f39452821461031b575f80fd5b80636352211e1461022c57806370a082311461023f57806395d89b4114610260578063a22cb46514610299575f80fd5b8063095ea7b3116100ce578063095ea7b31461019657806323b872dd146101ab57806342842e0e146101be57806348f3c51c146101d1575f80fd5b806301ffc9a7146100f457806306fdde031461011c578063081812fc1461015e575b5f80fd5b610107610102366004611102565b61033b565b60405190151581526020015b60405180910390f35b60408051808201909152600881527f47656d43656c6c7300000000000000000000000000000000000000000000000060208201525b6040516101139190611185565b61017161016c366004611197565b61041f565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610113565b6101a96101a43660046111d1565b6104e0565b005b6101a96101b93660046111f9565b6105ef565b6101a96101cc3660046111f9565b61086a565b6102006101df366004611197565b5f908152600160205260409020549067ffffffffffffffff60b883901c1690565b6040805173ffffffffffffffffffffffffffffffffffffffff9093168352602083019190915201610113565b61017161023a366004611197565b610889565b61025261024d366004611232565b6108ec565b604051908152602001610113565b60408051808201909152600881527f47454d5f43454c4c0000000000000000000000000000000000000000000000006020820152610151565b6101a96102a736600461124b565b610950565b6101a96102ba3660046112b1565b61095f565b6101516102cd366004611197565b50606090565b6101076102e13660046113a4565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260046020908152604080832093909416825291909152205460ff1690565b61032e6103293660046113d5565b610bdc565b6040516101139190611444565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614806103cd57507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b8061041957507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b5f818152600160205260408120547f80000000000000000000000000000000000000000000000000000000000000008082161473ffffffffffffffffffffffffffffffffffffffff82166104a7576040517f38077a2b000000000000000000000000000000000000000000000000000000008152600481018590526024015b60405180910390fd5b80156104d7575050505f9081526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b505f9392505050565b5f818152600160205260409020546affffffffffffffffffffff60a082901c1673ffffffffffffffffffffffffffffffffffffffff8216610550576040517f38077a2b0000000000000000000000000000000000000000000000000000000081526004810184905260240161049e565b3373ffffffffffffffffffffffffffffffffffffffff8316148015906105a6575073ffffffffffffffffffffffffffffffffffffffff82165f90815260046020908152604080832033845290915290205460ff16155b156105dd576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105e982828686610d0e565b50505050565b5f818152600160205260409020546affffffffffffffffffffff60a082901c167f80000000000000000000000000000000000000000000000000000000000000008083161473ffffffffffffffffffffffffffffffffffffffff8316610684576040517f38077a2b0000000000000000000000000000000000000000000000000000000081526004810185905260240161049e565b8273ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610709576040517f23295f0e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80881660048301528416602482015260440161049e565b73ffffffffffffffffffffffffffffffffffffffff85161580610741575073ffffffffffffffffffffffffffffffffffffffff851630145b15610790576040517f8e4c8aa600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616600482015260240161049e565b3373ffffffffffffffffffffffffffffffffffffffff871614610850578080156107dc57505f8481526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1633145b158015610819575073ffffffffffffffffffffffffffffffffffffffff86165f90815260046020908152604080832033845290915290205460ff16155b15610850576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610862868686601886901c1515610e96565b505050505050565b61088483838360405180602001604052805f81525061095f565b505050565b5f8181526001602052604090205473ffffffffffffffffffffffffffffffffffffffff81166108e7576040517f38077a2b0000000000000000000000000000000000000000000000000000000081526004810183905260240161049e565b919050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e4f545f494d504c454d454e544544000000000000000000000000000000000060448201525f9060640161049e565b61095b338383610ef7565b5050565b5f828152600160205260409020546affffffffffffffffffffff60a082901c167f80000000000000000000000000000000000000000000000000000000000000008083161473ffffffffffffffffffffffffffffffffffffffff83166109f4576040517f38077a2b0000000000000000000000000000000000000000000000000000000081526004810186905260240161049e565b8673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610a79576040517f23295f0e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80891660048301528416602482015260440161049e565b73ffffffffffffffffffffffffffffffffffffffff86161580610ab1575073ffffffffffffffffffffffffffffffffffffffff861630145b15610b00576040517f8e4c8aa600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8716600482015260240161049e565b3373ffffffffffffffffffffffffffffffffffffffff881614610bc057808015610b4c57505f8581526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1633145b158015610b89575073ffffffffffffffffffffffffffffffffffffffff87165f90815260046020908152604080832033845290915290205460ff16155b15610bc0576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bd3878787601886901c151588610f8e565b50505050505050565b60608167ffffffffffffffff811115610bf757610bf7611284565b604051908082528060200260200182016040528015610c3b57816020015b604080518082019091525f8082526020820152815260200190600190039081610c155790505b5090505f5b82811015610d07575f60015f868685818110610c5e57610c5e6114a8565b9050602002013581526020019081526020015f2054905080838381518110610c8857610c886114a8565b60200260200101515f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060b881901c67ffffffffffffffff16838381518110610ce657610ce66114a8565b60209081029190910181015101525080610cff81611502565b915050610c40565b5092915050565b601883901c5f610d1f856001611539565b905081601882901c14610d5e576040517fadc1557200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610daa575f83815260016020526040902060a082901b73ffffffffffffffffffffffffffffffffffffffff8816179055610e33565b5f83815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8a811660a087901b177f800000000000000000000000000000000000000000000000000000000000000017909155600590925290912080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169186169190911790555b828473ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b5f828152600160205260408082204360b81b73ffffffffffffffffffffffffffffffffffffffff80881691821790925591518593918816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a450505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526004602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b610f9a85858585610e96565b73ffffffffffffffffffffffffffffffffffffffff84163b15610ffa57610fc43386868685611001565b610ffa576040517f4e472e5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b5f808473ffffffffffffffffffffffffffffffffffffffff1663150b7a02888887876040518563ffffffff1660e01b8152600401611042949392919061154c565b6020604051808303815f875af115801561105e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110829190611594565b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001491505095945050505050565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146110ff575f80fd5b50565b5f60208284031215611112575f80fd5b813561111d816110d2565b9392505050565b5f81518084525f5b818110156111485760208185018101518683018201520161112c565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61111d6020830184611124565b5f602082840312156111a7575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146108e7575f80fd5b5f80604083850312156111e2575f80fd5b6111eb836111ae565b946020939093013593505050565b5f805f6060848603121561120b575f80fd5b611214846111ae565b9250611222602085016111ae565b9150604084013590509250925092565b5f60208284031215611242575f80fd5b61111d826111ae565b5f806040838503121561125c575f80fd5b611265836111ae565b915060208301358015158114611279575f80fd5b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f805f80608085870312156112c4575f80fd5b6112cd856111ae565b93506112db602086016111ae565b925060408501359150606085013567ffffffffffffffff808211156112fe575f80fd5b818701915087601f830112611311575f80fd5b81358181111561132357611323611284565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561136957611369611284565b816040528281528a6020848701011115611381575f80fd5b826020860160208301375f60208483010152809550505050505092959194509250565b5f80604083850312156113b5575f80fd5b6113be836111ae565b91506113cc602084016111ae565b90509250929050565b5f80602083850312156113e6575f80fd5b823567ffffffffffffffff808211156113fd575f80fd5b818501915085601f830112611410575f80fd5b81358181111561141e575f80fd5b8660208260051b8501011115611432575f80fd5b60209290920196919550909350505050565b602080825282518282018190525f919060409081850190868401855b8281101561149b578151805173ffffffffffffffffffffffffffffffffffffffff168552860151868501529284019290850190600101611460565b5091979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611532576115326114d5565b5060010190565b80820180821115610419576104196114d5565b5f73ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261158a6080830184611124565b9695505050505050565b5f602082840312156115a4575f80fd5b815161111d816110d256fea264697066735822122048a30bcf14c8db8943aaac997a4cb0fe02b6efb06798bd008ae4f537e935283764736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {}, + "devdoc": { + "errors": { + "InvalidAddress(address)": [ + { + "params": { + "addr": "invalid address" + } + } + ], + "NonExistentToken(uint256)": [ + { + "params": { + "tokenID": "id of the expected token" + } + } + ], + "NotOwner(address,address)": [ + { + "params": { + "currentOwner": "the current owner", + "provided": "the address expected to be the current owner" + } + } + ], + "ReserveTooLow(uint256,uint256)": [ + { + "params": { + "expected": "amount required to proceed", + "inReserve": "amount in reserver as the time of the call" + } + } + ] + }, + "events": { + "Approval(address,address,uint256)": { + "params": { + "approved": "account who can know transfer on the owner's behalf", + "owner": "current owner of the token", + "tokenID": "id of the token being approved" + } + }, + "ApprovalForAll(address,address,bool)": { + "params": { + "approved": "whether it is approved or not", + "operator": "account who can know transfer on the owner's behalf", + "owner": "the account granting rights over all of its token" + } + }, + "CommitmentCancelled(address,uint24)": { + "params": { + "epoch": "epoch number on which this commit belongs to", + "player": "account taking the staking risk (can be a different account than the one controlling the gems)" + } + }, + "CommitmentMade(address,uint24,bytes24)": { + "params": { + "commitmentHash": "the hash of moves", + "epoch": "epoch number on which this commit belongs to", + "player": "account taking the staking risk (can be a different account than the one controlling the gems)" + } + }, + "CommitmentResolved(address,uint24,bytes24,(uint64,uint8)[],bytes24,uint256)": { + "params": { + "commitmentHash": "the hash of the moves", + "epoch": "epoch number on which this commit belongs to", + "furtherMoves": "hash of further moves, unless bytes32(0) which indicate end.", + "moves": "the moves", + "player": "account who commited" + } + }, + "CommitmentVoid(address,uint24,uint256,bytes24)": { + "params": { + "amountBurnt": "amount of token to burn", + "epoch": "epoch number on which this commit belongs to", + "furtherMoves": "hash of further moves, unless bytes32(0) which indicate end.", + "player": "the account that made the commitment" + } + }, + "MoveProcessed(uint64,address,uint8,uint8)": { + "params": { + "newColor": "color that takes over", + "oldColor": "previous color of the cell", + "player": "account making the move", + "position": "cell at which the move take place" + } + }, + "ReserveDeposited(address,uint256,uint256)": { + "params": { + "amountDeposited": "the number of tokens deposited", + "newAmount": "the number of tokens in reserver as a result", + "player": "account receiving the token in the reserve" + } + }, + "ReserveWithdrawn(address,uint256,uint256)": { + "params": { + "amountWithdrawn": "the number of tokens withdrawnn", + "newAmount": "the number of tokens in reserver as a result", + "player": "account withdrawing the tokens" + } + }, + "Transfer(address,address,uint256)": { + "params": { + "from": "the account the token is sent from", + "to": "the account the token is sent to", + "tokenID": "id of the token being sent" + } + } + }, + "kind": "dev", + "methods": { + "approve(address,uint256)": { + "params": { + "operator": "The address receiving the approval.", + "tokenID": "The id of the token." + } + }, + "getApproved(uint256)": { + "params": { + "tokenID": "The id of the token." + }, + "returns": { + "operator": "The address of the operator." + } + }, + "isApprovedForAll(address,address)": { + "params": { + "operator": "The address of the operator.", + "owner": "The address of the owner." + }, + "returns": { + "_0": "isOperator The status of the approval." + } + }, + "ownerAndLastTransferBlockNumberList(uint256[])": { + "params": { + "tokenIDs": "The list of token ids to check." + }, + "returns": { + "ownersData": "The list of (owner, lastTransferBlockNumber) for each ids given as input." + } + }, + "ownerAndLastTransferBlockNumberOf(uint256)": { + "params": { + "tokenID": "The id of the token." + }, + "returns": { + "blockNumber": "The blocknumber at which the last transfer of that id happened.", + "owner": "The address of the token owner." + } + }, + "ownerOf(uint256)": { + "params": { + "tokenID": "The id of the token." + }, + "returns": { + "owner": "The address of the token owner." + } + }, + "safeTransferFrom(address,address,uint256)": { + "params": { + "from": "The send of the token.", + "to": "The recipient of the token.", + "tokenID": "The id of the token." + } + }, + "safeTransferFrom(address,address,uint256,bytes)": { + "params": { + "data": "Additional data.", + "from": "The sender of the token.", + "to": "The recipient of the token.", + "tokenID": "The id of the token." + } + }, + "setApprovalForAll(address,bool)": { + "params": { + "approved": "The determination of the approval.", + "operator": "The address receiving the approval." + } + }, + "supportsInterface(bytes4)": { + "details": "Interface identification is specified in ERC-165. This function uses less than 30,000 gas.", + "params": { + "interfaceID": "The interface identifier, as specified in ERC-165" + }, + "returns": { + "_0": "`true` if the contract implements `interfaceID` and `interfaceID` is not 0xffffffff, `false` otherwise" + } + }, + "tokenURI(uint256)": { + "details": "Throws if `tokenID` is not a valid NFT. URIs are defined in RFC 3986. The URI may point to a JSON file that conforms to the \"ERC721 Metadata JSON Schema\".", + "params": { + "tokenID": "id of the token being queried." + } + }, + "transferFrom(address,address,uint256)": { + "params": { + "from": "The sender of the token.", + "to": "The recipient of the token.", + "tokenID": "The id of the token." + } + } + }, + "version": 1 + }, + "evm": { + "gasEstimates": { + "creation": { + "codeDepositCost": "1121000", + "executionCost": "infinite", + "totalCost": "infinite" + }, + "external": { + "approve(address,uint256)": "53492", + "balanceOf(address)": "440", + "getApproved(uint256)": "4761", + "isApprovedForAll(address,address)": "infinite", + "name()": "infinite", + "ownerAndLastTransferBlockNumberList(uint256[])": "infinite", + "ownerAndLastTransferBlockNumberOf(uint256)": "2578", + "ownerOf(uint256)": "2507", + "safeTransferFrom(address,address,uint256)": "infinite", + "safeTransferFrom(address,address,uint256,bytes)": "infinite", + "setApprovalForAll(address,bool)": "26683", + "supportsInterface(bytes4)": "453", + "symbol()": "infinite", + "tokenURI(uint256)": "infinite", + "transferFrom(address,address,uint256)": "infinite" + }, + "internal": { + "_approveFor(address,uint256,address,uint256)": "infinite", + "_checkOnERC721Received(address,address,address,uint256,bytes memory)": "infinite", + "_ownerAndNonceOf(uint256)": "infinite", + "_ownerAndOperatorEnabledOf(uint256)": "infinite", + "_ownerNonceAndOperatorEnabledOf(uint256)": "infinite", + "_safeMint(address,uint256)": "infinite", + "_safeTransferFrom(address,address,uint256,bool,bytes memory)": "infinite", + "_setApprovalForAll(address,address,bool)": "infinite", + "_transferFrom(address,address,uint256,bool)": "24137" + } + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"contract IERC20WithIERC2612\",\"name\":\"tokens\",\"type\":\"address\"},{\"internalType\":\"address payable\",\"name\":\"burnAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"commitPhaseDuration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"resolutionPhaseDuration\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"maxLife\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"numTokensPerGems\",\"type\":\"uint256\"}],\"internalType\":\"struct UsingStratagemsTypes.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CanStillResolve\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommitmentHashNotMatching\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GameNotStarted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InCommitmentPhase\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InResolutionPhase\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidEpoch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidFurtherMoves\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenID\",\"type\":\"uint256\"}],\"name\":\"NonExistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonceOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotAuthorized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"provided\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"currentOwner\",\"type\":\"address\"}],\"name\":\"NotOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NothingToResolve\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PreviousCommitmentNotResolved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"inReserve\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"}],\"name\":\"ReserveTooLow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferRejected\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenID\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"player\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint24\",\"name\":\"epoch\",\"type\":\"uint24\"}],\"name\":\"CommitmentCancelled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"player\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint24\",\"name\":\"epoch\",\"type\":\"uint24\"},{\"indexed\":false,\"internalType\":\"bytes24\",\"name\":\"commitmentHash\",\"type\":\"bytes24\"}],\"name\":\"CommitmentMade\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"player\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint24\",\"name\":\"epoch\",\"type\":\"uint24\"},{\"indexed\":true,\"internalType\":\"bytes24\",\"name\":\"commitmentHash\",\"type\":\"bytes24\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"position\",\"type\":\"uint64\"},{\"internalType\":\"enum UsingStratagemsTypes.Color\",\"name\":\"color\",\"type\":\"uint8\"}],\"indexed\":false,\"internalType\":\"struct UsingStratagemsTypes.Move[]\",\"name\":\"moves\",\"type\":\"tuple[]\"},{\"indexed\":false,\"internalType\":\"bytes24\",\"name\":\"furtherMoves\",\"type\":\"bytes24\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newReserveAmount\",\"type\":\"uint256\"}],\"name\":\"CommitmentResolved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"player\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint24\",\"name\":\"epoch\",\"type\":\"uint24\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountBurnt\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes24\",\"name\":\"furtherMoves\",\"type\":\"bytes24\"}],\"name\":\"CommitmentVoid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"position\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"player\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"enum UsingStratagemsTypes.Color\",\"name\":\"oldColor\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"enum UsingStratagemsTypes.Color\",\"name\":\"newColor\",\"type\":\"uint8\"}],\"name\":\"MoveProcessed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"player\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountDeposited\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newAmount\",\"type\":\"uint256\"}],\"name\":\"ReserveDeposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"player\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountWithdrawn\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newAmount\",\"type\":\"uint256\"}],\"name\":\"ReserveWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenID\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenID\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenID\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"tokenIDs\",\"type\":\"uint256[]\"}],\"name\":\"ownerAndLastTransferBlockNumberList\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"lastTransferBlockNumber\",\"type\":\"uint256\"}],\"internalType\":\"struct IERC721WithBlocknumber.OwnerData[]\",\"name\":\"ownersData\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenID\",\"type\":\"uint256\"}],\"name\":\"ownerAndLastTransferBlockNumberOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenID\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenID\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenID\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceID\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenID\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenID\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"InvalidAddress(address)\":[{\"params\":{\"addr\":\"invalid address\"}}],\"NonExistentToken(uint256)\":[{\"params\":{\"tokenID\":\"id of the expected token\"}}],\"NotOwner(address,address)\":[{\"params\":{\"currentOwner\":\"the current owner\",\"provided\":\"the address expected to be the current owner\"}}],\"ReserveTooLow(uint256,uint256)\":[{\"params\":{\"expected\":\"amount required to proceed\",\"inReserve\":\"amount in reserver as the time of the call\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"approved\":\"account who can know transfer on the owner's behalf\",\"owner\":\"current owner of the token\",\"tokenID\":\"id of the token being approved\"}},\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"whether it is approved or not\",\"operator\":\"account who can know transfer on the owner's behalf\",\"owner\":\"the account granting rights over all of its token\"}},\"CommitmentCancelled(address,uint24)\":{\"params\":{\"epoch\":\"epoch number on which this commit belongs to\",\"player\":\"account taking the staking risk (can be a different account than the one controlling the gems)\"}},\"CommitmentMade(address,uint24,bytes24)\":{\"params\":{\"commitmentHash\":\"the hash of moves\",\"epoch\":\"epoch number on which this commit belongs to\",\"player\":\"account taking the staking risk (can be a different account than the one controlling the gems)\"}},\"CommitmentResolved(address,uint24,bytes24,(uint64,uint8)[],bytes24,uint256)\":{\"params\":{\"commitmentHash\":\"the hash of the moves\",\"epoch\":\"epoch number on which this commit belongs to\",\"furtherMoves\":\"hash of further moves, unless bytes32(0) which indicate end.\",\"moves\":\"the moves\",\"player\":\"account who commited\"}},\"CommitmentVoid(address,uint24,uint256,bytes24)\":{\"params\":{\"amountBurnt\":\"amount of token to burn\",\"epoch\":\"epoch number on which this commit belongs to\",\"furtherMoves\":\"hash of further moves, unless bytes32(0) which indicate end.\",\"player\":\"the account that made the commitment\"}},\"MoveProcessed(uint64,address,uint8,uint8)\":{\"params\":{\"newColor\":\"color that takes over\",\"oldColor\":\"previous color of the cell\",\"player\":\"account making the move\",\"position\":\"cell at which the move take place\"}},\"ReserveDeposited(address,uint256,uint256)\":{\"params\":{\"amountDeposited\":\"the number of tokens deposited\",\"newAmount\":\"the number of tokens in reserver as a result\",\"player\":\"account receiving the token in the reserve\"}},\"ReserveWithdrawn(address,uint256,uint256)\":{\"params\":{\"amountWithdrawn\":\"the number of tokens withdrawnn\",\"newAmount\":\"the number of tokens in reserver as a result\",\"player\":\"account withdrawing the tokens\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"the account the token is sent from\",\"to\":\"the account the token is sent to\",\"tokenID\":\"id of the token being sent\"}}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"params\":{\"operator\":\"The address receiving the approval.\",\"tokenID\":\"The id of the token.\"}},\"getApproved(uint256)\":{\"params\":{\"tokenID\":\"The id of the token.\"},\"returns\":{\"operator\":\"The address of the operator.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"The address of the operator.\",\"owner\":\"The address of the owner.\"},\"returns\":{\"_0\":\"isOperator The status of the approval.\"}},\"ownerAndLastTransferBlockNumberList(uint256[])\":{\"params\":{\"tokenIDs\":\"The list of token ids to check.\"},\"returns\":{\"ownersData\":\"The list of (owner, lastTransferBlockNumber) for each ids given as input.\"}},\"ownerAndLastTransferBlockNumberOf(uint256)\":{\"params\":{\"tokenID\":\"The id of the token.\"},\"returns\":{\"blockNumber\":\"The blocknumber at which the last transfer of that id happened.\",\"owner\":\"The address of the token owner.\"}},\"ownerOf(uint256)\":{\"params\":{\"tokenID\":\"The id of the token.\"},\"returns\":{\"owner\":\"The address of the token owner.\"}},\"safeTransferFrom(address,address,uint256)\":{\"params\":{\"from\":\"The send of the token.\",\"to\":\"The recipient of the token.\",\"tokenID\":\"The id of the token.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"params\":{\"data\":\"Additional data.\",\"from\":\"The sender of the token.\",\"to\":\"The recipient of the token.\",\"tokenID\":\"The id of the token.\"}},\"setApprovalForAll(address,bool)\":{\"params\":{\"approved\":\"The determination of the approval.\",\"operator\":\"The address receiving the approval.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Interface identification is specified in ERC-165. This function uses less than 30,000 gas.\",\"params\":{\"interfaceID\":\"The interface identifier, as specified in ERC-165\"},\"returns\":{\"_0\":\"`true` if the contract implements `interfaceID` and `interfaceID` is not 0xffffffff, `false` otherwise\"}},\"tokenURI(uint256)\":{\"details\":\"Throws if `tokenID` is not a valid NFT. URIs are defined in RFC 3986. The URI may point to a JSON file that conforms to the \\\"ERC721 Metadata JSON Schema\\\".\",\"params\":{\"tokenID\":\"id of the token being queried.\"}},\"transferFrom(address,address,uint256)\":{\"params\":{\"from\":\"The sender of the token.\",\"to\":\"The recipient of the token.\",\"tokenID\":\"The id of the token.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"CanStillResolve()\":[{\"notice\":\"Player have to resolve if they can Stratagems will prevent them from acknowledging missed resolution if there is still time to resolve.\"}],\"CommitmentHashNotMatching()\":[{\"notice\":\"Player have to reveal their commitment using the exact same move values If they provide different value, the commitment hash will differ and Stratagems will reject their resolution.\"}],\"GameNotStarted()\":[{\"notice\":\"Game has not started yet, can't perform any action\"}],\"InCommitmentPhase()\":[{\"notice\":\"When in Commit phase, player can make new commitment but they cannot resolve their move yet.\"}],\"InResolutionPhase()\":[{\"notice\":\"When in Resolution phase, it is not possible to commit new moves or cancel previous commitment During Resolution phase, players have to reveal their commitment, if not already done.\"}],\"InvalidAddress(address)\":[{\"notice\":\"An invalid address is specified (for example: zero address)\"}],\"InvalidEpoch()\":[{\"notice\":\"Player can only resolve their move in the same epoch they commited.abi If a player resolve later it can only do to minimize the reserve burn cost by calling : `acknowledgeMissedResolution`\"}],\"InvalidFurtherMoves()\":[{\"notice\":\"Player can make arbitrary number of moves per epoch. To do so they group moves into (MAX_NUM_MOVES_PER_HASH = 32) moves This result in a recursive series of hash that they can then submit in turn while resolving. The limit (MAX_NUM_MOVES_PER_HASH = 32) ensure a resolution batch fits in a block.\"}],\"NonExistentToken(uint256)\":[{\"notice\":\"The token does not exist\"}],\"NonceOverflow()\":[{\"notice\":\"The Nonce overflowed, make a transfer to self to allow new nonces.\"}],\"NotAuthorized()\":[{\"notice\":\"Not authorized to perform this operation\"}],\"NotOwner(address,address)\":[{\"notice\":\"The address from which the token is sent is not the current owner\"}],\"NothingToResolve()\":[{\"notice\":\"Player can only resolve moves they commited.\"}],\"PreviousCommitmentNotResolved()\":[{\"notice\":\"Previous commitment need to be resolved before making a new one. Even if the corresponding reveal phase has passed.\\\\ It is also not possible to withdraw any amount from reserve until the commitment is revealed.\\\\If player lost the information to reveal, it can acknowledge failure which will burn all its reserve.\\\\\"}],\"ReserveTooLow(uint256,uint256)\":[{\"notice\":\"to make a commitment you always need at least one `config.numTokensPerGems` amount in reserve Player also need one `config.numTokensPerGems` per moves during the resolution phase.\"}],\"TransferRejected()\":[{\"notice\":\"The Transfer was rejected by the destination\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Triggered when a token is approved to be sent by another account Note tat the approval get reset when a Transfer event for that same token is emitted.\"},\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Triggered when an account approve or disaprove another to transfer on its behalf\"},\"CommitmentCancelled(address,uint24)\":{\"notice\":\"A player has cancelled its current commitment (before it reached the resolution phase)\"},\"CommitmentMade(address,uint24,bytes24)\":{\"notice\":\"A player has commited to make a move and resolve it on the resolution phase\"},\"CommitmentResolved(address,uint24,bytes24,(uint64,uint8)[],bytes24,uint256)\":{\"notice\":\"Player has resolved its previous commitment\"},\"CommitmentVoid(address,uint24,uint256,bytes24)\":{\"notice\":\"A player has canceled a previous commitment by burning some tokens\"},\"MoveProcessed(uint64,address,uint8,uint8)\":{\"notice\":\"A move has been resolved.\"},\"ReserveDeposited(address,uint256,uint256)\":{\"notice\":\"Player has deposited token in the reserve, allowing it to use that much in game\"},\"ReserveWithdrawn(address,uint256,uint256)\":{\"notice\":\"Player have withdrawn token from the reserve\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Triggered when a token is transferred\"}},\"kind\":\"user\",\"methods\":{\"approve(address,uint256)\":{\"notice\":\"Approve an operator to transfer a specific token on the senders behalf.\"},\"balanceOf(address)\":{\"notice\":\"balanceOf is not implemented, keeping track of this add gas and we did not consider that worth it\"},\"getApproved(uint256)\":{\"notice\":\"Get the approved operator for a specific token.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Check if the sender approved the operator to transfer any of its tokens.\"},\"name()\":{\"notice\":\"A descriptive name for a collection of NFTs in this contract\"},\"ownerAndLastTransferBlockNumberList(uint256[])\":{\"notice\":\"Get the list of owner of a token and the blockNumber of its last transfer, useful to voting mechanism.\"},\"ownerAndLastTransferBlockNumberOf(uint256)\":{\"notice\":\"Get the owner of a token and the blockNumber of the last transfer, useful to voting mechanism.\"},\"ownerOf(uint256)\":{\"notice\":\"Get the owner of a token.\"},\"safeTransferFrom(address,address,uint256)\":{\"notice\":\"Transfer a token between 2 addresses letting the receiver know of the transfer.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Transfer a token between 2 addresses letting the receiver knows of the transfer.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Set the approval for an operator to manage all the tokens of the sender.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Query if a contract implements an interface\"},\"symbol()\":{\"notice\":\"An abbreviated name for NFTs in this contract\"},\"tokenURI(uint256)\":{\"notice\":\"A distinct Uniform Resource Identifier (URI) for a given asset.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfer a token between 2 addresses.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/game/routes/StratagemsERC721.sol\":\"StratagemsERC721\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toString(int256 value) internal pure returns (string memory) {\\n return string(abi.encodePacked(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value))));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1, \\\"Math: mulDiv overflow\\\");\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.4.22 <0.9.0;\\n\\nlibrary console {\\n address constant CONSOLE_ADDRESS =\\n 0x000000000000000000636F6e736F6c652e6c6f67;\\n\\n function _sendLogPayloadImplementation(bytes memory payload) internal view {\\n address consoleAddress = CONSOLE_ADDRESS;\\n /// @solidity memory-safe-assembly\\n assembly {\\n pop(\\n staticcall(\\n gas(),\\n consoleAddress,\\n add(payload, 32),\\n mload(payload),\\n 0,\\n 0\\n )\\n )\\n }\\n }\\n\\n function _castToPure(\\n function(bytes memory) internal view fnIn\\n ) internal pure returns (function(bytes memory) pure fnOut) {\\n assembly {\\n fnOut := fnIn\\n }\\n }\\n\\n function _sendLogPayload(bytes memory payload) internal pure {\\n _castToPure(_sendLogPayloadImplementation)(payload);\\n }\\n\\n function log() internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n }\\n function logInt(int256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n }\\n\\n function logUint(uint256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n }\\n\\n function logString(string memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n }\\n\\n function logBool(bool p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n }\\n\\n function logAddress(address p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n }\\n\\n function logBytes(bytes memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n }\\n\\n function logBytes1(bytes1 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n }\\n\\n function logBytes2(bytes2 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n }\\n\\n function logBytes3(bytes3 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n }\\n\\n function logBytes4(bytes4 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n }\\n\\n function logBytes5(bytes5 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n }\\n\\n function logBytes6(bytes6 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n }\\n\\n function logBytes7(bytes7 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n }\\n\\n function logBytes8(bytes8 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n }\\n\\n function logBytes9(bytes9 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n }\\n\\n function logBytes10(bytes10 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n }\\n\\n function logBytes11(bytes11 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n }\\n\\n function logBytes12(bytes12 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n }\\n\\n function logBytes13(bytes13 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n }\\n\\n function logBytes14(bytes14 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n }\\n\\n function logBytes15(bytes15 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n }\\n\\n function logBytes16(bytes16 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n }\\n\\n function logBytes17(bytes17 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n }\\n\\n function logBytes18(bytes18 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n }\\n\\n function logBytes19(bytes19 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n }\\n\\n function logBytes20(bytes20 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n }\\n\\n function logBytes21(bytes21 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n }\\n\\n function logBytes22(bytes22 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n }\\n\\n function logBytes23(bytes23 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n }\\n\\n function logBytes24(bytes24 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n }\\n\\n function logBytes25(bytes25 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n }\\n\\n function logBytes26(bytes26 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n }\\n\\n function logBytes27(bytes27 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n }\\n\\n function logBytes28(bytes28 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n }\\n\\n function logBytes29(bytes29 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n }\\n\\n function logBytes30(bytes30 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n }\\n\\n function logBytes31(bytes31 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n }\\n\\n function logBytes32(bytes32 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n }\\n\\n function log(uint256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n }\\n\\n function log(string memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n }\\n\\n function log(bool p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n }\\n\\n function log(address p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n }\\n\\n function log(uint256 p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n }\\n\\n function log(bool p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n }\\n\\n function log(bool p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n }\\n\\n function log(bool p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n }\\n\\n function log(bool p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n }\\n\\n function log(address p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n }\\n\\n function log(address p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n }\\n\\n function log(address p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n }\\n\\n function log(address p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n}\\n\",\"keccak256\":\"0x7434453e6d3b7d0e5d0eb7846ffdbc27f0ccf3b163591263739b628074dc103a\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC165/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface IERC165 {\\n\\t/// @notice Query if a contract implements an interface\\n\\t/// @param interfaceID The interface identifier, as specified in ERC-165\\n\\t/// @dev Interface identification is specified in ERC-165. This function\\n\\t/// uses less than 30,000 gas.\\n\\t/// @return `true` if the contract implements `interfaceID` and\\n\\t/// `interfaceID` is not 0xffffffff, `false` otherwise\\n\\tfunction supportsInterface(bytes4 interfaceID) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x036eb02f585d3f298df9fc1470e1d761b74e86793b6c27d8d8608620146b3cf9\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/ERC2612/interfaces/IERC20WithIERC2612.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/IERC20.sol\\\";\\nimport \\\"./IERC2612.sol\\\";\\n\\ninterface IERC20WithIERC2612 is IERC20, IERC2612 {}\\n\",\"keccak256\":\"0x66100d98de50a396d46feb17a2b2b400b13f033f5e01b45e95901e61a4feef05\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/ERC2612/interfaces/IERC2612.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/IERC20Errors.sol\\\";\\n\\ninterface IERC2612 {\\n\\t/// @notice The signature do not match the expected signer\\n\\terror InvalidSignature();\\n\\t/// @notice The permit has expired\\n\\t/// @param currentTime time at which the error happen\\n\\t/// @param deadline the deadline\\n\\terror DeadlineOver(uint256 currentTime, uint256 deadline);\\n\\n\\t/// @notice allow `spender` to spend `value` amount of token on behalf of `owner`\\n\\t/// @param owner owner of the tokens\\n\\t/// @param spender address allowed to spend on behalf of the owner.\\n\\t/// @param value amount of token allowed to be spent\\n\\t/// @param deadline timestamp in seconds after which the permit is not valid.\\n\\t/// @param v signature part v\\n\\t/// @param r signature part r\\n\\t/// @param s signature part s\\n\\tfunction permit(\\n\\t\\taddress owner,\\n\\t\\taddress spender,\\n\\t\\tuint256 value,\\n\\t\\tuint256 deadline,\\n\\t\\tuint8 v,\\n\\t\\tbytes32 r,\\n\\t\\tbytes32 s\\n\\t) external;\\n\\n\\t/// @notice return the current nonce of the owner\\n\\t/// @param owner address queried\\n\\t/// @return nonce nonce value\\n\\tfunction nonces(address owner) external view returns (uint256 nonce);\\n\\n\\t/// @notice EIP-712 Domain separator hash\\n\\tfunction DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xe610994a34db6e750ee555ab2011292a980ec650e9afb7619fb0bc3fcad75095\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IERC20Errors.sol\\\";\\n\\ninterface IERC20 {\\n\\t/// @notice trigger when tokens are transferred, including zero value transfers.\\n\\t/// @param from the account the tokens are sent from\\n\\t/// @param to the account the tokens are sent to\\n\\t/// @param value number of tokens sent\\n\\tevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n\\t/// @notice trigger on approval amount being set.\\n\\t/// Note that Transfer events need to be considered to compute the current allowance.\\n\\t/// @param owner the account approving the `spender`\\n\\t/// @param spender the account allowed to spend\\n\\t/// @param value the amount granted\\n\\tevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n\\t/// @notice Returns the total token supply.\\n\\tfunction totalSupply() external view returns (uint256);\\n\\n\\t/// @notice Returns the number of decimals the token uses.\\n\\tfunction decimals() external view returns (uint8);\\n\\n\\t/// @notice Returns the symbol of the token.\\n\\tfunction symbol() external view returns (string memory);\\n\\n\\t/// @notice Returns the name of the token.\\n\\tfunction name() external view returns (string memory);\\n\\n\\t/// @notice Returns the account balance of another account with address `owner`.\\n\\tfunction balanceOf(address owner) external view returns (uint256);\\n\\n\\t/// @notice Transfers `amount` of tokens to address `to`.\\n\\tfunction transfer(address to, uint256 amount) external returns (bool);\\n\\n\\t/// @notice Returns the amount which `spender` is still allowed to withdraw from `owner`.\\n\\tfunction allowance(address owner, address spender) external view returns (uint256);\\n\\n\\t/// @notice Allows `spender` to withdraw from your account multiple times, up to `amount`.\\n\\tfunction approve(address spender, uint256 amount) external returns (bool);\\n\\n\\t/// @notice Transfers `amount` tokens from address `from` to address `to`.\\n\\tfunction transferFrom(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 amount\\n\\t) external returns (bool);\\n}\\n\",\"keccak256\":\"0x68034c81cd7775e19a5bb75dd33022da7add3bc1852309eed9f797f1ff835507\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/interfaces/IERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/// @notice The msg value do not match the expected value\\n/// @param provided msg.value amount provided\\n/// @param expected value expected\\nerror InvalidMsgValue(uint256 provided, uint256 expected);\\n/// @notice The total amount provided do not match the expected value\\n/// @param provided msg.value amount provided\\n/// @param expected value expected\\nerror InvalidTotalAmount(uint256 provided, uint256 expected);\\n/// @notice An invalid address is specified (for example: zero address)\\n/// @param addr invalid address\\nerror InvalidAddress(address addr);\\n/// @notice the amount requested exceed the allowance\\n/// @param currentAllowance the current allowance\\n/// @param expected amount expected\\nerror NotAuthorizedAllowance(uint256 currentAllowance, uint256 expected);\\n/// @notice the amount requested exceed the balance\\n/// @param currentBalance the current balance\\n/// @param expected amount expected\\nerror NotEnoughTokens(uint256 currentBalance, uint256 expected);\\n\",\"keccak256\":\"0xc8ab4cfee19338da32d2fc5473e1ee740bf608c59196ebd16de74294c4813ae9\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC721/implementations/ImplementingERC721Internal.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nabstract contract ImplementingERC721Internal {\\n\\tfunction _ownerAndNonceOf(uint256 tokenID) internal view virtual returns (address owner, uint256 nonce);\\n\\n\\tfunction _approveFor(\\n\\t\\taddress owner,\\n\\t\\tuint256 nonce,\\n\\t\\taddress operator,\\n\\t\\tuint256 tokenID\\n\\t) internal virtual;\\n\\n\\tfunction _setApprovalForAll(\\n\\t\\taddress sender,\\n\\t\\taddress operator,\\n\\t\\tbool approved\\n\\t) internal virtual;\\n}\\n\",\"keccak256\":\"0xfb4e33ff8e5bf69da8c47bc7d3bf3544b440383efebc5bc8ca412ebab35e2824\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../ERC165/interfaces/IERC165.sol\\\";\\nimport \\\"../../utils/GenericErrors.sol\\\";\\n\\ninterface IERC721Supply {\\n\\t/// @notice return the total number of token in existence\\n\\tfunction totalSupply() external view returns (uint256);\\n}\\n\\ninterface IERC721 is IERC165 {\\n\\t/// @notice Triggered when a token is transferred\\n\\t/// @param from the account the token is sent from\\n\\t/// @param to the account the token is sent to\\n\\t/// @param tokenID id of the token being sent\\n\\tevent Transfer(address indexed from, address indexed to, uint256 indexed tokenID);\\n\\n\\t/// @notice Triggered when a token is approved to be sent by another account\\n\\t/// Note tat the approval get reset when a Transfer event for that same token is emitted.\\n\\t/// @param owner current owner of the token\\n\\t/// @param approved account who can know transfer on the owner's behalf\\n\\t/// @param tokenID id of the token being approved\\n\\tevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenID);\\n\\n\\t/// @notice Triggered when an account approve or disaprove another to transfer on its behalf\\n\\t/// @param owner the account granting rights over all of its token\\n\\t/// @param operator account who can know transfer on the owner's behalf\\n\\t/// @param approved whether it is approved or not\\n\\tevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n\\t/// @notice The token does not exist\\n\\t/// @param tokenID id of the expected token\\n\\terror NonExistentToken(uint256 tokenID);\\n\\t/// @notice The address from which the token is sent is not the current owner\\n\\t/// @param provided the address expected to be the current owner\\n\\t/// @param currentOwner the current owner\\n\\terror NotOwner(address provided, address currentOwner);\\n\\t/// @notice An invalid address is specified (for example: zero address)\\n\\t/// @param addr invalid address\\n\\terror InvalidAddress(address addr);\\n\\t/// @notice The Transfer was rejected by the destination\\n\\terror TransferRejected();\\n\\t/// @notice The Nonce overflowed, make a transfer to self to allow new nonces.\\n\\terror NonceOverflow();\\n\\n\\t/// @notice Get the number of tokens owned by an address.\\n\\t/// @param owner The address to look for.\\n\\t/// @return balance The number of tokens owned by the address.\\n\\tfunction balanceOf(address owner) external view returns (uint256 balance);\\n\\n\\t/// @notice Get the owner of a token.\\n\\t/// @param tokenID The id of the token.\\n\\t/// @return owner The address of the token owner.\\n\\tfunction ownerOf(uint256 tokenID) external view returns (address owner);\\n\\n\\t/// @notice Transfer a token between 2 addresses letting the receiver knows of the transfer.\\n\\t/// @param from The sender of the token.\\n\\t/// @param to The recipient of the token.\\n\\t/// @param tokenID The id of the token.\\n\\t/// @param data Additional data.\\n\\tfunction safeTransferFrom(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 tokenID,\\n\\t\\tbytes calldata data\\n\\t) external;\\n\\n\\t/// @notice Transfer a token between 2 addresses letting the receiver know of the transfer.\\n\\t/// @param from The send of the token.\\n\\t/// @param to The recipient of the token.\\n\\t/// @param tokenID The id of the token.\\n\\tfunction safeTransferFrom(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 tokenID\\n\\t) external;\\n\\n\\t/// @notice Transfer a token between 2 addresses.\\n\\t/// @param from The sender of the token.\\n\\t/// @param to The recipient of the token.\\n\\t/// @param tokenID The id of the token.\\n\\tfunction transferFrom(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 tokenID\\n\\t) external;\\n\\n\\t/// @notice Approve an operator to transfer a specific token on the senders behalf.\\n\\t/// @param operator The address receiving the approval.\\n\\t/// @param tokenID The id of the token.\\n\\tfunction approve(address operator, uint256 tokenID) external;\\n\\n\\t/// @notice Set the approval for an operator to manage all the tokens of the sender.\\n\\t/// @param operator The address receiving the approval.\\n\\t/// @param approved The determination of the approval.\\n\\tfunction setApprovalForAll(address operator, bool approved) external;\\n\\n\\t/// @notice Get the approved operator for a specific token.\\n\\t/// @param tokenID The id of the token.\\n\\t/// @return operator The address of the operator.\\n\\tfunction getApproved(uint256 tokenID) external view returns (address operator);\\n\\n\\t/// @notice Check if the sender approved the operator to transfer any of its tokens.\\n\\t/// @param owner The address of the owner.\\n\\t/// @param operator The address of the operator.\\n\\t/// @return isOperator The status of the approval.\\n\\tfunction isApprovedForAll(address owner, address operator) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4df60787dd909ce77b09140217d364b2892756586b187f74035082e47ecfcd17\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC721.sol\\\";\\n\\ninterface IERC721Metadata is IERC721 {\\n\\t/// @notice A descriptive name for a collection of NFTs in this contract\\n\\tfunction name() external view returns (string memory name);\\n\\n\\t/// @notice An abbreviated name for NFTs in this contract\\n\\tfunction symbol() external view returns (string memory symbol);\\n\\n\\t/// @notice A distinct Uniform Resource Identifier (URI) for a given asset.\\n\\t/// @dev Throws if `tokenID` is not a valid NFT. URIs are defined in RFC\\n\\t/// 3986. The URI may point to a JSON file that conforms to the \\\"ERC721\\n\\t/// Metadata JSON Schema\\\".\\n\\t/// @param tokenID id of the token being queried.\\n\\tfunction tokenURI(uint256 tokenID) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0x540dda3ba75aa5ce30d01925acdeba36c0dbe806ac45d292b78afd39e16937a4\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface IERC721Receiver {\\n\\t/// @notice Handle the receipt of an NFT\\n\\t/// @dev The ERC721 smart contract calls this function on the recipient\\n\\t/// after a `transfer`. This function MAY throw to revert and reject the\\n\\t/// transfer. Return of other than the magic value MUST result in the\\n\\t/// transaction being reverted.\\n\\t/// Note: the contract address is always the message sender.\\n\\t/// @param operator The address which called `safeTransferFrom` function\\n\\t/// @param from The address which previously owned the token\\n\\t/// @param tokenID The NFT identifier which is being transferred\\n\\t/// @param data Additional data with no specified format\\n\\t/// @return `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))`\\n\\t/// unless throwing\\n\\tfunction onERC721Received(\\n\\t\\taddress operator,\\n\\t\\taddress from,\\n\\t\\tuint256 tokenID,\\n\\t\\tbytes calldata data\\n\\t) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x1d23357c0e47a1577b28f87d36457cb1bfba01b3d2d807cbda6ee476b9f84b30\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC721/interfaces/IERC721WithBlocknumber.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface IERC721WithBlocknumber {\\n\\t/// @notice Get the owner of a token and the blockNumber of the last transfer, useful to voting mechanism.\\n\\t/// @param tokenID The id of the token.\\n\\t/// @return owner The address of the token owner.\\n\\t/// @return blockNumber The blocknumber at which the last transfer of that id happened.\\n\\tfunction ownerAndLastTransferBlockNumberOf(uint256 tokenID)\\n\\t\\texternal\\n\\t\\tview\\n\\t\\treturns (address owner, uint256 blockNumber);\\n\\n\\tstruct OwnerData {\\n\\t\\taddress owner;\\n\\t\\tuint256 lastTransferBlockNumber;\\n\\t}\\n\\n\\t/// @notice Get the list of owner of a token and the blockNumber of its last transfer, useful to voting mechanism.\\n\\t/// @param tokenIDs The list of token ids to check.\\n\\t/// @return ownersData The list of (owner, lastTransferBlockNumber) for each ids given as input.\\n\\tfunction ownerAndLastTransferBlockNumberList(uint256[] calldata tokenIDs)\\n\\t\\texternal\\n\\t\\tview\\n\\t\\treturns (OwnerData[] memory ownersData);\\n}\\n\",\"keccak256\":\"0x984c7ea95237ebb72d22b4bbc9ecddee00a33be1daf476fb6333e09136f08fc9\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Openzeppelin_Address {\\n\\t/**\\n\\t * @dev Returns true if `account` is a contract.\\n\\t *\\n\\t * [IMPORTANT]\\n\\t * ====\\n\\t * It is unsafe to assume that an address for which this function returns\\n\\t * false is an externally-owned account (EOA) and not a contract.\\n\\t *\\n\\t * Among others, `isContract` will return false for the following\\n\\t * types of addresses:\\n\\t *\\n\\t * - an externally-owned account\\n\\t * - a contract in construction\\n\\t * - an address where a contract will be created\\n\\t * - an address where a contract lived, but was destroyed\\n\\t * ====\\n\\t *\\n\\t * [IMPORTANT]\\n\\t * ====\\n\\t * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n\\t *\\n\\t * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n\\t * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n\\t * constructor.\\n\\t * ====\\n\\t */\\n\\tfunction isContract(address account) internal view returns (bool) {\\n\\t\\t// This method relies on extcodesize/address.code.length, which returns 0\\n\\t\\t// for contracts in construction, since the code is only stored at the end\\n\\t\\t// of the constructor execution.\\n\\n\\t\\treturn account.code.length > 0;\\n\\t}\\n\\n\\t/**\\n\\t * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n\\t * `recipient`, forwarding all available gas and reverting on errors.\\n\\t *\\n\\t * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n\\t * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n\\t * imposed by `transfer`, making them unable to receive funds via\\n\\t * `transfer`. {sendValue} removes this limitation.\\n\\t *\\n\\t * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n\\t *\\n\\t * IMPORTANT: because control is transferred to `recipient`, care must be\\n\\t * taken to not create reentrancy vulnerabilities. Consider using\\n\\t * {ReentrancyGuard} or the\\n\\t * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n\\t */\\n\\tfunction sendValue(address payable recipient, uint256 amount) internal {\\n\\t\\trequire(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n\\t\\t(bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n\\t\\trequire(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n\\t}\\n\\n\\t/**\\n\\t * @dev Performs a Solidity function call using a low level `call`. A\\n\\t * plain `call` is an unsafe replacement for a function call: use this\\n\\t * function instead.\\n\\t *\\n\\t * If `target` reverts with a revert reason, it is bubbled up by this\\n\\t * function (like regular Solidity function calls).\\n\\t *\\n\\t * Returns the raw returned data. To convert to the expected return value,\\n\\t * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n\\t *\\n\\t * Requirements:\\n\\t *\\n\\t * - `target` must be a contract.\\n\\t * - calling `target` with `data` must not revert.\\n\\t *\\n\\t * _Available since v3.1._\\n\\t */\\n\\tfunction functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n\\t\\treturn functionCall(target, data, \\\"Address: low-level call failed\\\");\\n\\t}\\n\\n\\t/**\\n\\t * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n\\t * `errorMessage` as a fallback revert reason when `target` reverts.\\n\\t *\\n\\t * _Available since v3.1._\\n\\t */\\n\\tfunction functionCall(\\n\\t\\taddress target,\\n\\t\\tbytes memory data,\\n\\t\\tstring memory errorMessage\\n\\t) internal returns (bytes memory) {\\n\\t\\treturn functionCallWithValue(target, data, 0, errorMessage);\\n\\t}\\n\\n\\t/**\\n\\t * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n\\t * but also transferring `value` wei to `target`.\\n\\t *\\n\\t * Requirements:\\n\\t *\\n\\t * - the calling contract must have an ETH balance of at least `value`.\\n\\t * - the called Solidity function must be `payable`.\\n\\t *\\n\\t * _Available since v3.1._\\n\\t */\\n\\tfunction functionCallWithValue(\\n\\t\\taddress target,\\n\\t\\tbytes memory data,\\n\\t\\tuint256 value\\n\\t) internal returns (bytes memory) {\\n\\t\\treturn functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n\\t}\\n\\n\\t/**\\n\\t * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n\\t * with `errorMessage` as a fallback revert reason when `target` reverts.\\n\\t *\\n\\t * _Available since v3.1._\\n\\t */\\n\\tfunction functionCallWithValue(\\n\\t\\taddress target,\\n\\t\\tbytes memory data,\\n\\t\\tuint256 value,\\n\\t\\tstring memory errorMessage\\n\\t) internal returns (bytes memory) {\\n\\t\\trequire(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n\\t\\trequire(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n\\t\\t(bool success, bytes memory returndata) = target.call{value: value}(data);\\n\\t\\treturn verifyCallResult(success, returndata, errorMessage);\\n\\t}\\n\\n\\t/**\\n\\t * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n\\t * but performing a static call.\\n\\t *\\n\\t * _Available since v3.3._\\n\\t */\\n\\tfunction functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n\\t\\treturn functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n\\t}\\n\\n\\t/**\\n\\t * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n\\t * but performing a static call.\\n\\t *\\n\\t * _Available since v3.3._\\n\\t */\\n\\tfunction functionStaticCall(\\n\\t\\taddress target,\\n\\t\\tbytes memory data,\\n\\t\\tstring memory errorMessage\\n\\t) internal view returns (bytes memory) {\\n\\t\\trequire(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n\\t\\t(bool success, bytes memory returndata) = target.staticcall(data);\\n\\t\\treturn verifyCallResult(success, returndata, errorMessage);\\n\\t}\\n\\n\\t/**\\n\\t * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n\\t * but performing a delegate call.\\n\\t *\\n\\t * _Available since v3.4._\\n\\t */\\n\\tfunction functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n\\t\\treturn functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n\\t}\\n\\n\\t/**\\n\\t * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n\\t * but performing a delegate call.\\n\\t *\\n\\t * _Available since v3.4._\\n\\t */\\n\\tfunction functionDelegateCall(\\n\\t\\taddress target,\\n\\t\\tbytes memory data,\\n\\t\\tstring memory errorMessage\\n\\t) internal returns (bytes memory) {\\n\\t\\trequire(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n\\t\\t(bool success, bytes memory returndata) = target.delegatecall(data);\\n\\t\\treturn verifyCallResult(success, returndata, errorMessage);\\n\\t}\\n\\n\\t/**\\n\\t * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n\\t * revert reason using the provided one.\\n\\t *\\n\\t * _Available since v4.3._\\n\\t */\\n\\tfunction verifyCallResult(\\n\\t\\tbool success,\\n\\t\\tbytes memory returndata,\\n\\t\\tstring memory errorMessage\\n\\t) internal pure returns (bytes memory) {\\n\\t\\tif (success) {\\n\\t\\t\\treturn returndata;\\n\\t\\t} else {\\n\\t\\t\\t// Look for revert reason and bubble it up if present\\n\\t\\t\\tif (returndata.length > 0) {\\n\\t\\t\\t\\t// The easiest way to bubble the revert reason is using memory via assembly\\n\\t\\t\\t\\t/// @solidity memory-safe-assembly\\n\\t\\t\\t\\tassembly {\\n\\t\\t\\t\\t\\tlet returndata_size := mload(returndata)\\n\\t\\t\\t\\t\\trevert(add(32, returndata), returndata_size)\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\trevert(errorMessage);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\",\"keccak256\":\"0xda14142ec34e7dde33eabb747152062eb9d9aad16036f6498340418f59c83c97\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/utils/GenericErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/// @notice Not authorized to perform this operation\\nerror NotAuthorized();\\n\",\"keccak256\":\"0x333aa48943e66849a9350384e7ec2553b93e8a8a12b8ad300d3341f7c98b60fd\",\"license\":\"MIT\"},\"src/game/interface/UsingStratagemsErrors.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\ninterface UsingStratagemsErrors {\\n\\t/// @notice Game has not started yet, can't perform any action\\n\\terror GameNotStarted();\\n\\n\\t/// @notice When in Resolution phase, it is not possible to commit new moves or cancel previous commitment\\n\\t/// During Resolution phase, players have to reveal their commitment, if not already done.\\n\\terror InResolutionPhase();\\n\\n\\t/// @notice When in Commit phase, player can make new commitment but they cannot resolve their move yet.\\n\\terror InCommitmentPhase();\\n\\n\\t/// @notice Previous commitment need to be resolved before making a new one. Even if the corresponding reveal phase has passed.\\\\\\n\\t/// It is also not possible to withdraw any amount from reserve until the commitment is revealed.\\\\\\n\\t/// @notice If player lost the information to reveal, it can acknowledge failure which will burn all its reserve.\\\\\\n\\terror PreviousCommitmentNotResolved();\\n\\n\\t/// @notice to make a commitment you always need at least one `config.numTokensPerGems` amount in reserve\\n\\t/// Player also need one `config.numTokensPerGems` per moves during the resolution phase.\\n\\t/// @param inReserve amount in reserver as the time of the call\\n\\t/// @param expected amount required to proceed\\n\\terror ReserveTooLow(uint256 inReserve, uint256 expected);\\n\\n\\t/// @notice Player have to reveal their commitment using the exact same move values\\n\\t/// If they provide different value, the commitment hash will differ and Stratagems will reject their resolution.\\n\\terror CommitmentHashNotMatching();\\n\\n\\t/// @notice Player can only resolve moves they commited.\\n\\terror NothingToResolve();\\n\\n\\t/// @notice Player can only resolve their move in the same epoch they commited.abi\\n\\t/// If a player resolve later it can only do to minimize the reserve burn cost by calling : `acknowledgeMissedResolution`\\n\\terror InvalidEpoch();\\n\\n\\t/// @notice Player can make arbitrary number of moves per epoch. To do so they group moves into (MAX_NUM_MOVES_PER_HASH = 32) moves\\n\\t/// This result in a recursive series of hash that they can then submit in turn while resolving.\\n\\t/// The limit (MAX_NUM_MOVES_PER_HASH = 32) ensure a resolution batch fits in a block.\\n\\terror InvalidFurtherMoves();\\n\\n\\t/// @notice Player have to resolve if they can\\n\\t/// Stratagems will prevent them from acknowledging missed resolution if there is still time to resolve.\\n\\terror CanStillResolve();\\n}\\n\",\"keccak256\":\"0x8075ff688eea39ef831a10548de6b225f0e71293e48708ba7b7a6b5c8e45e020\",\"license\":\"AGPL-3.0\"},\"src/game/interface/UsingStratagemsEvents.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nimport './UsingStratagemsTypes.sol';\\n\\ninterface UsingStratagemsEvents is UsingStratagemsTypes {\\n\\t/// @notice A player has commited to make a move and resolve it on the resolution phase\\n\\t/// @param player account taking the staking risk (can be a different account than the one controlling the gems)\\n\\t/// @param epoch epoch number on which this commit belongs to\\n\\t/// @param commitmentHash the hash of moves\\n\\tevent CommitmentMade(address indexed player, uint24 indexed epoch, bytes24 commitmentHash);\\n\\n\\t/// @notice A player has cancelled its current commitment (before it reached the resolution phase)\\n\\t/// @param player account taking the staking risk (can be a different account than the one controlling the gems)\\n\\t/// @param epoch epoch number on which this commit belongs to\\n\\tevent CommitmentCancelled(address indexed player, uint24 indexed epoch);\\n\\n\\t/// @notice A player has canceled a previous commitment by burning some tokens\\n\\t/// @param player the account that made the commitment\\n\\t/// @param epoch epoch number on which this commit belongs to\\n\\t/// @param amountBurnt amount of token to burn\\n\\t/// @param furtherMoves hash of further moves, unless bytes32(0) which indicate end.\\n\\tevent CommitmentVoid(address indexed player, uint24 indexed epoch, uint256 amountBurnt, bytes24 furtherMoves);\\n\\n\\t/// @notice Player has resolved its previous commitment\\n\\t/// @param player account who commited\\n\\t/// @param epoch epoch number on which this commit belongs to\\n\\t/// @param commitmentHash the hash of the moves\\n\\t/// @param moves the moves\\n\\t/// @param furtherMoves hash of further moves, unless bytes32(0) which indicate end.\\n\\tevent CommitmentResolved(\\n\\t\\taddress indexed player,\\n\\t\\tuint24 indexed epoch,\\n\\t\\tbytes24 indexed commitmentHash,\\n\\t\\tMove[] moves,\\n\\t\\tbytes24 furtherMoves,\\n\\t\\tuint256 newReserveAmount\\n\\t);\\n\\n\\t/// @notice Player have withdrawn token from the reserve\\n\\t/// @param player account withdrawing the tokens\\n\\t/// @param amountWithdrawn the number of tokens withdrawnn\\n\\t/// @param newAmount the number of tokens in reserver as a result\\n\\tevent ReserveWithdrawn(address indexed player, uint256 amountWithdrawn, uint256 newAmount);\\n\\n\\t/// @notice Player has deposited token in the reserve, allowing it to use that much in game\\n\\t/// @param player account receiving the token in the reserve\\n\\t/// @param amountDeposited the number of tokens deposited\\n\\t/// @param newAmount the number of tokens in reserver as a result\\n\\tevent ReserveDeposited(address indexed player, uint256 amountDeposited, uint256 newAmount);\\n\\n\\t// --------------------------------------------------------------------------------------------\\n\\t// Event to make it easier to check what is happening\\n\\t// TODO get rid ?\\n\\t// --------------------------------------------------------------------------------------------\\n\\t/// @notice A move has been resolved.\\n\\t/// @param position cell at which the move take place\\n\\t/// @param player account making the move\\n\\t/// @param oldColor previous color of the cell\\n\\t/// @param newColor color that takes over\\n\\tevent MoveProcessed(uint64 indexed position, address indexed player, Color oldColor, Color newColor);\\n}\\n\",\"keccak256\":\"0x44d4cce8966d48be8edd16b28515757b16574463382f8df8301d80721509bb32\",\"license\":\"AGPL-3.0\"},\"src/game/interface/UsingStratagemsTypes.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nimport 'solidity-kit/solc_0.8/ERC721/interfaces/IERC721.sol';\\nimport 'solidity-kit/solc_0.8/ERC165/interfaces/IERC165.sol';\\nimport 'solidity-kit/solc_0.8/ERC20/ERC2612/interfaces/IERC20WithIERC2612.sol';\\n\\ninterface UsingStratagemsTypes {\\n\\t// --------------------------------------------------------------------------------------------\\n\\t// EXTERNAL TYPES\\n\\t// --------------------------------------------------------------------------------------------\\n\\n\\t/// @notice The set of possible color (None indicate the Cell is empty)\\n\\tenum Color {\\n\\t\\tNone,\\n\\t\\tBlue,\\n\\t\\tRed,\\n\\t\\tGreen,\\n\\t\\tYellow,\\n\\t\\tPurple,\\n\\t\\tEvil\\n\\t}\\n\\n\\t/// @notice Move struct that define position and color\\n\\tstruct Move {\\n\\t\\tuint64 position; // TODO make it bigger ? uint32 * uint32 is probably infinitely big enough\\n\\t\\tColor color;\\n\\t}\\n\\n\\t/// @notice Permit struct to authorize EIP2612 ERC20 contracts\\n\\tstruct Permit {\\n\\t\\tuint256 value;\\n\\t\\tuint256 deadline;\\n\\t\\tuint8 v;\\n\\t\\tbytes32 r;\\n\\t\\tbytes32 s;\\n\\t}\\n\\n\\t/// @notice Config struct to configure the game instance\\n\\tstruct Config {\\n\\t\\tIERC20WithIERC2612 tokens;\\n\\t\\taddress payable burnAddress;\\n\\t\\tuint256 startTime;\\n\\t\\tuint256 commitPhaseDuration;\\n\\t\\tuint256 resolutionPhaseDuration;\\n\\t\\tuint8 maxLife;\\n\\t\\tuint256 numTokensPerGems;\\n\\t}\\n\\n\\t/// @notice Cell struct representing the current state of a cell\\n\\tstruct FullCell {\\n\\t\\taddress owner;\\n\\t\\tuint24 lastEpochUpdate;\\n\\t\\tuint24 epochWhenTokenIsAdded;\\n\\t\\tColor color;\\n\\t\\tuint8 life;\\n\\t\\tint8 delta;\\n\\t\\tuint8 enemyMap;\\n\\t\\tuint8 distribution;\\n\\t}\\n\\n\\t// --------------------------------------------------------------------------------------------\\n\\t// STORAGE TYPES\\n\\t// --------------------------------------------------------------------------------------------\\n\\tstruct Cell {\\n\\t\\tuint24 lastEpochUpdate;\\n\\t\\tuint24 epochWhenTokenIsAdded;\\n\\t\\tColor color;\\n\\t\\tuint8 life;\\n\\t\\tint8 delta;\\n\\t\\tuint8 enemyMap;\\n\\t\\tuint8 distribution; // this encode who is left to be given reward (4 left most bits) and the reard (4 most right bits)\\n\\t}\\n\\n\\tstruct Commitment {\\n\\t\\tbytes24 hash;\\n\\t\\tuint24 epoch;\\n\\t}\\n\\n\\t// --------------------------------------------------------------------------------------------\\n\\t// INTERNAL TYPES\\n\\t// --------------------------------------------------------------------------------------------\\n\\n\\tstruct TokenTransfer {\\n\\t\\taddress payable to;\\n\\t\\tuint256 amount;\\n\\t}\\n\\n\\tstruct TokenTransferCollection {\\n\\t\\tTokenTransfer[] transfers;\\n\\t\\tuint256 numTransfers;\\n\\t}\\n\\n\\tstruct MoveTokens {\\n\\t\\tuint256 tokensPlaced;\\n\\t\\tuint256 tokensBurnt;\\n\\t\\tuint256 tokensReturned;\\n\\t}\\n}\\n\",\"keccak256\":\"0xc60a8b6fa0a4e29bd62ec6cda0ee731285dd1c2f4860fcee93f8a512bc185c60\",\"license\":\"AGPL-3.0\"},\"src/game/internal/UsingStratagemsSetters.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nimport './UsingStratagemsState.sol';\\nimport '../interface/UsingStratagemsEvents.sol';\\nimport './UsingStratagemsUtils.sol';\\n\\nabstract contract UsingStratagemsSetters is UsingStratagemsState, UsingStratagemsUtils {\\n\\tconstructor(Config memory config) UsingStratagemsState(config) {}\\n\\n\\tfunction _makeCommitment(address player, bytes24 commitmentHash, uint256 inReserve) internal {\\n\\t\\tCommitment storage commitment = _commitments[player];\\n\\n\\t\\t(uint24 epoch, bool commiting) = _epoch();\\n\\n\\t\\tif (!commiting) {\\n\\t\\t\\trevert InResolutionPhase();\\n\\t\\t}\\n\\t\\tif (commitment.epoch != 0 && commitment.epoch != epoch) {\\n\\t\\t\\trevert PreviousCommitmentNotResolved();\\n\\t\\t}\\n\\n\\t\\tcommitment.hash = commitmentHash;\\n\\t\\tcommitment.epoch = epoch;\\n\\n\\t\\t// for withdrawal, we still require a minimal reserve so player cannot change their mind without losing at least one token\\n\\t\\t// TODO we might want to increase that value to 10x as 10 moves might quite common, at least on some networks\\n\\t\\tif (inReserve < NUM_TOKENS_PER_GEMS) {\\n\\t\\t\\t// TODO? special error for this case ?\\n\\t\\t\\trevert ReserveTooLow(inReserve, NUM_TOKENS_PER_GEMS);\\n\\t\\t}\\n\\n\\t\\temit CommitmentMade(player, epoch, commitmentHash);\\n\\t}\\n\\n\\tfunction _resolveMoves(\\n\\t\\taddress player,\\n\\t\\tuint24 epoch,\\n\\t\\tMove[] memory moves,\\n\\t\\taddress tokenGiver\\n\\t) internal returns (uint256 newReserveAmount) {\\n\\t\\t// max number of transfer is (4+1) * moves.length\\n\\t\\t// (for each move's cell's neighbours potentially being a different account)\\n\\t\\t// limiting the number of move per commitment resolution to 32 or, even more probably, should cover this unlikely scenario\\n\\t\\tTokenTransferCollection memory transferCollection = TokenTransferCollection({\\n\\t\\t\\ttransfers: new TokenTransfer[](moves.length * 5),\\n\\t\\t\\tnumTransfers: 0\\n\\t\\t});\\n\\t\\tMoveTokens memory tokens;\\n\\t\\tfor (uint256 i = 0; i < moves.length; i++) {\\n\\t\\t\\t(uint256 placed, uint256 burnt, uint256 returned) = _computeMove(\\n\\t\\t\\t\\ttransferCollection,\\n\\t\\t\\t\\tplayer,\\n\\t\\t\\t\\tepoch,\\n\\t\\t\\t\\tmoves[i]\\n\\t\\t\\t);\\n\\n\\t\\t\\ttokens.tokensPlaced += placed;\\n\\t\\t\\ttokens.tokensBurnt += burnt;\\n\\t\\t\\ttokens.tokensReturned += returned;\\n\\t\\t}\\n\\n\\t\\tlogger.logTransfers(0, 'resolve', transferCollection);\\n\\n\\t\\t_multiTransfer(TOKENS, transferCollection);\\n\\n\\t\\tnewReserveAmount = _tokensInReserve[player];\\n\\n\\t\\t// Note: even if funds can comes from outside the reserve, we still check it\\n\\t\\t// This ensure player have to have a reserve and cannot escape the slash if not\\n\\t\\tif (newReserveAmount < tokens.tokensPlaced + tokens.tokensBurnt) {\\n\\t\\t\\trevert ReserveTooLow(newReserveAmount, tokens.tokensPlaced + tokens.tokensBurnt);\\n\\t\\t}\\n\\t\\tif (tokenGiver == address(0)) {\\n\\t\\t\\tnewReserveAmount -= tokens.tokensPlaced + tokens.tokensBurnt;\\n\\t\\t\\t_tokensInReserve[player] = newReserveAmount;\\n\\t\\t} else {\\n\\t\\t\\tif (tokens.tokensPlaced != 0) {\\n\\t\\t\\t\\t// TODO use TransferCollection too here\\n\\t\\t\\t\\tTOKENS.transferFrom(tokenGiver, address(this), tokens.tokensPlaced);\\n\\t\\t\\t}\\n\\t\\t\\tif (tokens.tokensBurnt != 0) {\\n\\t\\t\\t\\t// TODO use TransferCollection too here\\n\\t\\t\\t\\tTOKENS.transferFrom(tokenGiver, BURN_ADDRESS, tokens.tokensBurnt);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t// option to return in reserve ?\\n\\t\\t// TODO use TransferCollection too here\\n\\t\\tif (tokens.tokensReturned != 0) {\\n\\t\\t\\t// console.log(\\\"tokensReturned\\\");\\n\\t\\t\\t// console.log(tokens.tokensReturned);\\n\\t\\t\\tTOKENS.transfer(player, tokens.tokensReturned);\\n\\t\\t}\\n\\t}\\n\\n\\tfunction _countBits(uint8 n) internal pure returns (uint8 count) {\\n\\t\\twhile (n != 0) {\\n\\t\\t\\tn = n & (n - 1);\\n\\t\\t\\tcount++;\\n\\t\\t}\\n\\t}\\n\\n\\t// Note on COLLISION\\n\\t// If one color was used more than other, we could consider the cell having N owner and N times the number of tokens\\n\\t// such cells would be a good target for others\\n\\t// On the other end, on winning agains other cells, owner of such cell would have to divide the winnings\\n\\t// TODO revisit this\\n\\t// we could also refund the part\\n\\t// so if there is 3 green 2 blue and 1 red, then green win and the cell become green\\n\\t// player we put blue or red get refunded their respective gems\\n\\t// the players we put green get refunded 2/3 so that the cell still contains only 1\\n\\t// if there was 3 green and 3 blue and 1 red then the cell becomes black\\n\\t// every player get refunded 6/7 so that the black cell only has 1\\n\\t// note that the issue with green winning above is that winnings need to be distributed to all 3 players we put green\\n\\t// and since the number is technically unbounded, we have to use a splitter contract where player withdraw their winnings\\n\\t// this add UX complexity and some cost for withdrawals\\n\\tfunction _computeMove(\\n\\t\\tTokenTransferCollection memory transferCollection,\\n\\t\\taddress player,\\n\\t\\tuint24 epoch,\\n\\t\\tMove memory move\\n\\t) internal returns (uint256 tokensPlaced, uint256 tokensBurnt, uint256 tokensReturned) {\\n\\t\\tCell memory currentState = _getUpdatedCell(move.position, epoch);\\n\\n\\t\\tlogger.logCell(\\n\\t\\t\\t0,\\n\\t\\t\\tstring.concat('_computeMove at epoch ', Strings.toString(epoch)),\\n\\t\\t\\tmove.position,\\n\\t\\t\\tcurrentState,\\n\\t\\t\\taddress(uint160(_owners[move.position]))\\n\\t\\t);\\n\\n\\t\\t// we might have distribution still to do\\n\\t\\tuint8 distribution = currentState.distribution;\\n\\t\\tif (currentState.life == 0 && currentState.lastEpochUpdate != 0) {\\n\\t\\t\\t// if we just died, currentState.lastEpochUpdate > 0\\n\\t\\t\\t// we have to distribute to all\\n\\t\\t\\tdistribution = (currentState.enemyMap << 4) + _countBits(currentState.enemyMap);\\n\\n\\t\\t\\t/// we are now dead for real\\n\\t\\t\\tcurrentState.lastEpochUpdate = 0;\\n\\t\\t}\\n\\n\\t\\t// we then apply our move:\\n\\n\\t\\t// first we do some validity checks\\n\\t\\tif (move.color == Color.None) {\\n\\t\\t\\tif (currentState.life != MAX_LIFE || _ownerOf(move.position) != player) {\\n\\t\\t\\t\\t// invalid move\\n\\t\\t\\t\\treturn (0, 0, NUM_TOKENS_PER_GEMS);\\n\\t\\t\\t}\\n\\n\\t\\t\\t_collectTransfer(transferCollection, TokenTransfer({to: payable(player), amount: NUM_TOKENS_PER_GEMS}));\\n\\t\\t}\\n\\t\\t// then we consider the case of collision and transform such move as Color Evil\\n\\t\\telse if (currentState.epochWhenTokenIsAdded == epoch) {\\n\\t\\t\\tif (currentState.life != 0) {\\n\\t\\t\\t\\tmove.color = Color.Evil;\\n\\t\\t\\t\\t// TODO Add further stake, or do we burn? or return?\\n\\t\\t\\t} else {\\n\\t\\t\\t\\t// invalid move, on top of a MAX, that become None ?\\n\\t\\t\\t\\treturn (0, 0, NUM_TOKENS_PER_GEMS);\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t(int8 newDelta, uint8 newEnemyMap) = _propagate(\\n\\t\\t\\ttransferCollection,\\n\\t\\t\\tmove,\\n\\t\\t\\tepoch,\\n\\t\\t\\tcurrentState.color,\\n\\t\\t\\tdistribution\\n\\t\\t);\\n\\n\\t\\temit MoveProcessed(move.position, player, currentState.color, move.color);\\n\\t\\tcurrentState.color = move.color;\\n\\t\\tcurrentState.distribution = 0;\\n\\t\\tcurrentState.epochWhenTokenIsAdded = epoch; // used to prevent overwriting, even Color.None\\n\\n\\t\\tif (currentState.color == Color.None) {\\n\\t\\t\\tcurrentState.life = 0;\\n\\t\\t\\tcurrentState.lastEpochUpdate = 0;\\n\\t\\t\\tcurrentState.delta = 0;\\n\\t\\t\\tcurrentState.enemyMap = 0;\\n\\t\\t\\t_owners[move.position] = 0;\\n\\t\\t\\ttokensReturned = NUM_TOKENS_PER_GEMS;\\n\\t\\t} else {\\n\\t\\t\\ttokensPlaced = NUM_TOKENS_PER_GEMS;\\n\\n\\t\\t\\tcurrentState.enemyMap = newEnemyMap;\\n\\n\\t\\t\\tcurrentState.delta = newDelta;\\n\\t\\t\\tcurrentState.life = 1;\\n\\t\\t\\tcurrentState.lastEpochUpdate = epoch;\\n\\t\\t\\tif (currentState.color == Color.Evil) {\\n\\t\\t\\t\\t_owners[move.position] = uint256(uint160(0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF));\\n\\t\\t\\t} else {\\n\\t\\t\\t\\t_owners[move.position] = uint256(uint160(player));\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t_cells[move.position] = currentState;\\n\\n\\t\\tlogger.logCell(\\n\\t\\t\\t0,\\n\\t\\t\\tstring.concat('AFTER ', Strings.toString(epoch)),\\n\\t\\t\\tmove.position,\\n\\t\\t\\tcurrentState,\\n\\t\\t\\taddress(uint160(_owners[move.position]))\\n\\t\\t);\\n\\t}\\n\\n\\tfunction _propagate(\\n\\t\\tTokenTransferCollection memory transferCollection,\\n\\t\\tMove memory move,\\n\\t\\tuint24 epoch,\\n\\t\\tColor color,\\n\\t\\tuint8 distribution\\n\\t) internal returns (int8 newDelta, uint8 newEnemyMap) {\\n\\t\\t(\\n\\t\\t\\tint8 newComputedDelta,\\n\\t\\t\\tuint8 newComputedEnemyMap,\\n\\t\\t\\tuint8 numDue,\\n\\t\\t\\taddress[4] memory ownersToPay\\n\\t\\t) = _updateNeighbours(move.position, epoch, color, move.color, distribution);\\n\\n\\t\\tif (numDue > 0) {\\n\\t\\t\\t_collectTransfer(\\n\\t\\t\\t\\ttransferCollection,\\n\\t\\t\\t\\tTokenTransfer({to: payable(_ownerOf(move.position)), amount: (numDue * NUM_TOKENS_PER_GEMS) / 12})\\n\\t\\t\\t);\\n\\t\\t}\\n\\t\\tfor (uint8 i = 0; i < 4; i++) {\\n\\t\\t\\tif (ownersToPay[i] != address(0)) {\\n\\t\\t\\t\\t_collectTransfer(\\n\\t\\t\\t\\t\\ttransferCollection,\\n\\t\\t\\t\\t\\tTokenTransfer({to: payable(ownersToPay[i]), amount: (NUM_TOKENS_PER_GEMS / (distribution & 0x0f))})\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tnewDelta = newComputedDelta;\\n\\t\\tnewEnemyMap = newComputedEnemyMap;\\n\\t}\\n\\n\\tfunction _poke(TokenTransferCollection memory transferCollection, uint64 position) internal {\\n\\t\\t(uint24 epoch, ) = _epoch();\\n\\t\\tCell memory currentState = _getUpdatedCell(position, epoch);\\n\\n\\t\\tlogger.logCell(\\n\\t\\t\\t0,\\n\\t\\t\\tstring.concat('_poke at epoch ', Strings.toString(epoch)),\\n\\t\\t\\tposition,\\n\\t\\t\\tcurrentState,\\n\\t\\t\\taddress(uint160(_owners[position]))\\n\\t\\t);\\n\\n\\t\\t// we might have distribution still to do\\n\\t\\tuint8 distribution = currentState.distribution;\\n\\t\\tif (currentState.life == 0 && currentState.lastEpochUpdate != 0) {\\n\\t\\t\\t// if we just died, currentState.lastEpochUpdate > 0\\n\\t\\t\\t// we have to distribute to all\\n\\t\\t\\tdistribution = (currentState.enemyMap << 4) + _countBits(currentState.enemyMap);\\n\\n\\t\\t\\t/// we are now dead for real\\n\\t\\t\\tcurrentState.lastEpochUpdate = 0;\\n\\t\\t}\\n\\n\\t\\t(, , uint8 numDue, address[4] memory ownersToPay) = _updateNeighbours(\\n\\t\\t\\tposition,\\n\\t\\t\\tepoch,\\n\\t\\t\\tcurrentState.color,\\n\\t\\t\\tcurrentState.color,\\n\\t\\t\\tdistribution\\n\\t\\t);\\n\\n\\t\\tif (numDue > 0) {\\n\\t\\t\\t_collectTransfer(\\n\\t\\t\\t\\ttransferCollection,\\n\\t\\t\\t\\tTokenTransfer({to: payable(_ownerOf(position)), amount: numDue * NUM_TOKENS_PER_GEMS})\\n\\t\\t\\t);\\n\\t\\t}\\n\\t\\tfor (uint8 i = 0; i < 4; i++) {\\n\\t\\t\\tif (ownersToPay[i] != address(0)) {\\n\\t\\t\\t\\t_collectTransfer(\\n\\t\\t\\t\\t\\ttransferCollection,\\n\\t\\t\\t\\t\\tTokenTransfer({to: payable(ownersToPay[i]), amount: NUM_TOKENS_PER_GEMS})\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tcurrentState.distribution = 0;\\n\\t\\t_cells[position] = currentState;\\n\\t}\\n\\n\\tfunction _updateNeighbours(\\n\\t\\tuint64 position,\\n\\t\\tuint24 epoch,\\n\\t\\tColor oldColor,\\n\\t\\tColor newColor,\\n\\t\\tuint8 distribution\\n\\t) internal returns (int8 newDelta, uint8 newenemyMap, uint8 numDue, address[4] memory ownersToPay) {\\n\\t\\tunchecked {\\n\\t\\t\\tint256 x = int256(int32(int256(uint256(position) & 0xFFFFFFFF)));\\n\\t\\t\\tint256 y = int256(int32(int256(uint256(position) >> 32)));\\n\\n\\t\\t\\tint8 enemyOrFriend;\\n\\t\\t\\tuint8 due;\\n\\t\\t\\t{\\n\\t\\t\\t\\tuint64 upPosition = uint64((uint256(y - 1) << 32) + uint256(x));\\n\\t\\t\\t\\t(enemyOrFriend, due) = _updateCell(upPosition, epoch, 2, oldColor, newColor);\\n\\t\\t\\t\\tif (enemyOrFriend < 0) {\\n\\t\\t\\t\\t\\tnewenemyMap = newenemyMap | 1;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnumDue += due;\\n\\t\\t\\t\\tif ((distribution >> 4) & 4 == 4) {\\n\\t\\t\\t\\t\\t// TODO?: if we decide to group owner in the cell struct, we should get the cell in memory in that function\\n\\t\\t\\t\\t\\townersToPay[0] = _ownerOf(upPosition);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnewDelta += enemyOrFriend;\\n\\t\\t\\t}\\n\\t\\t\\t{\\n\\t\\t\\t\\tuint64 leftPosition = uint64((uint256(y) << 32) + uint256(x - 1));\\n\\n\\t\\t\\t\\t(enemyOrFriend, due) = _updateCell(leftPosition, epoch, 3, oldColor, newColor);\\n\\t\\t\\t\\tif (enemyOrFriend < 0) {\\n\\t\\t\\t\\t\\tnewenemyMap = newenemyMap | 2;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnumDue += due;\\n\\t\\t\\t\\tif ((distribution >> 4) & 8 == 8) {\\n\\t\\t\\t\\t\\townersToPay[1] = _ownerOf(leftPosition);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnewDelta += enemyOrFriend;\\n\\t\\t\\t}\\n\\n\\t\\t\\t{\\n\\t\\t\\t\\tuint64 downPosition = uint64((uint256(y + 1) << 32) + uint256(x));\\n\\t\\t\\t\\t(enemyOrFriend, due) = _updateCell(downPosition, epoch, 0, oldColor, newColor);\\n\\t\\t\\t\\tif (enemyOrFriend < 0) {\\n\\t\\t\\t\\t\\tnewenemyMap = newenemyMap | 4;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnumDue += due;\\n\\t\\t\\t\\tif ((distribution >> 4) & 1 == 1) {\\n\\t\\t\\t\\t\\townersToPay[2] = _ownerOf(downPosition);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnewDelta += enemyOrFriend;\\n\\t\\t\\t}\\n\\t\\t\\t{\\n\\t\\t\\t\\tuint64 rightPosition = uint64((uint256(y) << 32) + uint256(x + 1));\\n\\t\\t\\t\\t(enemyOrFriend, due) = _updateCell(rightPosition, epoch, 1, oldColor, newColor);\\n\\t\\t\\t\\tif (enemyOrFriend < 0) {\\n\\t\\t\\t\\t\\tnewenemyMap = newenemyMap | 8;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnumDue += due;\\n\\t\\t\\t\\tif ((distribution >> 4) & 2 == 2) {\\n\\t\\t\\t\\t\\townersToPay[3] = _ownerOf(rightPosition);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnewDelta += enemyOrFriend;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t/// @dev This update the cell in storage\\n\\tfunction _updateCell(\\n\\t\\tuint64 position,\\n\\t\\tuint24 epoch,\\n\\t\\tuint8 neighbourIndex,\\n\\t\\tColor oldColor,\\n\\t\\tColor newColor\\n\\t) internal returns (int8 enemyOrFriend, uint8 due) {\\n\\t\\tCell memory cell = _cells[position];\\n\\n\\t\\tuint24 lastUpdate = cell.lastEpochUpdate;\\n\\t\\tColor color = cell.color;\\n\\t\\tif (color != Color.None) {\\n\\t\\t\\tenemyOrFriend = color == newColor ? int8(1) : int8(-1);\\n\\t\\t}\\n\\t\\tif (lastUpdate >= 1 && color != Color.None) {\\n\\t\\t\\t// we only consider cell with color that are not dead\\n\\t\\t\\tif (cell.life > 0 && lastUpdate < epoch) {\\n\\t\\t\\t\\t// of there is life to update we compute the new life\\n\\t\\t\\t\\t(uint8 newLife, uint24 epochUsed) = _computeNewLife(\\n\\t\\t\\t\\t\\tlastUpdate,\\n\\t\\t\\t\\t\\tcell.enemyMap,\\n\\t\\t\\t\\t\\tcell.delta,\\n\\t\\t\\t\\t\\tcell.life,\\n\\t\\t\\t\\t\\tepoch\\n\\t\\t\\t\\t);\\n\\t\\t\\t\\tdue = _updateCellFromNeighbor(position, cell, newLife, epochUsed, neighbourIndex, oldColor, newColor);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tdue = _updateCellFromNeighbor(position, cell, cell.life, epoch, neighbourIndex, oldColor, newColor);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tfunction _updateCellFromNeighbor(\\n\\t\\tuint64 position, // position of the cell to be updated\\n\\t\\tCell memory cell, // cell to be updated\\n\\t\\tuint8 newLife, // new life value for the celll\\n\\t\\tuint24 epoch, // epoch at which the update occured (epochUsed TODO: confirm its use)\\n\\t\\tuint8 neighbourIndex, // the neighbor triggering the update and for which we return whether it should receive its due\\n\\t\\tColor oldColor, // old color of that neighbor\\n\\t\\tColor newColor // new color of that neighbor\\n\\t) internal returns (uint8 due) {\\n\\t\\tif (cell.life > 0 && newLife == 0) {\\n\\t\\t\\t// we just died, we establish the distributionMap and counts\\n\\t\\t\\tcell.distribution = (cell.enemyMap << 4) + _countBits(cell.enemyMap);\\n\\t\\t}\\n\\n\\t\\tlogger.logCell(\\n\\t\\t\\t0,\\n\\t\\t\\tstring.concat('_updateCellFromNeighbor index', Strings.toString(neighbourIndex)),\\n\\t\\t\\tposition,\\n\\t\\t\\tcell,\\n\\t\\t\\taddress(uint160(_owners[position]))\\n\\t\\t);\\n\\n\\t\\tif ((cell.distribution >> 4) & (2 ** neighbourIndex) == 2 ** neighbourIndex) {\\n\\t\\t\\tdue = 12 / (cell.distribution & 0x0f);\\n\\t\\t\\tcell.distribution =\\n\\t\\t\\t\\t(uint8(uint256(cell.distribution >> 4) & (~(2 ** uint256(neighbourIndex)))) << 4) +\\n\\t\\t\\t\\t(cell.distribution & 0x0f);\\n\\t\\t}\\n\\n\\t\\tif (oldColor != newColor) {\\n\\t\\t\\tif (newColor == Color.None) {\\n\\t\\t\\t\\tif (cell.color == oldColor) {\\n\\t\\t\\t\\t\\tcell.delta -= 1;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tcell.delta += 1;\\n\\t\\t\\t\\t\\tcell.enemyMap = cell.enemyMap & uint8((1 << neighbourIndex) ^ 0xFF);\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else if (cell.color == oldColor) {\\n\\t\\t\\t\\t// then newColor is different (see assert above)\\n\\t\\t\\t\\tcell.enemyMap = cell.enemyMap | uint8(1 << neighbourIndex);\\n\\t\\t\\t\\tcell.delta -= 2;\\n\\t\\t\\t} else if (cell.color == newColor) {\\n\\t\\t\\t\\t// then old color was different\\n\\t\\t\\t\\tcell.delta += (oldColor == Color.None ? int8(1) : int8(2));\\n\\t\\t\\t\\tcell.enemyMap = cell.enemyMap & uint8((1 << neighbourIndex) ^ 0xFF);\\n\\t\\t\\t} else if (oldColor == Color.None) {\\n\\t\\t\\t\\t// if there were no oldCOlor and the newColor is not your (already checked in previous if clause)\\n\\t\\t\\t\\tcell.delta -= 1;\\n\\t\\t\\t\\tcell.enemyMap = cell.enemyMap | uint8(1 << neighbourIndex);\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tcell.lastEpochUpdate = epoch;\\n\\t\\tcell.life = newLife;\\n\\n\\t\\tlogger.logCell(\\n\\t\\t\\t0,\\n\\t\\t\\tstring.concat('AFTER _updateCellFromNeighbor index', Strings.toString(neighbourIndex)),\\n\\t\\t\\tposition,\\n\\t\\t\\tcell,\\n\\t\\t\\taddress(uint160(_owners[position]))\\n\\t\\t);\\n\\n\\t\\t_cells[position] = cell;\\n\\t}\\n}\\n\",\"keccak256\":\"0xb3431344216d678974e84e5870b55f021059015b8add0dba32848686e8371dd2\",\"license\":\"AGPL-3.0\"},\"src/game/internal/UsingStratagemsState.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nimport './UsingStratagemsStore.sol';\\nimport '../interface/UsingStratagemsEvents.sol';\\nimport '../interface/UsingStratagemsErrors.sol';\\nimport './UsingVirtualTime.sol';\\n\\n// TODO use hardhat-preprocessor\\nimport 'hardhat/console.sol';\\nimport '@openzeppelin/contracts/utils/Strings.sol';\\n\\nlibrary logger {\\n\\taddress constant CONSOLE_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67;\\n\\n\\tfunction _sendLogPayload(bytes memory payload) private view {\\n\\t\\taddress consoleAddress = CONSOLE_ADDRESS;\\n\\t\\t/// @solidity memory-safe-assembly\\n\\t\\tassembly {\\n\\t\\t\\tpop(staticcall(gas(), consoleAddress, add(payload, 32), mload(payload), 0, 0))\\n\\t\\t}\\n\\t}\\n\\n\\t// _sendLogPayload(abi.encodeWithSignature('log(string,int256,int256)', 'cell %s', x, y));\\n\\n\\tfunction logCell(\\n\\t\\tuint8 ii,\\n\\t\\tstring memory title,\\n\\t\\tuint64 id,\\n\\t\\tUsingStratagemsTypes.Cell memory cell,\\n\\t\\taddress owner\\n\\t) internal view {\\n\\t\\t// string memory indent = ii == 0 ? '' : ii == 1 ? ' ' : ii == 2 ? ' ' : ' ';\\n\\t\\t// // string memory indent = '';\\n\\t\\t// console.log('%s%s', indent, title);\\n\\t\\t// int256 x = int256(int32(int256(uint256(id) & 0xFFFFFFFF)));\\n\\t\\t// int256 y = int256(int32(int256(uint256(id) >> 32)));\\n\\t\\t// console.log('%s-------------------------------------------------------------', indent);\\n\\t\\t// console.log('%scell (%s,%s)', indent, Strings.toString(x), Strings.toString(y));\\n\\t\\t// console.log('%s-------------------------------------------------------------', indent);\\n\\t\\t// console.log('%s - lastEpochUpdate: %s', indent, cell.lastEpochUpdate);\\n\\t\\t// console.log('%s - epochWhenTokenIsAdded: %s', indent, cell.epochWhenTokenIsAdded);\\n\\t\\t// console.log('%s - color: %s', indent, uint8(cell.color));\\n\\t\\t// console.log('%s - life: %s', indent, cell.life);\\n\\t\\t// console.log('%s - distribution: %s', indent, cell.distribution);\\n\\t\\t// console.log('%s - owner: %s', indent, owner);\\n\\t\\t// console.log('%s - delta: %s', indent, Strings.toString(cell.delta));\\n\\t\\t// console.log('%s - enemyMap: %s', indent, cell.enemyMap);\\n\\t\\t// console.log('%s-------------------------------------------------------------', indent);\\n\\t}\\n\\n\\tfunction logTransfers(\\n\\t\\tuint8 ii,\\n\\t\\tstring memory title,\\n\\t\\tUsingStratagemsTypes.TokenTransferCollection memory transferCollection\\n\\t) internal pure {\\n\\t\\t// string memory indent = ii == 0 ? '' : ii == 1 ? ' ' : ii == 2 ? ' ' : ' ';\\n\\t\\t// // string memory indent = '';\\n\\t\\t// console.log('%s%s', indent, title);\\n\\t\\t// console.log('%s-------------------------------------------------------------', indent);\\n\\t\\t// for (uint256 i = 0; i < transferCollection.numTransfers; i++) {\\n\\t\\t// \\tconsole.log(\\n\\t\\t// \\t\\t'%stransfer (%s,%s)',\\n\\t\\t// \\t\\tindent,\\n\\t\\t// \\t\\ttransferCollection.transfers[i].to,\\n\\t\\t// \\t\\tStrings.toString(transferCollection.transfers[i].amount)\\n\\t\\t// \\t);\\n\\t\\t// }\\n\\t\\t// console.log('%s-------------------------------------------------------------', indent);\\n\\t}\\n}\\n\\nabstract contract UsingStratagemsState is\\n\\tUsingStratagemsStore,\\n\\tUsingStratagemsEvents,\\n\\tUsingStratagemsErrors,\\n\\tUsingVirtualTime\\n{\\n\\t/// @notice The token used for the game. Each gems on the board contains that token\\n\\tIERC20WithIERC2612 internal immutable TOKENS;\\n\\t/// @notice the timestamp (in seconds) at which the game start, it start in the commit phase\\n\\tuint256 internal immutable START_TIME;\\n\\t/// @notice the duration of the commit phase in seconds\\n\\tuint256 internal immutable COMMIT_PHASE_DURATION;\\n\\t/// @notice the duration of the resolution phase in seconds\\n\\tuint256 internal immutable RESOLUTION_PHASE_DURATION;\\n\\t/// @notice the max number of level a cell can reach in the game\\n\\tuint8 internal immutable MAX_LIFE;\\n\\t/// @notice the number of tokens underlying each gems on the board.\\n\\tuint256 internal immutable NUM_TOKENS_PER_GEMS;\\n\\t/// @notice the address to send the token to when burning\\n\\taddress payable internal immutable BURN_ADDRESS;\\n\\n\\t/// @notice the number of moves a hash represent, after that players make use of furtherMoves\\n\\tuint8 internal constant MAX_NUM_MOVES_PER_HASH = 32;\\n\\n\\t/// @notice Create an instance of a Stratagems game\\n\\t/// @param config configuration options for the game\\n\\tconstructor(Config memory config) {\\n\\t\\tTOKENS = config.tokens;\\n\\t\\tBURN_ADDRESS = config.burnAddress;\\n\\t\\tSTART_TIME = config.startTime;\\n\\t\\tCOMMIT_PHASE_DURATION = config.commitPhaseDuration;\\n\\t\\tRESOLUTION_PHASE_DURATION = config.resolutionPhaseDuration;\\n\\t\\tMAX_LIFE = config.maxLife;\\n\\t\\tNUM_TOKENS_PER_GEMS = config.numTokensPerGems;\\n\\t}\\n\\n\\tfunction _epoch() internal view virtual returns (uint24 epoch, bool commiting) {\\n\\t\\tuint256 epochDuration = COMMIT_PHASE_DURATION + RESOLUTION_PHASE_DURATION;\\n\\t\\tuint256 time = _timestamp();\\n\\t\\tif (time < START_TIME) {\\n\\t\\t\\trevert GameNotStarted();\\n\\t\\t}\\n\\t\\tuint256 timePassed = time - START_TIME;\\n\\t\\tepoch = uint24(timePassed / epochDuration + 2); // epoch start at 2, this make the hypothetical previous resolution phase's epoch to be 1\\n\\t\\tcommiting = timePassed - ((epoch - 2) * epochDuration) < COMMIT_PHASE_DURATION;\\n\\t}\\n\\n\\tfunction _computeNewLife(\\n\\t\\tuint24 lastUpdate,\\n\\t\\tuint8 enemyMap,\\n\\t\\tint8 delta,\\n\\t\\tuint8 life,\\n\\t\\tuint24 epoch\\n\\t) internal view returns (uint8 newLife, uint24 epochUsed) {\\n\\t\\tepochUsed = lastUpdate;\\n\\t\\tif (lastUpdate >= 1 && life > 0) {\\n\\t\\t\\tuint256 epochDelta = epoch - lastUpdate;\\n\\t\\t\\tif (epochDelta > 0) {\\n\\t\\t\\t\\tint8 effectiveDelta = delta != 0 ? delta : -1;\\n\\t\\t\\t\\tif (effectiveDelta < 0 && enemyMap == 0) {\\n\\t\\t\\t\\t\\teffectiveDelta = 0;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif (effectiveDelta > 0) {\\n\\t\\t\\t\\t\\tif (life < MAX_LIFE) {\\n\\t\\t\\t\\t\\t\\tuint8 maxEpoch = ((MAX_LIFE - life) + uint8(effectiveDelta) - 1) / uint8(effectiveDelta);\\n\\t\\t\\t\\t\\t\\tif (epochDelta > maxEpoch) {\\n\\t\\t\\t\\t\\t\\t\\tepochDelta = maxEpoch;\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\tlife += uint8(epochDelta) * uint8(effectiveDelta);\\n\\t\\t\\t\\t\\t\\tif (life > MAX_LIFE) {\\n\\t\\t\\t\\t\\t\\t\\tlife = MAX_LIFE;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tnewLife = life;\\n\\t\\t\\t\\t\\t\\tepochUsed = lastUpdate + uint24(epochDelta);\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tnewLife = life;\\n\\t\\t\\t\\t\\t\\tepochUsed = lastUpdate;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} else if (effectiveDelta < 0) {\\n\\t\\t\\t\\t\\tuint8 numEpochBeforeDying = (life + uint8(-effectiveDelta) - 1) / uint8(-effectiveDelta);\\n\\t\\t\\t\\t\\tif (epochDelta > numEpochBeforeDying) {\\n\\t\\t\\t\\t\\t\\tepochDelta = numEpochBeforeDying;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tuint8 lifeLoss = uint8(epochDelta) * uint8(-effectiveDelta);\\n\\t\\t\\t\\t\\tif (lifeLoss > life) {\\n\\t\\t\\t\\t\\t\\tnewLife = 0;\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tnewLife = life - lifeLoss;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tepochUsed = lastUpdate + uint24(epochDelta);\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tnewLife = life;\\n\\t\\t\\t\\t\\tepochUsed = epoch;\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tnewLife = life;\\n\\t\\t\\t\\tepochUsed = lastUpdate;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tfunction _getUpdatedCell(uint64 position, uint24 epoch) internal view returns (Cell memory updatedCell) {\\n\\t\\t// load from state\\n\\t\\tupdatedCell = _cells[position];\\n\\t\\tuint24 lastUpdate = updatedCell.lastEpochUpdate;\\n\\t\\tint8 delta = updatedCell.delta;\\n\\t\\tuint8 life = updatedCell.life;\\n\\t\\t// logger.logCell(0, 'before update', position, updatedCell, address(uint160(_owners[position])));\\n\\t\\tif (lastUpdate >= 1 && life > 0) {\\n\\t\\t\\t(uint8 newLife, uint24 epochUsed) = _computeNewLife(lastUpdate, updatedCell.enemyMap, delta, life, epoch);\\n\\t\\t\\tupdatedCell.life = newLife;\\n\\t\\t\\tupdatedCell.lastEpochUpdate = epochUsed; // TODO check if this is useful to cap it to epoch where it died\\n\\t\\t}\\n\\t}\\n\\n\\t/// @dev Get the owner of a token.\\n\\t/// @param tokenID The token to query.\\n\\tfunction _ownerOf(uint256 tokenID) internal view virtual returns (address owner) {\\n\\t\\towner = address(uint160(_owners[tokenID]));\\n\\t}\\n}\\n\",\"keccak256\":\"0x93630a64cfb85f8cab1d9971293bf41718c3f6457cd2de39c68bead638803f85\",\"license\":\"AGPL-3.0\"},\"src/game/internal/UsingStratagemsStore.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nimport '../interface/UsingStratagemsTypes.sol';\\n\\ncontract UsingStratagemsStore is UsingStratagemsTypes {\\n\\tmapping(uint256 => Cell) internal _cells;\\n\\tmapping(uint256 => uint256) internal _owners; //owner + approval + ... erc721\\n\\n\\tmapping(address => uint256) internal _tokensInReserve;\\n\\tmapping(address => Commitment) internal _commitments;\\n\\n\\t// Operators (also used by ERC721)\\n\\tmapping(address => mapping(address => bool)) internal _operatorsForAll;\\n\\tmapping(uint256 => address) internal _operators;\\n\\n\\t// ERC721 balanceOf\\n\\t// mapping(address => uint256) internal _balances;\\n}\\n\",\"keccak256\":\"0x67d22bbc7eb4513799c8038a35e581d90ee2cb213051850ebd59f4e78cc44a2d\",\"license\":\"AGPL-3.0\"},\"src/game/internal/UsingStratagemsUtils.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nimport '../interface/UsingStratagemsTypes.sol';\\nimport '../interface/UsingStratagemsErrors.sol';\\n\\nabstract contract UsingStratagemsUtils is UsingStratagemsTypes, UsingStratagemsErrors {\\n\\tfunction _checkHash(\\n\\t\\tbytes24 commitmentHash,\\n\\t\\tbytes32 secret,\\n\\t\\tMove[] memory moves,\\n\\t\\tbytes24 furtherMoves\\n\\t) internal pure {\\n\\t\\tif (furtherMoves != bytes24(0)) {\\n\\t\\t\\tbytes24 computedHash = bytes24(keccak256(abi.encode(secret, moves, furtherMoves)));\\n\\t\\t\\tif (commitmentHash != computedHash) {\\n\\t\\t\\t\\trevert CommitmentHashNotMatching();\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\tbytes24 computedHash = bytes24(keccak256(abi.encode(secret, moves)));\\n\\t\\t\\tif (commitmentHash != computedHash) {\\n\\t\\t\\t\\trevert CommitmentHashNotMatching();\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tfunction _collectTransfer(\\n\\t\\tTokenTransferCollection memory transferCollection,\\n\\t\\tTokenTransfer memory newTransfer\\n\\t) internal pure {\\n\\t\\t// we look for the newTransfer address in case it is already present\\n\\t\\tfor (uint256 k = 0; k < transferCollection.numTransfers; k++) {\\n\\t\\t\\tif (transferCollection.transfers[k].to == newTransfer.to) {\\n\\t\\t\\t\\t// if we found we add the amount\\n\\t\\t\\t\\ttransferCollection.transfers[k].amount += newTransfer.amount;\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t// if we did not find that address we add it to the end\\n\\t\\ttransferCollection.transfers[transferCollection.numTransfers].to = newTransfer.to;\\n\\t\\ttransferCollection.transfers[transferCollection.numTransfers].amount = newTransfer.amount;\\n\\t\\t// and increase the size to lookup for next time\\n\\t\\ttransferCollection.numTransfers++;\\n\\t}\\n\\n\\tfunction _multiTransfer(IERC20WithIERC2612 token, TokenTransferCollection memory transferCollection) internal {\\n\\t\\tfor (uint256 i = 0; i < transferCollection.numTransfers; i++) {\\n\\t\\t\\ttoken.transfer(transferCollection.transfers[i].to, transferCollection.transfers[i].amount);\\n\\t\\t}\\n\\t}\\n}\\n\",\"keccak256\":\"0x20ffcba1168cd6bf7b408c0265c79c8b56f022d36068e8188833ec3d1a06831d\",\"license\":\"AGPL-3.0\"},\"src/game/internal/UsingVirtualTime.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nabstract contract UsingVirtualTime {\\n\\t// TODO use hardhat-preprocessor\\n\\n\\tfunction _timestamp() internal view returns (uint256) {\\n\\t\\tuint256 delta;\\n\\t\\tassembly {\\n\\t\\t\\t// keccak256(\\\"time\\\") - 1\\n\\t\\t\\tdelta := sload(0x112c413de07a110ce0a9ace0c01e41b5b59462770325b042f0dc72c337f55f2)\\n\\t\\t}\\n\\t\\treturn block.timestamp + delta;\\n\\t}\\n}\\n\",\"keccak256\":\"0x4eec90855ba4ef869425250bdd97a93693ee65d94d96697b953345cd08c51048\",\"license\":\"AGPL-3.0\"},\"src/game/routes/StratagemsERC721.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nimport '../internal/UsingStratagemsSetters.sol';\\nimport 'solidity-kit/solc_0.8/ERC721/interfaces/IERC721.sol';\\nimport 'solidity-kit/solc_0.8/ERC721/interfaces/IERC721Metadata.sol';\\nimport 'solidity-kit/solc_0.8/ERC721/interfaces/IERC721WithBlocknumber.sol';\\nimport 'solidity-kit/solc_0.8/ERC721/interfaces/IERC721Receiver.sol';\\nimport 'solidity-kit/solc_0.8/ERC721/implementations/ImplementingERC721Internal.sol';\\nimport 'solidity-kit/solc_0.8/openzeppelin/contracts/utils/Address.sol';\\n\\ncontract StratagemsERC721 is\\n\\tIERC721,\\n\\tIERC721Metadata,\\n\\tIERC721WithBlocknumber,\\n\\tUsingStratagemsSetters,\\n\\tImplementingERC721Internal\\n{\\n\\tusing Openzeppelin_Address for address;\\n\\n\\tconstructor(Config memory config) UsingStratagemsSetters(config) {}\\n\\n\\tbytes4 internal constant ERC721_RECEIVED = 0x150b7a02;\\n\\tuint256 internal constant OPERATOR_FLAG = 0x8000000000000000000000000000000000000000000000000000000000000000;\\n\\n\\t// --------------------------------------------------------------------------------------------\\n\\t// Getters\\n\\t// --------------------------------------------------------------------------------------------\\n\\n\\t// /// @inheritdoc IERC721\\n\\t/// @notice balanceOf is not implemented, keeping track of this add gas and we did not consider that worth it\\n\\tfunction balanceOf(address) external pure override returns (uint256) {\\n\\t\\trevert('NOT_IMPLEMENTED');\\n\\t\\t// if (owner == address(0)) {\\n\\t\\t// \\trevert InvalidAddress(owner);\\n\\t\\t// }\\n\\t\\t// balance = _balances[owner];\\n\\t}\\n\\n\\t/// @inheritdoc IERC721\\n\\tfunction ownerOf(uint256 tokenID) external view override returns (address owner) {\\n\\t\\towner = _ownerOf(tokenID);\\n\\t\\tif (owner == address(0)) {\\n\\t\\t\\trevert NonExistentToken(tokenID);\\n\\t\\t}\\n\\t}\\n\\n\\t/// @inheritdoc IERC721\\n\\tfunction getApproved(uint256 tokenID) external view override returns (address operator) {\\n\\t\\t(address owner, bool operatorEnabled) = _ownerAndOperatorEnabledOf(tokenID);\\n\\t\\tif (owner == address(0)) {\\n\\t\\t\\trevert NonExistentToken(tokenID);\\n\\t\\t}\\n\\t\\tif (operatorEnabled) {\\n\\t\\t\\treturn _operators[tokenID];\\n\\t\\t} else {\\n\\t\\t\\treturn address(0);\\n\\t\\t}\\n\\t}\\n\\n\\t/// @inheritdoc IERC721\\n\\tfunction isApprovedForAll(address owner, address operator) public view override returns (bool) {\\n\\t\\treturn _operatorsForAll[owner][operator];\\n\\t}\\n\\n\\t/// @inheritdoc IERC165\\n\\tfunction supportsInterface(bytes4 interfaceID) external pure returns (bool) {\\n\\t\\t/// 0x01ffc9a7 is ERC165.\\n\\t\\t/// 0x80ac58cd is ERC721\\n\\t\\t/// 0x5b5e139f is for ERC721 metadata\\n\\t\\treturn interfaceID == 0x01ffc9a7 || interfaceID == 0x80ac58cd || interfaceID == 0x5b5e139f;\\n\\t}\\n\\n\\t/// @inheritdoc IERC721Metadata\\n\\tfunction name() external pure returns (string memory) {\\n\\t\\treturn 'GemCells';\\n\\t}\\n\\n\\t/// @inheritdoc IERC721Metadata\\n\\tfunction symbol() external pure returns (string memory) {\\n\\t\\treturn 'GEM_CELL';\\n\\t}\\n\\n\\t/// @inheritdoc IERC721Metadata\\n\\tfunction tokenURI(uint256 tokenID) external view returns (string memory) {}\\n\\n\\t/// @inheritdoc IERC721WithBlocknumber\\n\\tfunction ownerAndLastTransferBlockNumberOf(\\n\\t\\tuint256 tokenID\\n\\t) external view override returns (address owner, uint256 blockNumber) {\\n\\t\\t(address currentOwner, uint256 nonce) = _ownerAndNonceOf(tokenID);\\n\\t\\towner = currentOwner;\\n\\t\\tblockNumber = (nonce >> 24);\\n\\t}\\n\\n\\t/// @inheritdoc IERC721WithBlocknumber\\n\\tfunction ownerAndLastTransferBlockNumberList(\\n\\t\\tuint256[] calldata tokenIDs\\n\\t) external view virtual returns (OwnerData[] memory ownersData) {\\n\\t\\townersData = new OwnerData[](tokenIDs.length);\\n\\t\\tfor (uint256 i = 0; i < tokenIDs.length; i++) {\\n\\t\\t\\tuint256 data = _owners[tokenIDs[i]];\\n\\t\\t\\townersData[i].owner = address(uint160(data));\\n\\t\\t\\townersData[i].lastTransferBlockNumber = (data >> 184) & 0xFFFFFFFFFFFFFFFF;\\n\\t\\t}\\n\\t}\\n\\n\\t// --------------------------------------------------------------------------------------------\\n\\t// Setters\\n\\t// --------------------------------------------------------------------------------------------\\n\\n\\t/// @inheritdoc IERC721\\n\\tfunction safeTransferFrom(address from, address to, uint256 tokenID, bytes memory data) public override {\\n\\t\\t(address owner, uint256 nonce, bool operatorEnabled) = _ownerNonceAndOperatorEnabledOf(tokenID);\\n\\t\\tif (owner == address(0)) {\\n\\t\\t\\trevert NonExistentToken(tokenID);\\n\\t\\t}\\n\\t\\tif (owner != from) {\\n\\t\\t\\trevert NotOwner(from, owner);\\n\\t\\t}\\n\\n\\t\\tif (to == address(0) || to == address(this)) {\\n\\t\\t\\trevert InvalidAddress(to);\\n\\t\\t}\\n\\n\\t\\tif (msg.sender != from) {\\n\\t\\t\\tif (!(operatorEnabled && _operators[tokenID] == msg.sender) && !isApprovedForAll(from, msg.sender)) {\\n\\t\\t\\t\\trevert NotAuthorized();\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t_safeTransferFrom(from, to, tokenID, (nonce >> 24) != 0, data);\\n\\t}\\n\\n\\t/// @inheritdoc IERC721\\n\\tfunction safeTransferFrom(address from, address to, uint256 tokenID) external override {\\n\\t\\tsafeTransferFrom(from, to, tokenID, '');\\n\\t}\\n\\n\\t/// @inheritdoc IERC721\\n\\tfunction transferFrom(address from, address to, uint256 tokenID) external override {\\n\\t\\t(address owner, uint256 nonce, bool operatorEnabled) = _ownerNonceAndOperatorEnabledOf(tokenID);\\n\\t\\tif (owner == address(0)) {\\n\\t\\t\\trevert NonExistentToken(tokenID);\\n\\t\\t}\\n\\t\\tif (from != owner) {\\n\\t\\t\\trevert NotOwner(from, owner);\\n\\t\\t}\\n\\t\\tif (to == address(0) || to == address(this)) {\\n\\t\\t\\trevert InvalidAddress(to);\\n\\t\\t}\\n\\t\\tif (msg.sender != from) {\\n\\t\\t\\tif (!(operatorEnabled && _operators[tokenID] == msg.sender) && !isApprovedForAll(from, msg.sender)) {\\n\\t\\t\\t\\trevert NotAuthorized();\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t_transferFrom(from, to, tokenID, (nonce >> 24) != 0);\\n\\t}\\n\\n\\t/// @inheritdoc IERC721\\n\\tfunction approve(address operator, uint256 tokenID) external override {\\n\\t\\t(address owner, uint256 nonce) = _ownerAndNonceOf(tokenID);\\n\\t\\tif (owner == address(0)) {\\n\\t\\t\\trevert NonExistentToken(tokenID);\\n\\t\\t}\\n\\t\\tif (msg.sender != owner && !isApprovedForAll(owner, msg.sender)) {\\n\\t\\t\\trevert NotAuthorized();\\n\\t\\t}\\n\\t\\t_approveFor(owner, nonce, operator, tokenID);\\n\\t}\\n\\n\\t/// @inheritdoc IERC721\\n\\tfunction setApprovalForAll(address operator, bool approved) external override {\\n\\t\\t_setApprovalForAll(msg.sender, operator, approved);\\n\\t}\\n\\n\\t// ------------------------------------------------------------------------------------------------------------------\\n\\t// INTERNALS\\n\\t// ------------------------------------------------------------------------------------------------------------------\\n\\n\\tfunction _safeMint(address to, uint256 tokenID) internal {\\n\\t\\t_safeTransferFrom(address(0), to, tokenID, false, '');\\n\\t}\\n\\n\\tfunction _safeTransferFrom(address from, address to, uint256 tokenID, bool registered, bytes memory data) internal {\\n\\t\\t_transferFrom(from, to, tokenID, registered);\\n\\t\\tif (to.isContract()) {\\n\\t\\t\\tif (!_checkOnERC721Received(msg.sender, from, to, tokenID, data)) {\\n\\t\\t\\t\\trevert TransferRejected();\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tfunction _transferFrom(address from, address to, uint256 tokenID, bool registered) internal virtual {\\n\\t\\t// unchecked {\\n\\t\\t// \\t_balances[to]++;\\n\\t\\t// \\tif (registered) {\\n\\t\\t// \\t\\t_balances[from]--;\\n\\t\\t// \\t}\\n\\t\\t// }\\n\\n\\t\\t// TODO register in the Gem Generator\\n\\n\\t\\t// We encode the blockNumber in the token nonce. We can then use it for count voting.\\n\\t\\t_owners[tokenID] = (block.number << 184) | uint256(uint160(to));\\n\\t\\temit Transfer(from, to, tokenID);\\n\\t}\\n\\n\\t/// @dev See approve.\\n\\tfunction _approveFor(address owner, uint256 nonce, address operator, uint256 tokenID) internal override {\\n\\t\\tuint256 blockNumber = nonce >> 24;\\n\\t\\tuint256 newNonce = nonce + 1;\\n\\t\\tif (newNonce >> 24 != blockNumber) {\\n\\t\\t\\trevert NonceOverflow();\\n\\t\\t}\\n\\t\\tif (operator == address(0)) {\\n\\t\\t\\t_owners[tokenID] = (newNonce << 160) | uint256(uint160(owner));\\n\\t\\t} else {\\n\\t\\t\\t_owners[tokenID] = OPERATOR_FLAG | ((newNonce << 160) | uint256(uint160(owner)));\\n\\t\\t\\t_operators[tokenID] = operator;\\n\\t\\t}\\n\\t\\temit Approval(owner, operator, tokenID);\\n\\t}\\n\\n\\t/// @dev See setApprovalForAll.\\n\\tfunction _setApprovalForAll(address sender, address operator, bool approved) internal override {\\n\\t\\t_operatorsForAll[sender][operator] = approved;\\n\\n\\t\\temit ApprovalForAll(sender, operator, approved);\\n\\t}\\n\\n\\t/// @dev Check if receiving contract accepts erc721 transfers.\\n\\t/// @param operator The address of the operator.\\n\\t/// @param from The from address, may be different from msg.sender.\\n\\t/// @param to The adddress we want to transfer to.\\n\\t/// @param tokenID The id of the token we would like to transfer.\\n\\t/// @param data Any additional data to send with the transfer.\\n\\t/// @return Whether the expected value of 0x150b7a02 is returned.\\n\\tfunction _checkOnERC721Received(\\n\\t\\taddress operator,\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 tokenID,\\n\\t\\tbytes memory data\\n\\t) internal returns (bool) {\\n\\t\\tbytes4 retval = IERC721Receiver(to).onERC721Received(operator, from, tokenID, data);\\n\\t\\treturn (retval == ERC721_RECEIVED);\\n\\t}\\n\\n\\t/// @dev Get the owner and operatorEnabled status of a token.\\n\\t/// @param tokenID The token to query.\\n\\t/// @return owner The owner of the token.\\n\\t/// @return operatorEnabled Whether or not operators are enabled for this token.\\n\\tfunction _ownerAndOperatorEnabledOf(\\n\\t\\tuint256 tokenID\\n\\t) internal view virtual returns (address owner, bool operatorEnabled) {\\n\\t\\tuint256 data = _owners[tokenID];\\n\\t\\towner = address(uint160(data));\\n\\t\\toperatorEnabled = (data & OPERATOR_FLAG) == OPERATOR_FLAG;\\n\\t}\\n\\n\\t/// @dev Get the owner and the permit nonce of a token.\\n\\t/// @param tokenID The token to query.\\n\\t/// @return owner The owner of the token.\\n\\t/// @return nonce the nonce for permit (also incluse the blocknumer in the 64 higer bits (88 bits in total))\\n\\tfunction _ownerAndNonceOf(uint256 tokenID) internal view virtual override returns (address owner, uint256 nonce) {\\n\\t\\tuint256 data = _owners[tokenID];\\n\\t\\towner = address(uint160(data));\\n\\t\\tnonce = (data >> 160) & 0xFFFFFFFFFFFFFFFFFFFFFF;\\n\\t}\\n\\n\\t// @dev Get the owner, the permit nonce of a token and operatorEnabled status of a token.\\n\\t/// @param tokenID The token to query.\\n\\t/// @return owner The owner of the token.\\n\\t/// @return nonce the nonce for permit (also incluse the blocknumer in the 64 higer bits (88 bits in total))\\n\\t/// @return operatorEnabled Whether or not operators are enabled for this token.\\n\\tfunction _ownerNonceAndOperatorEnabledOf(\\n\\t\\tuint256 tokenID\\n\\t) internal view virtual returns (address owner, uint256 nonce, bool operatorEnabled) {\\n\\t\\tuint256 data = _owners[tokenID];\\n\\t\\towner = address(uint160(data));\\n\\t\\toperatorEnabled = (data & OPERATOR_FLAG) == OPERATOR_FLAG;\\n\\t\\tnonce = (data >> 160) & 0xFFFFFFFFFFFFFFFFFFFFFF;\\n\\t}\\n}\\n\",\"keccak256\":\"0x39418b74c10c06bc36e559f00bc08022d91a6cd3728f534bff803d68e6e9f1e8\",\"license\":\"AGPL-3.0\"}},\"version\":1}", + "storageLayout": { + "storage": [ + { + "astId": 13922, + "contract": "src/game/routes/StratagemsERC721.sol:StratagemsERC721", + "label": "_cells", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_uint256,t_struct(Cell)11667_storage)" + }, + { + "astId": 13926, + "contract": "src/game/routes/StratagemsERC721.sol:StratagemsERC721", + "label": "_owners", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_uint256,t_uint256)" + }, + { + "astId": 13930, + "contract": "src/game/routes/StratagemsERC721.sol:StratagemsERC721", + "label": "_tokensInReserve", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 13935, + "contract": "src/game/routes/StratagemsERC721.sol:StratagemsERC721", + "label": "_commitments", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_struct(Commitment)11672_storage)" + }, + { + "astId": 13941, + "contract": "src/game/routes/StratagemsERC721.sol:StratagemsERC721", + "label": "_operatorsForAll", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))" + }, + { + "astId": 13945, + "contract": "src/game/routes/StratagemsERC721.sol:StratagemsERC721", + "label": "_operators", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_uint256,t_address)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes24": { + "encoding": "inplace", + "label": "bytes24", + "numberOfBytes": "24" + }, + "t_enum(Color)11596": { + "encoding": "inplace", + "label": "enum UsingStratagemsTypes.Color", + "numberOfBytes": "1" + }, + "t_int8": { + "encoding": "inplace", + "label": "int8", + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_bool)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_address,t_mapping(t_address,t_bool))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => bool))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_bool)" + }, + "t_mapping(t_address,t_struct(Commitment)11672_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => struct UsingStratagemsTypes.Commitment)", + "numberOfBytes": "32", + "value": "t_struct(Commitment)11672_storage" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_mapping(t_uint256,t_address)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => address)", + "numberOfBytes": "32", + "value": "t_address" + }, + "t_mapping(t_uint256,t_struct(Cell)11667_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => struct UsingStratagemsTypes.Cell)", + "numberOfBytes": "32", + "value": "t_struct(Cell)11667_storage" + }, + "t_mapping(t_uint256,t_uint256)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_struct(Cell)11667_storage": { + "encoding": "inplace", + "label": "struct UsingStratagemsTypes.Cell", + "members": [ + { + "astId": 11653, + "contract": "src/game/routes/StratagemsERC721.sol:StratagemsERC721", + "label": "lastEpochUpdate", + "offset": 0, + "slot": "0", + "type": "t_uint24" + }, + { + "astId": 11655, + "contract": "src/game/routes/StratagemsERC721.sol:StratagemsERC721", + "label": "epochWhenTokenIsAdded", + "offset": 3, + "slot": "0", + "type": "t_uint24" + }, + { + "astId": 11658, + "contract": "src/game/routes/StratagemsERC721.sol:StratagemsERC721", + "label": "color", + "offset": 6, + "slot": "0", + "type": "t_enum(Color)11596" + }, + { + "astId": 11660, + "contract": "src/game/routes/StratagemsERC721.sol:StratagemsERC721", + "label": "life", + "offset": 7, + "slot": "0", + "type": "t_uint8" + }, + { + "astId": 11662, + "contract": "src/game/routes/StratagemsERC721.sol:StratagemsERC721", + "label": "delta", + "offset": 8, + "slot": "0", + "type": "t_int8" + }, + { + "astId": 11664, + "contract": "src/game/routes/StratagemsERC721.sol:StratagemsERC721", + "label": "enemyMap", + "offset": 9, + "slot": "0", + "type": "t_uint8" + }, + { + "astId": 11666, + "contract": "src/game/routes/StratagemsERC721.sol:StratagemsERC721", + "label": "distribution", + "offset": 10, + "slot": "0", + "type": "t_uint8" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Commitment)11672_storage": { + "encoding": "inplace", + "label": "struct UsingStratagemsTypes.Commitment", + "members": [ + { + "astId": 11669, + "contract": "src/game/routes/StratagemsERC721.sol:StratagemsERC721", + "label": "hash", + "offset": 0, + "slot": "0", + "type": "t_bytes24" + }, + { + "astId": 11671, + "contract": "src/game/routes/StratagemsERC721.sol:StratagemsERC721", + "label": "epoch", + "offset": 24, + "slot": "0", + "type": "t_uint24" + } + ], + "numberOfBytes": "32" + }, + "t_uint24": { + "encoding": "inplace", + "label": "uint24", + "numberOfBytes": "3" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "encoding": "inplace", + "label": "uint8", + "numberOfBytes": "1" + } + } + }, + "userdoc": { + "errors": { + "CanStillResolve()": [ + { + "notice": "Player have to resolve if they can Stratagems will prevent them from acknowledging missed resolution if there is still time to resolve." + } + ], + "CommitmentHashNotMatching()": [ + { + "notice": "Player have to reveal their commitment using the exact same move values If they provide different value, the commitment hash will differ and Stratagems will reject their resolution." + } + ], + "GameNotStarted()": [ + { + "notice": "Game has not started yet, can't perform any action" + } + ], + "InCommitmentPhase()": [ + { + "notice": "When in Commit phase, player can make new commitment but they cannot resolve their move yet." + } + ], + "InResolutionPhase()": [ + { + "notice": "When in Resolution phase, it is not possible to commit new moves or cancel previous commitment During Resolution phase, players have to reveal their commitment, if not already done." + } + ], + "InvalidAddress(address)": [ + { + "notice": "An invalid address is specified (for example: zero address)" + } + ], + "InvalidEpoch()": [ + { + "notice": "Player can only resolve their move in the same epoch they commited.abi If a player resolve later it can only do to minimize the reserve burn cost by calling : `acknowledgeMissedResolution`" + } + ], + "InvalidFurtherMoves()": [ + { + "notice": "Player can make arbitrary number of moves per epoch. To do so they group moves into (MAX_NUM_MOVES_PER_HASH = 32) moves This result in a recursive series of hash that they can then submit in turn while resolving. The limit (MAX_NUM_MOVES_PER_HASH = 32) ensure a resolution batch fits in a block." + } + ], + "NonExistentToken(uint256)": [ + { + "notice": "The token does not exist" + } + ], + "NonceOverflow()": [ + { + "notice": "The Nonce overflowed, make a transfer to self to allow new nonces." + } + ], + "NotAuthorized()": [ + { + "notice": "Not authorized to perform this operation" + } + ], + "NotOwner(address,address)": [ + { + "notice": "The address from which the token is sent is not the current owner" + } + ], + "NothingToResolve()": [ + { + "notice": "Player can only resolve moves they commited." + } + ], + "PreviousCommitmentNotResolved()": [ + { + "notice": "Previous commitment need to be resolved before making a new one. Even if the corresponding reveal phase has passed.\\ It is also not possible to withdraw any amount from reserve until the commitment is revealed.\\If player lost the information to reveal, it can acknowledge failure which will burn all its reserve.\\" + } + ], + "ReserveTooLow(uint256,uint256)": [ + { + "notice": "to make a commitment you always need at least one `config.numTokensPerGems` amount in reserve Player also need one `config.numTokensPerGems` per moves during the resolution phase." + } + ], + "TransferRejected()": [ + { + "notice": "The Transfer was rejected by the destination" + } + ] + }, + "events": { + "Approval(address,address,uint256)": { + "notice": "Triggered when a token is approved to be sent by another account Note tat the approval get reset when a Transfer event for that same token is emitted." + }, + "ApprovalForAll(address,address,bool)": { + "notice": "Triggered when an account approve or disaprove another to transfer on its behalf" + }, + "CommitmentCancelled(address,uint24)": { + "notice": "A player has cancelled its current commitment (before it reached the resolution phase)" + }, + "CommitmentMade(address,uint24,bytes24)": { + "notice": "A player has commited to make a move and resolve it on the resolution phase" + }, + "CommitmentResolved(address,uint24,bytes24,(uint64,uint8)[],bytes24,uint256)": { + "notice": "Player has resolved its previous commitment" + }, + "CommitmentVoid(address,uint24,uint256,bytes24)": { + "notice": "A player has canceled a previous commitment by burning some tokens" + }, + "MoveProcessed(uint64,address,uint8,uint8)": { + "notice": "A move has been resolved." + }, + "ReserveDeposited(address,uint256,uint256)": { + "notice": "Player has deposited token in the reserve, allowing it to use that much in game" + }, + "ReserveWithdrawn(address,uint256,uint256)": { + "notice": "Player have withdrawn token from the reserve" + }, + "Transfer(address,address,uint256)": { + "notice": "Triggered when a token is transferred" + } + }, + "kind": "user", + "methods": { + "approve(address,uint256)": { + "notice": "Approve an operator to transfer a specific token on the senders behalf." + }, + "balanceOf(address)": { + "notice": "balanceOf is not implemented, keeping track of this add gas and we did not consider that worth it" + }, + "getApproved(uint256)": { + "notice": "Get the approved operator for a specific token." + }, + "isApprovedForAll(address,address)": { + "notice": "Check if the sender approved the operator to transfer any of its tokens." + }, + "name()": { + "notice": "A descriptive name for a collection of NFTs in this contract" + }, + "ownerAndLastTransferBlockNumberList(uint256[])": { + "notice": "Get the list of owner of a token and the blockNumber of its last transfer, useful to voting mechanism." + }, + "ownerAndLastTransferBlockNumberOf(uint256)": { + "notice": "Get the owner of a token and the blockNumber of the last transfer, useful to voting mechanism." + }, + "ownerOf(uint256)": { + "notice": "Get the owner of a token." + }, + "safeTransferFrom(address,address,uint256)": { + "notice": "Transfer a token between 2 addresses letting the receiver know of the transfer." + }, + "safeTransferFrom(address,address,uint256,bytes)": { + "notice": "Transfer a token between 2 addresses letting the receiver knows of the transfer." + }, + "setApprovalForAll(address,bool)": { + "notice": "Set the approval for an operator to manage all the tokens of the sender." + }, + "supportsInterface(bytes4)": { + "notice": "Query if a contract implements an interface" + }, + "symbol()": { + "notice": "An abbreviated name for NFTs in this contract" + }, + "tokenURI(uint256)": { + "notice": "A distinct Uniform Resource Identifier (URI) for a given asset." + }, + "transferFrom(address,address,uint256)": { + "notice": "Transfer a token between 2 addresses." + } + }, + "version": 1 + }, + "argsData": "0x0000000000000000000000004c78783faac7636c0d55605ae5bd1d6b9a62f496000000000000000000000000deaddeaddeaddeaddeaddeaddeaddeaddeaddead000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000143700000000000000000000000000000000000000000000000000000000000000e1000000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000de0b6b3a7640000", + "transaction": { + "hash": "0x49cdd7f657e3daaaaf1c920aa90722e15984cb069c6262b85163b4d809a42be0", + "nonce": "0x89", + "origin": "0x61c461ecc993aadeb7e4b47e96d1b8cc37314b20" + } +} \ No newline at end of file diff --git a/contracts/deployments/sepolia/Stratagems_Proxy.json b/contracts/deployments/sepolia/Stratagems_Proxy.json new file mode 100644 index 00000000..b50b3c77 --- /dev/null +++ b/contracts/deployments/sepolia/Stratagems_Proxy.json @@ -0,0 +1,197 @@ +{ + "address": "0x564c4045fce3de04911c0bd1ed79db9c8781cd0f", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "implementationAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "ownerAddress", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousImplementation", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "ProxyImplementationUpdated", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "id", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "contractName": "EIP173Proxy", + "sourceName": "solc_0.8/EIP173/EIP173Proxy.sol", + "bytecode": "0x608060405260405162000c7838038062000c788339810160408190526200002691620001e4565b620000318262000046565b6200003d8382620000b5565b505050620002db565b5f6200005e5f8051602062000c588339815191525490565b9050815f8051602062000c5883398151915255816001600160a01b0316816001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8054908390556040516001600160a01b0380851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b7379068296905f90a38151156200018b575f836001600160a01b031683604051620001379190620002be565b5f60405180830381855af49150503d805f811462000171576040519150601f19603f3d011682016040523d82523d5f602084013e62000176565b606091505b505090508062000189573d805f803e805ffd5b505b505050565b80516001600160a01b0381168114620001a7575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620001dc578181015183820152602001620001c2565b50505f910152565b5f805f60608486031215620001f7575f80fd5b620002028462000190565b9250620002126020850162000190565b60408501519092506001600160401b03808211156200022f575f80fd5b818601915086601f83011262000243575f80fd5b815181811115620002585762000258620001ac565b604051601f8201601f19908116603f01168101908382118183101715620002835762000283620001ac565b816040528281528960208487010111156200029c575f80fd5b620002af836020830160208801620001c0565b80955050505050509250925092565b5f8251620002d1818460208701620001c0565b9190910192915050565b61096f80620002e95f395ff3fe60806040526004361061005d575f3560e01c80634f1ef286116100425780634f1ef286146101265780638da5cb5b14610139578063f2fde38b14610172576100c9565b806301ffc9a7146100d35780633659cfe614610107576100c9565b366100c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f45544845525f52454a454354454400000000000000000000000000000000000060448201526064015b60405180910390fd5b6100d1610191565b005b3480156100de575f80fd5b506100f26100ed3660046107f2565b6101db565b60405190151581526020015b60405180910390f35b348015610112575f80fd5b506100d1610121366004610859565b6103a6565b6100d1610134366004610872565b610477565b348015610144575f80fd5b5061014d610571565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100fe565b34801561017d575f80fd5b506100d161018c366004610859565b61059f565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc545f3681823780813683855af491503d8082833e8280156101d1578183f35b8183fd5b50505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061026d57507f7f5828d0000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b1561027a57506001919050565b7fffffffff0000000000000000000000000000000000000000000000000000000080831690036102ab57505f919050565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008416600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa925050508015610393575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610390918101906108ee565b60015b61039f57505f92915050565b9392505050565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461045c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c0565b6104748160405180602001604052805f81525061065e565b50565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461052d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c0565b61056c8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061065e92505050565b505050565b5f61059a7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905090565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610655576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c0565b61047481610746565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80549083905560405173ffffffffffffffffffffffffffffffffffffffff80851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b7379068296905f90a381511561056c575f8373ffffffffffffffffffffffffffffffffffffffff16836040516106f7919061090d565b5f60405180830381855af49150503d805f811461072f576040519150601f19603f3d011682016040523d82523d5f602084013e610734565b606091505b50509050806101d5573d805f803e805ffd5b5f61076f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b9050817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103558173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60208284031215610802575f80fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461039f575f80fd5b803573ffffffffffffffffffffffffffffffffffffffff81168114610854575f80fd5b919050565b5f60208284031215610869575f80fd5b61039f82610831565b5f805f60408486031215610884575f80fd5b61088d84610831565b9250602084013567ffffffffffffffff808211156108a9575f80fd5b818601915086601f8301126108bc575f80fd5b8135818111156108ca575f80fd5b8760208285010111156108db575f80fd5b6020830194508093505050509250925092565b5f602082840312156108fe575f80fd5b8151801515811461039f575f80fd5b5f82515f5b8181101561092c5760208186018101518583015201610912565b505f92019182525091905056fea2646970667358221220b684f5b70c5366d5cfce68365932ccc48bc1e8ce159edd1546835e83f82a3f2964736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103", + "deployedBytecode": "0x60806040526004361061005d575f3560e01c80634f1ef286116100425780634f1ef286146101265780638da5cb5b14610139578063f2fde38b14610172576100c9565b806301ffc9a7146100d35780633659cfe614610107576100c9565b366100c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f45544845525f52454a454354454400000000000000000000000000000000000060448201526064015b60405180910390fd5b6100d1610191565b005b3480156100de575f80fd5b506100f26100ed3660046107f2565b6101db565b60405190151581526020015b60405180910390f35b348015610112575f80fd5b506100d1610121366004610859565b6103a6565b6100d1610134366004610872565b610477565b348015610144575f80fd5b5061014d610571565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100fe565b34801561017d575f80fd5b506100d161018c366004610859565b61059f565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc545f3681823780813683855af491503d8082833e8280156101d1578183f35b8183fd5b50505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061026d57507f7f5828d0000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b1561027a57506001919050565b7fffffffff0000000000000000000000000000000000000000000000000000000080831690036102ab57505f919050565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008416600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa925050508015610393575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610390918101906108ee565b60015b61039f57505f92915050565b9392505050565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461045c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c0565b6104748160405180602001604052805f81525061065e565b50565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461052d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c0565b61056c8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061065e92505050565b505050565b5f61059a7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905090565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610655576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c0565b61047481610746565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80549083905560405173ffffffffffffffffffffffffffffffffffffffff80851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b7379068296905f90a381511561056c575f8373ffffffffffffffffffffffffffffffffffffffff16836040516106f7919061090d565b5f60405180830381855af49150503d805f811461072f576040519150601f19603f3d011682016040523d82523d5f602084013e610734565b606091505b50509050806101d5573d805f803e805ffd5b5f61076f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b9050817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103558173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60208284031215610802575f80fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461039f575f80fd5b803573ffffffffffffffffffffffffffffffffffffffff81168114610854575f80fd5b919050565b5f60208284031215610869575f80fd5b61039f82610831565b5f805f60408486031215610884575f80fd5b61088d84610831565b9250602084013567ffffffffffffffff808211156108a9575f80fd5b818601915086601f8301126108bc575f80fd5b8135818111156108ca575f80fd5b8760208285010111156108db575f80fd5b6020830194508093505050509250925092565b5f602082840312156108fe575f80fd5b8151801515811461039f575f80fd5b5f82515f5b8181101561092c5760208186018101518583015201610912565b505f92019182525091905056fea2646970667358221220b684f5b70c5366d5cfce68365932ccc48bc1e8ce159edd1546835e83f82a3f2964736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {}, + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "gasEstimates": { + "creation": { + "codeDepositCost": "483000", + "executionCost": "infinite", + "totalCost": "infinite" + }, + "external": { + "": "infinite", + "owner()": "2359", + "supportsInterface(bytes4)": "infinite", + "transferOwnership(address)": "28275", + "upgradeTo(address)": "28302", + "upgradeToAndCall(address,bytes)": "infinite" + }, + "internal": { + "_owner()": "infinite", + "_setOwner(address)": "25798" + } + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementationAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"ownerAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousImplementation\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"ProxyImplementationUpdated\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"id\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Proxy implementing EIP173 for ownership management\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"solc_0.8/EIP173/EIP173Proxy.sol\":\"EIP173Proxy\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solc_0.8/EIP173/EIP173Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../EIP1967/Proxy.sol\\\";\\n\\ninterface ERC165 {\\n function supportsInterface(bytes4 id) external view returns (bool);\\n}\\n\\n///@notice Proxy implementing EIP173 for ownership management\\ncontract EIP173Proxy is Proxy {\\n // --------------------------------------------------------------------------------------------\\n // Events\\n // --------------------------------------------------------------------------------------------\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n // --------------------------------------------------------------------------------------------\\n // Constructor\\n // --------------------------------------------------------------------------------------------\\n\\n constructor(address implementationAddress, address ownerAddress, bytes memory data) payable {\\n _setOwner(ownerAddress);\\n _setImplementation(implementationAddress, data);\\n }\\n\\n // --------------------------------------------------------------------------------------------\\n // Public Interface\\n // --------------------------------------------------------------------------------------------\\n\\n function owner() external view returns (address) {\\n return _owner();\\n }\\n\\n function supportsInterface(bytes4 id) external view returns (bool) {\\n if (id == 0x01ffc9a7 || id == 0x7f5828d0) {\\n return true;\\n }\\n if (id == 0xFFFFFFFF) {\\n return false;\\n }\\n\\n ERC165 implementation;\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n implementation := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n }\\n\\n // Technically this is not standard compliant as ERC-165 require 30,000 gas which that call cannot ensure\\n // because it is itself inside `supportsInterface` that might only get 30,000 gas.\\n // In practise this is unlikely to be an issue.\\n try implementation.supportsInterface(id) returns (bool support) {\\n return support;\\n } catch {\\n return false;\\n }\\n }\\n\\n function transferOwnership(address newOwner) external onlyOwner {\\n _setOwner(newOwner);\\n }\\n\\n function upgradeTo(address newImplementation) external onlyOwner {\\n _setImplementation(newImplementation, \\\"\\\");\\n }\\n\\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable onlyOwner {\\n _setImplementation(newImplementation, data);\\n }\\n\\n // --------------------------------------------------------------------------------------------\\n // Modifiers\\n // --------------------------------------------------------------------------------------------\\n\\n modifier onlyOwner() {\\n require(msg.sender == _owner(), \\\"NOT_AUTHORIZED\\\");\\n _;\\n }\\n\\n // --------------------------------------------------------------------------------------------\\n // Internal\\n // --------------------------------------------------------------------------------------------\\n\\n function _owner() internal view returns (address adminAddress) {\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n adminAddress := sload(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103)\\n }\\n }\\n\\n function _setOwner(address newOwner) internal {\\n address previousOwner = _owner();\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n sstore(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103, newOwner)\\n }\\n emit OwnershipTransferred(previousOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xf424b3ab9dd0c0328554e3ff27d6cae0681b81a107b2a9313ecadae374800f2c\",\"license\":\"MIT\"},\"solc_0.8/EIP1967/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n// EIP-1967\\nabstract contract Proxy {\\n // --------------------------------------------------------------------------------------------\\n // Events\\n // --------------------------------------------------------------------------------------------\\n\\n event ProxyImplementationUpdated(address indexed previousImplementation, address indexed newImplementation);\\n\\n // --------------------------------------------------------------------------------------------\\n // Public Interface\\n // --------------------------------------------------------------------------------------------\\n\\n receive() external payable virtual {\\n revert(\\\"ETHER_REJECTED\\\"); // explicit reject by default\\n }\\n\\n fallback() external payable {\\n _fallback();\\n }\\n\\n // --------------------------------------------------------------------------------------------\\n // Internal\\n // --------------------------------------------------------------------------------------------\\n\\n function _fallback() internal {\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n let implementationAddress := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n calldatacopy(0x0, 0x0, calldatasize())\\n let success := delegatecall(gas(), implementationAddress, 0x0, calldatasize(), 0, 0)\\n let retSz := returndatasize()\\n returndatacopy(0, 0, retSz)\\n switch success\\n case 0 { revert(0, retSz) }\\n default { return(0, retSz) }\\n }\\n }\\n\\n function _setImplementation(address newImplementation, bytes memory data) internal {\\n address previousImplementation;\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n previousImplementation := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n }\\n\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n sstore(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc, newImplementation)\\n }\\n\\n emit ProxyImplementationUpdated(previousImplementation, newImplementation);\\n\\n if (data.length > 0) {\\n (bool success,) = newImplementation.delegatecall(data);\\n if (!success) {\\n assembly {\\n // This assembly ensure the revert contains the exact string data\\n let returnDataSize := returndatasize()\\n returndatacopy(0, 0, returnDataSize)\\n revert(0, returnDataSize)\\n }\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xb2192ed12467c27c3f6035903c0350c709c88c5bfde520e016c99f46b389016d\",\"license\":\"MIT\"}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": {}, + "notice": "Proxy implementing EIP173 for ownership management", + "version": 1 + }, + "argsData": "0x0000000000000000000000003f75e916ac2871bcdeb8b6e5b28f29052407333600000000000000000000000061c461ecc993aadeb7e4b47e96d1b8cc37314b2000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "transaction": { + "hash": "0x166317a721a5396c6775e747e1966601a59850f50c2ee823c20bbcb6d786f6a3", + "nonce": "0x8c", + "origin": "0x61c461ecc993aadeb7e4b47e96d1b8cc37314b20" + } +} \ No newline at end of file diff --git a/contracts/deployments/sepolia/TestTokens.json b/contracts/deployments/sepolia/TestTokens.json new file mode 100644 index 00000000..494dd053 --- /dev/null +++ b/contracts/deployments/sepolia/TestTokens.json @@ -0,0 +1,984 @@ +{ + "address": "0x4c78783faac7636c0d55605ae5bd1d6b9a62f496", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "DeadlineOver", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "name": "InvalidAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "provided", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "InvalidMsgValue", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "provided", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "InvalidTotalAmount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentAllowance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "NotAuthorizedAllowance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "NotEnoughTokens", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "approveAndCall", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable[]", + "name": "tos", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "totalAmount", + "type": "uint256" + } + ], + "name": "distributeAlongWithETH", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "eip712Domain", + "outputs": [ + { + "internalType": "bytes1", + "name": "fields", + "type": "bytes1" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + }, + { + "internalType": "uint256", + "name": "chainID", + "type": "uint256" + }, + { + "internalType": "address", + "name": "verifyingContract", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256[]", + "name": "extensions", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferAlongWithETH", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "transferAndCall", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "transferFromAndCall", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "forAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "transferOnBehalfAndCall", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "contractName": "TestTokens", + "sourceName": "src/test/TestTokens.sol", + "bytecode": "0x60e060405234801562000010575f80fd5b5060405162001a5c38038062001a5c8339810160408190526200003391620001ac565b4660808190523090819081156200004b57816200004d565b305b6001600160a01b031660c08190526200006890829062000084565b60a052506200007c91508390508262000123565b505062000205565b5f7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866620000ca604080518082019091526006815265546f6b656e7360d01b602082015290565b80516020918201206040516200010493928791879101938452602084019290925260408301526001600160a01b0316606082015260800190565b6040516020818303038152906040528051906020012090505b92915050565b805f80828254620001359190620001e5565b90915550506001600160a01b0382165f908152600160205260408120805483929062000163908490620001e5565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b5f8060408385031215620001be575f80fd5b82516001600160a01b0381168114620001d5575f80fd5b6020939093015192949293505050565b808201808211156200011d57634e487b7160e01b5f52601160045260245ffd5b60805160a05160c051611825620002375f395f8181610799015261100501525f61103001525f610fda01526118255ff3fe60806040526004361061013d575f3560e01c806370a08231116100bb578063c1d34b8911610071578063d505accf11610057578063d505accf146103d1578063dd62ed3e146103f2578063e7fcb06514610411575f80fd5b8063c1d34b8914610393578063cae9ca51146103b2575f80fd5b806384b0196e116100a157806384b0196e1461030557806395d89b411461032c578063a9059cbb14610374575f80fd5b806370a08231146102835780637ecebe00146102c4575f80fd5b806323b872dd116101105780633644e515116100f65780633644e515146102315780634000aea01461024557806365520efa14610264575f80fd5b806323b872dd146101f7578063313ce56714610216575f80fd5b806306fdde0314610141578063095ea7b3146101985780630e02df54146101c757806318160ddd146101da575b5f80fd5b34801561014c575f80fd5b5060408051808201909152600681527f546f6b656e73000000000000000000000000000000000000000000000000000060208201525b60405161018f91906111b3565b60405180910390f35b3480156101a3575f80fd5b506101b76101b23660046111f0565b610424565b604051901515815260200161018f565b6101b76101d5366004611257565b61043a565b3480156101e5575f80fd5b505f545b60405190815260200161018f565b348015610202575f80fd5b506101b761021136600461133b565b6105c7565b348015610221575f80fd5b506040516012815260200161018f565b34801561023c575f80fd5b506101e96105dd565b348015610250575f80fd5b506101b761025f3660046113be565b6105e6565b34801561026f575f80fd5b506101b761027e366004611416565b610693565b34801561028e575f80fd5b506101e961029d366004611484565b73ffffffffffffffffffffffffffffffffffffffff165f9081526001602052604090205490565b3480156102cf575f80fd5b506101e96102de366004611484565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b348015610310575f80fd5b50610319610743565b60405161018f979695949392919061149f565b348015610337575f80fd5b506101826040518060400160405280600581526020017f544f4b454e00000000000000000000000000000000000000000000000000000081525081565b34801561037f575f80fd5b506101b761038e3660046111f0565b6107c3565b34801561039e575f80fd5b506101b76103ad366004611416565b6107cf565b3480156103bd575f80fd5b506101b76103cc3660046113be565b610833565b3480156103dc575f80fd5b506103f06103eb36600461155c565b610895565b005b3480156103fd575f80fd5b506101e961040c3660046115cd565b610b58565b6101b761041f3660046111f0565b610bd5565b5f610430338484610c20565b5060015b92915050565b5f808351346104499190611631565b90508351816104589190611669565b34146104ac573484518261046c9190611669565b6040517f1f89f671000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044015b60405180910390fd5b5f8451846104ba9190611631565b90508451816104c99190611669565b841461051857838551826104dd9190611669565b6040517fe93890a2000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016104a3565b5f5b85518110156105b6576105473387838151811061053957610539611680565b602002602001015184610cfd565b85818151811061055957610559611680565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166108fc8490811502906040515f60405180830381858888f193505050501580156105a3573d5f803e3d5ffd5b50806105ae816116ad565b91505061051a565b50600195945050505050565b905090565b5f6105d3848484610ead565b5060019392505050565b5f6105c2610fd6565b5f6105f2338686610cfd565b6040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063a4c0ed369061064a90339088908890889060040161172b565b6020604051808303815f875af1158015610666573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061068a9190611760565b95945050505050565b5f61069f338686610cfd565b6040517f2eedcb7100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861690632eedcb71906106f99033908a9089908990899060040161177f565b6020604051808303815f875af1158015610715573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107399190611760565b9695505050505050565b7f0d000000000000000000000000000000000000000000000000000000000000006060805f808083610773611056565b60408051602080820183525f8083528351818152918201909352999a92999098504697507f0000000000000000000000000000000000000000000000000000000000000000965090945092509050565b5f610430338484610cfd565b5f6107db868686610ead565b6040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063a4c0ed36906106f990899088908890889060040161172b565b5f61083f338686610c20565b6040517eba451f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169062ba451f9061064a90339088908890889060040161172b565b73ffffffffffffffffffffffffffffffffffffffff87166108e4576040517f8e4c8aa60000000000000000000000000000000000000000000000000000000081525f60048201526024016104a3565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260036020526040812054906109126105dd565b604080517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9602082015273ffffffffffffffffffffffffffffffffffffffff808d1692820192909252908a1660608201526080810189905260a0810184905260c0810188905260e001604051602081830303815290604052805190602001206040516020016109d39291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f845290830180835281905260ff8816918301919091526060820186905260808201859052915060019060a0016020604051602081039080840390855afa158015610a56573d5f803e3d5ffd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614610ac4576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8515801590610ad257508542115b15610b12576040517fdd6b219a000000000000000000000000000000000000000000000000000000008152426004820152602481018790526044016104a3565b610b1d8260016117c9565b73ffffffffffffffffffffffffffffffffffffffff8a165f90815260036020526040902055610b4d898989610c20565b505050505050505050565b5f3073ffffffffffffffffffffffffffffffffffffffff841603610b9d57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610434565b5073ffffffffffffffffffffffffffffffffffffffff9182165f90815260026020908152604080832093909416825291909152205490565b5f610be1338484610cfd565b60405173ffffffffffffffffffffffffffffffffffffffff8416903480156108fc02915f818181858888f193505050501580156105d3573d5f803e3d5ffd5b73ffffffffffffffffffffffffffffffffffffffff83161580610c57575073ffffffffffffffffffffffffffffffffffffffff8216155b15610c90576040517f8e4c8aa60000000000000000000000000000000000000000000000000000000081525f60048201526024016104a3565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff82161580610d35575073ffffffffffffffffffffffffffffffffffffffff821630145b15610d84576040517f8e4c8aa600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016104a3565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526001602052604090205481811015610ded576040517f6584853f00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016104a3565b610df782826117dc565b73ffffffffffffffffffffffffffffffffffffffff8086165f908152600160205260408082209390935590851681529081208054849290610e399084906117c9565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e9f91815260200190565b60405180910390a350505050565b3373ffffffffffffffffffffffffffffffffffffffff841614801590610ee9575073ffffffffffffffffffffffffffffffffffffffff83163014155b15610fc65773ffffffffffffffffffffffffffffffffffffffff83165f9081526002602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610fc45781811015610f89576040517f95fcd25400000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016104a3565b610f9382826117dc565b73ffffffffffffffffffffffffffffffffffffffff85165f9081526002602090815260408083203384529091529020555b505b610fd1838383610cfd565b505050565b5f467f0000000000000000000000000000000000000000000000000000000000000000811461102e57611029817f0000000000000000000000000000000000000000000000000000000000000000611092565b611050565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b60606105c260408051808201909152600681527f546f6b656e730000000000000000000000000000000000000000000000000000602082015290565b5f7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666110ee60408051808201909152600681527f546f6b656e730000000000000000000000000000000000000000000000000000602082015290565b8051602091820120604051611134939287918791019384526020840192909252604083015273ffffffffffffffffffffffffffffffffffffffff16606082015260800190565b60405160208183030381529060405280519060200120905092915050565b5f81518084525f5b818110156111765760208185018101518683018201520161115a565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6111c56020830184611152565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146111ed575f80fd5b50565b5f8060408385031215611201575f80fd5b823561120c816111cc565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b8035611252816111cc565b919050565b5f8060408385031215611268575f80fd5b823567ffffffffffffffff8082111561127f575f80fd5b818501915085601f830112611292575f80fd5b81356020828211156112a6576112a661121a565b8160051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811086821117156112e9576112e961121a565b604052928352818301935084810182019289841115611306575f80fd5b948201945b8386101561132b5761131c86611247565b8552948201949382019361130b565b9997909101359750505050505050565b5f805f6060848603121561134d575f80fd5b8335611358816111cc565b92506020840135611368816111cc565b929592945050506040919091013590565b5f8083601f840112611389575f80fd5b50813567ffffffffffffffff8111156113a0575f80fd5b6020830191508360208285010111156113b7575f80fd5b9250929050565b5f805f80606085870312156113d1575f80fd5b84356113dc816111cc565b935060208501359250604085013567ffffffffffffffff8111156113fe575f80fd5b61140a87828801611379565b95989497509550505050565b5f805f805f6080868803121561142a575f80fd5b8535611435816111cc565b94506020860135611445816111cc565b935060408601359250606086013567ffffffffffffffff811115611467575f80fd5b61147388828901611379565b969995985093965092949392505050565b5f60208284031215611494575f80fd5b81356111c5816111cc565b7fff00000000000000000000000000000000000000000000000000000000000000881681525f602060e0818401526114da60e084018a611152565b83810360408501526114ec818a611152565b6060850189905273ffffffffffffffffffffffffffffffffffffffff8816608086015260a0850187905284810360c086015285518082528387019250908301905f5b8181101561154a5783518352928401929184019160010161152e565b50909c9b505050505050505050505050565b5f805f805f805f60e0888a031215611572575f80fd5b873561157d816111cc565b9650602088013561158d816111cc565b95506040880135945060608801359350608088013560ff811681146115b0575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156115de575f80fd5b82356115e9816111cc565b915060208301356115f9816111cc565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f82611664577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b808202811582820484141761043457610434611604565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036116dd576116dd611604565b5060010190565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6107396060830184866116e4565b5f60208284031215611770575f80fd5b815180151581146111c5575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff8088168352808716602084015250846040830152608060608301526117be6080830184866116e4565b979650505050505050565b8082018082111561043457610434611604565b818103818111156104345761043461160456fea26469706673582212206cbb7cdcba7a06233151e0f7036b7ff88298d822c611cc19f7ccb6a5a073af4c64736f6c63430008140033", + "deployedBytecode": "0x60806040526004361061013d575f3560e01c806370a08231116100bb578063c1d34b8911610071578063d505accf11610057578063d505accf146103d1578063dd62ed3e146103f2578063e7fcb06514610411575f80fd5b8063c1d34b8914610393578063cae9ca51146103b2575f80fd5b806384b0196e116100a157806384b0196e1461030557806395d89b411461032c578063a9059cbb14610374575f80fd5b806370a08231146102835780637ecebe00146102c4575f80fd5b806323b872dd116101105780633644e515116100f65780633644e515146102315780634000aea01461024557806365520efa14610264575f80fd5b806323b872dd146101f7578063313ce56714610216575f80fd5b806306fdde0314610141578063095ea7b3146101985780630e02df54146101c757806318160ddd146101da575b5f80fd5b34801561014c575f80fd5b5060408051808201909152600681527f546f6b656e73000000000000000000000000000000000000000000000000000060208201525b60405161018f91906111b3565b60405180910390f35b3480156101a3575f80fd5b506101b76101b23660046111f0565b610424565b604051901515815260200161018f565b6101b76101d5366004611257565b61043a565b3480156101e5575f80fd5b505f545b60405190815260200161018f565b348015610202575f80fd5b506101b761021136600461133b565b6105c7565b348015610221575f80fd5b506040516012815260200161018f565b34801561023c575f80fd5b506101e96105dd565b348015610250575f80fd5b506101b761025f3660046113be565b6105e6565b34801561026f575f80fd5b506101b761027e366004611416565b610693565b34801561028e575f80fd5b506101e961029d366004611484565b73ffffffffffffffffffffffffffffffffffffffff165f9081526001602052604090205490565b3480156102cf575f80fd5b506101e96102de366004611484565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b348015610310575f80fd5b50610319610743565b60405161018f979695949392919061149f565b348015610337575f80fd5b506101826040518060400160405280600581526020017f544f4b454e00000000000000000000000000000000000000000000000000000081525081565b34801561037f575f80fd5b506101b761038e3660046111f0565b6107c3565b34801561039e575f80fd5b506101b76103ad366004611416565b6107cf565b3480156103bd575f80fd5b506101b76103cc3660046113be565b610833565b3480156103dc575f80fd5b506103f06103eb36600461155c565b610895565b005b3480156103fd575f80fd5b506101e961040c3660046115cd565b610b58565b6101b761041f3660046111f0565b610bd5565b5f610430338484610c20565b5060015b92915050565b5f808351346104499190611631565b90508351816104589190611669565b34146104ac573484518261046c9190611669565b6040517f1f89f671000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044015b60405180910390fd5b5f8451846104ba9190611631565b90508451816104c99190611669565b841461051857838551826104dd9190611669565b6040517fe93890a2000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016104a3565b5f5b85518110156105b6576105473387838151811061053957610539611680565b602002602001015184610cfd565b85818151811061055957610559611680565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166108fc8490811502906040515f60405180830381858888f193505050501580156105a3573d5f803e3d5ffd5b50806105ae816116ad565b91505061051a565b50600195945050505050565b905090565b5f6105d3848484610ead565b5060019392505050565b5f6105c2610fd6565b5f6105f2338686610cfd565b6040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063a4c0ed369061064a90339088908890889060040161172b565b6020604051808303815f875af1158015610666573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061068a9190611760565b95945050505050565b5f61069f338686610cfd565b6040517f2eedcb7100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861690632eedcb71906106f99033908a9089908990899060040161177f565b6020604051808303815f875af1158015610715573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107399190611760565b9695505050505050565b7f0d000000000000000000000000000000000000000000000000000000000000006060805f808083610773611056565b60408051602080820183525f8083528351818152918201909352999a92999098504697507f0000000000000000000000000000000000000000000000000000000000000000965090945092509050565b5f610430338484610cfd565b5f6107db868686610ead565b6040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063a4c0ed36906106f990899088908890889060040161172b565b5f61083f338686610c20565b6040517eba451f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169062ba451f9061064a90339088908890889060040161172b565b73ffffffffffffffffffffffffffffffffffffffff87166108e4576040517f8e4c8aa60000000000000000000000000000000000000000000000000000000081525f60048201526024016104a3565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260036020526040812054906109126105dd565b604080517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9602082015273ffffffffffffffffffffffffffffffffffffffff808d1692820192909252908a1660608201526080810189905260a0810184905260c0810188905260e001604051602081830303815290604052805190602001206040516020016109d39291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f845290830180835281905260ff8816918301919091526060820186905260808201859052915060019060a0016020604051602081039080840390855afa158015610a56573d5f803e3d5ffd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614610ac4576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8515801590610ad257508542115b15610b12576040517fdd6b219a000000000000000000000000000000000000000000000000000000008152426004820152602481018790526044016104a3565b610b1d8260016117c9565b73ffffffffffffffffffffffffffffffffffffffff8a165f90815260036020526040902055610b4d898989610c20565b505050505050505050565b5f3073ffffffffffffffffffffffffffffffffffffffff841603610b9d57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610434565b5073ffffffffffffffffffffffffffffffffffffffff9182165f90815260026020908152604080832093909416825291909152205490565b5f610be1338484610cfd565b60405173ffffffffffffffffffffffffffffffffffffffff8416903480156108fc02915f818181858888f193505050501580156105d3573d5f803e3d5ffd5b73ffffffffffffffffffffffffffffffffffffffff83161580610c57575073ffffffffffffffffffffffffffffffffffffffff8216155b15610c90576040517f8e4c8aa60000000000000000000000000000000000000000000000000000000081525f60048201526024016104a3565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff82161580610d35575073ffffffffffffffffffffffffffffffffffffffff821630145b15610d84576040517f8e4c8aa600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016104a3565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526001602052604090205481811015610ded576040517f6584853f00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016104a3565b610df782826117dc565b73ffffffffffffffffffffffffffffffffffffffff8086165f908152600160205260408082209390935590851681529081208054849290610e399084906117c9565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e9f91815260200190565b60405180910390a350505050565b3373ffffffffffffffffffffffffffffffffffffffff841614801590610ee9575073ffffffffffffffffffffffffffffffffffffffff83163014155b15610fc65773ffffffffffffffffffffffffffffffffffffffff83165f9081526002602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610fc45781811015610f89576040517f95fcd25400000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016104a3565b610f9382826117dc565b73ffffffffffffffffffffffffffffffffffffffff85165f9081526002602090815260408083203384529091529020555b505b610fd1838383610cfd565b505050565b5f467f0000000000000000000000000000000000000000000000000000000000000000811461102e57611029817f0000000000000000000000000000000000000000000000000000000000000000611092565b611050565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b60606105c260408051808201909152600681527f546f6b656e730000000000000000000000000000000000000000000000000000602082015290565b5f7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666110ee60408051808201909152600681527f546f6b656e730000000000000000000000000000000000000000000000000000602082015290565b8051602091820120604051611134939287918791019384526020840192909252604083015273ffffffffffffffffffffffffffffffffffffffff16606082015260800190565b60405160208183030381529060405280519060200120905092915050565b5f81518084525f5b818110156111765760208185018101518683018201520161115a565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6111c56020830184611152565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146111ed575f80fd5b50565b5f8060408385031215611201575f80fd5b823561120c816111cc565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b8035611252816111cc565b919050565b5f8060408385031215611268575f80fd5b823567ffffffffffffffff8082111561127f575f80fd5b818501915085601f830112611292575f80fd5b81356020828211156112a6576112a661121a565b8160051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811086821117156112e9576112e961121a565b604052928352818301935084810182019289841115611306575f80fd5b948201945b8386101561132b5761131c86611247565b8552948201949382019361130b565b9997909101359750505050505050565b5f805f6060848603121561134d575f80fd5b8335611358816111cc565b92506020840135611368816111cc565b929592945050506040919091013590565b5f8083601f840112611389575f80fd5b50813567ffffffffffffffff8111156113a0575f80fd5b6020830191508360208285010111156113b7575f80fd5b9250929050565b5f805f80606085870312156113d1575f80fd5b84356113dc816111cc565b935060208501359250604085013567ffffffffffffffff8111156113fe575f80fd5b61140a87828801611379565b95989497509550505050565b5f805f805f6080868803121561142a575f80fd5b8535611435816111cc565b94506020860135611445816111cc565b935060408601359250606086013567ffffffffffffffff811115611467575f80fd5b61147388828901611379565b969995985093965092949392505050565b5f60208284031215611494575f80fd5b81356111c5816111cc565b7fff00000000000000000000000000000000000000000000000000000000000000881681525f602060e0818401526114da60e084018a611152565b83810360408501526114ec818a611152565b6060850189905273ffffffffffffffffffffffffffffffffffffffff8816608086015260a0850187905284810360c086015285518082528387019250908301905f5b8181101561154a5783518352928401929184019160010161152e565b50909c9b505050505050505050505050565b5f805f805f805f60e0888a031215611572575f80fd5b873561157d816111cc565b9650602088013561158d816111cc565b95506040880135945060608801359350608088013560ff811681146115b0575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156115de575f80fd5b82356115e9816111cc565b915060208301356115f9816111cc565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f82611664577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b808202811582820484141761043457610434611604565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036116dd576116dd611604565b5060010190565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6107396060830184866116e4565b5f60208284031215611770575f80fd5b815180151581146111c5575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff8088168352808716602084015250846040830152608060608301526117be6080830184866116e4565b979650505050505050565b8082018082111561043457610434611604565b818103818111156104345761043461160456fea26469706673582212206cbb7cdcba7a06233151e0f7036b7ff88298d822c611cc19f7ccb6a5a073af4c64736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {}, + "devdoc": { + "errors": { + "DeadlineOver(uint256,uint256)": [ + { + "params": { + "currentTime": "time at which the error happen", + "deadline": "the deadline" + } + } + ], + "InvalidAddress(address)": [ + { + "params": { + "addr": "invalid address" + } + } + ], + "InvalidMsgValue(uint256,uint256)": [ + { + "params": { + "expected": "value expected", + "provided": "msg.value amount provided" + } + } + ], + "InvalidTotalAmount(uint256,uint256)": [ + { + "params": { + "expected": "value expected", + "provided": "msg.value amount provided" + } + } + ], + "NotAuthorizedAllowance(uint256,uint256)": [ + { + "params": { + "currentAllowance": "the current allowance", + "expected": "amount expected" + } + } + ], + "NotEnoughTokens(uint256,uint256)": [ + { + "params": { + "currentBalance": "the current balance", + "expected": "amount expected" + } + } + ] + }, + "events": { + "Approval(address,address,uint256)": { + "params": { + "owner": "the account approving the `spender`", + "spender": "the account allowed to spend", + "value": "the amount granted" + } + }, + "Transfer(address,address,uint256)": { + "params": { + "from": "the account the tokens are sent from", + "to": "the account the tokens are sent to", + "value": "number of tokens sent" + } + } + }, + "kind": "dev", + "methods": { + "approveAndCall(address,uint256,bytes)": { + "params": { + "amount": "number of token to transfer", + "data": "extra data", + "spender": "account to send the token for" + }, + "returns": { + "_0": "success" + } + }, + "eip712Domain()": { + "returns": { + "chainID": "EIP-712 chainID", + "extensions": "A list of EIP numbers that specify additional fields in the domain. The method to obtain the value for each of these additional fields and any conditions for inclusion are expected to be specified in the respective EIP. The value of fields does not affect their inclusion.", + "fields": "A bit map where bit i is set to 1 if and only if domain field i is present (0 ≤ i ≤ 4). Bits are read from least significant to most significant, and fields are indexed in the order that is specified by EIP-712, identical to the order in which they are listed in the function type.", + "name": "EIP-712 name", + "salt": "EIP-712 salt", + "verifyingContract": "EIP-712 name verifyingContract", + "version": "EIP-712 version" + } + }, + "nonces(address)": { + "params": { + "owner": "address queried" + }, + "returns": { + "_0": "nonce value" + } + }, + "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": { + "params": { + "deadline": "timestamp in seconds after which the permit is not valid.", + "owner": "owner of the tokens", + "r": "signature part r", + "s": "signature part s", + "spender": "address allowed to spend on behalf of the owner.", + "v": "signature part v", + "value": "amount of token allowed to be spent" + } + }, + "transferAndCall(address,uint256,bytes)": { + "params": { + "amount": "number of token to transfer", + "data": "extra data", + "to": "account to receive the tokens" + }, + "returns": { + "_0": "success" + } + }, + "transferFromAndCall(address,address,uint256,bytes)": { + "params": { + "amount": "number of token to transfer", + "data": "extra data", + "from": "account to send the token from", + "to": "account to receive the tokens" + }, + "returns": { + "_0": "success" + } + }, + "transferOnBehalfAndCall(address,address,uint256,bytes)": { + "params": { + "amount": "number of token to transfer", + "data": "extra data", + "forAddress": "account to send the token for", + "to": "account to receive the tokens" + }, + "returns": { + "_0": "success" + } + } + }, + "version": 1 + }, + "evm": { + "gasEstimates": { + "creation": { + "codeDepositCost": "1236200", + "executionCost": "infinite", + "totalCost": "infinite" + }, + "external": { + "DOMAIN_SEPARATOR()": "infinite", + "allowance(address,address)": "infinite", + "approve(address,uint256)": "24599", + "approveAndCall(address,uint256,bytes)": "infinite", + "balanceOf(address)": "2550", + "decimals()": "244", + "distributeAlongWithETH(address[],uint256)": "infinite", + "eip712Domain()": "infinite", + "name()": "infinite", + "nonces(address)": "2572", + "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": "infinite", + "symbol()": "infinite", + "totalSupply()": "2369", + "transfer(address,uint256)": "infinite", + "transferAlongWithETH(address,uint256)": "infinite", + "transferAndCall(address,uint256,bytes)": "infinite", + "transferFrom(address,address,uint256)": "infinite", + "transferFromAndCall(address,address,uint256,bytes)": "infinite", + "transferOnBehalfAndCall(address,address,uint256,bytes)": "infinite" + } + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"DeadlineOver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"provided\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"}],\"name\":\"InvalidMsgValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"provided\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"}],\"name\":\"InvalidTotalAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentAllowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"}],\"name\":\"NotAuthorizedAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"}],\"name\":\"NotEnoughTokens\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"approveAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"tos\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"totalAmount\",\"type\":\"uint256\"}],\"name\":\"distributeAlongWithETH\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eip712Domain\",\"outputs\":[{\"internalType\":\"bytes1\",\"name\":\"fields\",\"type\":\"bytes1\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"chainID\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"verifyingContract\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"extensions\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferAlongWithETH\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferFromAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferOnBehalfAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"DeadlineOver(uint256,uint256)\":[{\"params\":{\"currentTime\":\"time at which the error happen\",\"deadline\":\"the deadline\"}}],\"InvalidAddress(address)\":[{\"params\":{\"addr\":\"invalid address\"}}],\"InvalidMsgValue(uint256,uint256)\":[{\"params\":{\"expected\":\"value expected\",\"provided\":\"msg.value amount provided\"}}],\"InvalidTotalAmount(uint256,uint256)\":[{\"params\":{\"expected\":\"value expected\",\"provided\":\"msg.value amount provided\"}}],\"NotAuthorizedAllowance(uint256,uint256)\":[{\"params\":{\"currentAllowance\":\"the current allowance\",\"expected\":\"amount expected\"}}],\"NotEnoughTokens(uint256,uint256)\":[{\"params\":{\"currentBalance\":\"the current balance\",\"expected\":\"amount expected\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"the account approving the `spender`\",\"spender\":\"the account allowed to spend\",\"value\":\"the amount granted\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"the account the tokens are sent from\",\"to\":\"the account the tokens are sent to\",\"value\":\"number of tokens sent\"}}},\"kind\":\"dev\",\"methods\":{\"approveAndCall(address,uint256,bytes)\":{\"params\":{\"amount\":\"number of token to transfer\",\"data\":\"extra data\",\"spender\":\"account to send the token for\"},\"returns\":{\"_0\":\"success\"}},\"eip712Domain()\":{\"returns\":{\"chainID\":\"EIP-712 chainID\",\"extensions\":\"A list of EIP numbers that specify additional fields in the domain. The method to obtain the value for each of these additional fields and any conditions for inclusion are expected to be specified in the respective EIP. The value of fields does not affect their inclusion.\",\"fields\":\"A bit map where bit i is set to 1 if and only if domain field i is present (0 \\u2264 i \\u2264 4). Bits are read from least significant to most significant, and fields are indexed in the order that is specified by EIP-712, identical to the order in which they are listed in the function type.\",\"name\":\"EIP-712 name\",\"salt\":\"EIP-712 salt\",\"verifyingContract\":\"EIP-712 name verifyingContract\",\"version\":\"EIP-712 version\"}},\"nonces(address)\":{\"params\":{\"owner\":\"address queried\"},\"returns\":{\"_0\":\"nonce value\"}},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"params\":{\"deadline\":\"timestamp in seconds after which the permit is not valid.\",\"owner\":\"owner of the tokens\",\"r\":\"signature part r\",\"s\":\"signature part s\",\"spender\":\"address allowed to spend on behalf of the owner.\",\"v\":\"signature part v\",\"value\":\"amount of token allowed to be spent\"}},\"transferAndCall(address,uint256,bytes)\":{\"params\":{\"amount\":\"number of token to transfer\",\"data\":\"extra data\",\"to\":\"account to receive the tokens\"},\"returns\":{\"_0\":\"success\"}},\"transferFromAndCall(address,address,uint256,bytes)\":{\"params\":{\"amount\":\"number of token to transfer\",\"data\":\"extra data\",\"from\":\"account to send the token from\",\"to\":\"account to receive the tokens\"},\"returns\":{\"_0\":\"success\"}},\"transferOnBehalfAndCall(address,address,uint256,bytes)\":{\"params\":{\"amount\":\"number of token to transfer\",\"data\":\"extra data\",\"forAddress\":\"account to send the token for\",\"to\":\"account to receive the tokens\"},\"returns\":{\"_0\":\"success\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"DeadlineOver(uint256,uint256)\":[{\"notice\":\"The permit has expired\"}],\"InvalidAddress(address)\":[{\"notice\":\"An invalid address is specified (for example: zero address)\"}],\"InvalidMsgValue(uint256,uint256)\":[{\"notice\":\"The msg value do not match the expected value\"}],\"InvalidSignature()\":[{\"notice\":\"The signature do not match the expected signer\"}],\"InvalidTotalAmount(uint256,uint256)\":[{\"notice\":\"The total amount provided do not match the expected value\"}],\"NotAuthorizedAllowance(uint256,uint256)\":[{\"notice\":\"the amount requested exceed the allowance\"}],\"NotEnoughTokens(uint256,uint256)\":[{\"notice\":\"the amount requested exceed the balance\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"trigger on approval amount being set. Note that Transfer events need to be considered to compute the current allowance.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"trigger when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"notice\":\"EIP-712 Domain separator hash\"},\"allowance(address,address)\":{\"notice\":\"Returns the amount which `spender` is still allowed to withdraw from `owner`.\"},\"approve(address,uint256)\":{\"notice\":\"Allows `spender` to withdraw from your account multiple times, up to `amount`.\"},\"approveAndCall(address,uint256,bytes)\":{\"notice\":\"approve `amount` token to be spent by `spender` and callback into it via `onTokenApproval`\"},\"balanceOf(address)\":{\"notice\":\"Returns the account balance of another account with address `owner`.\"},\"decimals()\":{\"notice\":\"Returns the number of decimals the token uses.\"},\"distributeAlongWithETH(address[],uint256)\":{\"notice\":\"distribute\"},\"eip712Domain()\":{\"notice\":\"The return values of this function MUST describe the domain separator that is used for verification of EIP-712 signatures in the contract. They describe both the form of the EIP712Domain struct (i.e., which of the optional fields and extensions are present) and the value of each field, as follows.\"},\"nonces(address)\":{\"notice\":\"return the current nonce of the owner\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"allow `spender` to spend `value` amount of token on behalf of `owner`\"},\"symbol()\":{\"notice\":\"Returns the symbol of the token.\"},\"totalSupply()\":{\"notice\":\"Returns the total token supply.\"},\"transfer(address,uint256)\":{\"notice\":\"Transfers `amount` of tokens to address `to`.\"},\"transferAlongWithETH(address,uint256)\":{\"notice\":\"transfer\"},\"transferAndCall(address,uint256,bytes)\":{\"notice\":\"transfer `amount` token to `to` and callback into it via `onTokenTransfer`\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfers `amount` tokens from address `from` to address `to`.\"},\"transferFromAndCall(address,address,uint256,bytes)\":{\"notice\":\"transfer `amount` token to `to` and callback into it via `onTokenTransfer`\"},\"transferOnBehalfAndCall(address,address,uint256,bytes)\":{\"notice\":\"transfer `amount` token to `to` and callback into it via `onTokenTransferedOnBehalf`\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/test/TestTokens.sol\":\"TestTokens\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solidity-kit/solc_0.8/ERC20/ERC2612/implementations/UsingPermit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport '../../implementations/ImplementingERC20Internal.sol';\\nimport '../interfaces/IERC2612.sol';\\nimport '../../../ERC712/implementations/UsingERC712.sol';\\nimport '../../../ERC712/implementations/ImplementingExternalDomainSeparator.sol';\\n\\nabstract contract UsingPermit is ImplementingERC20Internal, ImplementingExternalDomainSeparator, UsingERC712, IERC2612 {\\n\\tbytes32 internal constant PERMIT_TYPEHASH =\\n\\t\\tkeccak256('Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)');\\n\\n\\tmapping(address => uint256) internal _nonces;\\n\\n\\t/// @inheritdoc IERC2612\\n\\tfunction nonces(address owner) external view returns (uint256) {\\n\\t\\treturn _nonces[owner];\\n\\t}\\n\\n\\t/// @inheritdoc IERC2612\\n\\tfunction DOMAIN_SEPARATOR()\\n\\t\\tpublic\\n\\t\\tview\\n\\t\\tvirtual\\n\\t\\toverride(IERC2612, ImplementingExternalDomainSeparator)\\n\\t\\treturns (bytes32);\\n\\n\\t/// @inheritdoc IERC2612\\n\\tfunction permit(\\n\\t\\taddress owner,\\n\\t\\taddress spender,\\n\\t\\tuint256 value,\\n\\t\\tuint256 deadline,\\n\\t\\tuint8 v,\\n\\t\\tbytes32 r,\\n\\t\\tbytes32 s\\n\\t) external override {\\n\\t\\tif (owner == address(0)) {\\n\\t\\t\\trevert InvalidAddress(address(0));\\n\\t\\t}\\n\\n\\t\\tuint256 currentNonce = _nonces[owner];\\n\\t\\tbytes32 digest = keccak256(\\n\\t\\t\\tabi.encodePacked(\\n\\t\\t\\t\\t'\\\\x19\\\\x01',\\n\\t\\t\\t\\tDOMAIN_SEPARATOR(),\\n\\t\\t\\t\\tkeccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, currentNonce, deadline))\\n\\t\\t\\t)\\n\\t\\t);\\n\\t\\tif (owner != ecrecover(digest, v, r, s)) {\\n\\t\\t\\trevert InvalidSignature();\\n\\t\\t}\\n\\t\\tif (deadline != 0 && block.timestamp > deadline) {\\n\\t\\t\\trevert DeadlineOver(block.timestamp, deadline);\\n\\t\\t}\\n\\n\\t\\t_nonces[owner] = currentNonce + 1;\\n\\t\\t_approveFor(owner, spender, value);\\n\\t}\\n}\\n\",\"keccak256\":\"0x311115bfcaa89f3acdddfa261794e47ebf87ce81436c2758456900b8c6d81053\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/ERC2612/implementations/UsingPermitWithDynamicChainID.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./UsingPermit.sol\\\";\\nimport \\\"../../../ERC712/implementations/UsingERC712WithDynamicChainID.sol\\\";\\n\\nabstract contract UsingPermitWithDynamicChainID is UsingPermit, UsingERC712WithDynamicChainID {\\n\\tconstructor(address verifyingContract) UsingERC712WithDynamicChainID(verifyingContract) {}\\n\\n\\t/// @inheritdoc IERC2612\\n\\tfunction DOMAIN_SEPARATOR() public view virtual override returns (bytes32) {\\n\\t\\treturn _currentDomainSeparator();\\n\\t}\\n}\\n\",\"keccak256\":\"0xe21356300c4ccc093643cd925c5707fc0509559b8850e5d951b481d845310ee2\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/ERC2612/interfaces/IERC2612.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/IERC20Errors.sol\\\";\\n\\ninterface IERC2612 {\\n\\t/// @notice The signature do not match the expected signer\\n\\terror InvalidSignature();\\n\\t/// @notice The permit has expired\\n\\t/// @param currentTime time at which the error happen\\n\\t/// @param deadline the deadline\\n\\terror DeadlineOver(uint256 currentTime, uint256 deadline);\\n\\n\\t/// @notice allow `spender` to spend `value` amount of token on behalf of `owner`\\n\\t/// @param owner owner of the tokens\\n\\t/// @param spender address allowed to spend on behalf of the owner.\\n\\t/// @param value amount of token allowed to be spent\\n\\t/// @param deadline timestamp in seconds after which the permit is not valid.\\n\\t/// @param v signature part v\\n\\t/// @param r signature part r\\n\\t/// @param s signature part s\\n\\tfunction permit(\\n\\t\\taddress owner,\\n\\t\\taddress spender,\\n\\t\\tuint256 value,\\n\\t\\tuint256 deadline,\\n\\t\\tuint8 v,\\n\\t\\tbytes32 r,\\n\\t\\tbytes32 s\\n\\t) external;\\n\\n\\t/// @notice return the current nonce of the owner\\n\\t/// @param owner address queried\\n\\t/// @return nonce nonce value\\n\\tfunction nonces(address owner) external view returns (uint256 nonce);\\n\\n\\t/// @notice EIP-712 Domain separator hash\\n\\tfunction DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xe610994a34db6e750ee555ab2011292a980ec650e9afb7619fb0bc3fcad75095\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/implementations/ERC20Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IERC20.sol\\\";\\nimport \\\"../interfaces/IERC20WithCallback.sol\\\";\\nimport \\\"../interfaces/IERC20WithDistribution.sol\\\";\\nimport \\\"./ImplementingERC20Internal.sol\\\";\\nimport \\\"../../utils/Constants.sol\\\";\\n\\nabstract contract ERC20Base is IERC20, IERC20WithCallback, IERC20WithDistribution, ImplementingERC20Internal {\\n\\tuint256 internal _totalSupply;\\n\\tmapping(address => uint256) internal _balances;\\n\\tmapping(address => mapping(address => uint256)) internal _allowances;\\n\\n\\t/// @inheritdoc IERC20\\n\\tfunction totalSupply() external view override returns (uint256) {\\n\\t\\treturn _internal_totalSupply();\\n\\t}\\n\\n\\t/// @inheritdoc IERC20\\n\\tfunction balanceOf(address owner) external view override returns (uint256) {\\n\\t\\treturn _balances[owner];\\n\\t}\\n\\n\\t/// @inheritdoc IERC20\\n\\tfunction allowance(address owner, address spender) external view override returns (uint256) {\\n\\t\\tif (owner == address(this)) {\\n\\t\\t\\t// see transferFrom: address(this) allows anyone\\n\\t\\t\\treturn type(uint256).max;\\n\\t\\t}\\n\\t\\treturn _allowances[owner][spender];\\n\\t}\\n\\n\\t/// @inheritdoc IERC20\\n\\tfunction decimals() external pure virtual override returns (uint8) {\\n\\t\\treturn uint8(18);\\n\\t}\\n\\n\\t/// @inheritdoc IERC20\\n\\tfunction transfer(address to, uint256 amount) external override returns (bool) {\\n\\t\\t_transfer(msg.sender, to, amount);\\n\\t\\treturn true;\\n\\t}\\n\\n\\t/// @inheritdoc IERC20WithDistribution\\n\\tfunction transferAlongWithETH(address payable to, uint256 amount) external payable returns (bool) {\\n\\t\\t_transfer(msg.sender, to, amount);\\n\\t\\tto.transfer(msg.value);\\n\\t\\treturn true;\\n\\t}\\n\\n\\t/// @inheritdoc IERC20WithDistribution\\n\\tfunction distributeAlongWithETH(address payable[] memory tos, uint256 totalAmount) external payable returns (bool) {\\n\\t\\tuint256 val = msg.value / tos.length;\\n\\t\\tif (msg.value != val * tos.length) {\\n\\t\\t\\trevert InvalidMsgValue(msg.value, val * tos.length);\\n\\t\\t}\\n\\t\\tuint256 amount = totalAmount / tos.length;\\n\\t\\tif (totalAmount != amount * tos.length) {\\n\\t\\t\\trevert InvalidTotalAmount(totalAmount, amount * tos.length);\\n\\t\\t}\\n\\t\\tfor (uint256 i = 0; i < tos.length; i++) {\\n\\t\\t\\t_transfer(msg.sender, tos[i], amount);\\n\\t\\t\\ttos[i].transfer(val);\\n\\t\\t}\\n\\t\\treturn true;\\n\\t}\\n\\n\\t/// @inheritdoc IERC20WithCallback\\n\\tfunction transferAndCall(\\n\\t\\taddress to,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool) {\\n\\t\\t_transfer(msg.sender, to, amount);\\n\\t\\treturn ITransferReceiver(to).onTokenTransfer(msg.sender, amount, data);\\n\\t}\\n\\n\\t/// @inheritdoc IERC20WithCallback\\n\\tfunction transferFromAndCall(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool) {\\n\\t\\t_transferFrom(from, to, amount);\\n\\t\\treturn ITransferReceiver(to).onTokenTransfer(from, amount, data);\\n\\t}\\n\\n\\t/// @inheritdoc IERC20WithCallback\\n\\tfunction transferOnBehalfAndCall(\\n\\t\\taddress forAddress,\\n\\t\\taddress to,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool) {\\n\\t\\t_transfer(msg.sender, to, amount);\\n\\t\\treturn ITransferOnBehalfReceiver(to).onTokenTransferedOnBehalf(msg.sender, forAddress, amount, data);\\n\\t}\\n\\n\\t/// @inheritdoc IERC20\\n\\tfunction transferFrom(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 amount\\n\\t) external override returns (bool) {\\n\\t\\t_transferFrom(from, to, amount);\\n\\t\\treturn true;\\n\\t}\\n\\n\\t/// @inheritdoc IERC20\\n\\tfunction approve(address spender, uint256 amount) external override returns (bool) {\\n\\t\\t_approveFor(msg.sender, spender, amount);\\n\\t\\treturn true;\\n\\t}\\n\\n\\t/// @inheritdoc IERC20WithCallback\\n\\tfunction approveAndCall(\\n\\t\\taddress spender,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool) {\\n\\t\\t_approveFor(msg.sender, spender, amount);\\n\\t\\treturn IApprovalReceiver(spender).onTokenApproval(msg.sender, amount, data);\\n\\t}\\n\\n\\t// ------------------------------------------------------------------------------------------------------------------\\n\\t// INTERNALS\\n\\t// ------------------------------------------------------------------------------------------------------------------\\n\\n\\tfunction _internal_totalSupply() internal view override returns (uint256) {\\n\\t\\treturn _totalSupply;\\n\\t}\\n\\n\\tfunction _approveFor(\\n\\t\\taddress owner,\\n\\t\\taddress spender,\\n\\t\\tuint256 amount\\n\\t) internal override {\\n\\t\\tif (owner == address(0) || spender == address(0)) {\\n\\t\\t\\trevert InvalidAddress(address(0));\\n\\t\\t}\\n\\t\\t_allowances[owner][spender] = amount;\\n\\t\\temit Approval(owner, spender, amount);\\n\\t}\\n\\n\\tfunction _transferFrom(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 amount\\n\\t) internal {\\n\\t\\t// anybody can transfer from this\\n\\t\\t// this allow mintAndApprovedCall without gas overhead\\n\\t\\tif (msg.sender != from && from != address(this)) {\\n\\t\\t\\tuint256 currentAllowance = _allowances[from][msg.sender];\\n\\t\\t\\tif (currentAllowance != type(uint256).max) {\\n\\t\\t\\t\\t// save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n\\t\\t\\t\\tif (currentAllowance < amount) {\\n\\t\\t\\t\\t\\trevert NotAuthorizedAllowance(currentAllowance, amount);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t_allowances[from][msg.sender] = currentAllowance - amount;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t_transfer(from, to, amount);\\n\\t}\\n\\n\\tfunction _transfer(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 amount\\n\\t) internal {\\n\\t\\tif (to == address(0) || to == address(this)) {\\n\\t\\t\\trevert InvalidAddress(to);\\n\\t\\t}\\n\\t\\tuint256 currentBalance = _balances[from];\\n\\t\\tif (currentBalance < amount) {\\n\\t\\t\\trevert NotEnoughTokens(currentBalance, amount);\\n\\t\\t}\\n\\t\\t_balances[from] = currentBalance - amount;\\n\\t\\t_balances[to] += amount;\\n\\t\\temit Transfer(from, to, amount);\\n\\t}\\n\\n\\tfunction _transferAllIfAny(address from, address to) internal {\\n\\t\\tuint256 balanceLeft = _balances[from];\\n\\t\\tif (balanceLeft > 0) {\\n\\t\\t\\t_balances[from] = 0;\\n\\t\\t\\t_balances[to] += balanceLeft;\\n\\t\\t\\temit Transfer(from, to, balanceLeft);\\n\\t\\t}\\n\\t}\\n\\n\\tfunction _mint(address to, uint256 amount) internal override {\\n\\t\\t_totalSupply += amount;\\n\\t\\t_balances[to] += amount;\\n\\t\\temit Transfer(address(0), to, amount);\\n\\t}\\n\\n\\tfunction _burnFrom(address from, uint256 amount) internal override {\\n\\t\\tuint256 currentBalance = _balances[from];\\n\\t\\tif (currentBalance < amount) {\\n\\t\\t\\trevert NotEnoughTokens(currentBalance, amount);\\n\\t\\t}\\n\\t\\t_balances[from] = currentBalance - amount;\\n\\t\\t_totalSupply -= amount;\\n\\t\\temit Transfer(from, address(0), amount);\\n\\t}\\n}\\n\",\"keccak256\":\"0xfeb88cdc5795fe281cc9b13cb30ee9f57bf9e27ed719d96f599dd0a1a7e91dcd\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/implementations/ImplementingERC20Internal.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nabstract contract ImplementingERC20Internal {\\n\\tfunction _approveFor(\\n\\t\\taddress owner,\\n\\t\\taddress target,\\n\\t\\tuint256 amount\\n\\t) internal virtual;\\n\\n\\tfunction _mint(address to, uint256 amount) internal virtual;\\n\\n\\tfunction _burnFrom(address from, uint256 amount) internal virtual;\\n\\n\\tfunction _internal_totalSupply() internal view virtual returns (uint256);\\n}\\n\",\"keccak256\":\"0xa748d2b3c0573af21672cb5c19ea769ccec11fc03a2f7606213308d28a94f7ef\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IERC20Errors.sol\\\";\\n\\ninterface IERC20 {\\n\\t/// @notice trigger when tokens are transferred, including zero value transfers.\\n\\t/// @param from the account the tokens are sent from\\n\\t/// @param to the account the tokens are sent to\\n\\t/// @param value number of tokens sent\\n\\tevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n\\t/// @notice trigger on approval amount being set.\\n\\t/// Note that Transfer events need to be considered to compute the current allowance.\\n\\t/// @param owner the account approving the `spender`\\n\\t/// @param spender the account allowed to spend\\n\\t/// @param value the amount granted\\n\\tevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n\\t/// @notice Returns the total token supply.\\n\\tfunction totalSupply() external view returns (uint256);\\n\\n\\t/// @notice Returns the number of decimals the token uses.\\n\\tfunction decimals() external view returns (uint8);\\n\\n\\t/// @notice Returns the symbol of the token.\\n\\tfunction symbol() external view returns (string memory);\\n\\n\\t/// @notice Returns the name of the token.\\n\\tfunction name() external view returns (string memory);\\n\\n\\t/// @notice Returns the account balance of another account with address `owner`.\\n\\tfunction balanceOf(address owner) external view returns (uint256);\\n\\n\\t/// @notice Transfers `amount` of tokens to address `to`.\\n\\tfunction transfer(address to, uint256 amount) external returns (bool);\\n\\n\\t/// @notice Returns the amount which `spender` is still allowed to withdraw from `owner`.\\n\\tfunction allowance(address owner, address spender) external view returns (uint256);\\n\\n\\t/// @notice Allows `spender` to withdraw from your account multiple times, up to `amount`.\\n\\tfunction approve(address spender, uint256 amount) external returns (bool);\\n\\n\\t/// @notice Transfers `amount` tokens from address `from` to address `to`.\\n\\tfunction transferFrom(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 amount\\n\\t) external returns (bool);\\n}\\n\",\"keccak256\":\"0x68034c81cd7775e19a5bb75dd33022da7add3bc1852309eed9f797f1ff835507\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/interfaces/IERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/// @notice The msg value do not match the expected value\\n/// @param provided msg.value amount provided\\n/// @param expected value expected\\nerror InvalidMsgValue(uint256 provided, uint256 expected);\\n/// @notice The total amount provided do not match the expected value\\n/// @param provided msg.value amount provided\\n/// @param expected value expected\\nerror InvalidTotalAmount(uint256 provided, uint256 expected);\\n/// @notice An invalid address is specified (for example: zero address)\\n/// @param addr invalid address\\nerror InvalidAddress(address addr);\\n/// @notice the amount requested exceed the allowance\\n/// @param currentAllowance the current allowance\\n/// @param expected amount expected\\nerror NotAuthorizedAllowance(uint256 currentAllowance, uint256 expected);\\n/// @notice the amount requested exceed the balance\\n/// @param currentBalance the current balance\\n/// @param expected amount expected\\nerror NotEnoughTokens(uint256 currentBalance, uint256 expected);\\n\",\"keccak256\":\"0xc8ab4cfee19338da32d2fc5473e1ee740bf608c59196ebd16de74294c4813ae9\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/interfaces/IERC20WithCallback.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IERC20.sol\\\";\\n\\ninterface ITransferReceiver {\\n\\t/// @notice called by ERC20 token after transfer been executed.\\n\\t/// @param payer account sending the money\\n\\t/// @param amount number of token transfered\\n\\t/// @param data extra data\\n\\tfunction onTokenTransfer(\\n\\t\\taddress payer,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool);\\n}\\n\\ninterface ITransferOnBehalfReceiver {\\n\\t/// @notice called by ERC20 token after transfer been executed.\\n\\t/// @param payer account sending the money\\n\\t/// @param forAddress account to be considered as te actual payer\\n\\t/// @param amount number of token transfered\\n\\t/// @param data extra data\\n\\tfunction onTokenTransferedOnBehalf(\\n\\t\\taddress payer,\\n\\t\\taddress forAddress,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool);\\n}\\n\\ninterface IApprovalReceiver {\\n\\t/// @notice called by ERC20 token after transfer been executed.\\n\\t/// @param owner account that grant the approval\\n\\t/// @param amount number of token approved\\n\\t/// @param data extra data\\n\\tfunction onTokenApproval(\\n\\t\\taddress owner,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool);\\n}\\n\\ninterface IERC20WithCallback is IERC20 {\\n\\t/// @notice transfer `amount` token to `to` and callback into it via `onTokenTransfer`\\n\\t/// @param to account to receive the tokens\\n\\t/// @param amount number of token to transfer\\n\\t/// @param data extra data\\n\\t/// @return success\\n\\tfunction transferAndCall(\\n\\t\\taddress to,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool);\\n\\n\\t/// @notice transfer `amount` token to `to` and callback into it via `onTokenTransfer`\\n\\t/// @param from account to send the token from\\n\\t/// @param to account to receive the tokens\\n\\t/// @param amount number of token to transfer\\n\\t/// @param data extra data\\n\\t/// @return success\\n\\tfunction transferFromAndCall(\\n\\t\\taddress from,\\n\\t\\taddress to,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool);\\n\\n\\t/// @notice transfer `amount` token to `to` and callback into it via `onTokenTransferedOnBehalf`\\n\\t/// @param forAddress account to send the token for\\n\\t/// @param to account to receive the tokens\\n\\t/// @param amount number of token to transfer\\n\\t/// @param data extra data\\n\\t/// @return success\\n\\tfunction transferOnBehalfAndCall(\\n\\t\\taddress forAddress,\\n\\t\\taddress to,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool);\\n\\n\\t/// @notice approve `amount` token to be spent by `spender` and callback into it via `onTokenApproval`\\n\\t/// @param spender account to send the token for\\n\\t/// @param amount number of token to transfer\\n\\t/// @param data extra data\\n\\t/// @return success\\n\\tfunction approveAndCall(\\n\\t\\taddress spender,\\n\\t\\tuint256 amount,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool);\\n}\\n\",\"keccak256\":\"0xcbe7ac72af21634f11616ee1ff302df87039ec7d9752382ea7dbc748a5692f86\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC20/interfaces/IERC20WithDistribution.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IERC20.sol\\\";\\n\\ninterface IERC20WithDistribution is IERC20 {\\n\\t/// @notice transfer\\n\\tfunction transferAlongWithETH(address payable to, uint256 amount) external payable returns (bool);\\n\\n\\t/// @notice distribute\\n\\tfunction distributeAlongWithETH(address payable[] memory tos, uint256 totalAmount) external payable returns (bool);\\n}\\n\",\"keccak256\":\"0x8c46558a2161e80878f6102cd868c83a227d942ef1e38b639fc29b9c0025b7a3\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC712/implementations/ImplementingExternalDomainSeparator.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nabstract contract ImplementingExternalDomainSeparator {\\n\\t/// @notice EIP-712 Domain separator hash\\n\\tfunction DOMAIN_SEPARATOR() public view virtual returns (bytes32);\\n}\\n\",\"keccak256\":\"0xaeea9575d7d21d565d7148a9d57d5f559760e1e73a94e9038b2110cd50d1cd14\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC712/implementations/Named.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nabstract contract Named {\\n\\t/// @notice Returns the name of the contract.\\n\\tfunction name() public view virtual returns (string memory);\\n}\\n\",\"keccak256\":\"0x924b53f83a89b85206c14daea25f30248502b831f4424186c567581581c46794\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC712/implementations/UsingERC712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IERC5267.sol\\\";\\n\\nabstract contract UsingERC712 is IERC5267 {}\\n\",\"keccak256\":\"0x5b2d5c3dd2ebe8dedf66a6d1a8b01918a42dfe3bc00778dca06fdf7686b7699e\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC712/implementations/UsingERC712WithDynamicChainID.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./UsingERC712.sol\\\";\\nimport \\\"./Named.sol\\\";\\n\\nabstract contract UsingERC712WithDynamicChainID is UsingERC712, Named {\\n\\tuint256 private immutable _deploymentChainID;\\n\\tbytes32 private immutable _deploymentDomainSeparator;\\n\\taddress private immutable _verifyingContract;\\n\\n\\t/// @dev we let you specifying the verifying contract so that if you use a proxy, the implementation can use it.\\n\\tconstructor(address verifyingContract) {\\n\\t\\tuint256 chainID;\\n\\t\\tassembly {\\n\\t\\t\\tchainID := chainid()\\n\\t\\t}\\n\\n\\t\\t_deploymentChainID = chainID;\\n\\t\\t_verifyingContract = verifyingContract == address(0) ? address(this) : verifyingContract;\\n\\t\\t_deploymentDomainSeparator = _calculateDomainSeparator(chainID, _verifyingContract);\\n\\t}\\n\\n\\t/// @inheritdoc IERC5267\\n\\tfunction eip712Domain()\\n\\t\\texternal\\n\\t\\tview\\n\\t\\tvirtual\\n\\t\\toverride\\n\\t\\treturns (\\n\\t\\t\\tbytes1 fields,\\n\\t\\t\\tstring memory name,\\n\\t\\t\\tstring memory version,\\n\\t\\t\\tuint256 chainID,\\n\\t\\t\\taddress verifyingContract,\\n\\t\\t\\tbytes32 salt,\\n\\t\\t\\tuint256[] memory extensions\\n\\t\\t)\\n\\t{\\n\\t\\tfields = 0x0D;\\n\\t\\tname = _name();\\n\\t\\tversion = \\\"\\\";\\n\\t\\tassembly {\\n\\t\\t\\tchainID := chainid()\\n\\t\\t}\\n\\t\\tverifyingContract = _verifyingContract;\\n\\t\\tsalt = 0;\\n\\t\\textensions = new uint256[](0);\\n\\t}\\n\\n\\t// ------------------------------------------------------------------------------------------------------------------\\n\\t// INTERNALS\\n\\t// ------------------------------------------------------------------------------------------------------------------\\n\\n\\t// need to ensure we can use return value \\\"name\\\" in `eip712Domain`\\n\\tfunction _name() internal view returns (string memory) {\\n\\t\\treturn name();\\n\\t}\\n\\n\\tfunction _currentDomainSeparator() internal view returns (bytes32) {\\n\\t\\tuint256 chainID;\\n\\t\\tassembly {\\n\\t\\t\\tchainID := chainid()\\n\\t\\t}\\n\\n\\t\\t// in case a fork happen, to support the chain that had to change its chainID, we compute the domain operator\\n\\t\\treturn\\n\\t\\t\\tchainID == _deploymentChainID\\n\\t\\t\\t\\t? _deploymentDomainSeparator\\n\\t\\t\\t\\t: _calculateDomainSeparator(chainID, _verifyingContract);\\n\\t}\\n\\n\\t/// @dev Calculate the Domain Separator used to compute ERC712 hash\\n\\tfunction _calculateDomainSeparator(uint256 chainID, address verifyingContract) private view returns (bytes32) {\\n\\t\\treturn\\n\\t\\t\\tkeccak256(\\n\\t\\t\\t\\tabi.encode(\\n\\t\\t\\t\\t\\tkeccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\"),\\n\\t\\t\\t\\t\\tkeccak256(bytes(name())),\\n\\t\\t\\t\\t\\tchainID,\\n\\t\\t\\t\\t\\tverifyingContract\\n\\t\\t\\t\\t)\\n\\t\\t\\t);\\n\\t}\\n}\\n\",\"keccak256\":\"0x95bb33423ae9d2e9fcf7a91418630bb2d4bc438e2aa8cd9958e42af24183b488\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/ERC712/interfaces/IERC5267.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\ninterface IERC5267 {\\n\\t/// @notice The return values of this function MUST describe the domain separator that is used for verification of EIP-712 signatures in the contract. They describe both the form of the EIP712Domain struct (i.e., which of the optional fields and extensions are present) and the value of each field, as follows.\\n\\t/// @return fields A bit map where bit i is set to 1 if and only if domain field i is present (0 \\u2264 i \\u2264 4). Bits are read from least significant to most significant, and fields are indexed in the order that is specified by EIP-712, identical to the order in which they are listed in the function type.\\n\\t/// @return name EIP-712 name\\n\\t/// @return version EIP-712 version\\n\\t/// @return chainID EIP-712 chainID\\n\\t/// @return verifyingContract EIP-712 name verifyingContract\\n\\t/// @return salt EIP-712 salt\\n\\t/// @return extensions A list of EIP numbers that specify additional fields in the domain. The method to obtain the value for each of these additional fields and any conditions for inclusion are expected to be specified in the respective EIP. The value of fields does not affect their inclusion.\\n\\tfunction eip712Domain()\\n\\t\\texternal\\n\\t\\tview\\n\\t\\treturns (\\n\\t\\t\\tbytes1 fields,\\n\\t\\t\\tstring memory name,\\n\\t\\t\\tstring memory version,\\n\\t\\t\\tuint256 chainID,\\n\\t\\t\\taddress verifyingContract,\\n\\t\\t\\tbytes32 salt,\\n\\t\\t\\tuint256[] memory extensions\\n\\t\\t);\\n}\\n\",\"keccak256\":\"0xb0f30c518c3c6afc4e88fff6f822469425ed81611065be5528b10dee5aebde63\",\"license\":\"MIT\"},\"solidity-kit/solc_0.8/utils/Constants.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nlibrary Constants {\\n\\tuint256 internal constant DECIMALS_18 = 1000000000000000000;\\n}\\n\",\"keccak256\":\"0xe9da4ad04d270eb44b2bada7307894079ad6d3458b4d237b7992022f900d94b6\",\"license\":\"MIT\"},\"src/test/TestTokens.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\npragma solidity ^0.8.0;\\n\\nimport 'solidity-kit/solc_0.8/ERC20/implementations/ERC20Base.sol';\\nimport 'solidity-kit/solc_0.8/ERC20/ERC2612/implementations/UsingPermitWithDynamicChainID.sol';\\n\\ncontract TestTokens is ERC20Base, UsingPermitWithDynamicChainID {\\n\\tconstructor(address to, uint256 amount) UsingPermitWithDynamicChainID(address(this)) {\\n\\t\\t_mint(to, amount);\\n\\t}\\n\\n\\tstring public constant symbol = 'TOKEN';\\n\\n\\tfunction name() public pure override(IERC20, Named) returns (string memory) {\\n\\t\\treturn 'Tokens';\\n\\t}\\n}\\n\",\"keccak256\":\"0x7c2953e8933750746a48f57283e38fffec37913ee016b1c644d2f15b51564e1e\",\"license\":\"AGPL-3.0\"}},\"version\":1}", + "storageLayout": { + "storage": [ + { + "astId": 243, + "contract": "src/test/TestTokens.sol:TestTokens", + "label": "_totalSupply", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 247, + "contract": "src/test/TestTokens.sol:TestTokens", + "label": "_balances", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 253, + "contract": "src/test/TestTokens.sol:TestTokens", + "label": "_allowances", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" + }, + { + "astId": 22, + "contract": "src/test/TestTokens.sol:TestTokens", + "label": "_nonces", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_uint256)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => uint256))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_uint256)" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + }, + "userdoc": { + "errors": { + "DeadlineOver(uint256,uint256)": [ + { + "notice": "The permit has expired" + } + ], + "InvalidAddress(address)": [ + { + "notice": "An invalid address is specified (for example: zero address)" + } + ], + "InvalidMsgValue(uint256,uint256)": [ + { + "notice": "The msg value do not match the expected value" + } + ], + "InvalidSignature()": [ + { + "notice": "The signature do not match the expected signer" + } + ], + "InvalidTotalAmount(uint256,uint256)": [ + { + "notice": "The total amount provided do not match the expected value" + } + ], + "NotAuthorizedAllowance(uint256,uint256)": [ + { + "notice": "the amount requested exceed the allowance" + } + ], + "NotEnoughTokens(uint256,uint256)": [ + { + "notice": "the amount requested exceed the balance" + } + ] + }, + "events": { + "Approval(address,address,uint256)": { + "notice": "trigger on approval amount being set. Note that Transfer events need to be considered to compute the current allowance." + }, + "Transfer(address,address,uint256)": { + "notice": "trigger when tokens are transferred, including zero value transfers." + } + }, + "kind": "user", + "methods": { + "DOMAIN_SEPARATOR()": { + "notice": "EIP-712 Domain separator hash" + }, + "allowance(address,address)": { + "notice": "Returns the amount which `spender` is still allowed to withdraw from `owner`." + }, + "approve(address,uint256)": { + "notice": "Allows `spender` to withdraw from your account multiple times, up to `amount`." + }, + "approveAndCall(address,uint256,bytes)": { + "notice": "approve `amount` token to be spent by `spender` and callback into it via `onTokenApproval`" + }, + "balanceOf(address)": { + "notice": "Returns the account balance of another account with address `owner`." + }, + "decimals()": { + "notice": "Returns the number of decimals the token uses." + }, + "distributeAlongWithETH(address[],uint256)": { + "notice": "distribute" + }, + "eip712Domain()": { + "notice": "The return values of this function MUST describe the domain separator that is used for verification of EIP-712 signatures in the contract. They describe both the form of the EIP712Domain struct (i.e., which of the optional fields and extensions are present) and the value of each field, as follows." + }, + "nonces(address)": { + "notice": "return the current nonce of the owner" + }, + "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": { + "notice": "allow `spender` to spend `value` amount of token on behalf of `owner`" + }, + "symbol()": { + "notice": "Returns the symbol of the token." + }, + "totalSupply()": { + "notice": "Returns the total token supply." + }, + "transfer(address,uint256)": { + "notice": "Transfers `amount` of tokens to address `to`." + }, + "transferAlongWithETH(address,uint256)": { + "notice": "transfer" + }, + "transferAndCall(address,uint256,bytes)": { + "notice": "transfer `amount` token to `to` and callback into it via `onTokenTransfer`" + }, + "transferFrom(address,address,uint256)": { + "notice": "Transfers `amount` tokens from address `from` to address `to`." + }, + "transferFromAndCall(address,address,uint256,bytes)": { + "notice": "transfer `amount` token to `to` and callback into it via `onTokenTransfer`" + }, + "transferOnBehalfAndCall(address,address,uint256,bytes)": { + "notice": "transfer `amount` token to `to` and callback into it via `onTokenTransferedOnBehalf`" + } + }, + "version": 1 + }, + "argsData": "0x000000000000000000000000e53cd71271acadbeb0f64d9c8c62bbddc8ca9e660000000000000000000000000000000000000000033b2e3c9fd0803ce8000000", + "transaction": { + "hash": "0xfdb5e19d745ca9bda230dfaab0eaa624daf67ef812e0c7f535ea05cddb9fb610", + "nonce": "0x85", + "origin": "0x61c461ecc993aadeb7e4b47e96d1b8cc37314b20" + } +} \ No newline at end of file