@keep-network/tbtc-v2 1.2.0-goerli.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/artifacts/.chainId +1 -1
  2. package/artifacts/Bank.json +23 -23
  3. package/artifacts/Bridge.json +27 -63
  4. package/artifacts/BridgeGovernance.json +25 -25
  5. package/artifacts/BridgeGovernanceParameters.json +10 -10
  6. package/artifacts/Deposit.json +14 -14
  7. package/artifacts/DepositSweep.json +13 -13
  8. package/artifacts/DonationVault.json +14 -14
  9. package/artifacts/Fraud.json +13 -13
  10. package/artifacts/LightRelay.json +65 -55
  11. package/artifacts/MaintainerProxy.json +47 -47
  12. package/artifacts/MovingFunds.json +13 -13
  13. package/artifacts/Redemption.json +13 -13
  14. package/artifacts/TBTC.json +36 -37
  15. package/artifacts/TBTCVault.json +47 -47
  16. package/artifacts/VendingMachine.json +34 -35
  17. package/artifacts/VendingMachineV2.json +360 -0
  18. package/artifacts/VendingMachineV3.json +405 -0
  19. package/artifacts/Wallets.json +13 -13
  20. package/artifacts/solcInputs/7cc3eda3cb3ff2522d18b5e7b31ea228.json +102 -0
  21. package/artifacts/solcInputs/802132f7da69a8a4226cb9424480847b.json +218 -0
  22. package/artifacts/solcInputs/{f862bd134ddc06352fa5be0644481600.json → 887fad6b16575ba42183543c324eeb0e.json} +6 -6
  23. package/artifacts/solcInputs/b0025f1f7efe4824592ac0c9793776c3.json +392 -0
  24. package/artifacts/solcInputs/{deff85fc9ae9b5be07226c67809262df.json → fccb130292c8c7cc958ab4fa31a3e180.json} +3 -3
  25. package/build/contracts/GovernanceUtils.sol/GovernanceUtils.dbg.json +1 -1
  26. package/build/contracts/bank/Bank.sol/Bank.dbg.json +1 -1
  27. package/build/contracts/bank/IReceiveBalanceApproval.sol/IReceiveBalanceApproval.dbg.json +1 -1
  28. package/build/contracts/bridge/BitcoinTx.sol/BitcoinTx.dbg.json +1 -1
  29. package/build/contracts/bridge/BitcoinTx.sol/BitcoinTx.json +2 -2
  30. package/build/contracts/bridge/Bridge.sol/Bridge.dbg.json +1 -1
  31. package/build/contracts/bridge/Bridge.sol/Bridge.json +2 -2
  32. package/build/contracts/bridge/BridgeGovernance.sol/BridgeGovernance.dbg.json +1 -1
  33. package/build/contracts/bridge/BridgeGovernance.sol/BridgeGovernance.json +2 -2
  34. package/build/contracts/bridge/BridgeGovernanceParameters.sol/BridgeGovernanceParameters.dbg.json +1 -1
  35. package/build/contracts/bridge/BridgeState.sol/BridgeState.dbg.json +1 -1
  36. package/build/contracts/bridge/BridgeState.sol/BridgeState.json +2 -2
  37. package/build/contracts/bridge/Deposit.sol/Deposit.dbg.json +1 -1
  38. package/build/contracts/bridge/Deposit.sol/Deposit.json +2 -2
  39. package/build/contracts/bridge/DepositSweep.sol/DepositSweep.dbg.json +1 -1
  40. package/build/contracts/bridge/DepositSweep.sol/DepositSweep.json +2 -2
  41. package/build/contracts/bridge/EcdsaLib.sol/EcdsaLib.dbg.json +1 -1
  42. package/build/contracts/bridge/Fraud.sol/Fraud.dbg.json +1 -1
  43. package/build/contracts/bridge/Fraud.sol/Fraud.json +2 -2
  44. package/build/contracts/bridge/Heartbeat.sol/Heartbeat.dbg.json +1 -1
  45. package/build/contracts/bridge/IRelay.sol/IRelay.dbg.json +1 -1
  46. package/build/contracts/bridge/MovingFunds.sol/MovingFunds.dbg.json +1 -1
  47. package/build/contracts/bridge/MovingFunds.sol/MovingFunds.json +2 -2
  48. package/build/contracts/bridge/Redemption.sol/OutboundTx.dbg.json +1 -1
  49. package/build/contracts/bridge/Redemption.sol/OutboundTx.json +2 -2
  50. package/build/contracts/bridge/Redemption.sol/Redemption.dbg.json +1 -1
  51. package/build/contracts/bridge/Redemption.sol/Redemption.json +2 -2
  52. package/build/contracts/bridge/VendingMachine.sol/VendingMachine.dbg.json +1 -1
  53. package/build/contracts/bridge/VendingMachineV2.sol/VendingMachineV2.dbg.json +1 -1
  54. package/build/contracts/bridge/VendingMachineV3.sol/VendingMachineV3.dbg.json +1 -1
  55. package/build/contracts/bridge/Wallets.sol/Wallets.dbg.json +1 -1
  56. package/build/contracts/bridge/Wallets.sol/Wallets.json +2 -2
  57. package/build/contracts/l2/L2TBTC.sol/L2TBTC.dbg.json +1 -1
  58. package/build/contracts/l2/L2WormholeGateway.sol/IWormholeTokenBridge.dbg.json +1 -1
  59. package/build/contracts/l2/L2WormholeGateway.sol/L2WormholeGateway.dbg.json +1 -1
  60. package/build/contracts/maintainer/MaintainerProxy.sol/MaintainerProxy.dbg.json +1 -1
  61. package/build/contracts/maintainer/MaintainerProxy.sol/MaintainerProxy.json +2 -2
  62. package/build/contracts/relay/LightRelay.sol/ILightRelay.dbg.json +1 -1
  63. package/build/contracts/relay/LightRelay.sol/LightRelay.dbg.json +1 -1
  64. package/build/contracts/relay/LightRelay.sol/RelayUtils.dbg.json +1 -1
  65. package/build/contracts/token/TBTC.sol/TBTC.dbg.json +1 -1
  66. package/build/contracts/vault/DonationVault.sol/DonationVault.dbg.json +1 -1
  67. package/build/contracts/vault/IVault.sol/IVault.dbg.json +1 -1
  68. package/build/contracts/vault/TBTCOptimisticMinting.sol/TBTCOptimisticMinting.dbg.json +1 -1
  69. package/build/contracts/vault/TBTCVault.sol/TBTCVault.dbg.json +1 -1
  70. package/build/contracts/vault/TBTCVault.sol/TBTCVault.json +2 -2
  71. package/export/artifacts/@keep-network/ecdsa/contracts/EcdsaDkgValidator.sol/EcdsaDkgValidator.json +29 -29
  72. package/export/artifacts/@keep-network/ecdsa/contracts/WalletRegistry.sol/WalletRegistry.json +245 -245
  73. package/export/artifacts/@keep-network/ecdsa/contracts/libraries/EcdsaDkg.sol/EcdsaDkg.json +7 -7
  74. package/export/artifacts/@keep-network/ecdsa/contracts/libraries/EcdsaInactivity.sol/EcdsaInactivity.json +28 -28
  75. package/export/artifacts/@keep-network/random-beacon/contracts/ReimbursementPool.sol/ReimbursementPool.json +53 -53
  76. package/export/artifacts/@keep-network/sortition-pools/contracts/Chaosnet.sol/Chaosnet.json +21 -21
  77. package/export/artifacts/@keep-network/sortition-pools/contracts/Rewards.sol/Rewards.json +16 -16
  78. package/export/artifacts/@keep-network/sortition-pools/contracts/SortitionPool.sol/SortitionPool.json +1054 -1054
  79. package/export/artifacts/@keep-network/sortition-pools/contracts/SortitionTree.sol/SortitionTree.json +26 -26
  80. package/export/artifacts/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol/ERC1967Proxy.json +46 -46
  81. package/export/artifacts/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.json +36 -36
  82. package/export/artifacts/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.json +78 -78
  83. package/export/artifacts/@openzeppelin/contracts/token/ERC721/ERC721.sol/ERC721.json +68 -68
  84. package/export/artifacts/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol/ERC20Upgradeable.json +43 -43
  85. package/export/artifacts/@thesis/solidity-contracts/contracts/token/ERC20WithPermit.sol/ERC20WithPermit.json +79 -79
  86. package/export/artifacts/@thesis/solidity-contracts/contracts/token/MisfundRecovery.sol/MisfundRecovery.json +42 -42
  87. package/export/artifacts/contracts/bank/Bank.sol/Bank.json +77 -77
  88. package/export/artifacts/contracts/bridge/Bridge.sol/Bridge.json +325 -325
  89. package/export/artifacts/contracts/bridge/BridgeGovernance.sol/BridgeGovernance.json +223 -223
  90. package/export/artifacts/contracts/bridge/VendingMachine.sol/VendingMachine.json +108 -108
  91. package/export/artifacts/contracts/bridge/VendingMachineV2.sol/VendingMachineV2.json +63 -63
  92. package/export/artifacts/contracts/bridge/VendingMachineV3.sol/VendingMachineV3.json +65 -65
  93. package/export/artifacts/contracts/l2/L2TBTC.sol/L2TBTC.json +194 -194
  94. package/export/artifacts/contracts/l2/L2WormholeGateway.sol/L2WormholeGateway.json +100 -100
  95. package/export/artifacts/contracts/maintainer/MaintainerProxy.sol/MaintainerProxy.json +154 -154
  96. package/export/artifacts/contracts/relay/LightRelay.sol/LightRelay.json +76 -76
  97. package/export/artifacts/contracts/token/TBTC.sol/TBTC.json +104 -104
  98. package/export/artifacts/contracts/vault/DonationVault.sol/DonationVault.json +19 -19
  99. package/export/artifacts/contracts/vault/TBTCVault.sol/TBTCVault.json +189 -189
  100. package/export/deploy/00_resolve_relay.js +83 -0
  101. package/export/deploy/01_deploy_tbtc_v2_token.js +70 -0
  102. package/export/deploy/02_deploy_vending_machine.js +84 -0
  103. package/export/deploy/03_transfer_vending_machine_roles.js +69 -0
  104. package/export/deploy/04_deploy_bank.js +73 -0
  105. package/export/deploy/05_deploy_bridge.js +178 -0
  106. package/export/deploy/06_deploy_tbtc_vault.js +80 -0
  107. package/export/deploy/07_deploy_bridge_governance.js +87 -0
  108. package/export/deploy/08_deploy_maintainer_proxy.js +80 -0
  109. package/export/deploy/09_bank_update_bridge.js +63 -0
  110. package/export/deploy/10_authorize_spv_maintainer_in_bridge.js +61 -0
  111. package/export/deploy/11_transfer_bank_ownership.js +60 -0
  112. package/export/deploy/12_transfer_bridge_governance.js +63 -0
  113. package/export/deploy/13_transfer_bridge_governance_ownership.js +60 -0
  114. package/export/deploy/14_transfer_tbtc_vault_ownership.js +60 -0
  115. package/export/deploy/15_transfer_maintainer_proxy_ownership.js +60 -0
  116. package/export/deploy/16_initialize_wallet_owner.js +63 -0
  117. package/export/deploy/16_transfer_proxy_admin_ownership.js +73 -0
  118. package/export/deploy/17_authorize_maintainer_proxy_in_bridge.js +63 -0
  119. package/export/deploy/17_transfer_proxy_admin_ownership.js +73 -0
  120. package/export/deploy/18_authorize_maintainer_proxy_in_bridge.js +63 -0
  121. package/export/deploy/18_authorize_maintainer_proxy_in_reimbursement_pool.js +63 -0
  122. package/export/deploy/19_authorize_bridge_in_reimbursement_pool.js +63 -0
  123. package/export/deploy/19_authorize_maintainer_proxy_in_reimbursement_pool.js +63 -0
  124. package/export/deploy/20_authorize_bridge_in_reimbursement_pool.js +63 -0
  125. package/export/deploy/20_deploy_proxy_admin_with_deputy.js +80 -0
  126. package/export/deploy/21_transfer_reimbursement_pool_ownership.js +60 -0
  127. package/export/deploy/22_deploy_proxy_admin_with_deputy.js +80 -0
  128. package/export/deploy/24_transfer_maintainer_proxy_ownership.js +60 -0
  129. package/export/deploy/25_transfer_proxy_admin_ownership.js +73 -0
  130. package/export/deploy/26_authorize_maintainer_proxy_in_reimbursement_pool.js +70 -0
  131. package/export/deploy/27_authorize_bridge_in_reimbursement_pool.js +70 -0
  132. package/export/deploy/28_deploy_proxy_admin_with_deputy.js +80 -0
  133. package/export/typechain/RelayStub.js +2 -0
  134. package/export/typechain/TestRelay.js +2 -0
  135. package/export/typechain/factories/BridgeGovernance__factory.js +1 -1
  136. package/export/typechain/factories/BridgeState__factory.js +1 -1
  137. package/export/typechain/factories/BridgeStub__factory.js +1 -1
  138. package/export/typechain/factories/Bridge__factory.js +1 -1
  139. package/export/typechain/factories/DepositSweep__factory.js +1 -1
  140. package/export/typechain/factories/Deposit__factory.js +1 -1
  141. package/export/typechain/factories/EcdsaAuthorization__factory.js +1 -1
  142. package/export/typechain/factories/EcdsaDkgValidator__factory.js +1 -1
  143. package/export/typechain/factories/EcdsaDkg__factory.js +1 -1
  144. package/export/typechain/factories/EcdsaInactivity__factory.js +1 -1
  145. package/export/typechain/factories/Fraud__factory.js +1 -1
  146. package/export/typechain/factories/MaintainerProxy__factory.js +1 -1
  147. package/export/typechain/factories/MovingFunds__factory.js +1 -1
  148. package/export/typechain/factories/Redemption__factory.js +1 -1
  149. package/export/typechain/factories/RelayStub__factory.js +546 -0
  150. package/export/typechain/factories/SortitionPool__factory.js +1 -1
  151. package/export/typechain/factories/SystemTestRelay__factory.js +1 -1
  152. package/export/typechain/factories/TBTCVault__factory.js +1 -1
  153. package/export/typechain/factories/TestRelay__factory.js +168 -0
  154. package/export/typechain/factories/WalletRegistry__factory.js +1 -1
  155. package/export/typechain/factories/Wallets__factory.js +1 -1
  156. package/export.json +7879 -37568
  157. package/package.json +7 -5
@@ -95,8 +95,8 @@
95
95
  "type": "function"
96
96
  }
97
97
  ],
98
- "bytecode": "0x61112161003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe730000000000000000000000000000000000000000301460806040526004361061004b5760003560e01c80636dcc64f81461005057806389ef44b01461006b578063f4df04be14610073575b600080fd5b610058603381565b6040519081526020015b60405180910390f35b610058604181565b610086610081366004610c0b565b610093565b6040516100629190610d11565b60606100ab6100a56020880188610d5b565b8461067b565b600060416100bc6060890189610da5565b6100c7929150610e18565b90506100d66060880188610da5565b905060000361012c5760405162461bcd60e51b815260206004820152601660248201527f4e6f207369676e6174757265732070726f76696465640000000000000000000060448201526064015b60405180910390fd5b604161013b6060890189610da5565b610146929150610e2c565b156101935760405162461bcd60e51b815260206004820152601a60248201527f4d616c666f726d6564207369676e6174757265732061727261790000000000006044820152606401610123565b6101a06080880188610d5b565b905081146101f05760405162461bcd60e51b815260206004820152601b60248201527f556e6578706563746564207369676e61747572657320636f756e7400000000006044820152606401610123565b60338110156102415760405162461bcd60e51b815260206004820152601260248201527f546f6f20666577207369676e61747572657300000000000000000000000000006044820152606401610123565b828111156102915760405162461bcd60e51b815260206004820152601360248201527f546f6f206d616e79207369676e617475726573000000000000000000000000006044820152606401610123565b6102a76102a16080890189610d5b565b8561067b565b60006103444687896102bc60208d018d610d5b565b8d60400160208101906102cf9190610e40565b6040516020016102e496959493929190610eb4565b60408051601f1981840301815282825280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000084830152603c8085019190915282518085039091018152605c909301909152815191012090565b90506000896001600160a01b031663f7f9a8fa87876040518363ffffffff1660e01b8152600401610376929190610f53565b600060405180830381865afa158015610393573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103bb9190810190610f9c565b905060606000805b8581101561051c5760006103da60808e018e610d5b565b838181106103ea576103ea61104e565b9050602002013590506104538260416104039190611064565b60418f80606001906104159190610da5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509294939250506108239050565b9350600061046187866108d3565b90506001600160a01b0381168661047960018561107b565b815181106104895761048961104e565b60200260200101516001600160a01b0316146104e75760405162461bcd60e51b815260206004820152601160248201527f496e76616c6964207369676e61747572650000000000000000000000000000006044820152606401610123565b831580156104fd5750336001600160a01b038216145b1561050757600193505b505080806105149061108e565b9150506103c3565b508061056a5760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206d75737420626520636c61696d207369676e657200000000006044820152606401610123565b61057760208c018c610d5b565b905067ffffffffffffffff81111561059157610591610b7f565b6040519080825280602002602001820160405280156105ba578160200160208202803683370190505b50955060005b6105cd60208d018d610d5b565b905081101561066b5760006105e560208e018e610d5b565b838181106105f5576105f561104e565b905060200201359050898960018361060d919061107b565b81811061061c5761061c61104e565b905060200201602081019061063191906110a7565b8883815181106106435761064361104e565b63ffffffff9092166020928302919091019091015250806106638161108e565b9150506105c0565b5050505050509695505050505050565b811580159061068a5750808211155b6106d65760405162461bcd60e51b815260206004820152601960248201527f436f72727570746564206d656d6265727320696e6469636573000000000000006044820152606401610123565b6000838360008181106106eb576106eb61104e565b90506020020135118015610721575080838361070860018261107b565b8181106107175761071761104e565b9050602002013511155b61076d5760405162461bcd60e51b815260206004820152601960248201527f436f72727570746564206d656d6265727320696e6469636573000000000000006044820152606401610123565b60005b61077b60018461107b565b81101561081d57838361078f8360016110c2565b81811061079e5761079e61104e565b905060200201358484838181106107b7576107b761104e565b905060200201351061080b5760405162461bcd60e51b815260206004820152601960248201527f436f72727570746564206d656d6265727320696e6469636573000000000000006044820152606401610123565b806108158161108e565b915050610770565b50505050565b6060600061083183856110c2565b90508381118015610843575080855110155b61088f5760405162461bcd60e51b815260206004820152601360248201527f536c696365206f7574206f6620626f756e6473000000000000000000000000006044820152606401610123565b604051915082604083010160405282825283850182038460208701018481015b808210156108c8578151838301526020820191506108af565b505050509392505050565b60008060006108e285856108f9565b915091506108ef8161093e565b5090505b92915050565b600080825160410361092f5760208301516040840151606085015160001a61092387828585610aa6565b94509450505050610937565b506000905060025b9250929050565b6000816004811115610952576109526110d5565b0361095a5750565b600181600481111561096e5761096e6110d5565b036109bb5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610123565b60028160048111156109cf576109cf6110d5565b03610a1c5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610123565b6003816004811115610a3057610a306110d5565b03610aa35760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610123565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610add5750600090506003610b61565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610b31573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610b5a57600060019250925050610b61565b9150600090505b94509492505050565b6001600160a01b0381168114610aa357600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610bbe57610bbe610b7f565b604052919050565b60008083601f840112610bd857600080fd5b50813567ffffffffffffffff811115610bf057600080fd5b6020830191508360208260051b850101111561093757600080fd5b60008060008060008060a08789031215610c2457600080fd5b8635610c2f81610b6a565b955060208781013567ffffffffffffffff80821115610c4d57600080fd5b9089019060a0828c031215610c6157600080fd5b90965060408901359080821115610c7757600080fd5b818a0191508a601f830112610c8b57600080fd5b813581811115610c9d57610c9d610b7f565b610caf601f8201601f19168501610b95565b8181528c85838601011115610cc357600080fd5b81858501868301376000918101909401529195506060890135945060808901359180831115610cf157600080fd5b5050610cff89828a01610bc6565b979a9699509497509295939492505050565b6020808252825182820181905260009190848201906040850190845b81811015610d4f57835163ffffffff1683529284019291840191600101610d2d565b50909695505050505050565b6000808335601e19843603018112610d7257600080fd5b83018035915067ffffffffffffffff821115610d8d57600080fd5b6020019150600581901b360382131561093757600080fd5b6000808335601e19843603018112610dbc57600080fd5b83018035915067ffffffffffffffff821115610dd757600080fd5b60200191503681900382131561093757600080fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082610e2757610e27610dec565b500490565b600082610e3b57610e3b610dec565b500690565b600060208284031215610e5257600080fd5b81358015158114610e6257600080fd5b9392505050565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115610e9b57600080fd5b8260051b80836020870137939093016020019392505050565b86815260006020878184015260a0604084015286518060a085015260005b81811015610eee5788810183015185820160c001528201610ed2565b50600060c08286010152601f19601f820116840191505060c0838203016060840152610f1e60c082018688610e69565b915050610f2f608083018415159052565b979650505050505050565b803563ffffffff81168114610f4e57600080fd5b919050565b60208082528181018390526000908460408401835b86811015610f915763ffffffff610f7e84610f3a565b1682529183019190830190600101610f68565b509695505050505050565b60006020808385031215610faf57600080fd5b825167ffffffffffffffff80821115610fc757600080fd5b818501915085601f830112610fdb57600080fd5b815181811115610fed57610fed610b7f565b8060051b9150610ffe848301610b95565b818152918301840191848101908884111561101857600080fd5b938501935b83851015611042578451925061103283610b6a565b828252938501939085019061101d565b98975050505050505050565b634e487b7160e01b600052603260045260246000fd5b80820281158282048414176108f3576108f3610e02565b818103818111156108f3576108f3610e02565b6000600182016110a0576110a0610e02565b5060010190565b6000602082840312156110b957600080fd5b610e6282610f3a565b808201808211156108f3576108f3610e02565b634e487b7160e01b600052602160045260246000fdfea264697066735822122090b0be1f942d36486bb0f921c262b1413d6eab7a8a4ef713c6d7d36c5e9423d564736f6c63430008110033",
99
- "deployedBytecode": "0x730000000000000000000000000000000000000000301460806040526004361061004b5760003560e01c80636dcc64f81461005057806389ef44b01461006b578063f4df04be14610073575b600080fd5b610058603381565b6040519081526020015b60405180910390f35b610058604181565b610086610081366004610c0b565b610093565b6040516100629190610d11565b60606100ab6100a56020880188610d5b565b8461067b565b600060416100bc6060890189610da5565b6100c7929150610e18565b90506100d66060880188610da5565b905060000361012c5760405162461bcd60e51b815260206004820152601660248201527f4e6f207369676e6174757265732070726f76696465640000000000000000000060448201526064015b60405180910390fd5b604161013b6060890189610da5565b610146929150610e2c565b156101935760405162461bcd60e51b815260206004820152601a60248201527f4d616c666f726d6564207369676e6174757265732061727261790000000000006044820152606401610123565b6101a06080880188610d5b565b905081146101f05760405162461bcd60e51b815260206004820152601b60248201527f556e6578706563746564207369676e61747572657320636f756e7400000000006044820152606401610123565b60338110156102415760405162461bcd60e51b815260206004820152601260248201527f546f6f20666577207369676e61747572657300000000000000000000000000006044820152606401610123565b828111156102915760405162461bcd60e51b815260206004820152601360248201527f546f6f206d616e79207369676e617475726573000000000000000000000000006044820152606401610123565b6102a76102a16080890189610d5b565b8561067b565b60006103444687896102bc60208d018d610d5b565b8d60400160208101906102cf9190610e40565b6040516020016102e496959493929190610eb4565b60408051601f1981840301815282825280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000084830152603c8085019190915282518085039091018152605c909301909152815191012090565b90506000896001600160a01b031663f7f9a8fa87876040518363ffffffff1660e01b8152600401610376929190610f53565b600060405180830381865afa158015610393573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103bb9190810190610f9c565b905060606000805b8581101561051c5760006103da60808e018e610d5b565b838181106103ea576103ea61104e565b9050602002013590506104538260416104039190611064565b60418f80606001906104159190610da5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509294939250506108239050565b9350600061046187866108d3565b90506001600160a01b0381168661047960018561107b565b815181106104895761048961104e565b60200260200101516001600160a01b0316146104e75760405162461bcd60e51b815260206004820152601160248201527f496e76616c6964207369676e61747572650000000000000000000000000000006044820152606401610123565b831580156104fd5750336001600160a01b038216145b1561050757600193505b505080806105149061108e565b9150506103c3565b508061056a5760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206d75737420626520636c61696d207369676e657200000000006044820152606401610123565b61057760208c018c610d5b565b905067ffffffffffffffff81111561059157610591610b7f565b6040519080825280602002602001820160405280156105ba578160200160208202803683370190505b50955060005b6105cd60208d018d610d5b565b905081101561066b5760006105e560208e018e610d5b565b838181106105f5576105f561104e565b905060200201359050898960018361060d919061107b565b81811061061c5761061c61104e565b905060200201602081019061063191906110a7565b8883815181106106435761064361104e565b63ffffffff9092166020928302919091019091015250806106638161108e565b9150506105c0565b5050505050509695505050505050565b811580159061068a5750808211155b6106d65760405162461bcd60e51b815260206004820152601960248201527f436f72727570746564206d656d6265727320696e6469636573000000000000006044820152606401610123565b6000838360008181106106eb576106eb61104e565b90506020020135118015610721575080838361070860018261107b565b8181106107175761071761104e565b9050602002013511155b61076d5760405162461bcd60e51b815260206004820152601960248201527f436f72727570746564206d656d6265727320696e6469636573000000000000006044820152606401610123565b60005b61077b60018461107b565b81101561081d57838361078f8360016110c2565b81811061079e5761079e61104e565b905060200201358484838181106107b7576107b761104e565b905060200201351061080b5760405162461bcd60e51b815260206004820152601960248201527f436f72727570746564206d656d6265727320696e6469636573000000000000006044820152606401610123565b806108158161108e565b915050610770565b50505050565b6060600061083183856110c2565b90508381118015610843575080855110155b61088f5760405162461bcd60e51b815260206004820152601360248201527f536c696365206f7574206f6620626f756e6473000000000000000000000000006044820152606401610123565b604051915082604083010160405282825283850182038460208701018481015b808210156108c8578151838301526020820191506108af565b505050509392505050565b60008060006108e285856108f9565b915091506108ef8161093e565b5090505b92915050565b600080825160410361092f5760208301516040840151606085015160001a61092387828585610aa6565b94509450505050610937565b506000905060025b9250929050565b6000816004811115610952576109526110d5565b0361095a5750565b600181600481111561096e5761096e6110d5565b036109bb5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610123565b60028160048111156109cf576109cf6110d5565b03610a1c5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610123565b6003816004811115610a3057610a306110d5565b03610aa35760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610123565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610add5750600090506003610b61565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610b31573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610b5a57600060019250925050610b61565b9150600090505b94509492505050565b6001600160a01b0381168114610aa357600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610bbe57610bbe610b7f565b604052919050565b60008083601f840112610bd857600080fd5b50813567ffffffffffffffff811115610bf057600080fd5b6020830191508360208260051b850101111561093757600080fd5b60008060008060008060a08789031215610c2457600080fd5b8635610c2f81610b6a565b955060208781013567ffffffffffffffff80821115610c4d57600080fd5b9089019060a0828c031215610c6157600080fd5b90965060408901359080821115610c7757600080fd5b818a0191508a601f830112610c8b57600080fd5b813581811115610c9d57610c9d610b7f565b610caf601f8201601f19168501610b95565b8181528c85838601011115610cc357600080fd5b81858501868301376000918101909401529195506060890135945060808901359180831115610cf157600080fd5b5050610cff89828a01610bc6565b979a9699509497509295939492505050565b6020808252825182820181905260009190848201906040850190845b81811015610d4f57835163ffffffff1683529284019291840191600101610d2d565b50909695505050505050565b6000808335601e19843603018112610d7257600080fd5b83018035915067ffffffffffffffff821115610d8d57600080fd5b6020019150600581901b360382131561093757600080fd5b6000808335601e19843603018112610dbc57600080fd5b83018035915067ffffffffffffffff821115610dd757600080fd5b60200191503681900382131561093757600080fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082610e2757610e27610dec565b500490565b600082610e3b57610e3b610dec565b500690565b600060208284031215610e5257600080fd5b81358015158114610e6257600080fd5b9392505050565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115610e9b57600080fd5b8260051b80836020870137939093016020019392505050565b86815260006020878184015260a0604084015286518060a085015260005b81811015610eee5788810183015185820160c001528201610ed2565b50600060c08286010152601f19601f820116840191505060c0838203016060840152610f1e60c082018688610e69565b915050610f2f608083018415159052565b979650505050505050565b803563ffffffff81168114610f4e57600080fd5b919050565b60208082528181018390526000908460408401835b86811015610f915763ffffffff610f7e84610f3a565b1682529183019190830190600101610f68565b509695505050505050565b60006020808385031215610faf57600080fd5b825167ffffffffffffffff80821115610fc757600080fd5b818501915085601f830112610fdb57600080fd5b815181811115610fed57610fed610b7f565b8060051b9150610ffe848301610b95565b818152918301840191848101908884111561101857600080fd5b938501935b83851015611042578451925061103283610b6a565b828252938501939085019061101d565b98975050505050505050565b634e487b7160e01b600052603260045260246000fd5b80820281158282048414176108f3576108f3610e02565b818103818111156108f3576108f3610e02565b6000600182016110a0576110a0610e02565b5060010190565b6000602082840312156110b957600080fd5b610e6282610f3a565b808201808211156108f3576108f3610e02565b634e487b7160e01b600052602160045260246000fdfea264697066735822122090b0be1f942d36486bb0f921c262b1413d6eab7a8a4ef713c6d7d36c5e9423d564736f6c63430008110033",
98
+ "bytecode": "0x61112161003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe730000000000000000000000000000000000000000301460806040526004361061004b5760003560e01c80636dcc64f81461005057806389ef44b01461006b578063f4df04be14610073575b600080fd5b610058603381565b6040519081526020015b60405180910390f35b610058604181565b610086610081366004610c0b565b610093565b6040516100629190610d11565b60606100ab6100a56020880188610d5b565b8461067b565b600060416100bc6060890189610da5565b6100c7929150610e18565b90506100d66060880188610da5565b905060000361012c5760405162461bcd60e51b815260206004820152601660248201527f4e6f207369676e6174757265732070726f76696465640000000000000000000060448201526064015b60405180910390fd5b604161013b6060890189610da5565b610146929150610e2c565b156101935760405162461bcd60e51b815260206004820152601a60248201527f4d616c666f726d6564207369676e6174757265732061727261790000000000006044820152606401610123565b6101a06080880188610d5b565b905081146101f05760405162461bcd60e51b815260206004820152601b60248201527f556e6578706563746564207369676e61747572657320636f756e7400000000006044820152606401610123565b60338110156102415760405162461bcd60e51b815260206004820152601260248201527f546f6f20666577207369676e61747572657300000000000000000000000000006044820152606401610123565b828111156102915760405162461bcd60e51b815260206004820152601360248201527f546f6f206d616e79207369676e617475726573000000000000000000000000006044820152606401610123565b6102a76102a16080890189610d5b565b8561067b565b60006103444687896102bc60208d018d610d5b565b8d60400160208101906102cf9190610e40565b6040516020016102e496959493929190610eb4565b60408051601f1981840301815282825280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000084830152603c8085019190915282518085039091018152605c909301909152815191012090565b90506000896001600160a01b031663f7f9a8fa87876040518363ffffffff1660e01b8152600401610376929190610f53565b600060405180830381865afa158015610393573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103bb9190810190610f9c565b905060606000805b8581101561051c5760006103da60808e018e610d5b565b838181106103ea576103ea61104e565b9050602002013590506104538260416104039190611064565b60418f80606001906104159190610da5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509294939250506108239050565b9350600061046187866108d3565b90506001600160a01b0381168661047960018561107b565b815181106104895761048961104e565b60200260200101516001600160a01b0316146104e75760405162461bcd60e51b815260206004820152601160248201527f496e76616c6964207369676e61747572650000000000000000000000000000006044820152606401610123565b831580156104fd5750336001600160a01b038216145b1561050757600193505b505080806105149061108e565b9150506103c3565b508061056a5760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206d75737420626520636c61696d207369676e657200000000006044820152606401610123565b61057760208c018c610d5b565b905067ffffffffffffffff81111561059157610591610b7f565b6040519080825280602002602001820160405280156105ba578160200160208202803683370190505b50955060005b6105cd60208d018d610d5b565b905081101561066b5760006105e560208e018e610d5b565b838181106105f5576105f561104e565b905060200201359050898960018361060d919061107b565b81811061061c5761061c61104e565b905060200201602081019061063191906110a7565b8883815181106106435761064361104e565b63ffffffff9092166020928302919091019091015250806106638161108e565b9150506105c0565b5050505050509695505050505050565b811580159061068a5750808211155b6106d65760405162461bcd60e51b815260206004820152601960248201527f436f72727570746564206d656d6265727320696e6469636573000000000000006044820152606401610123565b6000838360008181106106eb576106eb61104e565b90506020020135118015610721575080838361070860018261107b565b8181106107175761071761104e565b9050602002013511155b61076d5760405162461bcd60e51b815260206004820152601960248201527f436f72727570746564206d656d6265727320696e6469636573000000000000006044820152606401610123565b60005b61077b60018461107b565b81101561081d57838361078f8360016110c2565b81811061079e5761079e61104e565b905060200201358484838181106107b7576107b761104e565b905060200201351061080b5760405162461bcd60e51b815260206004820152601960248201527f436f72727570746564206d656d6265727320696e6469636573000000000000006044820152606401610123565b806108158161108e565b915050610770565b50505050565b6060600061083183856110c2565b90508381118015610843575080855110155b61088f5760405162461bcd60e51b815260206004820152601360248201527f536c696365206f7574206f6620626f756e6473000000000000000000000000006044820152606401610123565b604051915082604083010160405282825283850182038460208701018481015b808210156108c8578151838301526020820191506108af565b505050509392505050565b60008060006108e285856108f9565b915091506108ef8161093e565b5090505b92915050565b600080825160410361092f5760208301516040840151606085015160001a61092387828585610aa6565b94509450505050610937565b506000905060025b9250929050565b6000816004811115610952576109526110d5565b0361095a5750565b600181600481111561096e5761096e6110d5565b036109bb5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610123565b60028160048111156109cf576109cf6110d5565b03610a1c5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610123565b6003816004811115610a3057610a306110d5565b03610aa35760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610123565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610add5750600090506003610b61565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610b31573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610b5a57600060019250925050610b61565b9150600090505b94509492505050565b6001600160a01b0381168114610aa357600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610bbe57610bbe610b7f565b604052919050565b60008083601f840112610bd857600080fd5b50813567ffffffffffffffff811115610bf057600080fd5b6020830191508360208260051b850101111561093757600080fd5b60008060008060008060a08789031215610c2457600080fd5b8635610c2f81610b6a565b955060208781013567ffffffffffffffff80821115610c4d57600080fd5b9089019060a0828c031215610c6157600080fd5b90965060408901359080821115610c7757600080fd5b818a0191508a601f830112610c8b57600080fd5b813581811115610c9d57610c9d610b7f565b610caf601f8201601f19168501610b95565b8181528c85838601011115610cc357600080fd5b81858501868301376000918101909401529195506060890135945060808901359180831115610cf157600080fd5b5050610cff89828a01610bc6565b979a9699509497509295939492505050565b6020808252825182820181905260009190848201906040850190845b81811015610d4f57835163ffffffff1683529284019291840191600101610d2d565b50909695505050505050565b6000808335601e19843603018112610d7257600080fd5b83018035915067ffffffffffffffff821115610d8d57600080fd5b6020019150600581901b360382131561093757600080fd5b6000808335601e19843603018112610dbc57600080fd5b83018035915067ffffffffffffffff821115610dd757600080fd5b60200191503681900382131561093757600080fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082610e2757610e27610dec565b500490565b600082610e3b57610e3b610dec565b500690565b600060208284031215610e5257600080fd5b81358015158114610e6257600080fd5b9392505050565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115610e9b57600080fd5b8260051b80836020870137939093016020019392505050565b86815260006020878184015260a0604084015286518060a085015260005b81811015610eee5788810183015185820160c001528201610ed2565b50600060c08286010152601f19601f820116840191505060c0838203016060840152610f1e60c082018688610e69565b915050610f2f608083018415159052565b979650505050505050565b803563ffffffff81168114610f4e57600080fd5b919050565b60208082528181018390526000908460408401835b86811015610f915763ffffffff610f7e84610f3a565b1682529183019190830190600101610f68565b509695505050505050565b60006020808385031215610faf57600080fd5b825167ffffffffffffffff80821115610fc757600080fd5b818501915085601f830112610fdb57600080fd5b815181811115610fed57610fed610b7f565b8060051b9150610ffe848301610b95565b818152918301840191848101908884111561101857600080fd5b938501935b83851015611042578451925061103283610b6a565b828252938501939085019061101d565b98975050505050505050565b634e487b7160e01b600052603260045260246000fd5b80820281158282048414176108f3576108f3610e02565b818103818111156108f3576108f3610e02565b6000600182016110a0576110a0610e02565b5060010190565b6000602082840312156110b957600080fd5b610e6282610f3a565b808201808211156108f3576108f3610e02565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220a4eba8937a99704f1d81befed62e38bbbe2bc00ee2cef4966db01fc39536a97964736f6c63430008110033",
99
+ "deployedBytecode": "0x730000000000000000000000000000000000000000301460806040526004361061004b5760003560e01c80636dcc64f81461005057806389ef44b01461006b578063f4df04be14610073575b600080fd5b610058603381565b6040519081526020015b60405180910390f35b610058604181565b610086610081366004610c0b565b610093565b6040516100629190610d11565b60606100ab6100a56020880188610d5b565b8461067b565b600060416100bc6060890189610da5565b6100c7929150610e18565b90506100d66060880188610da5565b905060000361012c5760405162461bcd60e51b815260206004820152601660248201527f4e6f207369676e6174757265732070726f76696465640000000000000000000060448201526064015b60405180910390fd5b604161013b6060890189610da5565b610146929150610e2c565b156101935760405162461bcd60e51b815260206004820152601a60248201527f4d616c666f726d6564207369676e6174757265732061727261790000000000006044820152606401610123565b6101a06080880188610d5b565b905081146101f05760405162461bcd60e51b815260206004820152601b60248201527f556e6578706563746564207369676e61747572657320636f756e7400000000006044820152606401610123565b60338110156102415760405162461bcd60e51b815260206004820152601260248201527f546f6f20666577207369676e61747572657300000000000000000000000000006044820152606401610123565b828111156102915760405162461bcd60e51b815260206004820152601360248201527f546f6f206d616e79207369676e617475726573000000000000000000000000006044820152606401610123565b6102a76102a16080890189610d5b565b8561067b565b60006103444687896102bc60208d018d610d5b565b8d60400160208101906102cf9190610e40565b6040516020016102e496959493929190610eb4565b60408051601f1981840301815282825280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000084830152603c8085019190915282518085039091018152605c909301909152815191012090565b90506000896001600160a01b031663f7f9a8fa87876040518363ffffffff1660e01b8152600401610376929190610f53565b600060405180830381865afa158015610393573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103bb9190810190610f9c565b905060606000805b8581101561051c5760006103da60808e018e610d5b565b838181106103ea576103ea61104e565b9050602002013590506104538260416104039190611064565b60418f80606001906104159190610da5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509294939250506108239050565b9350600061046187866108d3565b90506001600160a01b0381168661047960018561107b565b815181106104895761048961104e565b60200260200101516001600160a01b0316146104e75760405162461bcd60e51b815260206004820152601160248201527f496e76616c6964207369676e61747572650000000000000000000000000000006044820152606401610123565b831580156104fd5750336001600160a01b038216145b1561050757600193505b505080806105149061108e565b9150506103c3565b508061056a5760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206d75737420626520636c61696d207369676e657200000000006044820152606401610123565b61057760208c018c610d5b565b905067ffffffffffffffff81111561059157610591610b7f565b6040519080825280602002602001820160405280156105ba578160200160208202803683370190505b50955060005b6105cd60208d018d610d5b565b905081101561066b5760006105e560208e018e610d5b565b838181106105f5576105f561104e565b905060200201359050898960018361060d919061107b565b81811061061c5761061c61104e565b905060200201602081019061063191906110a7565b8883815181106106435761064361104e565b63ffffffff9092166020928302919091019091015250806106638161108e565b9150506105c0565b5050505050509695505050505050565b811580159061068a5750808211155b6106d65760405162461bcd60e51b815260206004820152601960248201527f436f72727570746564206d656d6265727320696e6469636573000000000000006044820152606401610123565b6000838360008181106106eb576106eb61104e565b90506020020135118015610721575080838361070860018261107b565b8181106107175761071761104e565b9050602002013511155b61076d5760405162461bcd60e51b815260206004820152601960248201527f436f72727570746564206d656d6265727320696e6469636573000000000000006044820152606401610123565b60005b61077b60018461107b565b81101561081d57838361078f8360016110c2565b81811061079e5761079e61104e565b905060200201358484838181106107b7576107b761104e565b905060200201351061080b5760405162461bcd60e51b815260206004820152601960248201527f436f72727570746564206d656d6265727320696e6469636573000000000000006044820152606401610123565b806108158161108e565b915050610770565b50505050565b6060600061083183856110c2565b90508381118015610843575080855110155b61088f5760405162461bcd60e51b815260206004820152601360248201527f536c696365206f7574206f6620626f756e6473000000000000000000000000006044820152606401610123565b604051915082604083010160405282825283850182038460208701018481015b808210156108c8578151838301526020820191506108af565b505050509392505050565b60008060006108e285856108f9565b915091506108ef8161093e565b5090505b92915050565b600080825160410361092f5760208301516040840151606085015160001a61092387828585610aa6565b94509450505050610937565b506000905060025b9250929050565b6000816004811115610952576109526110d5565b0361095a5750565b600181600481111561096e5761096e6110d5565b036109bb5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610123565b60028160048111156109cf576109cf6110d5565b03610a1c5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610123565b6003816004811115610a3057610a306110d5565b03610aa35760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610123565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610add5750600090506003610b61565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610b31573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610b5a57600060019250925050610b61565b9150600090505b94509492505050565b6001600160a01b0381168114610aa357600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610bbe57610bbe610b7f565b604052919050565b60008083601f840112610bd857600080fd5b50813567ffffffffffffffff811115610bf057600080fd5b6020830191508360208260051b850101111561093757600080fd5b60008060008060008060a08789031215610c2457600080fd5b8635610c2f81610b6a565b955060208781013567ffffffffffffffff80821115610c4d57600080fd5b9089019060a0828c031215610c6157600080fd5b90965060408901359080821115610c7757600080fd5b818a0191508a601f830112610c8b57600080fd5b813581811115610c9d57610c9d610b7f565b610caf601f8201601f19168501610b95565b8181528c85838601011115610cc357600080fd5b81858501868301376000918101909401529195506060890135945060808901359180831115610cf157600080fd5b5050610cff89828a01610bc6565b979a9699509497509295939492505050565b6020808252825182820181905260009190848201906040850190845b81811015610d4f57835163ffffffff1683529284019291840191600101610d2d565b50909695505050505050565b6000808335601e19843603018112610d7257600080fd5b83018035915067ffffffffffffffff821115610d8d57600080fd5b6020019150600581901b360382131561093757600080fd5b6000808335601e19843603018112610dbc57600080fd5b83018035915067ffffffffffffffff821115610dd757600080fd5b60200191503681900382131561093757600080fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082610e2757610e27610dec565b500490565b600082610e3b57610e3b610dec565b500690565b600060208284031215610e5257600080fd5b81358015158114610e6257600080fd5b9392505050565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115610e9b57600080fd5b8260051b80836020870137939093016020019392505050565b86815260006020878184015260a0604084015286518060a085015260005b81811015610eee5788810183015185820160c001528201610ed2565b50600060c08286010152601f19601f820116840191505060c0838203016060840152610f1e60c082018688610e69565b915050610f2f608083018415159052565b979650505050505050565b803563ffffffff81168114610f4e57600080fd5b919050565b60208082528181018390526000908460408401835b86811015610f915763ffffffff610f7e84610f3a565b1682529183019190830190600101610f68565b509695505050505050565b60006020808385031215610faf57600080fd5b825167ffffffffffffffff80821115610fc757600080fd5b818501915085601f830112610fdb57600080fd5b815181811115610fed57610fed610b7f565b8060051b9150610ffe848301610b95565b818152918301840191848101908884111561101857600080fd5b938501935b83851015611042578451925061103283610b6a565b828252938501939085019061101d565b98975050505050505050565b634e487b7160e01b600052603260045260246000fd5b80820281158282048414176108f3576108f3610e02565b818103818111156108f3576108f3610e02565b6000600182016110a0576110a0610e02565b5060010190565b6000602082840312156110b957600080fd5b610e6282610f3a565b808201808211156108f3576108f3610e02565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220a4eba8937a99704f1d81befed62e38bbbe2bc00ee2cef4966db01fc39536a97964736f6c63430008110033",
100
100
  "linkReferences": {},
101
101
  "deployedLinkReferences": {},
102
102
  "devdoc": {
@@ -123,68 +123,68 @@
123
123
  "functionDebugData": {},
124
124
  "generatedSources": [],
125
125
  "linkReferences": {},
126
- "opcodes": "PUSH2 0x1121 PUSH2 0x3A PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH2 0x2D JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x6DCC64F8 EQ PUSH2 0x50 JUMPI DUP1 PUSH4 0x89EF44B0 EQ PUSH2 0x6B JUMPI DUP1 PUSH4 0xF4DF04BE EQ PUSH2 0x73 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x58 PUSH1 0x33 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x58 PUSH1 0x41 DUP2 JUMP JUMPDEST PUSH2 0x86 PUSH2 0x81 CALLDATASIZE PUSH1 0x4 PUSH2 0xC0B JUMP JUMPDEST PUSH2 0x93 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x62 SWAP2 SWAP1 PUSH2 0xD11 JUMP JUMPDEST PUSH1 0x60 PUSH2 0xAB PUSH2 0xA5 PUSH1 0x20 DUP9 ADD DUP9 PUSH2 0xD5B JUMP JUMPDEST DUP5 PUSH2 0x67B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x41 PUSH2 0xBC PUSH1 0x60 DUP10 ADD DUP10 PUSH2 0xDA5 JUMP JUMPDEST PUSH2 0xC7 SWAP3 SWAP2 POP PUSH2 0xE18 JUMP JUMPDEST SWAP1 POP PUSH2 0xD6 PUSH1 0x60 DUP9 ADD DUP9 PUSH2 0xDA5 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SUB PUSH2 0x12C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4E6F207369676E6174757265732070726F766964656400000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x41 PUSH2 0x13B PUSH1 0x60 DUP10 ADD DUP10 PUSH2 0xDA5 JUMP JUMPDEST PUSH2 0x146 SWAP3 SWAP2 POP PUSH2 0xE2C JUMP JUMPDEST ISZERO PUSH2 0x193 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4D616C666F726D6564207369676E617475726573206172726179000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH2 0x1A0 PUSH1 0x80 DUP9 ADD DUP9 PUSH2 0xD5B JUMP JUMPDEST SWAP1 POP DUP2 EQ PUSH2 0x1F0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x556E6578706563746564207369676E61747572657320636F756E740000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH1 0x33 DUP2 LT ISZERO PUSH2 0x241 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6F20666577207369676E6174757265730000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x291 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6F206D616E79207369676E61747572657300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH2 0x2A7 PUSH2 0x2A1 PUSH1 0x80 DUP10 ADD DUP10 PUSH2 0xD5B JUMP JUMPDEST DUP6 PUSH2 0x67B JUMP JUMPDEST PUSH1 0x0 PUSH2 0x344 CHAINID DUP8 DUP10 PUSH2 0x2BC PUSH1 0x20 DUP14 ADD DUP14 PUSH2 0xD5B JUMP JUMPDEST DUP14 PUSH1 0x40 ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x2CF SWAP2 SWAP1 PUSH2 0xE40 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x2E4 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xEB4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE DUP3 DUP3 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD KECCAK256 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP5 DUP4 ADD MSTORE PUSH1 0x3C DUP1 DUP6 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP6 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x5C SWAP1 SWAP4 ADD SWAP1 SWAP2 MSTORE DUP2 MLOAD SWAP2 ADD KECCAK256 SWAP1 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP10 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF7F9A8FA DUP8 DUP8 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x376 SWAP3 SWAP2 SWAP1 PUSH2 0xF53 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x393 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0x3BB SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xF9C JUMP JUMPDEST SWAP1 POP PUSH1 0x60 PUSH1 0x0 DUP1 JUMPDEST DUP6 DUP2 LT ISZERO PUSH2 0x51C JUMPI PUSH1 0x0 PUSH2 0x3DA PUSH1 0x80 DUP15 ADD DUP15 PUSH2 0xD5B JUMP JUMPDEST DUP4 DUP2 DUP2 LT PUSH2 0x3EA JUMPI PUSH2 0x3EA PUSH2 0x104E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD SWAP1 POP PUSH2 0x453 DUP3 PUSH1 0x41 PUSH2 0x403 SWAP2 SWAP1 PUSH2 0x1064 JUMP JUMPDEST PUSH1 0x41 DUP16 DUP1 PUSH1 0x60 ADD SWAP1 PUSH2 0x415 SWAP2 SWAP1 PUSH2 0xDA5 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP PUSH2 0x823 SWAP1 POP JUMP JUMPDEST SWAP4 POP PUSH1 0x0 PUSH2 0x461 DUP8 DUP7 PUSH2 0x8D3 JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP7 PUSH2 0x479 PUSH1 0x1 DUP6 PUSH2 0x107B JUMP JUMPDEST DUP2 MLOAD DUP2 LT PUSH2 0x489 JUMPI PUSH2 0x489 PUSH2 0x104E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x4E7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C6964207369676E6174757265000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST DUP4 ISZERO DUP1 ISZERO PUSH2 0x4FD JUMPI POP CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND EQ JUMPDEST ISZERO PUSH2 0x507 JUMPI PUSH1 0x1 SWAP4 POP JUMPDEST POP POP DUP1 DUP1 PUSH2 0x514 SWAP1 PUSH2 0x108E JUMP JUMPDEST SWAP2 POP POP PUSH2 0x3C3 JUMP JUMPDEST POP DUP1 PUSH2 0x56A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E646572206D75737420626520636C61696D207369676E65720000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH2 0x577 PUSH1 0x20 DUP13 ADD DUP13 PUSH2 0xD5B JUMP JUMPDEST SWAP1 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x591 JUMPI PUSH2 0x591 PUSH2 0xB7F JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x5BA JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP6 POP PUSH1 0x0 JUMPDEST PUSH2 0x5CD PUSH1 0x20 DUP14 ADD DUP14 PUSH2 0xD5B JUMP JUMPDEST SWAP1 POP DUP2 LT ISZERO PUSH2 0x66B JUMPI PUSH1 0x0 PUSH2 0x5E5 PUSH1 0x20 DUP15 ADD DUP15 PUSH2 0xD5B JUMP JUMPDEST DUP4 DUP2 DUP2 LT PUSH2 0x5F5 JUMPI PUSH2 0x5F5 PUSH2 0x104E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD SWAP1 POP DUP10 DUP10 PUSH1 0x1 DUP4 PUSH2 0x60D SWAP2 SWAP1 PUSH2 0x107B JUMP JUMPDEST DUP2 DUP2 LT PUSH2 0x61C JUMPI PUSH2 0x61C PUSH2 0x104E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x631 SWAP2 SWAP1 PUSH2 0x10A7 JUMP JUMPDEST DUP9 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x643 JUMPI PUSH2 0x643 PUSH2 0x104E JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE POP DUP1 PUSH2 0x663 DUP2 PUSH2 0x108E JUMP JUMPDEST SWAP2 POP POP PUSH2 0x5C0 JUMP JUMPDEST POP POP POP POP POP POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST DUP2 ISZERO DUP1 ISZERO SWAP1 PUSH2 0x68A JUMPI POP DUP1 DUP3 GT ISZERO JUMPDEST PUSH2 0x6D6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F72727570746564206D656D6265727320696E646963657300000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP4 PUSH1 0x0 DUP2 DUP2 LT PUSH2 0x6EB JUMPI PUSH2 0x6EB PUSH2 0x104E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD GT DUP1 ISZERO PUSH2 0x721 JUMPI POP DUP1 DUP4 DUP4 PUSH2 0x708 PUSH1 0x1 DUP3 PUSH2 0x107B JUMP JUMPDEST DUP2 DUP2 LT PUSH2 0x717 JUMPI PUSH2 0x717 PUSH2 0x104E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD GT ISZERO JUMPDEST PUSH2 0x76D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F72727570746564206D656D6265727320696E646963657300000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH1 0x0 JUMPDEST PUSH2 0x77B PUSH1 0x1 DUP5 PUSH2 0x107B JUMP JUMPDEST DUP2 LT ISZERO PUSH2 0x81D JUMPI DUP4 DUP4 PUSH2 0x78F DUP4 PUSH1 0x1 PUSH2 0x10C2 JUMP JUMPDEST DUP2 DUP2 LT PUSH2 0x79E JUMPI PUSH2 0x79E PUSH2 0x104E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD DUP5 DUP5 DUP4 DUP2 DUP2 LT PUSH2 0x7B7 JUMPI PUSH2 0x7B7 PUSH2 0x104E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD LT PUSH2 0x80B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F72727570746564206D656D6265727320696E646963657300000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST DUP1 PUSH2 0x815 DUP2 PUSH2 0x108E JUMP JUMPDEST SWAP2 POP POP PUSH2 0x770 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x831 DUP4 DUP6 PUSH2 0x10C2 JUMP JUMPDEST SWAP1 POP DUP4 DUP2 GT DUP1 ISZERO PUSH2 0x843 JUMPI POP DUP1 DUP6 MLOAD LT ISZERO JUMPDEST PUSH2 0x88F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536C696365206F7574206F6620626F756E647300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 POP DUP3 PUSH1 0x40 DUP4 ADD ADD PUSH1 0x40 MSTORE DUP3 DUP3 MSTORE DUP4 DUP6 ADD DUP3 SUB DUP5 PUSH1 0x20 DUP8 ADD ADD DUP5 DUP2 ADD JUMPDEST DUP1 DUP3 LT ISZERO PUSH2 0x8C8 JUMPI DUP2 MLOAD DUP4 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH2 0x8AF JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x8E2 DUP6 DUP6 PUSH2 0x8F9 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x8EF DUP2 PUSH2 0x93E JUMP JUMPDEST POP SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH1 0x41 SUB PUSH2 0x92F JUMPI PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x0 BYTE PUSH2 0x923 DUP8 DUP3 DUP6 DUP6 PUSH2 0xAA6 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x937 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP PUSH1 0x2 JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x952 JUMPI PUSH2 0x952 PUSH2 0x10D5 JUMP JUMPDEST SUB PUSH2 0x95A JUMPI POP JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x96E JUMPI PUSH2 0x96E PUSH2 0x10D5 JUMP JUMPDEST SUB PUSH2 0x9BB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E61747572650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x9CF JUMPI PUSH2 0x9CF PUSH2 0x10D5 JUMP JUMPDEST SUB PUSH2 0xA1C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265206C656E67746800 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH1 0x3 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0xA30 JUMPI PUSH2 0xA30 PUSH2 0x10D5 JUMP JUMPDEST SUB PUSH2 0xAA3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265202773272076616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7565000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x123 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP4 GT ISZERO PUSH2 0xADD JUMPI POP PUSH1 0x0 SWAP1 POP PUSH1 0x3 PUSH2 0xB61 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP1 DUP5 MSTORE DUP10 SWAP1 MSTORE PUSH1 0xFF DUP9 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP6 SWAP1 MSTORE 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 0xB31 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD SWAP2 POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0xB5A JUMPI PUSH1 0x0 PUSH1 0x1 SWAP3 POP SWAP3 POP POP PUSH2 0xB61 JUMP JUMPDEST SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0xAA3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xBBE JUMPI PUSH2 0xBBE PUSH2 0xB7F JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0xBD8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xBF0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x937 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0xC24 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0xC2F DUP2 PUSH2 0xB6A JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xC4D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 DUP10 ADD SWAP1 PUSH1 0xA0 DUP3 DUP13 SUB SLT ISZERO PUSH2 0xC61 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0xC77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP11 ADD SWAP2 POP DUP11 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xC8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0xC9D JUMPI PUSH2 0xC9D PUSH2 0xB7F JUMP JUMPDEST PUSH2 0xCAF PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND DUP6 ADD PUSH2 0xB95 JUMP JUMPDEST DUP2 DUP2 MSTORE DUP13 DUP6 DUP4 DUP7 ADD ADD GT ISZERO PUSH2 0xCC3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 DUP6 ADD DUP7 DUP4 ADD CALLDATACOPY PUSH1 0x0 SWAP2 DUP2 ADD SWAP1 SWAP5 ADD MSTORE SWAP2 SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD SWAP2 DUP1 DUP4 GT ISZERO PUSH2 0xCF1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP PUSH2 0xCFF DUP10 DUP3 DUP11 ADD PUSH2 0xBC6 JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xD4F JUMPI DUP4 MLOAD PUSH4 0xFFFFFFFF AND DUP4 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0xD2D JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH1 0x1E NOT DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0xD72 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xD8D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP PUSH1 0x5 DUP2 SWAP1 SHL CALLDATASIZE SUB DUP3 SGT ISZERO PUSH2 0x937 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH1 0x1E NOT DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0xDBC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xDD7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x937 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH2 0xE27 JUMPI PUSH2 0xE27 PUSH2 0xDEC JUMP JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0xE3B JUMPI PUSH2 0xE3B PUSH2 0xDEC JUMP JUMPDEST POP MOD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xE52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0xE62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP2 DUP4 MSTORE PUSH1 0x0 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT ISZERO PUSH2 0xE9B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x5 SHL DUP1 DUP4 PUSH1 0x20 DUP8 ADD CALLDATACOPY SWAP4 SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP7 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP8 DUP2 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x40 DUP5 ADD MSTORE DUP7 MLOAD DUP1 PUSH1 0xA0 DUP6 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xEEE JUMPI DUP9 DUP2 ADD DUP4 ADD MLOAD DUP6 DUP3 ADD PUSH1 0xC0 ADD MSTORE DUP3 ADD PUSH2 0xED2 JUMP JUMPDEST POP PUSH1 0x0 PUSH1 0xC0 DUP3 DUP7 ADD ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP5 ADD SWAP2 POP POP PUSH1 0xC0 DUP4 DUP3 SUB ADD PUSH1 0x60 DUP5 ADD MSTORE PUSH2 0xF1E PUSH1 0xC0 DUP3 ADD DUP7 DUP9 PUSH2 0xE69 JUMP JUMPDEST SWAP2 POP POP PUSH2 0xF2F PUSH1 0x80 DUP4 ADD DUP5 ISZERO ISZERO SWAP1 MSTORE JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xF4E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x0 SWAP1 DUP5 PUSH1 0x40 DUP5 ADD DUP4 JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0xF91 JUMPI PUSH4 0xFFFFFFFF PUSH2 0xF7E DUP5 PUSH2 0xF3A JUMP JUMPDEST AND DUP3 MSTORE SWAP2 DUP4 ADD SWAP2 SWAP1 DUP4 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xF68 JUMP JUMPDEST POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xFAF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xFC7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xFDB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0xFED JUMPI PUSH2 0xFED PUSH2 0xB7F JUMP JUMPDEST DUP1 PUSH1 0x5 SHL SWAP2 POP PUSH2 0xFFE DUP5 DUP4 ADD PUSH2 0xB95 JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 DUP4 ADD DUP5 ADD SWAP2 DUP5 DUP2 ADD SWAP1 DUP9 DUP5 GT ISZERO PUSH2 0x1018 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 DUP6 ADD SWAP4 JUMPDEST DUP4 DUP6 LT ISZERO PUSH2 0x1042 JUMPI DUP5 MLOAD SWAP3 POP PUSH2 0x1032 DUP4 PUSH2 0xB6A JUMP JUMPDEST DUP3 DUP3 MSTORE SWAP4 DUP6 ADD SWAP4 SWAP1 DUP6 ADD SWAP1 PUSH2 0x101D JUMP JUMPDEST SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 DUP3 MUL DUP2 ISZERO DUP3 DUP3 DIV DUP5 EQ OR PUSH2 0x8F3 JUMPI PUSH2 0x8F3 PUSH2 0xE02 JUMP JUMPDEST DUP2 DUP2 SUB DUP2 DUP2 GT ISZERO PUSH2 0x8F3 JUMPI PUSH2 0x8F3 PUSH2 0xE02 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP3 ADD PUSH2 0x10A0 JUMPI PUSH2 0x10A0 PUSH2 0xE02 JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x10B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE62 DUP3 PUSH2 0xF3A JUMP JUMPDEST DUP1 DUP3 ADD DUP1 DUP3 GT ISZERO PUSH2 0x8F3 JUMPI PUSH2 0x8F3 PUSH2 0xE02 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP1 0xB0 0xBE 0x1F SWAP5 0x2D CALLDATASIZE BASEFEE PUSH12 0xB0F921C262B1413D6EAB7A8A 0x4E 0xF7 SGT 0xC6 0xD7 0xD3 PUSH13 0x5E9423D564736F6C6343000811 STOP CALLER ",
126
+ "opcodes": "PUSH2 0x1121 PUSH2 0x3A PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH2 0x2D JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x6DCC64F8 EQ PUSH2 0x50 JUMPI DUP1 PUSH4 0x89EF44B0 EQ PUSH2 0x6B JUMPI DUP1 PUSH4 0xF4DF04BE EQ PUSH2 0x73 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x58 PUSH1 0x33 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x58 PUSH1 0x41 DUP2 JUMP JUMPDEST PUSH2 0x86 PUSH2 0x81 CALLDATASIZE PUSH1 0x4 PUSH2 0xC0B JUMP JUMPDEST PUSH2 0x93 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x62 SWAP2 SWAP1 PUSH2 0xD11 JUMP JUMPDEST PUSH1 0x60 PUSH2 0xAB PUSH2 0xA5 PUSH1 0x20 DUP9 ADD DUP9 PUSH2 0xD5B JUMP JUMPDEST DUP5 PUSH2 0x67B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x41 PUSH2 0xBC PUSH1 0x60 DUP10 ADD DUP10 PUSH2 0xDA5 JUMP JUMPDEST PUSH2 0xC7 SWAP3 SWAP2 POP PUSH2 0xE18 JUMP JUMPDEST SWAP1 POP PUSH2 0xD6 PUSH1 0x60 DUP9 ADD DUP9 PUSH2 0xDA5 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SUB PUSH2 0x12C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4E6F207369676E6174757265732070726F766964656400000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x41 PUSH2 0x13B PUSH1 0x60 DUP10 ADD DUP10 PUSH2 0xDA5 JUMP JUMPDEST PUSH2 0x146 SWAP3 SWAP2 POP PUSH2 0xE2C JUMP JUMPDEST ISZERO PUSH2 0x193 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4D616C666F726D6564207369676E617475726573206172726179000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH2 0x1A0 PUSH1 0x80 DUP9 ADD DUP9 PUSH2 0xD5B JUMP JUMPDEST SWAP1 POP DUP2 EQ PUSH2 0x1F0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x556E6578706563746564207369676E61747572657320636F756E740000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH1 0x33 DUP2 LT ISZERO PUSH2 0x241 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6F20666577207369676E6174757265730000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x291 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6F206D616E79207369676E61747572657300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH2 0x2A7 PUSH2 0x2A1 PUSH1 0x80 DUP10 ADD DUP10 PUSH2 0xD5B JUMP JUMPDEST DUP6 PUSH2 0x67B JUMP JUMPDEST PUSH1 0x0 PUSH2 0x344 CHAINID DUP8 DUP10 PUSH2 0x2BC PUSH1 0x20 DUP14 ADD DUP14 PUSH2 0xD5B JUMP JUMPDEST DUP14 PUSH1 0x40 ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x2CF SWAP2 SWAP1 PUSH2 0xE40 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x2E4 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xEB4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE DUP3 DUP3 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD KECCAK256 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP5 DUP4 ADD MSTORE PUSH1 0x3C DUP1 DUP6 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP6 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x5C SWAP1 SWAP4 ADD SWAP1 SWAP2 MSTORE DUP2 MLOAD SWAP2 ADD KECCAK256 SWAP1 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP10 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF7F9A8FA DUP8 DUP8 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x376 SWAP3 SWAP2 SWAP1 PUSH2 0xF53 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x393 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0x3BB SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xF9C JUMP JUMPDEST SWAP1 POP PUSH1 0x60 PUSH1 0x0 DUP1 JUMPDEST DUP6 DUP2 LT ISZERO PUSH2 0x51C JUMPI PUSH1 0x0 PUSH2 0x3DA PUSH1 0x80 DUP15 ADD DUP15 PUSH2 0xD5B JUMP JUMPDEST DUP4 DUP2 DUP2 LT PUSH2 0x3EA JUMPI PUSH2 0x3EA PUSH2 0x104E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD SWAP1 POP PUSH2 0x453 DUP3 PUSH1 0x41 PUSH2 0x403 SWAP2 SWAP1 PUSH2 0x1064 JUMP JUMPDEST PUSH1 0x41 DUP16 DUP1 PUSH1 0x60 ADD SWAP1 PUSH2 0x415 SWAP2 SWAP1 PUSH2 0xDA5 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP PUSH2 0x823 SWAP1 POP JUMP JUMPDEST SWAP4 POP PUSH1 0x0 PUSH2 0x461 DUP8 DUP7 PUSH2 0x8D3 JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP7 PUSH2 0x479 PUSH1 0x1 DUP6 PUSH2 0x107B JUMP JUMPDEST DUP2 MLOAD DUP2 LT PUSH2 0x489 JUMPI PUSH2 0x489 PUSH2 0x104E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x4E7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C6964207369676E6174757265000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST DUP4 ISZERO DUP1 ISZERO PUSH2 0x4FD JUMPI POP CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND EQ JUMPDEST ISZERO PUSH2 0x507 JUMPI PUSH1 0x1 SWAP4 POP JUMPDEST POP POP DUP1 DUP1 PUSH2 0x514 SWAP1 PUSH2 0x108E JUMP JUMPDEST SWAP2 POP POP PUSH2 0x3C3 JUMP JUMPDEST POP DUP1 PUSH2 0x56A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E646572206D75737420626520636C61696D207369676E65720000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH2 0x577 PUSH1 0x20 DUP13 ADD DUP13 PUSH2 0xD5B JUMP JUMPDEST SWAP1 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x591 JUMPI PUSH2 0x591 PUSH2 0xB7F JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x5BA JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP6 POP PUSH1 0x0 JUMPDEST PUSH2 0x5CD PUSH1 0x20 DUP14 ADD DUP14 PUSH2 0xD5B JUMP JUMPDEST SWAP1 POP DUP2 LT ISZERO PUSH2 0x66B JUMPI PUSH1 0x0 PUSH2 0x5E5 PUSH1 0x20 DUP15 ADD DUP15 PUSH2 0xD5B JUMP JUMPDEST DUP4 DUP2 DUP2 LT PUSH2 0x5F5 JUMPI PUSH2 0x5F5 PUSH2 0x104E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD SWAP1 POP DUP10 DUP10 PUSH1 0x1 DUP4 PUSH2 0x60D SWAP2 SWAP1 PUSH2 0x107B JUMP JUMPDEST DUP2 DUP2 LT PUSH2 0x61C JUMPI PUSH2 0x61C PUSH2 0x104E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x631 SWAP2 SWAP1 PUSH2 0x10A7 JUMP JUMPDEST DUP9 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x643 JUMPI PUSH2 0x643 PUSH2 0x104E JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE POP DUP1 PUSH2 0x663 DUP2 PUSH2 0x108E JUMP JUMPDEST SWAP2 POP POP PUSH2 0x5C0 JUMP JUMPDEST POP POP POP POP POP POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST DUP2 ISZERO DUP1 ISZERO SWAP1 PUSH2 0x68A JUMPI POP DUP1 DUP3 GT ISZERO JUMPDEST PUSH2 0x6D6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F72727570746564206D656D6265727320696E646963657300000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP4 PUSH1 0x0 DUP2 DUP2 LT PUSH2 0x6EB JUMPI PUSH2 0x6EB PUSH2 0x104E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD GT DUP1 ISZERO PUSH2 0x721 JUMPI POP DUP1 DUP4 DUP4 PUSH2 0x708 PUSH1 0x1 DUP3 PUSH2 0x107B JUMP JUMPDEST DUP2 DUP2 LT PUSH2 0x717 JUMPI PUSH2 0x717 PUSH2 0x104E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD GT ISZERO JUMPDEST PUSH2 0x76D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F72727570746564206D656D6265727320696E646963657300000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH1 0x0 JUMPDEST PUSH2 0x77B PUSH1 0x1 DUP5 PUSH2 0x107B JUMP JUMPDEST DUP2 LT ISZERO PUSH2 0x81D JUMPI DUP4 DUP4 PUSH2 0x78F DUP4 PUSH1 0x1 PUSH2 0x10C2 JUMP JUMPDEST DUP2 DUP2 LT PUSH2 0x79E JUMPI PUSH2 0x79E PUSH2 0x104E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD DUP5 DUP5 DUP4 DUP2 DUP2 LT PUSH2 0x7B7 JUMPI PUSH2 0x7B7 PUSH2 0x104E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD LT PUSH2 0x80B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F72727570746564206D656D6265727320696E646963657300000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST DUP1 PUSH2 0x815 DUP2 PUSH2 0x108E JUMP JUMPDEST SWAP2 POP POP PUSH2 0x770 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x831 DUP4 DUP6 PUSH2 0x10C2 JUMP JUMPDEST SWAP1 POP DUP4 DUP2 GT DUP1 ISZERO PUSH2 0x843 JUMPI POP DUP1 DUP6 MLOAD LT ISZERO JUMPDEST PUSH2 0x88F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536C696365206F7574206F6620626F756E647300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 POP DUP3 PUSH1 0x40 DUP4 ADD ADD PUSH1 0x40 MSTORE DUP3 DUP3 MSTORE DUP4 DUP6 ADD DUP3 SUB DUP5 PUSH1 0x20 DUP8 ADD ADD DUP5 DUP2 ADD JUMPDEST DUP1 DUP3 LT ISZERO PUSH2 0x8C8 JUMPI DUP2 MLOAD DUP4 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH2 0x8AF JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x8E2 DUP6 DUP6 PUSH2 0x8F9 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x8EF DUP2 PUSH2 0x93E JUMP JUMPDEST POP SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH1 0x41 SUB PUSH2 0x92F JUMPI PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x0 BYTE PUSH2 0x923 DUP8 DUP3 DUP6 DUP6 PUSH2 0xAA6 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x937 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP PUSH1 0x2 JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x952 JUMPI PUSH2 0x952 PUSH2 0x10D5 JUMP JUMPDEST SUB PUSH2 0x95A JUMPI POP JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x96E JUMPI PUSH2 0x96E PUSH2 0x10D5 JUMP JUMPDEST SUB PUSH2 0x9BB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E61747572650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x9CF JUMPI PUSH2 0x9CF PUSH2 0x10D5 JUMP JUMPDEST SUB PUSH2 0xA1C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265206C656E67746800 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH1 0x3 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0xA30 JUMPI PUSH2 0xA30 PUSH2 0x10D5 JUMP JUMPDEST SUB PUSH2 0xAA3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265202773272076616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7565000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x123 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP4 GT ISZERO PUSH2 0xADD JUMPI POP PUSH1 0x0 SWAP1 POP PUSH1 0x3 PUSH2 0xB61 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP1 DUP5 MSTORE DUP10 SWAP1 MSTORE PUSH1 0xFF DUP9 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP6 SWAP1 MSTORE 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 0xB31 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD SWAP2 POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0xB5A JUMPI PUSH1 0x0 PUSH1 0x1 SWAP3 POP SWAP3 POP POP PUSH2 0xB61 JUMP JUMPDEST SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0xAA3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xBBE JUMPI PUSH2 0xBBE PUSH2 0xB7F JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0xBD8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xBF0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x937 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0xC24 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0xC2F DUP2 PUSH2 0xB6A JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xC4D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 DUP10 ADD SWAP1 PUSH1 0xA0 DUP3 DUP13 SUB SLT ISZERO PUSH2 0xC61 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0xC77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP11 ADD SWAP2 POP DUP11 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xC8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0xC9D JUMPI PUSH2 0xC9D PUSH2 0xB7F JUMP JUMPDEST PUSH2 0xCAF PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND DUP6 ADD PUSH2 0xB95 JUMP JUMPDEST DUP2 DUP2 MSTORE DUP13 DUP6 DUP4 DUP7 ADD ADD GT ISZERO PUSH2 0xCC3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 DUP6 ADD DUP7 DUP4 ADD CALLDATACOPY PUSH1 0x0 SWAP2 DUP2 ADD SWAP1 SWAP5 ADD MSTORE SWAP2 SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD SWAP2 DUP1 DUP4 GT ISZERO PUSH2 0xCF1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP PUSH2 0xCFF DUP10 DUP3 DUP11 ADD PUSH2 0xBC6 JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xD4F JUMPI DUP4 MLOAD PUSH4 0xFFFFFFFF AND DUP4 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0xD2D JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH1 0x1E NOT DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0xD72 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xD8D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP PUSH1 0x5 DUP2 SWAP1 SHL CALLDATASIZE SUB DUP3 SGT ISZERO PUSH2 0x937 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH1 0x1E NOT DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0xDBC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xDD7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x937 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH2 0xE27 JUMPI PUSH2 0xE27 PUSH2 0xDEC JUMP JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0xE3B JUMPI PUSH2 0xE3B PUSH2 0xDEC JUMP JUMPDEST POP MOD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xE52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0xE62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP2 DUP4 MSTORE PUSH1 0x0 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT ISZERO PUSH2 0xE9B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x5 SHL DUP1 DUP4 PUSH1 0x20 DUP8 ADD CALLDATACOPY SWAP4 SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP7 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP8 DUP2 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x40 DUP5 ADD MSTORE DUP7 MLOAD DUP1 PUSH1 0xA0 DUP6 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xEEE JUMPI DUP9 DUP2 ADD DUP4 ADD MLOAD DUP6 DUP3 ADD PUSH1 0xC0 ADD MSTORE DUP3 ADD PUSH2 0xED2 JUMP JUMPDEST POP PUSH1 0x0 PUSH1 0xC0 DUP3 DUP7 ADD ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP5 ADD SWAP2 POP POP PUSH1 0xC0 DUP4 DUP3 SUB ADD PUSH1 0x60 DUP5 ADD MSTORE PUSH2 0xF1E PUSH1 0xC0 DUP3 ADD DUP7 DUP9 PUSH2 0xE69 JUMP JUMPDEST SWAP2 POP POP PUSH2 0xF2F PUSH1 0x80 DUP4 ADD DUP5 ISZERO ISZERO SWAP1 MSTORE JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xF4E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x0 SWAP1 DUP5 PUSH1 0x40 DUP5 ADD DUP4 JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0xF91 JUMPI PUSH4 0xFFFFFFFF PUSH2 0xF7E DUP5 PUSH2 0xF3A JUMP JUMPDEST AND DUP3 MSTORE SWAP2 DUP4 ADD SWAP2 SWAP1 DUP4 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xF68 JUMP JUMPDEST POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xFAF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xFC7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xFDB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0xFED JUMPI PUSH2 0xFED PUSH2 0xB7F JUMP JUMPDEST DUP1 PUSH1 0x5 SHL SWAP2 POP PUSH2 0xFFE DUP5 DUP4 ADD PUSH2 0xB95 JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 DUP4 ADD DUP5 ADD SWAP2 DUP5 DUP2 ADD SWAP1 DUP9 DUP5 GT ISZERO PUSH2 0x1018 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 DUP6 ADD SWAP4 JUMPDEST DUP4 DUP6 LT ISZERO PUSH2 0x1042 JUMPI DUP5 MLOAD SWAP3 POP PUSH2 0x1032 DUP4 PUSH2 0xB6A JUMP JUMPDEST DUP3 DUP3 MSTORE SWAP4 DUP6 ADD SWAP4 SWAP1 DUP6 ADD SWAP1 PUSH2 0x101D JUMP JUMPDEST SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 DUP3 MUL DUP2 ISZERO DUP3 DUP3 DIV DUP5 EQ OR PUSH2 0x8F3 JUMPI PUSH2 0x8F3 PUSH2 0xE02 JUMP JUMPDEST DUP2 DUP2 SUB DUP2 DUP2 GT ISZERO PUSH2 0x8F3 JUMPI PUSH2 0x8F3 PUSH2 0xE02 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP3 ADD PUSH2 0x10A0 JUMPI PUSH2 0x10A0 PUSH2 0xE02 JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x10B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE62 DUP3 PUSH2 0xF3A JUMP JUMPDEST DUP1 DUP3 ADD DUP1 DUP3 GT ISZERO PUSH2 0x8F3 JUMPI PUSH2 0x8F3 PUSH2 0xE02 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 LOG4 0xEB 0xA8 SWAP4 PUSH27 0x99704F1D81BEFED62E38BBBE2BC00EE2CEF4966DB01FC39536A979 PUSH5 0x736F6C6343 STOP ADDMOD GT STOP CALLER ",
127
127
  "sourceMap": "2180:7415:11:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;2180:7415:11;;;;;;;;;;;;;;;;;"
128
128
  },
129
129
  "deployedBytecode": {
130
130
  "functionDebugData": {
131
- "@_throwError_14386": {
131
+ "@_throwError_14390": {
132
132
  "entryPoint": 2366,
133
- "id": 14386,
133
+ "id": 14390,
134
134
  "parameterSlots": 1,
135
135
  "returnSlots": 0
136
136
  },
137
- "@groupThreshold_7820": {
137
+ "@groupThreshold_7822": {
138
138
  "entryPoint": null,
139
- "id": 7820,
139
+ "id": 7822,
140
140
  "parameterSlots": 0,
141
141
  "returnSlots": 0
142
142
  },
143
- "@recover_14459": {
143
+ "@recover_14463": {
144
144
  "entryPoint": 2259,
145
- "id": 14459,
145
+ "id": 14463,
146
146
  "parameterSlots": 2,
147
147
  "returnSlots": 1
148
148
  },
149
- "@signatureByteSize_7824": {
149
+ "@signatureByteSize_7826": {
150
150
  "entryPoint": null,
151
- "id": 7824,
151
+ "id": 7826,
152
152
  "parameterSlots": 0,
153
153
  "returnSlots": 0
154
154
  },
155
- "@slice_8913": {
155
+ "@slice_8915": {
156
156
  "entryPoint": 2083,
157
- "id": 8913,
157
+ "id": 8915,
158
158
  "parameterSlots": 3,
159
159
  "returnSlots": 1
160
160
  },
161
- "@toEthSignedMessageHash_14650": {
161
+ "@toEthSignedMessageHash_14654": {
162
162
  "entryPoint": null,
163
- "id": 14650,
163
+ "id": 14654,
164
164
  "parameterSlots": 1,
165
165
  "returnSlots": 1
166
166
  },
167
- "@tryRecover_14432": {
167
+ "@tryRecover_14436": {
168
168
  "entryPoint": 2297,
169
- "id": 14432,
169
+ "id": 14436,
170
170
  "parameterSlots": 2,
171
171
  "returnSlots": 2
172
172
  },
173
- "@tryRecover_14600": {
173
+ "@tryRecover_14604": {
174
174
  "entryPoint": 2726,
175
- "id": 14600,
175
+ "id": 14604,
176
176
  "parameterSlots": 4,
177
177
  "returnSlots": 2
178
178
  },
179
- "@validateMembersIndices_8124": {
179
+ "@validateMembersIndices_8126": {
180
180
  "entryPoint": 1659,
181
- "id": 8124,
181
+ "id": 8126,
182
182
  "parameterSlots": 3,
183
183
  "returnSlots": 0
184
184
  },
185
- "@verifyClaim_8055": {
185
+ "@verifyClaim_8057": {
186
186
  "entryPoint": 147,
187
- "id": 8055,
187
+ "id": 8057,
188
188
  "parameterSlots": 6,
189
189
  "returnSlots": 1
190
190
  },
@@ -206,7 +206,7 @@
206
206
  "parameterSlots": 2,
207
207
  "returnSlots": 1
208
208
  },
209
- "abi_decode_tuple_t_contract$_SortitionPool_$11053t_struct$_Claim_$7816_calldata_ptrt_bytes_memory_ptrt_uint256t_array$_t_uint32_$dyn_calldata_ptr": {
209
+ "abi_decode_tuple_t_contract$_SortitionPool_$11057t_struct$_Claim_$7818_calldata_ptrt_bytes_memory_ptrt_uint256t_array$_t_uint32_$dyn_calldata_ptr": {
210
210
  "entryPoint": 3083,
211
211
  "id": null,
212
212
  "parameterSlots": 2,
@@ -2651,7 +2651,7 @@
2651
2651
  }
2652
2652
  ]
2653
2653
  },
2654
- "name": "abi_decode_tuple_t_contract$_SortitionPool_$11053t_struct$_Claim_$7816_calldata_ptrt_bytes_memory_ptrt_uint256t_array$_t_uint32_$dyn_calldata_ptr",
2654
+ "name": "abi_decode_tuple_t_contract$_SortitionPool_$11057t_struct$_Claim_$7818_calldata_ptrt_bytes_memory_ptrt_uint256t_array$_t_uint32_$dyn_calldata_ptr",
2655
2655
  "nodeType": "YulFunctionDefinition",
2656
2656
  "parameters": [
2657
2657
  {
@@ -10739,7 +10739,7 @@
10739
10739
  }
10740
10740
  ]
10741
10741
  },
10742
- "contents": "{\n { }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_library_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function validator_revert_contract_SortitionPool(value)\n {\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function panic_error_0x41()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function allocate_memory(size) -> memPtr\n {\n memPtr := mload(64)\n let newFreePtr := add(memPtr, and(add(size, 31), not(31)))\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n }\n function abi_decode_array_uint32_dyn_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, shl(5, length)), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_contract$_SortitionPool_$11053t_struct$_Claim_$7816_calldata_ptrt_bytes_memory_ptrt_uint256t_array$_t_uint32_$dyn_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5\n {\n if slt(sub(dataEnd, headStart), 160) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_contract_SortitionPool(value)\n value0 := value\n let _1 := 32\n let offset := calldataload(add(headStart, _1))\n let _2 := 0xffffffffffffffff\n if gt(offset, _2) { revert(0, 0) }\n let _3 := add(headStart, offset)\n if slt(sub(dataEnd, _3), 160) { revert(0, 0) }\n value1 := _3\n let offset_1 := calldataload(add(headStart, 64))\n if gt(offset_1, _2) { revert(0, 0) }\n let _4 := add(headStart, offset_1)\n if iszero(slt(add(_4, 0x1f), dataEnd)) { revert(0, 0) }\n let _5 := calldataload(_4)\n if gt(_5, _2) { panic_error_0x41() }\n let array := allocate_memory(add(and(add(_5, 0x1f), not(31)), _1))\n mstore(array, _5)\n if gt(add(add(_4, _5), _1), dataEnd) { revert(0, 0) }\n calldatacopy(add(array, _1), add(_4, _1), _5)\n mstore(add(add(array, _5), _1), 0)\n value2 := array\n value3 := calldataload(add(headStart, 96))\n let offset_2 := calldataload(add(headStart, 128))\n if gt(offset_2, _2) { revert(0, 0) }\n let value4_1, value5_1 := abi_decode_array_uint32_dyn_calldata(add(headStart, offset_2), dataEnd)\n value4 := value4_1\n value5 := value5_1\n }\n function abi_encode_tuple_t_array$_t_uint32_$dyn_memory_ptr__to_t_array$_t_uint32_$dyn_memory_ptr__fromStack_library_reversed(headStart, value0) -> tail\n {\n let _1 := 32\n let tail_1 := add(headStart, _1)\n mstore(headStart, _1)\n let pos := tail_1\n let length := mload(value0)\n mstore(tail_1, length)\n pos := add(headStart, 64)\n let srcPtr := add(value0, _1)\n let i := 0\n for { } lt(i, length) { i := add(i, 1) }\n {\n mstore(pos, and(mload(srcPtr), 0xffffffff))\n pos := add(pos, _1)\n srcPtr := add(srcPtr, _1)\n }\n tail := pos\n }\n function access_calldata_tail_t_array$_t_uint256_$dyn_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), not(30)))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), shl(5, length))) { revert(0, 0) }\n }\n function access_calldata_tail_t_bytes_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), not(30)))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function panic_error_0x12()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x12)\n revert(0, 0x24)\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) { panic_error_0x12() }\n r := div(x, y)\n }\n function abi_encode_tuple_t_stringliteral_5c1bc66b60b0cd10a1c2a228b13a32899bd977c8518209456e20402447234666__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 22)\n mstore(add(headStart, 64), \"No signatures provided\")\n tail := add(headStart, 96)\n }\n function mod_t_uint256(x, y) -> r\n {\n if iszero(y) { panic_error_0x12() }\n r := mod(x, y)\n }\n function abi_encode_tuple_t_stringliteral_b494411b6394224aafa8969e002615691a12bcba15c12d41e9beb5017d3cf022__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 26)\n mstore(add(headStart, 64), \"Malformed signatures array\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_df140fef1d2f759ef940b77794e3f57ebe9644600d9accd12cea0c0d870e9294__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 27)\n mstore(add(headStart, 64), \"Unexpected signatures count\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_373db3a66f802b1b7b1c9047a3cf950dc599a8c346f67c6e918f5172e1836b7a__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 18)\n mstore(add(headStart, 64), \"Too few signatures\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_fb7b3ea196d5ad1f394be21a8b7dfef19f94f940f861b602699668390d39b2ba__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 19)\n mstore(add(headStart, 64), \"Too many signatures\")\n tail := add(headStart, 96)\n }\n function abi_decode_tuple_t_bool(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, iszero(iszero(value)))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_array_uint256_dyn_calldata(start, length, pos) -> end\n {\n mstore(pos, length)\n if gt(length, 0x07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) { revert(0, 0) }\n let length_1 := shl(5, length)\n calldatacopy(add(pos, 0x20), start, length_1)\n end := add(add(pos, length_1), 0x20)\n }\n function abi_encode_bool(value, pos)\n {\n mstore(pos, iszero(iszero(value)))\n }\n function abi_encode_tuple_t_uint256_t_uint256_t_bytes_memory_ptr_t_array$_t_uint256_$dyn_calldata_ptr_t_bool__to_t_uint256_t_uint256_t_bytes_memory_ptr_t_array$_t_uint256_$dyn_memory_ptr_t_bool__fromStack_reversed(headStart, value5, value4, value3, value2, value1, value0) -> tail\n {\n mstore(headStart, value0)\n let _1 := 32\n mstore(add(headStart, _1), value1)\n mstore(add(headStart, 64), 160)\n let length := mload(value2)\n mstore(add(headStart, 160), length)\n let i := 0\n for { } lt(i, length) { i := add(i, _1) }\n {\n mstore(add(add(headStart, i), 192), mload(add(add(value2, i), _1)))\n }\n mstore(add(add(headStart, length), 192), 0)\n let _2 := add(headStart, and(add(length, 31), not(31)))\n mstore(add(headStart, 96), add(sub(_2, headStart), 192))\n tail := abi_encode_array_uint256_dyn_calldata(value3, value4, add(_2, 192))\n abi_encode_bool(value5, add(headStart, 128))\n }\n function abi_decode_uint32(offset) -> value\n {\n value := calldataload(offset)\n if iszero(eq(value, and(value, 0xffffffff))) { revert(0, 0) }\n }\n function abi_encode_tuple_t_array$_t_uint32_$dyn_calldata_ptr__to_t_array$_t_uint32_$dyn_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n let _1 := 32\n let tail_1 := add(headStart, _1)\n mstore(headStart, _1)\n let pos := tail_1\n mstore(tail_1, value1)\n pos := add(headStart, 64)\n let srcPtr := value0\n let i := 0\n for { } lt(i, value1) { i := add(i, 1) }\n {\n mstore(pos, and(abi_decode_uint32(srcPtr), 0xffffffff))\n pos := add(pos, _1)\n srcPtr := add(srcPtr, _1)\n }\n tail := pos\n }\n function abi_decode_tuple_t_array$_t_address_$dyn_memory_ptr_fromMemory(headStart, dataEnd) -> value0\n {\n let _1 := 32\n if slt(sub(dataEnd, headStart), _1) { revert(0, 0) }\n let offset := mload(headStart)\n let _2 := 0xffffffffffffffff\n if gt(offset, _2) { revert(0, 0) }\n let _3 := add(headStart, offset)\n if iszero(slt(add(_3, 0x1f), dataEnd)) { revert(0, 0) }\n let _4 := mload(_3)\n if gt(_4, _2) { panic_error_0x41() }\n let _5 := shl(5, _4)\n let dst := allocate_memory(add(_5, _1))\n let dst_1 := dst\n mstore(dst, _4)\n dst := add(dst, _1)\n let srcEnd := add(add(_3, _5), _1)\n if gt(srcEnd, dataEnd) { revert(0, 0) }\n let src := add(_3, _1)\n for { } lt(src, srcEnd) { src := add(src, _1) }\n {\n let value := mload(src)\n validator_revert_contract_SortitionPool(value)\n mstore(dst, value)\n dst := add(dst, _1)\n }\n value0 := dst_1\n }\n function panic_error_0x32()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x32)\n revert(0, 0x24)\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 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_stringliteral_4f2d7dfcb27c0aafa13ae8c400de482c7832204d194018b6e45bd2bf244c74e7__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 17)\n mstore(add(headStart, 64), \"Invalid signature\")\n tail := add(headStart, 96)\n }\n function increment_t_uint256(value) -> ret\n {\n if eq(value, not(0)) { panic_error_0x11() }\n ret := add(value, 1)\n }\n function abi_encode_tuple_t_stringliteral_6d609cefd884be3cb723afe8867ba6fd72c88126474090e7a298eebbc3bc6561__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 27)\n mstore(add(headStart, 64), \"Sender must be claim signer\")\n tail := add(headStart, 96)\n }\n function abi_decode_tuple_t_uint32(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := abi_decode_uint32(headStart)\n }\n function abi_encode_tuple_t_stringliteral_bb4a6f887291c8f7ecd750c39bcd7b919b23eef2379aa8aead0f632d95e240b7__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 25)\n mstore(add(headStart, 64), \"Corrupted members indices\")\n tail := add(headStart, 96)\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 abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n mstore(pos, 0x19457468657265756d205369676e6564204d6573736167653a0a333200000000)\n mstore(add(pos, 28), value0)\n end := add(pos, 60)\n }\n function abi_encode_tuple_t_stringliteral_f1c269d7eab972b2fd4d87a15c317e920493e7eea923de7e48c0ebcb7f611fa9__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 19)\n mstore(add(headStart, 64), \"Slice out of bounds\")\n tail := add(headStart, 96)\n }\n function panic_error_0x21()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x21)\n revert(0, 0x24)\n }\n function abi_encode_tuple_t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 24)\n mstore(add(headStart, 64), \"ECDSA: invalid signature\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 31)\n mstore(add(headStart, 64), \"ECDSA: invalid signature length\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 34)\n mstore(add(headStart, 64), \"ECDSA: invalid signature 's' val\")\n mstore(add(headStart, 96), \"ue\")\n tail := add(headStart, 128)\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}",
10742
+ "contents": "{\n { }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_library_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function validator_revert_contract_SortitionPool(value)\n {\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function panic_error_0x41()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function allocate_memory(size) -> memPtr\n {\n memPtr := mload(64)\n let newFreePtr := add(memPtr, and(add(size, 31), not(31)))\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n }\n function abi_decode_array_uint32_dyn_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, shl(5, length)), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_contract$_SortitionPool_$11057t_struct$_Claim_$7818_calldata_ptrt_bytes_memory_ptrt_uint256t_array$_t_uint32_$dyn_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5\n {\n if slt(sub(dataEnd, headStart), 160) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_contract_SortitionPool(value)\n value0 := value\n let _1 := 32\n let offset := calldataload(add(headStart, _1))\n let _2 := 0xffffffffffffffff\n if gt(offset, _2) { revert(0, 0) }\n let _3 := add(headStart, offset)\n if slt(sub(dataEnd, _3), 160) { revert(0, 0) }\n value1 := _3\n let offset_1 := calldataload(add(headStart, 64))\n if gt(offset_1, _2) { revert(0, 0) }\n let _4 := add(headStart, offset_1)\n if iszero(slt(add(_4, 0x1f), dataEnd)) { revert(0, 0) }\n let _5 := calldataload(_4)\n if gt(_5, _2) { panic_error_0x41() }\n let array := allocate_memory(add(and(add(_5, 0x1f), not(31)), _1))\n mstore(array, _5)\n if gt(add(add(_4, _5), _1), dataEnd) { revert(0, 0) }\n calldatacopy(add(array, _1), add(_4, _1), _5)\n mstore(add(add(array, _5), _1), 0)\n value2 := array\n value3 := calldataload(add(headStart, 96))\n let offset_2 := calldataload(add(headStart, 128))\n if gt(offset_2, _2) { revert(0, 0) }\n let value4_1, value5_1 := abi_decode_array_uint32_dyn_calldata(add(headStart, offset_2), dataEnd)\n value4 := value4_1\n value5 := value5_1\n }\n function abi_encode_tuple_t_array$_t_uint32_$dyn_memory_ptr__to_t_array$_t_uint32_$dyn_memory_ptr__fromStack_library_reversed(headStart, value0) -> tail\n {\n let _1 := 32\n let tail_1 := add(headStart, _1)\n mstore(headStart, _1)\n let pos := tail_1\n let length := mload(value0)\n mstore(tail_1, length)\n pos := add(headStart, 64)\n let srcPtr := add(value0, _1)\n let i := 0\n for { } lt(i, length) { i := add(i, 1) }\n {\n mstore(pos, and(mload(srcPtr), 0xffffffff))\n pos := add(pos, _1)\n srcPtr := add(srcPtr, _1)\n }\n tail := pos\n }\n function access_calldata_tail_t_array$_t_uint256_$dyn_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), not(30)))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), shl(5, length))) { revert(0, 0) }\n }\n function access_calldata_tail_t_bytes_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), not(30)))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function panic_error_0x12()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x12)\n revert(0, 0x24)\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) { panic_error_0x12() }\n r := div(x, y)\n }\n function abi_encode_tuple_t_stringliteral_5c1bc66b60b0cd10a1c2a228b13a32899bd977c8518209456e20402447234666__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 22)\n mstore(add(headStart, 64), \"No signatures provided\")\n tail := add(headStart, 96)\n }\n function mod_t_uint256(x, y) -> r\n {\n if iszero(y) { panic_error_0x12() }\n r := mod(x, y)\n }\n function abi_encode_tuple_t_stringliteral_b494411b6394224aafa8969e002615691a12bcba15c12d41e9beb5017d3cf022__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 26)\n mstore(add(headStart, 64), \"Malformed signatures array\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_df140fef1d2f759ef940b77794e3f57ebe9644600d9accd12cea0c0d870e9294__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 27)\n mstore(add(headStart, 64), \"Unexpected signatures count\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_373db3a66f802b1b7b1c9047a3cf950dc599a8c346f67c6e918f5172e1836b7a__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 18)\n mstore(add(headStart, 64), \"Too few signatures\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_fb7b3ea196d5ad1f394be21a8b7dfef19f94f940f861b602699668390d39b2ba__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 19)\n mstore(add(headStart, 64), \"Too many signatures\")\n tail := add(headStart, 96)\n }\n function abi_decode_tuple_t_bool(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, iszero(iszero(value)))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_array_uint256_dyn_calldata(start, length, pos) -> end\n {\n mstore(pos, length)\n if gt(length, 0x07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) { revert(0, 0) }\n let length_1 := shl(5, length)\n calldatacopy(add(pos, 0x20), start, length_1)\n end := add(add(pos, length_1), 0x20)\n }\n function abi_encode_bool(value, pos)\n {\n mstore(pos, iszero(iszero(value)))\n }\n function abi_encode_tuple_t_uint256_t_uint256_t_bytes_memory_ptr_t_array$_t_uint256_$dyn_calldata_ptr_t_bool__to_t_uint256_t_uint256_t_bytes_memory_ptr_t_array$_t_uint256_$dyn_memory_ptr_t_bool__fromStack_reversed(headStart, value5, value4, value3, value2, value1, value0) -> tail\n {\n mstore(headStart, value0)\n let _1 := 32\n mstore(add(headStart, _1), value1)\n mstore(add(headStart, 64), 160)\n let length := mload(value2)\n mstore(add(headStart, 160), length)\n let i := 0\n for { } lt(i, length) { i := add(i, _1) }\n {\n mstore(add(add(headStart, i), 192), mload(add(add(value2, i), _1)))\n }\n mstore(add(add(headStart, length), 192), 0)\n let _2 := add(headStart, and(add(length, 31), not(31)))\n mstore(add(headStart, 96), add(sub(_2, headStart), 192))\n tail := abi_encode_array_uint256_dyn_calldata(value3, value4, add(_2, 192))\n abi_encode_bool(value5, add(headStart, 128))\n }\n function abi_decode_uint32(offset) -> value\n {\n value := calldataload(offset)\n if iszero(eq(value, and(value, 0xffffffff))) { revert(0, 0) }\n }\n function abi_encode_tuple_t_array$_t_uint32_$dyn_calldata_ptr__to_t_array$_t_uint32_$dyn_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n let _1 := 32\n let tail_1 := add(headStart, _1)\n mstore(headStart, _1)\n let pos := tail_1\n mstore(tail_1, value1)\n pos := add(headStart, 64)\n let srcPtr := value0\n let i := 0\n for { } lt(i, value1) { i := add(i, 1) }\n {\n mstore(pos, and(abi_decode_uint32(srcPtr), 0xffffffff))\n pos := add(pos, _1)\n srcPtr := add(srcPtr, _1)\n }\n tail := pos\n }\n function abi_decode_tuple_t_array$_t_address_$dyn_memory_ptr_fromMemory(headStart, dataEnd) -> value0\n {\n let _1 := 32\n if slt(sub(dataEnd, headStart), _1) { revert(0, 0) }\n let offset := mload(headStart)\n let _2 := 0xffffffffffffffff\n if gt(offset, _2) { revert(0, 0) }\n let _3 := add(headStart, offset)\n if iszero(slt(add(_3, 0x1f), dataEnd)) { revert(0, 0) }\n let _4 := mload(_3)\n if gt(_4, _2) { panic_error_0x41() }\n let _5 := shl(5, _4)\n let dst := allocate_memory(add(_5, _1))\n let dst_1 := dst\n mstore(dst, _4)\n dst := add(dst, _1)\n let srcEnd := add(add(_3, _5), _1)\n if gt(srcEnd, dataEnd) { revert(0, 0) }\n let src := add(_3, _1)\n for { } lt(src, srcEnd) { src := add(src, _1) }\n {\n let value := mload(src)\n validator_revert_contract_SortitionPool(value)\n mstore(dst, value)\n dst := add(dst, _1)\n }\n value0 := dst_1\n }\n function panic_error_0x32()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x32)\n revert(0, 0x24)\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 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_stringliteral_4f2d7dfcb27c0aafa13ae8c400de482c7832204d194018b6e45bd2bf244c74e7__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 17)\n mstore(add(headStart, 64), \"Invalid signature\")\n tail := add(headStart, 96)\n }\n function increment_t_uint256(value) -> ret\n {\n if eq(value, not(0)) { panic_error_0x11() }\n ret := add(value, 1)\n }\n function abi_encode_tuple_t_stringliteral_6d609cefd884be3cb723afe8867ba6fd72c88126474090e7a298eebbc3bc6561__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 27)\n mstore(add(headStart, 64), \"Sender must be claim signer\")\n tail := add(headStart, 96)\n }\n function abi_decode_tuple_t_uint32(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := abi_decode_uint32(headStart)\n }\n function abi_encode_tuple_t_stringliteral_bb4a6f887291c8f7ecd750c39bcd7b919b23eef2379aa8aead0f632d95e240b7__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 25)\n mstore(add(headStart, 64), \"Corrupted members indices\")\n tail := add(headStart, 96)\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 abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n mstore(pos, 0x19457468657265756d205369676e6564204d6573736167653a0a333200000000)\n mstore(add(pos, 28), value0)\n end := add(pos, 60)\n }\n function abi_encode_tuple_t_stringliteral_f1c269d7eab972b2fd4d87a15c317e920493e7eea923de7e48c0ebcb7f611fa9__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 19)\n mstore(add(headStart, 64), \"Slice out of bounds\")\n tail := add(headStart, 96)\n }\n function panic_error_0x21()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x21)\n revert(0, 0x24)\n }\n function abi_encode_tuple_t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 24)\n mstore(add(headStart, 64), \"ECDSA: invalid signature\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 31)\n mstore(add(headStart, 64), \"ECDSA: invalid signature length\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 34)\n mstore(add(headStart, 64), \"ECDSA: invalid signature 's' val\")\n mstore(add(headStart, 96), \"ue\")\n tail := add(headStart, 128)\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}",
10743
10743
  "id": 123,
10744
10744
  "language": "Yul",
10745
10745
  "name": "#utility.yul"
@@ -10747,7 +10747,7 @@
10747
10747
  ],
10748
10748
  "immutableReferences": {},
10749
10749
  "linkReferences": {},
10750
- "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x6DCC64F8 EQ PUSH2 0x50 JUMPI DUP1 PUSH4 0x89EF44B0 EQ PUSH2 0x6B JUMPI DUP1 PUSH4 0xF4DF04BE EQ PUSH2 0x73 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x58 PUSH1 0x33 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x58 PUSH1 0x41 DUP2 JUMP JUMPDEST PUSH2 0x86 PUSH2 0x81 CALLDATASIZE PUSH1 0x4 PUSH2 0xC0B JUMP JUMPDEST PUSH2 0x93 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x62 SWAP2 SWAP1 PUSH2 0xD11 JUMP JUMPDEST PUSH1 0x60 PUSH2 0xAB PUSH2 0xA5 PUSH1 0x20 DUP9 ADD DUP9 PUSH2 0xD5B JUMP JUMPDEST DUP5 PUSH2 0x67B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x41 PUSH2 0xBC PUSH1 0x60 DUP10 ADD DUP10 PUSH2 0xDA5 JUMP JUMPDEST PUSH2 0xC7 SWAP3 SWAP2 POP PUSH2 0xE18 JUMP JUMPDEST SWAP1 POP PUSH2 0xD6 PUSH1 0x60 DUP9 ADD DUP9 PUSH2 0xDA5 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SUB PUSH2 0x12C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4E6F207369676E6174757265732070726F766964656400000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x41 PUSH2 0x13B PUSH1 0x60 DUP10 ADD DUP10 PUSH2 0xDA5 JUMP JUMPDEST PUSH2 0x146 SWAP3 SWAP2 POP PUSH2 0xE2C JUMP JUMPDEST ISZERO PUSH2 0x193 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4D616C666F726D6564207369676E617475726573206172726179000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH2 0x1A0 PUSH1 0x80 DUP9 ADD DUP9 PUSH2 0xD5B JUMP JUMPDEST SWAP1 POP DUP2 EQ PUSH2 0x1F0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x556E6578706563746564207369676E61747572657320636F756E740000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH1 0x33 DUP2 LT ISZERO PUSH2 0x241 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6F20666577207369676E6174757265730000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x291 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6F206D616E79207369676E61747572657300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH2 0x2A7 PUSH2 0x2A1 PUSH1 0x80 DUP10 ADD DUP10 PUSH2 0xD5B JUMP JUMPDEST DUP6 PUSH2 0x67B JUMP JUMPDEST PUSH1 0x0 PUSH2 0x344 CHAINID DUP8 DUP10 PUSH2 0x2BC PUSH1 0x20 DUP14 ADD DUP14 PUSH2 0xD5B JUMP JUMPDEST DUP14 PUSH1 0x40 ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x2CF SWAP2 SWAP1 PUSH2 0xE40 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x2E4 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xEB4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE DUP3 DUP3 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD KECCAK256 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP5 DUP4 ADD MSTORE PUSH1 0x3C DUP1 DUP6 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP6 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x5C SWAP1 SWAP4 ADD SWAP1 SWAP2 MSTORE DUP2 MLOAD SWAP2 ADD KECCAK256 SWAP1 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP10 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF7F9A8FA DUP8 DUP8 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x376 SWAP3 SWAP2 SWAP1 PUSH2 0xF53 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x393 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0x3BB SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xF9C JUMP JUMPDEST SWAP1 POP PUSH1 0x60 PUSH1 0x0 DUP1 JUMPDEST DUP6 DUP2 LT ISZERO PUSH2 0x51C JUMPI PUSH1 0x0 PUSH2 0x3DA PUSH1 0x80 DUP15 ADD DUP15 PUSH2 0xD5B JUMP JUMPDEST DUP4 DUP2 DUP2 LT PUSH2 0x3EA JUMPI PUSH2 0x3EA PUSH2 0x104E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD SWAP1 POP PUSH2 0x453 DUP3 PUSH1 0x41 PUSH2 0x403 SWAP2 SWAP1 PUSH2 0x1064 JUMP JUMPDEST PUSH1 0x41 DUP16 DUP1 PUSH1 0x60 ADD SWAP1 PUSH2 0x415 SWAP2 SWAP1 PUSH2 0xDA5 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP PUSH2 0x823 SWAP1 POP JUMP JUMPDEST SWAP4 POP PUSH1 0x0 PUSH2 0x461 DUP8 DUP7 PUSH2 0x8D3 JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP7 PUSH2 0x479 PUSH1 0x1 DUP6 PUSH2 0x107B JUMP JUMPDEST DUP2 MLOAD DUP2 LT PUSH2 0x489 JUMPI PUSH2 0x489 PUSH2 0x104E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x4E7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C6964207369676E6174757265000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST DUP4 ISZERO DUP1 ISZERO PUSH2 0x4FD JUMPI POP CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND EQ JUMPDEST ISZERO PUSH2 0x507 JUMPI PUSH1 0x1 SWAP4 POP JUMPDEST POP POP DUP1 DUP1 PUSH2 0x514 SWAP1 PUSH2 0x108E JUMP JUMPDEST SWAP2 POP POP PUSH2 0x3C3 JUMP JUMPDEST POP DUP1 PUSH2 0x56A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E646572206D75737420626520636C61696D207369676E65720000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH2 0x577 PUSH1 0x20 DUP13 ADD DUP13 PUSH2 0xD5B JUMP JUMPDEST SWAP1 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x591 JUMPI PUSH2 0x591 PUSH2 0xB7F JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x5BA JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP6 POP PUSH1 0x0 JUMPDEST PUSH2 0x5CD PUSH1 0x20 DUP14 ADD DUP14 PUSH2 0xD5B JUMP JUMPDEST SWAP1 POP DUP2 LT ISZERO PUSH2 0x66B JUMPI PUSH1 0x0 PUSH2 0x5E5 PUSH1 0x20 DUP15 ADD DUP15 PUSH2 0xD5B JUMP JUMPDEST DUP4 DUP2 DUP2 LT PUSH2 0x5F5 JUMPI PUSH2 0x5F5 PUSH2 0x104E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD SWAP1 POP DUP10 DUP10 PUSH1 0x1 DUP4 PUSH2 0x60D SWAP2 SWAP1 PUSH2 0x107B JUMP JUMPDEST DUP2 DUP2 LT PUSH2 0x61C JUMPI PUSH2 0x61C PUSH2 0x104E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x631 SWAP2 SWAP1 PUSH2 0x10A7 JUMP JUMPDEST DUP9 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x643 JUMPI PUSH2 0x643 PUSH2 0x104E JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE POP DUP1 PUSH2 0x663 DUP2 PUSH2 0x108E JUMP JUMPDEST SWAP2 POP POP PUSH2 0x5C0 JUMP JUMPDEST POP POP POP POP POP POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST DUP2 ISZERO DUP1 ISZERO SWAP1 PUSH2 0x68A JUMPI POP DUP1 DUP3 GT ISZERO JUMPDEST PUSH2 0x6D6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F72727570746564206D656D6265727320696E646963657300000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP4 PUSH1 0x0 DUP2 DUP2 LT PUSH2 0x6EB JUMPI PUSH2 0x6EB PUSH2 0x104E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD GT DUP1 ISZERO PUSH2 0x721 JUMPI POP DUP1 DUP4 DUP4 PUSH2 0x708 PUSH1 0x1 DUP3 PUSH2 0x107B JUMP JUMPDEST DUP2 DUP2 LT PUSH2 0x717 JUMPI PUSH2 0x717 PUSH2 0x104E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD GT ISZERO JUMPDEST PUSH2 0x76D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F72727570746564206D656D6265727320696E646963657300000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH1 0x0 JUMPDEST PUSH2 0x77B PUSH1 0x1 DUP5 PUSH2 0x107B JUMP JUMPDEST DUP2 LT ISZERO PUSH2 0x81D JUMPI DUP4 DUP4 PUSH2 0x78F DUP4 PUSH1 0x1 PUSH2 0x10C2 JUMP JUMPDEST DUP2 DUP2 LT PUSH2 0x79E JUMPI PUSH2 0x79E PUSH2 0x104E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD DUP5 DUP5 DUP4 DUP2 DUP2 LT PUSH2 0x7B7 JUMPI PUSH2 0x7B7 PUSH2 0x104E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD LT PUSH2 0x80B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F72727570746564206D656D6265727320696E646963657300000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST DUP1 PUSH2 0x815 DUP2 PUSH2 0x108E JUMP JUMPDEST SWAP2 POP POP PUSH2 0x770 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x831 DUP4 DUP6 PUSH2 0x10C2 JUMP JUMPDEST SWAP1 POP DUP4 DUP2 GT DUP1 ISZERO PUSH2 0x843 JUMPI POP DUP1 DUP6 MLOAD LT ISZERO JUMPDEST PUSH2 0x88F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536C696365206F7574206F6620626F756E647300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 POP DUP3 PUSH1 0x40 DUP4 ADD ADD PUSH1 0x40 MSTORE DUP3 DUP3 MSTORE DUP4 DUP6 ADD DUP3 SUB DUP5 PUSH1 0x20 DUP8 ADD ADD DUP5 DUP2 ADD JUMPDEST DUP1 DUP3 LT ISZERO PUSH2 0x8C8 JUMPI DUP2 MLOAD DUP4 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH2 0x8AF JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x8E2 DUP6 DUP6 PUSH2 0x8F9 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x8EF DUP2 PUSH2 0x93E JUMP JUMPDEST POP SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH1 0x41 SUB PUSH2 0x92F JUMPI PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x0 BYTE PUSH2 0x923 DUP8 DUP3 DUP6 DUP6 PUSH2 0xAA6 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x937 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP PUSH1 0x2 JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x952 JUMPI PUSH2 0x952 PUSH2 0x10D5 JUMP JUMPDEST SUB PUSH2 0x95A JUMPI POP JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x96E JUMPI PUSH2 0x96E PUSH2 0x10D5 JUMP JUMPDEST SUB PUSH2 0x9BB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E61747572650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x9CF JUMPI PUSH2 0x9CF PUSH2 0x10D5 JUMP JUMPDEST SUB PUSH2 0xA1C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265206C656E67746800 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH1 0x3 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0xA30 JUMPI PUSH2 0xA30 PUSH2 0x10D5 JUMP JUMPDEST SUB PUSH2 0xAA3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265202773272076616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7565000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x123 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP4 GT ISZERO PUSH2 0xADD JUMPI POP PUSH1 0x0 SWAP1 POP PUSH1 0x3 PUSH2 0xB61 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP1 DUP5 MSTORE DUP10 SWAP1 MSTORE PUSH1 0xFF DUP9 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP6 SWAP1 MSTORE 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 0xB31 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD SWAP2 POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0xB5A JUMPI PUSH1 0x0 PUSH1 0x1 SWAP3 POP SWAP3 POP POP PUSH2 0xB61 JUMP JUMPDEST SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0xAA3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xBBE JUMPI PUSH2 0xBBE PUSH2 0xB7F JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0xBD8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xBF0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x937 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0xC24 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0xC2F DUP2 PUSH2 0xB6A JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xC4D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 DUP10 ADD SWAP1 PUSH1 0xA0 DUP3 DUP13 SUB SLT ISZERO PUSH2 0xC61 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0xC77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP11 ADD SWAP2 POP DUP11 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xC8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0xC9D JUMPI PUSH2 0xC9D PUSH2 0xB7F JUMP JUMPDEST PUSH2 0xCAF PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND DUP6 ADD PUSH2 0xB95 JUMP JUMPDEST DUP2 DUP2 MSTORE DUP13 DUP6 DUP4 DUP7 ADD ADD GT ISZERO PUSH2 0xCC3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 DUP6 ADD DUP7 DUP4 ADD CALLDATACOPY PUSH1 0x0 SWAP2 DUP2 ADD SWAP1 SWAP5 ADD MSTORE SWAP2 SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD SWAP2 DUP1 DUP4 GT ISZERO PUSH2 0xCF1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP PUSH2 0xCFF DUP10 DUP3 DUP11 ADD PUSH2 0xBC6 JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xD4F JUMPI DUP4 MLOAD PUSH4 0xFFFFFFFF AND DUP4 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0xD2D JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH1 0x1E NOT DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0xD72 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xD8D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP PUSH1 0x5 DUP2 SWAP1 SHL CALLDATASIZE SUB DUP3 SGT ISZERO PUSH2 0x937 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH1 0x1E NOT DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0xDBC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xDD7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x937 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH2 0xE27 JUMPI PUSH2 0xE27 PUSH2 0xDEC JUMP JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0xE3B JUMPI PUSH2 0xE3B PUSH2 0xDEC JUMP JUMPDEST POP MOD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xE52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0xE62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP2 DUP4 MSTORE PUSH1 0x0 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT ISZERO PUSH2 0xE9B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x5 SHL DUP1 DUP4 PUSH1 0x20 DUP8 ADD CALLDATACOPY SWAP4 SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP7 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP8 DUP2 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x40 DUP5 ADD MSTORE DUP7 MLOAD DUP1 PUSH1 0xA0 DUP6 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xEEE JUMPI DUP9 DUP2 ADD DUP4 ADD MLOAD DUP6 DUP3 ADD PUSH1 0xC0 ADD MSTORE DUP3 ADD PUSH2 0xED2 JUMP JUMPDEST POP PUSH1 0x0 PUSH1 0xC0 DUP3 DUP7 ADD ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP5 ADD SWAP2 POP POP PUSH1 0xC0 DUP4 DUP3 SUB ADD PUSH1 0x60 DUP5 ADD MSTORE PUSH2 0xF1E PUSH1 0xC0 DUP3 ADD DUP7 DUP9 PUSH2 0xE69 JUMP JUMPDEST SWAP2 POP POP PUSH2 0xF2F PUSH1 0x80 DUP4 ADD DUP5 ISZERO ISZERO SWAP1 MSTORE JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xF4E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x0 SWAP1 DUP5 PUSH1 0x40 DUP5 ADD DUP4 JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0xF91 JUMPI PUSH4 0xFFFFFFFF PUSH2 0xF7E DUP5 PUSH2 0xF3A JUMP JUMPDEST AND DUP3 MSTORE SWAP2 DUP4 ADD SWAP2 SWAP1 DUP4 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xF68 JUMP JUMPDEST POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xFAF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xFC7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xFDB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0xFED JUMPI PUSH2 0xFED PUSH2 0xB7F JUMP JUMPDEST DUP1 PUSH1 0x5 SHL SWAP2 POP PUSH2 0xFFE DUP5 DUP4 ADD PUSH2 0xB95 JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 DUP4 ADD DUP5 ADD SWAP2 DUP5 DUP2 ADD SWAP1 DUP9 DUP5 GT ISZERO PUSH2 0x1018 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 DUP6 ADD SWAP4 JUMPDEST DUP4 DUP6 LT ISZERO PUSH2 0x1042 JUMPI DUP5 MLOAD SWAP3 POP PUSH2 0x1032 DUP4 PUSH2 0xB6A JUMP JUMPDEST DUP3 DUP3 MSTORE SWAP4 DUP6 ADD SWAP4 SWAP1 DUP6 ADD SWAP1 PUSH2 0x101D JUMP JUMPDEST SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 DUP3 MUL DUP2 ISZERO DUP3 DUP3 DIV DUP5 EQ OR PUSH2 0x8F3 JUMPI PUSH2 0x8F3 PUSH2 0xE02 JUMP JUMPDEST DUP2 DUP2 SUB DUP2 DUP2 GT ISZERO PUSH2 0x8F3 JUMPI PUSH2 0x8F3 PUSH2 0xE02 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP3 ADD PUSH2 0x10A0 JUMPI PUSH2 0x10A0 PUSH2 0xE02 JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x10B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE62 DUP3 PUSH2 0xF3A JUMP JUMPDEST DUP1 DUP3 ADD DUP1 DUP3 GT ISZERO PUSH2 0x8F3 JUMPI PUSH2 0x8F3 PUSH2 0xE02 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP1 0xB0 0xBE 0x1F SWAP5 0x2D CALLDATASIZE BASEFEE PUSH12 0xB0F921C262B1413D6EAB7A8A 0x4E 0xF7 SGT 0xC6 0xD7 0xD3 PUSH13 0x5E9423D564736F6C6343000811 STOP CALLER ",
10750
+ "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x6DCC64F8 EQ PUSH2 0x50 JUMPI DUP1 PUSH4 0x89EF44B0 EQ PUSH2 0x6B JUMPI DUP1 PUSH4 0xF4DF04BE EQ PUSH2 0x73 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x58 PUSH1 0x33 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x58 PUSH1 0x41 DUP2 JUMP JUMPDEST PUSH2 0x86 PUSH2 0x81 CALLDATASIZE PUSH1 0x4 PUSH2 0xC0B JUMP JUMPDEST PUSH2 0x93 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x62 SWAP2 SWAP1 PUSH2 0xD11 JUMP JUMPDEST PUSH1 0x60 PUSH2 0xAB PUSH2 0xA5 PUSH1 0x20 DUP9 ADD DUP9 PUSH2 0xD5B JUMP JUMPDEST DUP5 PUSH2 0x67B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x41 PUSH2 0xBC PUSH1 0x60 DUP10 ADD DUP10 PUSH2 0xDA5 JUMP JUMPDEST PUSH2 0xC7 SWAP3 SWAP2 POP PUSH2 0xE18 JUMP JUMPDEST SWAP1 POP PUSH2 0xD6 PUSH1 0x60 DUP9 ADD DUP9 PUSH2 0xDA5 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SUB PUSH2 0x12C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4E6F207369676E6174757265732070726F766964656400000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x41 PUSH2 0x13B PUSH1 0x60 DUP10 ADD DUP10 PUSH2 0xDA5 JUMP JUMPDEST PUSH2 0x146 SWAP3 SWAP2 POP PUSH2 0xE2C JUMP JUMPDEST ISZERO PUSH2 0x193 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4D616C666F726D6564207369676E617475726573206172726179000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH2 0x1A0 PUSH1 0x80 DUP9 ADD DUP9 PUSH2 0xD5B JUMP JUMPDEST SWAP1 POP DUP2 EQ PUSH2 0x1F0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x556E6578706563746564207369676E61747572657320636F756E740000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH1 0x33 DUP2 LT ISZERO PUSH2 0x241 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6F20666577207369676E6174757265730000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x291 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6F206D616E79207369676E61747572657300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH2 0x2A7 PUSH2 0x2A1 PUSH1 0x80 DUP10 ADD DUP10 PUSH2 0xD5B JUMP JUMPDEST DUP6 PUSH2 0x67B JUMP JUMPDEST PUSH1 0x0 PUSH2 0x344 CHAINID DUP8 DUP10 PUSH2 0x2BC PUSH1 0x20 DUP14 ADD DUP14 PUSH2 0xD5B JUMP JUMPDEST DUP14 PUSH1 0x40 ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x2CF SWAP2 SWAP1 PUSH2 0xE40 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x2E4 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xEB4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE DUP3 DUP3 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD KECCAK256 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP5 DUP4 ADD MSTORE PUSH1 0x3C DUP1 DUP6 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP6 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x5C SWAP1 SWAP4 ADD SWAP1 SWAP2 MSTORE DUP2 MLOAD SWAP2 ADD KECCAK256 SWAP1 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP10 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF7F9A8FA DUP8 DUP8 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x376 SWAP3 SWAP2 SWAP1 PUSH2 0xF53 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x393 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0x3BB SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xF9C JUMP JUMPDEST SWAP1 POP PUSH1 0x60 PUSH1 0x0 DUP1 JUMPDEST DUP6 DUP2 LT ISZERO PUSH2 0x51C JUMPI PUSH1 0x0 PUSH2 0x3DA PUSH1 0x80 DUP15 ADD DUP15 PUSH2 0xD5B JUMP JUMPDEST DUP4 DUP2 DUP2 LT PUSH2 0x3EA JUMPI PUSH2 0x3EA PUSH2 0x104E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD SWAP1 POP PUSH2 0x453 DUP3 PUSH1 0x41 PUSH2 0x403 SWAP2 SWAP1 PUSH2 0x1064 JUMP JUMPDEST PUSH1 0x41 DUP16 DUP1 PUSH1 0x60 ADD SWAP1 PUSH2 0x415 SWAP2 SWAP1 PUSH2 0xDA5 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP PUSH2 0x823 SWAP1 POP JUMP JUMPDEST SWAP4 POP PUSH1 0x0 PUSH2 0x461 DUP8 DUP7 PUSH2 0x8D3 JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP7 PUSH2 0x479 PUSH1 0x1 DUP6 PUSH2 0x107B JUMP JUMPDEST DUP2 MLOAD DUP2 LT PUSH2 0x489 JUMPI PUSH2 0x489 PUSH2 0x104E JUMP JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x4E7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C6964207369676E6174757265000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST DUP4 ISZERO DUP1 ISZERO PUSH2 0x4FD JUMPI POP CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND EQ JUMPDEST ISZERO PUSH2 0x507 JUMPI PUSH1 0x1 SWAP4 POP JUMPDEST POP POP DUP1 DUP1 PUSH2 0x514 SWAP1 PUSH2 0x108E JUMP JUMPDEST SWAP2 POP POP PUSH2 0x3C3 JUMP JUMPDEST POP DUP1 PUSH2 0x56A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E646572206D75737420626520636C61696D207369676E65720000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH2 0x577 PUSH1 0x20 DUP13 ADD DUP13 PUSH2 0xD5B JUMP JUMPDEST SWAP1 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x591 JUMPI PUSH2 0x591 PUSH2 0xB7F JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x5BA JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP6 POP PUSH1 0x0 JUMPDEST PUSH2 0x5CD PUSH1 0x20 DUP14 ADD DUP14 PUSH2 0xD5B JUMP JUMPDEST SWAP1 POP DUP2 LT ISZERO PUSH2 0x66B JUMPI PUSH1 0x0 PUSH2 0x5E5 PUSH1 0x20 DUP15 ADD DUP15 PUSH2 0xD5B JUMP JUMPDEST DUP4 DUP2 DUP2 LT PUSH2 0x5F5 JUMPI PUSH2 0x5F5 PUSH2 0x104E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD SWAP1 POP DUP10 DUP10 PUSH1 0x1 DUP4 PUSH2 0x60D SWAP2 SWAP1 PUSH2 0x107B JUMP JUMPDEST DUP2 DUP2 LT PUSH2 0x61C JUMPI PUSH2 0x61C PUSH2 0x104E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x631 SWAP2 SWAP1 PUSH2 0x10A7 JUMP JUMPDEST DUP9 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x643 JUMPI PUSH2 0x643 PUSH2 0x104E JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE POP DUP1 PUSH2 0x663 DUP2 PUSH2 0x108E JUMP JUMPDEST SWAP2 POP POP PUSH2 0x5C0 JUMP JUMPDEST POP POP POP POP POP POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST DUP2 ISZERO DUP1 ISZERO SWAP1 PUSH2 0x68A JUMPI POP DUP1 DUP3 GT ISZERO JUMPDEST PUSH2 0x6D6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F72727570746564206D656D6265727320696E646963657300000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP4 PUSH1 0x0 DUP2 DUP2 LT PUSH2 0x6EB JUMPI PUSH2 0x6EB PUSH2 0x104E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD GT DUP1 ISZERO PUSH2 0x721 JUMPI POP DUP1 DUP4 DUP4 PUSH2 0x708 PUSH1 0x1 DUP3 PUSH2 0x107B JUMP JUMPDEST DUP2 DUP2 LT PUSH2 0x717 JUMPI PUSH2 0x717 PUSH2 0x104E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD GT ISZERO JUMPDEST PUSH2 0x76D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F72727570746564206D656D6265727320696E646963657300000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH1 0x0 JUMPDEST PUSH2 0x77B PUSH1 0x1 DUP5 PUSH2 0x107B JUMP JUMPDEST DUP2 LT ISZERO PUSH2 0x81D JUMPI DUP4 DUP4 PUSH2 0x78F DUP4 PUSH1 0x1 PUSH2 0x10C2 JUMP JUMPDEST DUP2 DUP2 LT PUSH2 0x79E JUMPI PUSH2 0x79E PUSH2 0x104E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD DUP5 DUP5 DUP4 DUP2 DUP2 LT PUSH2 0x7B7 JUMPI PUSH2 0x7B7 PUSH2 0x104E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD LT PUSH2 0x80B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F72727570746564206D656D6265727320696E646963657300000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST DUP1 PUSH2 0x815 DUP2 PUSH2 0x108E JUMP JUMPDEST SWAP2 POP POP PUSH2 0x770 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x831 DUP4 DUP6 PUSH2 0x10C2 JUMP JUMPDEST SWAP1 POP DUP4 DUP2 GT DUP1 ISZERO PUSH2 0x843 JUMPI POP DUP1 DUP6 MLOAD LT ISZERO JUMPDEST PUSH2 0x88F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536C696365206F7574206F6620626F756E647300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 POP DUP3 PUSH1 0x40 DUP4 ADD ADD PUSH1 0x40 MSTORE DUP3 DUP3 MSTORE DUP4 DUP6 ADD DUP3 SUB DUP5 PUSH1 0x20 DUP8 ADD ADD DUP5 DUP2 ADD JUMPDEST DUP1 DUP3 LT ISZERO PUSH2 0x8C8 JUMPI DUP2 MLOAD DUP4 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH2 0x8AF JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x8E2 DUP6 DUP6 PUSH2 0x8F9 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x8EF DUP2 PUSH2 0x93E JUMP JUMPDEST POP SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH1 0x41 SUB PUSH2 0x92F JUMPI PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x0 BYTE PUSH2 0x923 DUP8 DUP3 DUP6 DUP6 PUSH2 0xAA6 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x937 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP PUSH1 0x2 JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x952 JUMPI PUSH2 0x952 PUSH2 0x10D5 JUMP JUMPDEST SUB PUSH2 0x95A JUMPI POP JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x96E JUMPI PUSH2 0x96E PUSH2 0x10D5 JUMP JUMPDEST SUB PUSH2 0x9BB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E61747572650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x9CF JUMPI PUSH2 0x9CF PUSH2 0x10D5 JUMP JUMPDEST SUB PUSH2 0xA1C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265206C656E67746800 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x123 JUMP JUMPDEST PUSH1 0x3 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0xA30 JUMPI PUSH2 0xA30 PUSH2 0x10D5 JUMP JUMPDEST SUB PUSH2 0xAA3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E6174757265202773272076616C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7565000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x123 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP4 GT ISZERO PUSH2 0xADD JUMPI POP PUSH1 0x0 SWAP1 POP PUSH1 0x3 PUSH2 0xB61 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP1 DUP5 MSTORE DUP10 SWAP1 MSTORE PUSH1 0xFF DUP9 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP6 SWAP1 MSTORE 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 0xB31 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD SWAP2 POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0xB5A JUMPI PUSH1 0x0 PUSH1 0x1 SWAP3 POP SWAP3 POP POP PUSH2 0xB61 JUMP JUMPDEST SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0xAA3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xBBE JUMPI PUSH2 0xBBE PUSH2 0xB7F JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0xBD8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xBF0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x937 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0xC24 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0xC2F DUP2 PUSH2 0xB6A JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xC4D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 DUP10 ADD SWAP1 PUSH1 0xA0 DUP3 DUP13 SUB SLT ISZERO PUSH2 0xC61 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0xC77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP11 ADD SWAP2 POP DUP11 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xC8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0xC9D JUMPI PUSH2 0xC9D PUSH2 0xB7F JUMP JUMPDEST PUSH2 0xCAF PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND DUP6 ADD PUSH2 0xB95 JUMP JUMPDEST DUP2 DUP2 MSTORE DUP13 DUP6 DUP4 DUP7 ADD ADD GT ISZERO PUSH2 0xCC3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 DUP6 ADD DUP7 DUP4 ADD CALLDATACOPY PUSH1 0x0 SWAP2 DUP2 ADD SWAP1 SWAP5 ADD MSTORE SWAP2 SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD SWAP2 DUP1 DUP4 GT ISZERO PUSH2 0xCF1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP PUSH2 0xCFF DUP10 DUP3 DUP11 ADD PUSH2 0xBC6 JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xD4F JUMPI DUP4 MLOAD PUSH4 0xFFFFFFFF AND DUP4 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0xD2D JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH1 0x1E NOT DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0xD72 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xD8D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP PUSH1 0x5 DUP2 SWAP1 SHL CALLDATASIZE SUB DUP3 SGT ISZERO PUSH2 0x937 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH1 0x1E NOT DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0xDBC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xDD7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x937 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH2 0xE27 JUMPI PUSH2 0xE27 PUSH2 0xDEC JUMP JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0xE3B JUMPI PUSH2 0xE3B PUSH2 0xDEC JUMP JUMPDEST POP MOD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xE52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0xE62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP2 DUP4 MSTORE PUSH1 0x0 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT ISZERO PUSH2 0xE9B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x5 SHL DUP1 DUP4 PUSH1 0x20 DUP8 ADD CALLDATACOPY SWAP4 SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP7 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP8 DUP2 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x40 DUP5 ADD MSTORE DUP7 MLOAD DUP1 PUSH1 0xA0 DUP6 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xEEE JUMPI DUP9 DUP2 ADD DUP4 ADD MLOAD DUP6 DUP3 ADD PUSH1 0xC0 ADD MSTORE DUP3 ADD PUSH2 0xED2 JUMP JUMPDEST POP PUSH1 0x0 PUSH1 0xC0 DUP3 DUP7 ADD ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP5 ADD SWAP2 POP POP PUSH1 0xC0 DUP4 DUP3 SUB ADD PUSH1 0x60 DUP5 ADD MSTORE PUSH2 0xF1E PUSH1 0xC0 DUP3 ADD DUP7 DUP9 PUSH2 0xE69 JUMP JUMPDEST SWAP2 POP POP PUSH2 0xF2F PUSH1 0x80 DUP4 ADD DUP5 ISZERO ISZERO SWAP1 MSTORE JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xF4E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x0 SWAP1 DUP5 PUSH1 0x40 DUP5 ADD DUP4 JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0xF91 JUMPI PUSH4 0xFFFFFFFF PUSH2 0xF7E DUP5 PUSH2 0xF3A JUMP JUMPDEST AND DUP3 MSTORE SWAP2 DUP4 ADD SWAP2 SWAP1 DUP4 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xF68 JUMP JUMPDEST POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xFAF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xFC7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xFDB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0xFED JUMPI PUSH2 0xFED PUSH2 0xB7F JUMP JUMPDEST DUP1 PUSH1 0x5 SHL SWAP2 POP PUSH2 0xFFE DUP5 DUP4 ADD PUSH2 0xB95 JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 DUP4 ADD DUP5 ADD SWAP2 DUP5 DUP2 ADD SWAP1 DUP9 DUP5 GT ISZERO PUSH2 0x1018 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 DUP6 ADD SWAP4 JUMPDEST DUP4 DUP6 LT ISZERO PUSH2 0x1042 JUMPI DUP5 MLOAD SWAP3 POP PUSH2 0x1032 DUP4 PUSH2 0xB6A JUMP JUMPDEST DUP3 DUP3 MSTORE SWAP4 DUP6 ADD SWAP4 SWAP1 DUP6 ADD SWAP1 PUSH2 0x101D JUMP JUMPDEST SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 DUP3 MUL DUP2 ISZERO DUP3 DUP3 DIV DUP5 EQ OR PUSH2 0x8F3 JUMPI PUSH2 0x8F3 PUSH2 0xE02 JUMP JUMPDEST DUP2 DUP2 SUB DUP2 DUP2 GT ISZERO PUSH2 0x8F3 JUMPI PUSH2 0x8F3 PUSH2 0xE02 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP3 ADD PUSH2 0x10A0 JUMPI PUSH2 0x10A0 PUSH2 0xE02 JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x10B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE62 DUP3 PUSH2 0xF3A JUMP JUMPDEST DUP1 DUP3 ADD DUP1 DUP3 GT ISZERO PUSH2 0x8F3 JUMPI PUSH2 0x8F3 PUSH2 0xE02 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 LOG4 0xEB 0xA8 SWAP4 PUSH27 0x99704F1D81BEFED62E38BBBE2BC00EE2CEF4966DB01FC39536A979 PUSH5 0x736F6C6343 STOP ADDMOD GT STOP CALLER ",
10751
10751
  "sourceMap": "2180:7415:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4240:43;;4281:2;4240:43;;;;;168:25:123;;;156:2;141:18;4240:43:11;;;;;;;;4410:46;;4454:2;4410:46;;5098:3197;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;5313:31;5598:107;5634:28;;;;:5;:28;:::i;:::-;5676:12;5598:22;:107::i;:::-;5832:23;4454:2;5858:16;;;;:5;:16;:::i;:::-;:43;;;-1:-1:-1;5858:43:11;:::i;:::-;5832:69;-1:-1:-1;5919:16:11;;;;:5;:16;:::i;:::-;:23;;5946:1;5919:28;5911:63;;;;-1:-1:-1;;;5911:63:11;;5246:2:123;5911:63:11;;;5228:21:123;5285:2;5265:18;;;5258:30;5324:24;5304:18;;;5297:52;5366:18;;5911:63:11;;;;;;;;;4454:2;6005:16;;;;:5;:16;:::i;:::-;:43;;;-1:-1:-1;6005:43:11;:::i;:::-;:48;5984:121;;;;-1:-1:-1;;;5984:121:11;;5714:2:123;5984:121:11;;;5696:21:123;5753:2;5733:18;;;5726:30;5792:28;5772:18;;;5765:56;5838:18;;5984:121:11;5512:350:123;5984:121:11;6155:27;;;;:5;:27;:::i;:::-;:34;;6136:15;:53;6115:127;;;;-1:-1:-1;;;6115:127:11;;6069:2:123;6115:127:11;;;6051:21:123;6108:2;6088:18;;;6081:30;6147:29;6127:18;;;6120:57;6194:18;;6115:127:11;5867:351:123;6115:127:11;4281:2;6260:15;:33;;6252:64;;;;-1:-1:-1;;;6252:64:11;;6425:2:123;6252:64:11;;;6407:21:123;6464:2;6444:18;;;6437:30;6503:20;6483:18;;;6476:48;6541:18;;6252:64:11;6223:342:123;6252:64:11;6334:38;;;;6326:70;;;;-1:-1:-1;;;6326:70:11;;6772:2:123;6326:70:11;;;6754:21:123;6811:2;6791:18;;;6784:30;6850:21;6830:18;;;6823:49;6889:18;;6326:70:11;6570:343:123;6326:70:11;6583:106;6619:27;;;;:5;:27;:::i;:::-;6660:12;6583:22;:106::i;:::-;6700:25;6728:251;6779:13;6810:5;6833:12;6863:28;;;;:5;:28;:::i;:::-;6909:5;:21;;;;;;;;;;:::i;:::-;6751:193;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;6751:193:11;;;;;;;;;6728:226;;6751:193;6728:226;;;;12737:66:123;7477:58:44;;;12725:79:123;12820:12;;;;12813:28;;;;7477:58:44;;;;;;;;;;12857:12:123;;;;7477:58:44;;;7467:69;;;;;;7278:265;6728:251:11;6700:279;;6990:38;7031:13;-1:-1:-1;;;;;7031:28:11;;7073:12;;7031:64;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7031:64:11;;;;;;;;;;;;:::i;:::-;6990:105;;7140:29;7179:26;7228:9;7223:666;7247:15;7243:1;:19;7223:666;;;7283:19;7305:27;;;;:5;:27;:::i;:::-;7333:1;7305:30;;;;;;;:::i;:::-;;;;;;;7283:52;;7368:110;7428:1;4454:2;7408:21;;;;:::i;:::-;4454:2;7368:5;:16;;;;;;;;:::i;:::-;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7368:22:11;;:110;;-1:-1:-1;;7368:22:11;:110;-1:-1:-1;7368:110:11:i;:::-;7349:129;-1:-1:-1;7492:24:11;7519:73;:17;7349:129;7519:25;:73::i;:::-;7492:100;-1:-1:-1;;;;;;7632:58:11;;:21;7654:15;7668:1;7654:11;:15;:::i;:::-;7632:38;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;7632:58:11;;7607:134;;;;-1:-1:-1;;;7607:134:11;;11182:2:123;7607:134:11;;;11164:21:123;11221:2;11201:18;;;11194:30;11260:19;11240:18;;;11233:47;11297:18;;7607:134:11;10980:341:123;7607:134:11;7761:21;7760:22;:56;;;;-1:-1:-1;7786:10:11;-1:-1:-1;;;;;7786:30:11;;;7760:56;7756:123;;;7860:4;7836:28;;7756:123;7269:620;;7264:3;;;;;:::i;:::-;;;;7223:666;;;;7907:21;7899:61;;;;-1:-1:-1;;;7899:61:11;;11668:2:123;7899:61:11;;;11650:21:123;11707:2;11687:18;;;11680:30;11746:29;11726:18;;;11719:57;11793:18;;7899:61:11;11466:351:123;7899:61:11;8002:28;;;;:5;:28;:::i;:::-;:35;;7989:49;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7989:49:11;;7971:67;;8053:9;8048:208;8072:28;;;;:5;:28;:::i;:::-;:35;;8068:1;:39;8048:208;;;8128:19;8150:28;;;;:5;:28;:::i;:::-;8179:1;8150:31;;;;;;;:::i;:::-;;;;;;;8128:53;;8216:12;;8243:1;8229:11;:15;;;;:::i;:::-;8216:29;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;8195:15;8211:1;8195:18;;;;;;;;:::i;:::-;:50;;;;:18;;;;;;;;;;;:50;-1:-1:-1;8109:3:11;;;;:::i;:::-;;;;8048:208;;;;8266:22;;;;;5098:3197;;;;;;;;:::o;8667:926::-;8813:18;;;;;:49;;-1:-1:-1;8835:27:11;;;;8813:49;8792:121;;;;-1:-1:-1;;;8792:121:11;;12213:2:123;8792:121:11;;;12195:21:123;12252:2;12232:18;;;12225:30;12291:27;12271:18;;;12264:55;12336:18;;8792:121:11;12011:349:123;8792:121:11;9147:1;9134:7;;9142:1;9134:10;;;;;;;:::i;:::-;;;;;;;:14;:58;;;;-1:-1:-1;9183:9:11;9152:7;;9160:18;9177:1;9152:7;9160:18;:::i;:::-;9152:27;;;;;;;:::i;:::-;;;;;;;:40;;9134:58;9113:130;;;;-1:-1:-1;;;9113:130:11;;12213:2:123;9113:130:11;;;12195:21:123;12252:2;12232:18;;;12225:30;12291:27;12271:18;;;12264:55;12336:18;;9113:130:11;12011:349:123;9113:130:11;9259:9;9254:333;9278:18;9295:1;9278:7;:18;:::i;:::-;9274:1;:22;9254:333;;;9532:7;;9540:5;:1;9544;9540:5;:::i;:::-;9532:14;;;;;;;:::i;:::-;;;;;;;9519:7;;9527:1;9519:10;;;;;;;:::i;:::-;;;;;;;:27;9511:65;;;;-1:-1:-1;;;9511:65:11;;12213:2:123;9511:65:11;;;12195:21:123;12252:2;12232:18;;;12225:30;12291:27;12271:18;;;12264:55;12336:18;;9511:65:11;12011:349:123;9511:65:11;9298:3;;;;:::i;:::-;;;;9254:333;;;;8667:926;;;:::o;15356:898:18:-;15478:16;15506:12;15521:16;15530:7;15521:6;:16;:::i;:::-;15506:31;;15562:6;15555:4;:13;:38;;;;;15589:4;15572:6;:13;:21;;15555:38;15547:70;;;;-1:-1:-1;;;15547:70:18;;13082:2:123;15547:70:18;;;13064:21:123;13121:2;13101:18;;;13094:30;13160:21;13140:18;;;13133:49;13199:18;;15547:70:18;12880:343:123;15547:70:18;15754:4;15748:11;15741:18;;15803:7;15798:2;15793:3;15789:12;15785:26;15779:4;15772:40;15837:7;15832:3;15825:20;15964:6;15956;15952:19;15947:3;15943:29;16040:6;16035:2;16027:6;16023:15;16019:28;16084:7;16079:3;16075:17;15986:252;16115:3;16110;16107:12;15986:252;;;16219:3;16213:10;16206:4;16201:3;16197:14;16190:34;16154:2;16149:3;16145:12;16138:19;;15986:252;;;15990:116;;;15637:611;15356:898;;;;;:::o;3683:227:44:-;3761:7;3781:17;3800:18;3822:27;3833:4;3839:9;3822:10;:27::i;:::-;3780:69;;;;3859:18;3871:5;3859:11;:18::i;:::-;-1:-1:-1;3894:9:44;-1:-1:-1;3683:227:44;;;;;:::o;2167:730::-;2248:7;2257:12;2285:9;:16;2305:2;2285:22;2281:610;;2621:4;2606:20;;2600:27;2670:4;2655:20;;2649:27;2727:4;2712:20;;2706:27;2323:9;2698:36;2768:25;2779:4;2698:36;2600:27;2649;2768:10;:25::i;:::-;2761:32;;;;;;;;;2281:610;-1:-1:-1;2840:1:44;;-1:-1:-1;2844:35:44;2281:610;2167:730;;;;;:::o;592:511::-;669:20;660:5;:29;;;;;;;;:::i;:::-;;656:441;;592:511;:::o;656:441::-;765:29;756:5;:38;;;;;;;;:::i;:::-;;752:345;;810:34;;-1:-1:-1;;;810:34:44;;13619:2:123;810:34:44;;;13601:21:123;13658:2;13638:18;;;13631:30;13697:26;13677:18;;;13670:54;13741:18;;810:34:44;13417:348:123;752:345:44;874:35;865:5;:44;;;;;;;;:::i;:::-;;861:236;;925:41;;-1:-1:-1;;;925:41:44;;13972:2:123;925:41:44;;;13954:21:123;14011:2;13991:18;;;13984:30;14050:33;14030:18;;;14023:61;14101:18;;925:41:44;13770:355:123;861:236:44;996:30;987:5;:39;;;;;;;;:::i;:::-;;983:114;;1042:44;;-1:-1:-1;;;1042:44:44;;14332:2:123;1042:44:44;;;14314:21:123;14371:2;14351:18;;;14344:30;14410:34;14390:18;;;14383:62;14481:4;14461:18;;;14454:32;14503:19;;1042:44:44;14130:398:123;983:114:44;592:511;:::o;5091:1494::-;5217:7;;6141:66;6128:79;;6124:161;;;-1:-1:-1;6239:1:44;;-1:-1:-1;6243:30:44;6223:51;;6124:161;6396:24;;;6379:14;6396:24;;;;;;;;;14760:25:123;;;14833:4;14821:17;;14801:18;;;14794:45;;;;14855:18;;;14848:34;;;14898:18;;;14891:34;;;6396:24:44;;14732:19:123;;6396:24:44;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6396:24:44;;-1:-1:-1;;6396:24:44;;;-1:-1:-1;;;;;;;6434:20:44;;6430:101;;6486:1;6490:29;6470:50;;;;;;;6430:101;6549:6;-1:-1:-1;6557:20:44;;-1:-1:-1;5091:1494:44;;;;;;;;:::o;204:169:123:-;-1:-1:-1;;;;;298:5:123;294:54;287:5;284:65;274:93;;363:1;360;353:12;378:184;-1:-1:-1;;;427:1:123;420:88;527:4;524:1;517:15;551:4;548:1;541:15;567:275;638:2;632:9;703:2;684:13;;-1:-1:-1;;680:27:123;668:40;;738:18;723:34;;759:22;;;720:62;717:88;;;785:18;;:::i;:::-;821:2;814:22;567:275;;-1:-1:-1;567:275:123:o;847:366::-;909:8;919:6;973:3;966:4;958:6;954:17;950:27;940:55;;991:1;988;981:12;940:55;-1:-1:-1;1014:20:123;;1057:18;1046:30;;1043:50;;;1089:1;1086;1079:12;1043:50;1126:4;1118:6;1114:17;1102:29;;1186:3;1179:4;1169:6;1166:1;1162:14;1154:6;1150:27;1146:38;1143:47;1140:67;;;1203:1;1200;1193:12;1218:1582;1396:6;1404;1412;1420;1428;1436;1489:3;1477:9;1468:7;1464:23;1460:33;1457:53;;;1506:1;1503;1496:12;1457:53;1545:9;1532:23;1564:46;1604:5;1564:46;:::i;:::-;1629:5;-1:-1:-1;1653:2:123;1691:18;;;1678:32;1729:18;1759:14;;;1756:34;;;1786:1;1783;1776:12;1756:34;1809:22;;;;1865:3;1847:16;;;1843:26;1840:46;;;1882:1;1879;1872:12;1840:46;1905:2;;-1:-1:-1;1960:2:123;1945:18;;1932:32;;1976:16;;;1973:36;;;2005:1;2002;1995:12;1973:36;2043:8;2032:9;2028:24;2018:34;;2090:7;2083:4;2079:2;2075:13;2071:27;2061:55;;2112:1;2109;2102:12;2061:55;2148:2;2135:16;2170:2;2166;2163:10;2160:36;;;2176:18;;:::i;:::-;2218:53;2261:2;2242:13;;-1:-1:-1;;2238:27:123;2234:36;;2218:53;:::i;:::-;2294:2;2287:5;2280:17;2334:7;2329:2;2324;2320;2316:11;2312:20;2309:33;2306:53;;;2355:1;2352;2345:12;2306:53;2410:2;2405;2401;2397:11;2392:2;2385:5;2381:14;2368:45;2454:1;2433:14;;;2429:23;;;2422:34;2437:5;;-1:-1:-1;2527:2:123;2512:18;;2499:32;;-1:-1:-1;2584:3:123;2569:19;;2556:33;;2601:16;;;2598:36;;;2630:1;2627;2620:12;2598:36;;;2669:71;2732:7;2721:8;2710:9;2706:24;2669:71;:::i;:::-;1218:1582;;;;-1:-1:-1;1218:1582:123;;-1:-1:-1;1218:1582:123;;2759:8;;1218:1582;-1:-1:-1;;;1218:1582:123:o;2805:655::-;2982:2;3034:21;;;3104:13;;3007:18;;;3126:22;;;2953:4;;2982:2;3205:15;;;;3179:2;3164:18;;;2953:4;3248:186;3262:6;3259:1;3256:13;3248:186;;;3327:13;;3342:10;3323:30;3311:43;;3409:15;;;;3374:12;;;;3284:1;3277:9;3248:186;;;-1:-1:-1;3451:3:123;;2805:655;-1:-1:-1;;;;;;2805:655:123:o;3465:545::-;3558:4;3564:6;3624:11;3611:25;3718:2;3714:7;3703:8;3687:14;3683:29;3679:43;3659:18;3655:68;3645:96;;3737:1;3734;3727:12;3645:96;3764:33;;3816:20;;;-1:-1:-1;3859:18:123;3848:30;;3845:50;;;3891:1;3888;3881:12;3845:50;3924:4;3912:17;;-1:-1:-1;3975:1:123;3971:14;;;3955;3951:35;3941:46;;3938:66;;;4000:1;3997;3990:12;4015:521;4092:4;4098:6;4158:11;4145:25;4252:2;4248:7;4237:8;4221:14;4217:29;4213:43;4193:18;4189:68;4179:96;;4271:1;4268;4261:12;4179:96;4298:33;;4350:20;;;-1:-1:-1;4393:18:123;4382:30;;4379:50;;;4425:1;4422;4415:12;4379:50;4458:4;4446:17;;-1:-1:-1;4489:14:123;4485:27;;;4475:38;;4472:58;;;4526:1;4523;4516:12;4541:184;-1:-1:-1;;;4590:1:123;4583:88;4690:4;4687:1;4680:15;4714:4;4711:1;4704:15;4730:184;-1:-1:-1;;;4779:1:123;4772:88;4879:4;4876:1;4869:15;4903:4;4900:1;4893:15;4919:120;4959:1;4985;4975:35;;4990:18;;:::i;:::-;-1:-1:-1;5024:9:123;;4919:120::o;5395:112::-;5427:1;5453;5443:35;;5458:18;;:::i;:::-;-1:-1:-1;5492:9:123;;5395:112::o;6918:273::-;6974:6;7027:2;7015:9;7006:7;7002:23;6998:32;6995:52;;;7043:1;7040;7033:12;6995:52;7082:9;7069:23;7135:5;7128:13;7121:21;7114:5;7111:32;7101:60;;7157:1;7154;7147:12;7101:60;7180:5;6918:273;-1:-1:-1;;;6918:273:123:o;7196:358::-;7296:6;7291:3;7284:19;7266:3;7326:66;7318:6;7315:78;7312:98;;;7406:1;7403;7396:12;7312:98;7442:6;7439:1;7435:14;7494:8;7487:5;7480:4;7475:3;7471:14;7458:45;7523:18;;;;7543:4;7519:29;;7196:358;-1:-1:-1;;;7196:358:123:o;7655:997::-;7968:6;7957:9;7950:25;7931:4;7994:2;8032:6;8027:2;8016:9;8012:18;8005:34;8075:3;8070:2;8059:9;8055:18;8048:31;8108:6;8102:13;8152:6;8146:3;8135:9;8131:19;8124:35;8177:1;8187:141;8201:6;8198:1;8195:13;8187:141;;;8297:14;;;8293:23;;8287:30;8262:17;;;8281:3;8258:27;8251:67;8216:10;;8187:141;;;8191:3;8378:1;8372:3;8363:6;8352:9;8348:22;8344:32;8337:43;8439:2;8435:7;8430:2;8422:6;8418:15;8414:29;8403:9;8399:45;8389:55;;;8504:3;8492:9;8488:2;8484:18;8480:28;8475:2;8464:9;8460:18;8453:56;8526:67;8588:3;8584:2;8580:12;8572:6;8564;8526:67;:::i;:::-;8518:75;;;8602:44;8641:3;8630:9;8626:19;8618:6;7629:13;7622:21;7610:34;;7559:91;8602:44;7655:997;;;;;;;;;:::o;8657:163::-;8724:20;;8784:10;8773:22;;8763:33;;8753:61;;8810:1;8807;8800:12;8753:61;8657:163;;;:::o;8825:624::-;9004:2;9056:21;;;9029:18;;;9112:22;;;8975:4;;9191:6;9165:2;9150:18;;8975:4;9225:198;9239:6;9236:1;9233:13;9225:198;;;9331:10;9304:25;9322:6;9304:25;:::i;:::-;9300:42;9288:55;;9398:15;;;;9363:12;;;;9261:1;9254:9;9225:198;;;-1:-1:-1;9440:3:123;8825:624;-1:-1:-1;;;;;;8825:624:123:o;9454:1026::-;9549:6;9580:2;9623;9611:9;9602:7;9598:23;9594:32;9591:52;;;9639:1;9636;9629:12;9591:52;9672:9;9666:16;9701:18;9742:2;9734:6;9731:14;9728:34;;;9758:1;9755;9748:12;9728:34;9796:6;9785:9;9781:22;9771:32;;9841:7;9834:4;9830:2;9826:13;9822:27;9812:55;;9863:1;9860;9853:12;9812:55;9892:2;9886:9;9914:2;9910;9907:10;9904:36;;;9920:18;;:::i;:::-;9966:2;9963:1;9959:10;9949:20;;9989:28;10013:2;10009;10005:11;9989:28;:::i;:::-;10051:15;;;10121:11;;;10117:20;;;10082:12;;;;10149:19;;;10146:39;;;10181:1;10178;10171:12;10146:39;10205:11;;;;10225:225;10241:6;10236:3;10233:15;10225:225;;;10314:3;10308:10;10295:23;;10331:46;10371:5;10331:46;:::i;:::-;10390:18;;;10258:12;;;;10428;;;;10225:225;;;10469:5;9454:1026;-1:-1:-1;;;;;;;;9454:1026:123:o;10485:184::-;-1:-1:-1;;;10534:1:123;10527:88;10634:4;10631:1;10624:15;10658:4;10655:1;10648:15;10674:168;10747:9;;;10778;;10795:15;;;10789:22;;10775:37;10765:71;;10816:18;;:::i;10847:128::-;10914:9;;;10935:11;;;10932:37;;;10949:18;;:::i;11326:135::-;11365:3;11386:17;;;11383:43;;11406:18;;:::i;:::-;-1:-1:-1;11453:1:123;11442:13;;11326:135::o;11822:184::-;11880:6;11933:2;11921:9;11912:7;11908:23;11904:32;11901:52;;;11949:1;11946;11939:12;11901:52;11972:28;11990:9;11972:28;:::i;12365:125::-;12430:9;;;12451:10;;;12448:36;;;12464:18;;:::i;13228:184::-;-1:-1:-1;;;13277:1:123;13270:88;13377:4;13374:1;13367:15;13401:4;13398:1;13391:15"
10752
10752
  },
10753
10753
  "gasEstimates": {
@@ -10771,7 +10771,7 @@
10771
10771
  "verifyClaim(SortitionPool,EcdsaInactivity.Claim,bytes,uint256,uint32[])": "f4df04be"
10772
10772
  }
10773
10773
  },
10774
- "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"groupThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"signatureByteSize\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract SortitionPool\",\"name\":\"sortitionPool\",\"type\":\"SortitionPool\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"walletID\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"inactiveMembersIndices\",\"type\":\"uint256[]\"},{\"internalType\":\"bool\",\"name\":\"heartbeatFailed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"signatures\",\"type\":\"bytes\"},{\"internalType\":\"uint256[]\",\"name\":\"signingMembersIndices\",\"type\":\"uint256[]\"}],\"internalType\":\"struct EcdsaInactivity.Claim\",\"name\":\"claim\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"walletPubKey\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint32[]\",\"name\":\"groupMembers\",\"type\":\"uint32[]\"}],\"name\":\"verifyClaim\",\"outputs\":[{\"internalType\":\"uint32[]\",\"name\":\"inactiveMembers\",\"type\":\"uint32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"verifyClaim(SortitionPool,EcdsaInactivity.Claim,bytes,uint256,uint32[])\":{\"details\":\"Wallet signing group members hash is validated upstream in `WalletRegistry.notifyOperatorInactivity()`\",\"params\":{\"claim\":\"Inactivity claim\",\"groupMembers\":\"Identifiers of group members\",\"nonce\":\"Current inactivity nonce for wallet used in the claim\",\"sortitionPool\":\"Sortition pool reference\",\"walletPubKey\":\"Public key of the wallet\"},\"returns\":{\"inactiveMembers\":\"Identifiers of members who are inactive\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"groupThreshold()\":{\"notice\":\"The minimum number of wallet signing group members needed to interact according to the protocol to produce a valid inactivity claim.\"},\"signatureByteSize()\":{\"notice\":\"Size in bytes of a single signature produced by member supporting the inactivity claim.\"},\"verifyClaim(SortitionPool,EcdsaInactivity.Claim,bytes,uint256,uint32[])\":{\"notice\":\"Verifies the inactivity claim according to the rules defined in `Claim` struct documentation. Reverts if verification fails.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@keep-network/ecdsa/contracts/libraries/EcdsaInactivity.sol\":\"EcdsaInactivity\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[]},\"sources\":{\"@keep-network/ecdsa/contracts/libraries/EcdsaInactivity.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\n//\\n// \\u2593\\u2593\\u258c \\u2593\\u2593 \\u2590\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c\\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c\\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\u2584\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\u2584\\u2584\\u2584 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\u2584\\u2584\\u2584 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\u2580\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\u2580\\u2580\\u2580 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\u2580\\u2580\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2580\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2588\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n//\\n// Trust math, not hardware.\\n\\npragma solidity 0.8.17;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol\\\";\\n\\nimport \\\"@keep-network/random-beacon/contracts/libraries/BytesLib.sol\\\";\\nimport \\\"@keep-network/sortition-pools/contracts/SortitionPool.sol\\\";\\n\\nimport \\\"./Wallets.sol\\\";\\n\\nlibrary EcdsaInactivity {\\n using BytesLib for bytes;\\n using ECDSAUpgradeable for bytes32;\\n\\n struct Claim {\\n // ID of the wallet whose signing group is raising the inactivity claim.\\n bytes32 walletID;\\n // Indices of group members accused of being inactive. Indices must be in\\n // range [1, groupMembers.length], unique, and sorted in ascending order.\\n uint256[] inactiveMembersIndices;\\n // Indicates if inactivity claim is a wallet-wide heartbeat failure.\\n // If wallet failed a heartbeat, this is signalled to the wallet owner\\n // who may decide to move responsibilities to another wallet\\n // given that the wallet who failed the heartbeat is at risk of not\\n // being able to sign messages soon.\\n bool heartbeatFailed;\\n // Concatenation of signatures from members supporting the claim.\\n // The message to be signed by each member is keccak256 hash of the\\n // concatenation of the chain ID, inactivity claim nonce for the given\\n // wallet, wallet public key, inactive members indices, and boolean flag\\n // indicating if this is a wallet-wide heartbeat failure. The calculated\\n // hash should be prefixed with `\\\\x19Ethereum signed message:\\\\n` before\\n // signing, so the message to sign is:\\n // `\\\\x19Ethereum signed message:\\\\n${keccak256(\\n // chainID | nonce | walletPubKey | inactiveMembersIndices | heartbeatFailed\\n // )}`\\n bytes signatures;\\n // Indices of members corresponding to each signature. Indices must be\\n // in range [1, groupMembers.length], unique, and sorted in ascending\\n // order.\\n uint256[] signingMembersIndices;\\n // This struct doesn't contain `__gap` property as the structure is not\\n // stored, it is used as a function's calldata argument.\\n }\\n\\n /// @notice The minimum number of wallet signing group members needed to\\n /// interact according to the protocol to produce a valid inactivity\\n /// claim.\\n uint256 public constant groupThreshold = 51;\\n\\n /// @notice Size in bytes of a single signature produced by member\\n /// supporting the inactivity claim.\\n uint256 public constant signatureByteSize = 65;\\n\\n /// @notice Verifies the inactivity claim according to the rules defined in\\n /// `Claim` struct documentation. Reverts if verification fails.\\n /// @dev Wallet signing group members hash is validated upstream in\\n /// `WalletRegistry.notifyOperatorInactivity()`\\n /// @param sortitionPool Sortition pool reference\\n /// @param claim Inactivity claim\\n /// @param walletPubKey Public key of the wallet\\n /// @param nonce Current inactivity nonce for wallet used in the claim\\n /// @param groupMembers Identifiers of group members\\n /// @return inactiveMembers Identifiers of members who are inactive\\n function verifyClaim(\\n SortitionPool sortitionPool,\\n Claim calldata claim,\\n bytes memory walletPubKey,\\n uint256 nonce,\\n uint32[] calldata groupMembers\\n ) external view returns (uint32[] memory inactiveMembers) {\\n // Validate inactive members indices. Maximum indices count is equal to\\n // the group size and is not limited deliberately to leave a theoretical\\n // possibility to accuse more members than `groupSize - groupThreshold`.\\n validateMembersIndices(\\n claim.inactiveMembersIndices,\\n groupMembers.length\\n );\\n\\n // Validate signatures array is properly formed and number of\\n // signatures and signers is correct.\\n uint256 signaturesCount = claim.signatures.length / signatureByteSize;\\n require(claim.signatures.length != 0, \\\"No signatures provided\\\");\\n require(\\n claim.signatures.length % signatureByteSize == 0,\\n \\\"Malformed signatures array\\\"\\n );\\n require(\\n signaturesCount == claim.signingMembersIndices.length,\\n \\\"Unexpected signatures count\\\"\\n );\\n require(signaturesCount >= groupThreshold, \\\"Too few signatures\\\");\\n require(signaturesCount <= groupMembers.length, \\\"Too many signatures\\\");\\n\\n // Validate signing members indices. Note that `signingMembersIndices`\\n // were already partially validated during `signatures` parameter\\n // validation.\\n validateMembersIndices(\\n claim.signingMembersIndices,\\n groupMembers.length\\n );\\n\\n bytes32 signedMessageHash = keccak256(\\n abi.encode(\\n block.chainid,\\n nonce,\\n walletPubKey,\\n claim.inactiveMembersIndices,\\n claim.heartbeatFailed\\n )\\n ).toEthSignedMessageHash();\\n\\n address[] memory groupMembersAddresses = sortitionPool.getIDOperators(\\n groupMembers\\n );\\n\\n // Verify each signature.\\n bytes memory checkedSignature;\\n bool senderSignatureExists = false;\\n for (uint256 i = 0; i < signaturesCount; i++) {\\n uint256 memberIndex = claim.signingMembersIndices[i];\\n checkedSignature = claim.signatures.slice(\\n signatureByteSize * i,\\n signatureByteSize\\n );\\n address recoveredAddress = signedMessageHash.recover(\\n checkedSignature\\n );\\n\\n require(\\n groupMembersAddresses[memberIndex - 1] == recoveredAddress,\\n \\\"Invalid signature\\\"\\n );\\n\\n if (!senderSignatureExists && msg.sender == recoveredAddress) {\\n senderSignatureExists = true;\\n }\\n }\\n\\n require(senderSignatureExists, \\\"Sender must be claim signer\\\");\\n\\n inactiveMembers = new uint32[](claim.inactiveMembersIndices.length);\\n for (uint256 i = 0; i < claim.inactiveMembersIndices.length; i++) {\\n uint256 memberIndex = claim.inactiveMembersIndices[i];\\n inactiveMembers[i] = groupMembers[memberIndex - 1];\\n }\\n\\n return inactiveMembers;\\n }\\n\\n /// @notice Validates members indices array. Array is considered valid\\n /// if its size and each single index are in [1, groupSize] range,\\n /// indexes are unique, and sorted in an ascending order.\\n /// Reverts if validation fails.\\n /// @param indices Array to validate.\\n /// @param groupSize Group size used as reference.\\n function validateMembersIndices(\\n uint256[] calldata indices,\\n uint256 groupSize\\n ) internal pure {\\n require(\\n indices.length > 0 && indices.length <= groupSize,\\n \\\"Corrupted members indices\\\"\\n );\\n\\n // Check if first and last indices are in range [1, groupSize].\\n // This check combined with the loop below makes sure every single\\n // index is in the correct range.\\n require(\\n indices[0] > 0 && indices[indices.length - 1] <= groupSize,\\n \\\"Corrupted members indices\\\"\\n );\\n\\n for (uint256 i = 0; i < indices.length - 1; i++) {\\n // Check whether given index is smaller than the next one. This\\n // way we are sure indexes are ordered in the ascending order\\n // and there are no duplicates.\\n require(indices[i] < indices[i + 1], \\\"Corrupted members indices\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5ce38a16c97fbf1320e507667bc3d324e863e17ce81dc81d7fd3674e5a221ad5\",\"license\":\"GPL-3.0-only\"},\"@keep-network/ecdsa/contracts/libraries/Wallets.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\n//\\n// \\u2593\\u2593\\u258c \\u2593\\u2593 \\u2590\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c\\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c\\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\u2584\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\u2584\\u2584\\u2584 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\u2584\\u2584\\u2584 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\u2580\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\u2580\\u2580\\u2580 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\u2580\\u2580\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2580\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2588\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n//\\n// Trust math, not hardware.\\n\\npragma solidity 0.8.17;\\n\\nlibrary Wallets {\\n struct Wallet {\\n // Keccak256 hash of group members identifiers array. Group members do not\\n // include operators selected by the sortition pool that misbehaved during DKG.\\n bytes32 membersIdsHash;\\n // Uncompressed ECDSA public key stored as X and Y coordinates (32 bytes each).\\n bytes32 publicKeyX;\\n bytes32 publicKeyY;\\n // This struct doesn't contain `__gap` property as the structure is stored\\n // in a mapping, mappings store values in different slots and they are\\n // not contiguous with other values.\\n }\\n\\n struct Data {\\n // Mapping of keccak256 hashes of wallet public keys to wallet details.\\n // Hash of public key is considered an unique wallet identifier.\\n mapping(bytes32 => Wallet) registry;\\n // Reserved storage space in case we need to add more variables.\\n // See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n // slither-disable-next-line unused-state\\n uint256[49] __gap;\\n }\\n\\n /// @notice Performs preliminary validation of a new group public key.\\n /// The group public key must be unique and have 64 bytes in length.\\n /// If the validation fails, the function reverts. This function\\n /// must be called first for a public key of a wallet added with\\n /// `addWallet` function.\\n /// @param publicKey Uncompressed public key of a new wallet.\\n function validatePublicKey(Data storage self, bytes calldata publicKey)\\n internal\\n view\\n {\\n require(publicKey.length == 64, \\\"Invalid length of the public key\\\");\\n\\n bytes32 walletID = keccak256(publicKey);\\n require(\\n self.registry[walletID].publicKeyX == bytes32(0),\\n \\\"Wallet with the given public key already exists\\\"\\n );\\n\\n bytes32 publicKeyX = bytes32(publicKey[:32]);\\n require(publicKeyX != bytes32(0), \\\"Wallet public key must be non-zero\\\");\\n }\\n\\n /// @notice Registers a new wallet. This function does not validate\\n /// parameters. The code calling this function must call\\n /// `validatePublicKey` first.\\n /// @dev Uses a public key hash as a unique identifier of a wallet.\\n /// @param membersIdsHash Keccak256 hash of group members identifiers array\\n /// @param publicKey Uncompressed public key\\n /// @return walletID Wallet's ID\\n /// @return publicKeyX Wallet's public key's X coordinate\\n /// @return publicKeyY Wallet's public key's Y coordinate\\n function addWallet(\\n Data storage self,\\n bytes32 membersIdsHash,\\n bytes calldata publicKey\\n )\\n internal\\n returns (\\n bytes32 walletID,\\n bytes32 publicKeyX,\\n bytes32 publicKeyY\\n )\\n {\\n walletID = keccak256(publicKey);\\n\\n publicKeyX = bytes32(publicKey[:32]);\\n publicKeyY = bytes32(publicKey[32:]);\\n\\n self.registry[walletID].membersIdsHash = membersIdsHash;\\n self.registry[walletID].publicKeyX = publicKeyX;\\n self.registry[walletID].publicKeyY = publicKeyY;\\n }\\n\\n /// @notice Deletes wallet with the given ID from the registry. Reverts\\n /// if wallet with the given ID has not been registered or if it\\n /// has already been closed.\\n function deleteWallet(Data storage self, bytes32 walletID) internal {\\n require(\\n isWalletRegistered(self, walletID),\\n \\\"Wallet with the given ID has not been registered\\\"\\n );\\n\\n delete self.registry[walletID];\\n }\\n\\n /// @notice Checks if a wallet with the given ID is registered.\\n /// @param walletID Wallet's ID\\n /// @return True if a wallet is registered, false otherwise\\n function isWalletRegistered(Data storage self, bytes32 walletID)\\n internal\\n view\\n returns (bool)\\n {\\n return self.registry[walletID].publicKeyX != bytes32(0);\\n }\\n\\n /// @notice Returns Keccak256 hash of the wallet signing group members\\n /// identifiers array. Group members do not include operators\\n /// selected by the sortition pool that misbehaved during DKG.\\n /// Reverts if wallet with the given ID is not registered.\\n /// @param walletID ID of the wallet\\n /// @return Wallet signing group members hash\\n function getWalletMembersIdsHash(Data storage self, bytes32 walletID)\\n internal\\n view\\n returns (bytes32)\\n {\\n require(\\n isWalletRegistered(self, walletID),\\n \\\"Wallet with the given ID has not been registered\\\"\\n );\\n\\n return self.registry[walletID].membersIdsHash;\\n }\\n\\n /// @notice Gets public key of a wallet with the given wallet ID.\\n /// The public key is returned as X and Y coordinates.\\n /// Reverts if wallet with the given ID is not registered.\\n /// @param walletID ID of the wallet\\n /// @return x Public key X coordinate\\n /// @return y Public key Y coordinate\\n function getWalletPublicKeyCoordinates(Data storage self, bytes32 walletID)\\n internal\\n view\\n returns (bytes32 x, bytes32 y)\\n {\\n require(\\n isWalletRegistered(self, walletID),\\n \\\"Wallet with the given ID has not been registered\\\"\\n );\\n\\n Wallet storage wallet = self.registry[walletID];\\n\\n return (wallet.publicKeyX, wallet.publicKeyY);\\n }\\n\\n /// @notice Gets public key of a wallet with the given wallet ID.\\n /// The public key is returned in an uncompressed format as a 64-byte\\n /// concatenation of X and Y coordinates.\\n /// Reverts if wallet with the given ID is not registered.\\n /// @param walletID ID of the wallet\\n /// @return Uncompressed public key of the wallet\\n function getWalletPublicKey(Data storage self, bytes32 walletID)\\n internal\\n view\\n returns (bytes memory)\\n {\\n (bytes32 x, bytes32 y) = getWalletPublicKeyCoordinates(self, walletID);\\n return bytes.concat(x, y);\\n }\\n}\\n\",\"keccak256\":\"0x807b0de1b072dfe26b856771b3c77a2f5ae1e60c7cff6686383f88a4355748e4\",\"license\":\"GPL-3.0-only\"},\"@keep-network/random-beacon/contracts/libraries/BytesLib.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\n//\\n// \\u2593\\u2593\\u258c \\u2593\\u2593 \\u2590\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c\\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c\\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\u2584\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\u2584\\u2584\\u2584 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\u2584\\u2584\\u2584 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\u2580\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\u2580\\u2580\\u2580 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\u2580\\u2580\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2580\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2588\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n//\\n//\\n\\npragma solidity 0.8.17;\\n\\n/*\\nVersion pulled from keep-core v1:\\nhttps://github.com/keep-network/keep-core/blob/f297202db00c027978ad8e7103a356503de5773c/solidity-v1/contracts/utils/BytesLib.sol\\n\\nTo compile it with solidity 0.8 `_preBytes_slot` was replaced with `_preBytes.slot`.\\n*/\\n\\n/*\\nhttps://github.com/GNSPS/solidity-bytes-utils/\\nThis is free and unencumbered software released into the public domain.\\nAnyone is free to copy, modify, publish, use, compile, sell, or\\ndistribute this software, either in source code form or as a compiled\\nbinary, for any purpose, commercial or non-commercial, and by any\\nmeans.\\nIn jurisdictions that recognize copyright laws, the author or authors\\nof this software dedicate any and all copyright interest in the\\nsoftware to the public domain. We make this dedication for the benefit\\nof the public at large and to the detriment of our heirs and\\nsuccessors. We intend this dedication to be an overt act of\\nrelinquishment in perpetuity of all present and future rights to this\\nsoftware under copyright law.\\nTHE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND,\\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\\nIN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\\nOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\\nOTHER DEALINGS IN THE SOFTWARE.\\nFor more information, please refer to <https://unlicense.org>\\n*/\\n\\n/** @title BytesLib **/\\n/** @author https://github.com/GNSPS **/\\n\\nlibrary BytesLib {\\n function concatStorage(bytes storage _preBytes, bytes memory _postBytes)\\n internal\\n {\\n assembly {\\n // Read the first 32 bytes of _preBytes storage, which is the length\\n // of the array. (We don't need to use the offset into the slot\\n // because arrays use the entire slot.)\\n let fslot := sload(_preBytes.slot)\\n // Arrays of 31 bytes or less have an even value in their slot,\\n // while longer arrays have an odd value. The actual length is\\n // the slot divided by two for odd values, and the lowest order\\n // byte divided by two for even values.\\n // If the slot is even, bitwise and the slot with 255 and divide by\\n // two to get the length. If the slot is odd, bitwise and the slot\\n // with -1 and divide by two.\\n let slength := div(\\n and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)),\\n 2\\n )\\n let mlength := mload(_postBytes)\\n let newlength := add(slength, mlength)\\n // slength can contain both the length and contents of the array\\n // if length < 32 bytes so let's prepare for that\\n // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\\n switch add(lt(slength, 32), lt(newlength, 32))\\n case 2 {\\n // Since the new array still fits in the slot, we just need to\\n // update the contents of the slot.\\n // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length\\n sstore(\\n _preBytes.slot,\\n // all the modifications to the slot are inside this\\n // next block\\n add(\\n // we can just add to the slot contents because the\\n // bytes we want to change are the LSBs\\n fslot,\\n add(\\n mul(\\n div(\\n // load the bytes from memory\\n mload(add(_postBytes, 0x20)),\\n // zero all bytes to the right\\n exp(0x100, sub(32, mlength))\\n ),\\n // and now shift left the number of bytes to\\n // leave space for the length in the slot\\n exp(0x100, sub(32, newlength))\\n ),\\n // increase length by the double of the memory\\n // bytes length\\n mul(mlength, 2)\\n )\\n )\\n )\\n }\\n case 1 {\\n // The stored value fits in the slot, but the combined value\\n // will exceed it.\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n let sc := add(keccak256(0x0, 0x20), div(slength, 32))\\n\\n // save new length\\n sstore(_preBytes.slot, add(mul(newlength, 2), 1))\\n\\n // The contents of the _postBytes array start 32 bytes into\\n // the structure. Our first read should obtain the `submod`\\n // bytes that can fit into the unused space in the last word\\n // of the stored array. To get this, we read 32 bytes starting\\n // from `submod`, so the data we read overlaps with the array\\n // contents by `submod` bytes. Masking the lowest-order\\n // `submod` bytes allows us to add that value directly to the\\n // stored value.\\n\\n let submod := sub(32, slength)\\n let mc := add(_postBytes, submod)\\n let end := add(_postBytes, mlength)\\n let mask := sub(exp(0x100, submod), 1)\\n\\n sstore(\\n sc,\\n add(\\n and(\\n fslot,\\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00\\n ),\\n and(mload(mc), mask)\\n )\\n )\\n\\n for {\\n mc := add(mc, 0x20)\\n sc := add(sc, 1)\\n } lt(mc, end) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n sstore(sc, mload(mc))\\n }\\n\\n mask := exp(0x100, sub(mc, end))\\n\\n sstore(sc, mul(div(mload(mc), mask), mask))\\n }\\n default {\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n // Start copying to the last used word of the stored array.\\n let sc := add(keccak256(0x0, 0x20), div(slength, 32))\\n\\n // save new length\\n sstore(_preBytes.slot, add(mul(newlength, 2), 1))\\n\\n // Copy over the first `submod` bytes of the new data as in\\n // case 1 above.\\n let slengthmod := mod(slength, 32)\\n let submod := sub(32, slengthmod)\\n let mc := add(_postBytes, submod)\\n let end := add(_postBytes, mlength)\\n let mask := sub(exp(0x100, submod), 1)\\n\\n sstore(sc, add(sload(sc), and(mload(mc), mask)))\\n\\n for {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } lt(mc, end) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n sstore(sc, mload(mc))\\n }\\n\\n mask := exp(0x100, sub(mc, end))\\n\\n sstore(sc, mul(div(mload(mc), mask), mask))\\n }\\n }\\n }\\n\\n function equalStorage(bytes storage _preBytes, bytes memory _postBytes)\\n internal\\n view\\n returns (bool)\\n {\\n bool success = true;\\n\\n assembly {\\n // we know _preBytes_offset is 0\\n let fslot := sload(_preBytes.slot)\\n // Decode the length of the stored array like in concatStorage().\\n let slength := div(\\n and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)),\\n 2\\n )\\n let mlength := mload(_postBytes)\\n\\n // if lengths don't match the arrays are not equal\\n switch eq(slength, mlength)\\n case 1 {\\n // slength can contain both the length and contents of the array\\n // if length < 32 bytes so let's prepare for that\\n // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\\n if iszero(iszero(slength)) {\\n switch lt(slength, 32)\\n case 1 {\\n // blank the last byte which is the length\\n fslot := mul(div(fslot, 0x100), 0x100)\\n\\n if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) {\\n // unsuccess:\\n success := 0\\n }\\n }\\n default {\\n // cb is a circuit breaker in the for loop since there's\\n // no said feature for inline assembly loops\\n // cb = 1 - don't breaker\\n // cb = 0 - break\\n let cb := 1\\n\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n let sc := keccak256(0x0, 0x20)\\n\\n let mc := add(_postBytes, 0x20)\\n let end := add(mc, mlength)\\n\\n // the next line is the loop condition:\\n // while(uint(mc < end) + cb == 2)\\n for {\\n\\n } eq(add(lt(mc, end), cb), 2) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n if iszero(eq(sload(sc), mload(mc))) {\\n // unsuccess:\\n success := 0\\n cb := 0\\n }\\n }\\n }\\n }\\n }\\n default {\\n // unsuccess:\\n success := 0\\n }\\n }\\n\\n return success;\\n }\\n\\n function concat(bytes memory _preBytes, bytes memory _postBytes)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory tempBytes;\\n\\n assembly {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // Store the length of the first bytes array at the beginning of\\n // the memory for tempBytes.\\n let length := mload(_preBytes)\\n mstore(tempBytes, length)\\n\\n // Maintain a memory counter for the current write location in the\\n // temp bytes array by adding the 32 bytes for the array length to\\n // the starting location.\\n let mc := add(tempBytes, 0x20)\\n // Stop copying when the memory counter reaches the length of the\\n // first bytes array.\\n let end := add(mc, length)\\n\\n for {\\n // Initialize a copy counter to the start of the _preBytes data,\\n // 32 bytes into its memory.\\n let cc := add(_preBytes, 0x20)\\n } lt(mc, end) {\\n // Increase both counters by 32 bytes each iteration.\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // Write the _preBytes data into the tempBytes memory 32 bytes\\n // at a time.\\n mstore(mc, mload(cc))\\n }\\n\\n // Add the length of _postBytes to the current length of tempBytes\\n // and store it as the new length in the first 32 bytes of the\\n // tempBytes memory.\\n length := mload(_postBytes)\\n mstore(tempBytes, add(length, mload(tempBytes)))\\n\\n // Move the memory counter back from a multiple of 0x20 to the\\n // actual end of the _preBytes data.\\n mc := end\\n // Stop copying when the memory counter reaches the new combined\\n // length of the arrays.\\n end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n // Update the free-memory pointer by padding our last write location\\n // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\\n // next 32 byte block, then round down to the nearest multiple of\\n // 32. If the sum of the length of the two arrays is zero then add\\n // one before rounding down to leave a blank 32 bytes (the length block with 0).\\n mstore(\\n 0x40,\\n and(\\n add(add(end, iszero(add(length, mload(_preBytes)))), 31),\\n not(31) // Round down to the nearest 32 bytes.\\n )\\n )\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory res) {\\n uint256 _end = _start + _length;\\n require(_end > _start && _bytes.length >= _end, \\\"Slice out of bounds\\\");\\n\\n assembly {\\n // Alloc bytes array with additional 32 bytes afterspace and assign it's size\\n res := mload(0x40)\\n mstore(0x40, add(add(res, 64), _length))\\n mstore(res, _length)\\n\\n // Compute distance between source and destination pointers\\n let diff := sub(res, add(_bytes, _start))\\n\\n for {\\n let src := add(add(_bytes, 32), _start)\\n let end := add(src, _length)\\n } lt(src, end) {\\n src := add(src, 32)\\n } {\\n mstore(add(src, diff), mload(src))\\n }\\n }\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start)\\n internal\\n pure\\n returns (address)\\n {\\n uint256 _totalLen = _start + 20;\\n require(\\n _totalLen > _start && _bytes.length >= _totalLen,\\n \\\"Address conversion out of bounds.\\\"\\n );\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(\\n mload(add(add(_bytes, 0x20), _start)),\\n 0x1000000000000000000000000\\n )\\n }\\n\\n return tempAddress;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start)\\n internal\\n pure\\n returns (uint8)\\n {\\n require(\\n _bytes.length >= (_start + 1),\\n \\\"Uint8 conversion out of bounds.\\\"\\n );\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint(bytes memory _bytes, uint256 _start)\\n internal\\n pure\\n returns (uint256)\\n {\\n uint256 _totalLen = _start + 32;\\n require(\\n _totalLen > _start && _bytes.length >= _totalLen,\\n \\\"Uint conversion out of bounds.\\\"\\n );\\n uint256 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x20), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function equal(bytes memory _preBytes, bytes memory _postBytes)\\n internal\\n pure\\n returns (bool)\\n {\\n bool success = true;\\n\\n assembly {\\n let length := mload(_preBytes)\\n\\n // if lengths don't match the arrays are not equal\\n switch eq(length, mload(_postBytes))\\n case 1 {\\n // cb is a circuit breaker in the for loop since there's\\n // no said feature for inline assembly loops\\n // cb = 1 - don't breaker\\n // cb = 0 - break\\n let cb := 1\\n\\n let mc := add(_preBytes, 0x20)\\n let end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n // the next line is the loop condition:\\n // while(uint(mc < end) + cb == 2)\\n } eq(add(lt(mc, end), cb), 2) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // if any of these checks fails then arrays are not equal\\n if iszero(eq(mload(mc), mload(cc))) {\\n // unsuccess:\\n success := 0\\n cb := 0\\n }\\n }\\n }\\n default {\\n // unsuccess:\\n success := 0\\n }\\n }\\n\\n return success;\\n }\\n\\n function toBytes32(bytes memory _source)\\n internal\\n pure\\n returns (bytes32 result)\\n {\\n if (_source.length == 0) {\\n return 0x0;\\n }\\n\\n assembly {\\n result := mload(add(_source, 32))\\n }\\n }\\n\\n function keccak256Slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes32 result) {\\n uint256 _end = _start + _length;\\n require(_end > _start && _bytes.length >= _end, \\\"Slice out of bounds\\\");\\n\\n assembly {\\n result := keccak256(add(add(_bytes, 32), _start), _length)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3b76e2fe36eb777440250dcf2ea7a689375e8af22f3cc33521095ff6954becdb\",\"license\":\"GPL-3.0-only\"},\"@keep-network/sortition-pools/contracts/Branch.sol\":{\"content\":\"pragma solidity 0.8.17;\\n\\nimport \\\"./Constants.sol\\\";\\n\\n/// @notice The implicit 8-ary trees of the sortition pool\\n/// rely on packing 8 \\\"slots\\\" of 32-bit values into each uint256.\\n/// The Branch library permits efficient calculations on these slots.\\nlibrary Branch {\\n /// @notice Calculate the right shift required\\n /// to make the 32 least significant bits of an uint256\\n /// be the bits of the `position`th slot\\n /// when treating the uint256 as a uint32[8].\\n ///\\n /// @dev Not used for efficiency reasons,\\n /// but left to illustrate the meaning of a common pattern.\\n /// I wish solidity had macros, even C macros.\\n function slotShift(uint256 position) internal pure returns (uint256) {\\n unchecked {\\n return position * Constants.SLOT_WIDTH;\\n }\\n }\\n\\n /// @notice Return the `position`th slot of the `node`,\\n /// treating `node` as a uint32[32].\\n function getSlot(uint256 node, uint256 position)\\n internal\\n pure\\n returns (uint256)\\n {\\n unchecked {\\n uint256 shiftBits = position * Constants.SLOT_WIDTH;\\n // Doing a bitwise AND with `SLOT_MAX`\\n // clears all but the 32 least significant bits.\\n // Because of the right shift by `slotShift(position)` bits,\\n // those 32 bits contain the 32 bits in the `position`th slot of `node`.\\n return (node >> shiftBits) & Constants.SLOT_MAX;\\n }\\n }\\n\\n /// @notice Return `node` with the `position`th slot set to zero.\\n function clearSlot(uint256 node, uint256 position)\\n internal\\n pure\\n returns (uint256)\\n {\\n unchecked {\\n uint256 shiftBits = position * Constants.SLOT_WIDTH;\\n // Shifting `SLOT_MAX` left by `slotShift(position)` bits\\n // gives us a number where all bits of the `position`th slot are set,\\n // and all other bits are unset.\\n //\\n // Using a bitwise NOT on this number,\\n // we get a uint256 where all bits are set\\n // except for those of the `position`th slot.\\n //\\n // Bitwise ANDing the original `node` with this number\\n // sets the bits of `position`th slot to zero,\\n // leaving all other bits unchanged.\\n return node & ~(Constants.SLOT_MAX << shiftBits);\\n }\\n }\\n\\n /// @notice Return `node` with the `position`th slot set to `weight`.\\n ///\\n /// @param weight The weight of of the node.\\n /// Safely truncated to a 32-bit number,\\n /// but this should never be called with an overflowing weight regardless.\\n function setSlot(\\n uint256 node,\\n uint256 position,\\n uint256 weight\\n ) internal pure returns (uint256) {\\n unchecked {\\n uint256 shiftBits = position * Constants.SLOT_WIDTH;\\n // Clear the `position`th slot like in `clearSlot()`.\\n uint256 clearedNode = node & ~(Constants.SLOT_MAX << shiftBits);\\n // Bitwise AND `weight` with `SLOT_MAX`\\n // to clear all but the 32 least significant bits.\\n //\\n // Shift this left by `slotShift(position)` bits\\n // to obtain a uint256 with all bits unset\\n // except in the `position`th slot\\n // which contains the 32-bit value of `weight`.\\n uint256 shiftedWeight = (weight & Constants.SLOT_MAX) << shiftBits;\\n // When we bitwise OR these together,\\n // all other slots except the `position`th one come from the left argument,\\n // and the `position`th gets filled with `weight` from the right argument.\\n return clearedNode | shiftedWeight;\\n }\\n }\\n\\n /// @notice Calculate the summed weight of all slots in the `node`.\\n function sumWeight(uint256 node) internal pure returns (uint256 sum) {\\n unchecked {\\n sum = node & Constants.SLOT_MAX;\\n // Iterate through each slot\\n // by shifting `node` right in increments of 32 bits,\\n // and adding the 32 least significant bits to the `sum`.\\n uint256 newNode = node >> Constants.SLOT_WIDTH;\\n while (newNode > 0) {\\n sum += (newNode & Constants.SLOT_MAX);\\n newNode = newNode >> Constants.SLOT_WIDTH;\\n }\\n return sum;\\n }\\n }\\n\\n /// @notice Pick a slot in `node` that corresponds to `index`.\\n /// Treats the node like an array of virtual stakers,\\n /// the number of virtual stakers in each slot corresponding to its weight,\\n /// and picks which slot contains the `index`th virtual staker.\\n ///\\n /// @dev Requires that `index` be lower than `sumWeight(node)`.\\n /// However, this is not enforced for performance reasons.\\n /// If `index` exceeds the permitted range,\\n /// `pickWeightedSlot()` returns the rightmost slot\\n /// and an excessively high `newIndex`.\\n ///\\n /// @return slot The slot of `node` containing the `index`th virtual staker.\\n ///\\n /// @return newIndex The index of the `index`th virtual staker of `node`\\n /// within the returned slot.\\n function pickWeightedSlot(uint256 node, uint256 index)\\n internal\\n pure\\n returns (uint256 slot, uint256 newIndex)\\n {\\n unchecked {\\n newIndex = index;\\n uint256 newNode = node;\\n uint256 currentSlotWeight = newNode & Constants.SLOT_MAX;\\n while (newIndex >= currentSlotWeight) {\\n newIndex -= currentSlotWeight;\\n slot++;\\n newNode = newNode >> Constants.SLOT_WIDTH;\\n currentSlotWeight = newNode & Constants.SLOT_MAX;\\n }\\n return (slot, newIndex);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa7fb1c9c9789f30493e9a40e24a24f46875dc5e7630b4f67478167759f6d1882\"},\"@keep-network/sortition-pools/contracts/Chaosnet.sol\":{\"content\":\"pragma solidity 0.8.17;\\n\\n/// @title Chaosnet\\n/// @notice This is a beta staker program for stakers willing to go the extra\\n/// mile with monitoring, share their logs with the dev team, and allow to more\\n/// carefully monitor the bootstrapping network. As the network matures, the\\n/// beta program will be ended.\\ncontract Chaosnet {\\n /// @notice Indicates if the chaosnet is active. The chaosnet is active\\n /// after the contract deployment and can be ended with a call to\\n /// `deactivateChaosnet()`. Once deactivated chaosnet can not be activated\\n /// again.\\n bool public isChaosnetActive;\\n\\n /// @notice Indicates if the given operator is a beta operator for chaosnet.\\n mapping(address => bool) public isBetaOperator;\\n\\n /// @notice Address controlling chaosnet status and beta operator addresses.\\n address public chaosnetOwner;\\n\\n event BetaOperatorsAdded(address[] operators);\\n\\n event ChaosnetOwnerRoleTransferred(\\n address oldChaosnetOwner,\\n address newChaosnetOwner\\n );\\n\\n event ChaosnetDeactivated();\\n\\n constructor() {\\n _transferChaosnetOwner(msg.sender);\\n isChaosnetActive = true;\\n }\\n\\n modifier onlyChaosnetOwner() {\\n require(msg.sender == chaosnetOwner, \\\"Not the chaosnet owner\\\");\\n _;\\n }\\n\\n modifier onlyOnChaosnet() {\\n require(isChaosnetActive, \\\"Chaosnet is not active\\\");\\n _;\\n }\\n\\n /// @notice Adds beta operator to chaosnet. Can be called only by the\\n /// chaosnet owner when the chaosnet is active. Once the operator is added\\n /// as a beta operator, it can not be removed.\\n function addBetaOperators(address[] calldata operators)\\n public\\n onlyOnChaosnet\\n onlyChaosnetOwner\\n {\\n for (uint256 i = 0; i < operators.length; i++) {\\n isBetaOperator[operators[i]] = true;\\n }\\n\\n emit BetaOperatorsAdded(operators);\\n }\\n\\n /// @notice Deactivates the chaosnet. Can be called only by the chaosnet\\n /// owner. Once deactivated chaosnet can not be activated again.\\n function deactivateChaosnet() public onlyOnChaosnet onlyChaosnetOwner {\\n isChaosnetActive = false;\\n emit ChaosnetDeactivated();\\n }\\n\\n /// @notice Transfers the chaosnet owner role to another non-zero address.\\n function transferChaosnetOwnerRole(address newChaosnetOwner)\\n public\\n onlyChaosnetOwner\\n {\\n require(\\n newChaosnetOwner != address(0),\\n \\\"New chaosnet owner must not be zero address\\\"\\n );\\n _transferChaosnetOwner(newChaosnetOwner);\\n }\\n\\n function _transferChaosnetOwner(address newChaosnetOwner) internal {\\n address oldChaosnetOwner = chaosnetOwner;\\n chaosnetOwner = newChaosnetOwner;\\n emit ChaosnetOwnerRoleTransferred(oldChaosnetOwner, newChaosnetOwner);\\n }\\n}\\n\",\"keccak256\":\"0xeaf7bdd5626f88c329793a012621039692ce1b6e1f13013997ddb13d7e3032df\"},\"@keep-network/sortition-pools/contracts/Constants.sol\":{\"content\":\"pragma solidity 0.8.17;\\n\\nlibrary Constants {\\n ////////////////////////////////////////////////////////////////////////////\\n // Parameters for configuration\\n\\n // How many bits a position uses per level of the tree;\\n // each branch of the tree contains 2**SLOT_BITS slots.\\n uint256 constant SLOT_BITS = 3;\\n uint256 constant LEVELS = 7;\\n ////////////////////////////////////////////////////////////////////////////\\n\\n ////////////////////////////////////////////////////////////////////////////\\n // Derived constants, do not touch\\n uint256 constant SLOT_COUNT = 2**SLOT_BITS;\\n uint256 constant SLOT_WIDTH = 256 / SLOT_COUNT;\\n uint256 constant LAST_SLOT = SLOT_COUNT - 1;\\n uint256 constant SLOT_MAX = (2**SLOT_WIDTH) - 1;\\n uint256 constant POOL_CAPACITY = SLOT_COUNT**LEVELS;\\n\\n uint256 constant ID_WIDTH = SLOT_WIDTH;\\n uint256 constant ID_MAX = SLOT_MAX;\\n\\n uint256 constant BLOCKHEIGHT_WIDTH = 96 - ID_WIDTH;\\n uint256 constant BLOCKHEIGHT_MAX = (2**BLOCKHEIGHT_WIDTH) - 1;\\n\\n uint256 constant SLOT_POINTER_MAX = (2**SLOT_BITS) - 1;\\n uint256 constant LEAF_FLAG = 1 << 255;\\n\\n uint256 constant WEIGHT_WIDTH = 256 / SLOT_COUNT;\\n ////////////////////////////////////////////////////////////////////////////\\n}\\n\",\"keccak256\":\"0xaef690ced707935745ff1482b7bb9bd9eb77bf6a39c717465e64cf12db8a7d39\"},\"@keep-network/sortition-pools/contracts/Leaf.sol\":{\"content\":\"pragma solidity 0.8.17;\\n\\nimport \\\"./Constants.sol\\\";\\n\\nlibrary Leaf {\\n function make(\\n address _operator,\\n uint256 _creationBlock,\\n uint256 _id\\n ) internal pure returns (uint256) {\\n assert(_creationBlock <= type(uint64).max);\\n assert(_id <= type(uint32).max);\\n // Converting a bytesX type into a larger type\\n // adds zero bytes on the right.\\n uint256 op = uint256(bytes32(bytes20(_operator)));\\n // Bitwise AND the id to erase\\n // all but the 32 least significant bits\\n uint256 uid = _id & Constants.ID_MAX;\\n // Erase all but the 64 least significant bits,\\n // then shift left by 32 bits to make room for the id\\n uint256 cb = (_creationBlock & Constants.BLOCKHEIGHT_MAX) <<\\n Constants.ID_WIDTH;\\n // Bitwise OR them all together to get\\n // [address operator || uint64 creationBlock || uint32 id]\\n return (op | cb | uid);\\n }\\n\\n function operator(uint256 leaf) internal pure returns (address) {\\n // Converting a bytesX type into a smaller type\\n // truncates it on the right.\\n return address(bytes20(bytes32(leaf)));\\n }\\n\\n /// @notice Return the block number the leaf was created in.\\n function creationBlock(uint256 leaf) internal pure returns (uint256) {\\n return ((leaf >> Constants.ID_WIDTH) & Constants.BLOCKHEIGHT_MAX);\\n }\\n\\n function id(uint256 leaf) internal pure returns (uint32) {\\n // Id is stored in the 32 least significant bits.\\n // Bitwise AND ensures that we only get the contents of those bits.\\n return uint32(leaf & Constants.ID_MAX);\\n }\\n}\\n\",\"keccak256\":\"0xbd107a1a43e48884885e5e966ffcbcd8fa5e89863715d717bb4006e9f89cdc2b\"},\"@keep-network/sortition-pools/contracts/Position.sol\":{\"content\":\"pragma solidity 0.8.17;\\n\\nimport \\\"./Constants.sol\\\";\\n\\nlibrary Position {\\n // Return the last 3 bits of a position number,\\n // corresponding to its slot in its parent\\n function slot(uint256 a) internal pure returns (uint256) {\\n return a & Constants.SLOT_POINTER_MAX;\\n }\\n\\n // Return the parent of a position number\\n function parent(uint256 a) internal pure returns (uint256) {\\n return a >> Constants.SLOT_BITS;\\n }\\n\\n // Return the location of the child of a at the given slot\\n function child(uint256 a, uint256 s) internal pure returns (uint256) {\\n return (a << Constants.SLOT_BITS) | (s & Constants.SLOT_POINTER_MAX); // slot(s)\\n }\\n\\n // Return the uint p as a flagged position uint:\\n // the least significant 21 bits contain the position\\n // and the 22nd bit is set as a flag\\n // to distinguish the position 0x000000 from an empty field.\\n function setFlag(uint256 p) internal pure returns (uint256) {\\n return p | Constants.LEAF_FLAG;\\n }\\n\\n // Turn a flagged position into an unflagged position\\n // by removing the flag at the 22nd least significant bit.\\n //\\n // We shouldn't _actually_ need this\\n // as all position-manipulating code should ignore non-position bits anyway\\n // but it's cheap to call so might as well do it.\\n function unsetFlag(uint256 p) internal pure returns (uint256) {\\n return p & (~Constants.LEAF_FLAG);\\n }\\n}\\n\",\"keccak256\":\"0xd3a927908080ac21353a92a6bce3d69e94a5c30f6b51f16b271b6cc679f110e2\"},\"@keep-network/sortition-pools/contracts/RNG.sol\":{\"content\":\"pragma solidity 0.8.17;\\n\\nimport \\\"./Leaf.sol\\\";\\nimport \\\"./Constants.sol\\\";\\n\\nlibrary RNG {\\n /// @notice Get an index in the range `[0 .. range-1]`\\n /// and the new state of the RNG,\\n /// using the provided `state` of the RNG.\\n ///\\n /// @param range The upper bound of the index, exclusive.\\n ///\\n /// @param state The previous state of the RNG.\\n /// The initial state needs to be obtained\\n /// from a trusted randomness oracle (the random beacon),\\n /// or from a chain of earlier calls to `RNG.getIndex()`\\n /// on an originally trusted seed.\\n ///\\n /// @dev Calculates the number of bits required for the desired range,\\n /// takes the least significant bits of `state`\\n /// and checks if the obtained index is within the desired range.\\n /// The original state is hashed with `keccak256` to get a new state.\\n /// If the index is outside the range,\\n /// the function retries until it gets a suitable index.\\n ///\\n /// @return index A random integer between `0` and `range - 1`, inclusive.\\n ///\\n /// @return newState The new state of the RNG.\\n /// When `getIndex()` is called one or more times,\\n /// care must be taken to always use the output `state`\\n /// of the most recent call as the input `state` of a subsequent call.\\n /// At the end of a transaction calling `RNG.getIndex()`,\\n /// the previous stored state must be overwritten with the latest output.\\n function getIndex(\\n uint256 range,\\n bytes32 state,\\n uint256 bits\\n ) internal view returns (uint256, bytes32) {\\n bool found = false;\\n uint256 index = 0;\\n bytes32 newState = state;\\n while (!found) {\\n index = truncate(bits, uint256(newState));\\n newState = keccak256(abi.encodePacked(newState, address(this)));\\n if (index < range) {\\n found = true;\\n }\\n }\\n return (index, newState);\\n }\\n\\n /// @notice Calculate how many bits are required\\n /// for an index in the range `[0 .. range-1]`.\\n ///\\n /// @param range The upper bound of the desired range, exclusive.\\n ///\\n /// @return uint The smallest number of bits\\n /// that can contain the number `range-1`.\\n function bitsRequired(uint256 range) internal pure returns (uint256) {\\n unchecked {\\n if (range == 1) {\\n return 0;\\n }\\n\\n uint256 bits = Constants.WEIGHT_WIDTH - 1;\\n\\n // Left shift by `bits`,\\n // so we have a 1 in the (bits + 1)th least significant bit\\n // and 0 in other bits.\\n // If this number is equal or greater than `range`,\\n // the range [0, range-1] fits in `bits` bits.\\n //\\n // Because we loop from high bits to low bits,\\n // we find the highest number of bits that doesn't fit the range,\\n // and return that number + 1.\\n while (1 << bits >= range) {\\n bits--;\\n }\\n\\n return bits + 1;\\n }\\n }\\n\\n /// @notice Truncate `input` to the `bits` least significant bits.\\n function truncate(uint256 bits, uint256 input)\\n internal\\n pure\\n returns (uint256)\\n {\\n unchecked {\\n return input & ((1 << bits) - 1);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x67f87f589cd5123ffa32f883ea2f09b0e56258508bae82b8c655b3c27c71eb5e\"},\"@keep-network/sortition-pools/contracts/Rewards.sol\":{\"content\":\"pragma solidity 0.8.17;\\n\\n/// @title Rewards\\n/// @notice Rewards are allocated proportionally to operators\\n/// present in the pool at payout based on their weight in the pool.\\n///\\n/// To facilitate this, we use a global accumulator value\\n/// to track the total rewards one unit of weight would've earned\\n/// since the creation of the pool.\\n///\\n/// Whenever a reward is paid, the accumulator is increased\\n/// by the size of the reward divided by the total weight\\n/// of all eligible operators in the pool.\\n///\\n/// Each operator has an individual accumulator value,\\n/// set to equal the global accumulator when the operator joins the pool.\\n/// This accumulator reflects the amount of rewards\\n/// that have already been accounted for with that operator.\\n///\\n/// Whenever an operator's weight in the pool changes,\\n/// we can update the amount of rewards the operator has earned\\n/// by subtracting the operator's accumulator from the global accumulator.\\n/// This gives us the amount of rewards one unit of weight has earned\\n/// since the last time the operator's rewards have been updated.\\n/// Then we multiply that by the operator's previous (pre-change) weight\\n/// to determine how much rewards in total the operator has earned,\\n/// and add this to the operator's earned rewards.\\n/// Finally, we set the operator's accumulator to the global accumulator value.\\ncontract Rewards {\\n struct OperatorRewards {\\n // The state of the global accumulator\\n // when the operator's rewards were last updated\\n uint96 accumulated;\\n // The amount of rewards collected by the operator after the latest update.\\n // The amount the operator could withdraw may equal `available`\\n // or it may be greater, if more rewards have been paid in since then.\\n // To evaulate the most recent amount including rewards potentially paid\\n // since the last update, use `availableRewards` function.\\n uint96 available;\\n // If nonzero, the operator is ineligible for rewards\\n // and may only re-enable rewards after the specified timestamp.\\n // XXX: unsigned 32-bit integer unix seconds, will break around 2106\\n uint32 ineligibleUntil;\\n // Locally cached weight of the operator,\\n // used to reduce the cost of setting operators ineligible.\\n uint32 weight;\\n }\\n\\n // The global accumulator of how much rewards\\n // a hypothetical operator of weight 1 would have earned\\n // since the creation of the pool.\\n uint96 internal globalRewardAccumulator;\\n // If the amount of reward tokens paid in\\n // does not divide cleanly by pool weight,\\n // the difference is recorded as rounding dust\\n // and added to the next reward.\\n uint96 internal rewardRoundingDust;\\n\\n // The amount of rewards that would've been earned by ineligible operators\\n // had they not been ineligible.\\n uint96 public ineligibleEarnedRewards;\\n\\n // Ineligibility times are calculated from this offset,\\n // set at contract creation.\\n uint256 internal immutable ineligibleOffsetStart;\\n\\n mapping(uint32 => OperatorRewards) internal operatorRewards;\\n\\n constructor() {\\n // solhint-disable-next-line not-rely-on-time\\n ineligibleOffsetStart = block.timestamp;\\n }\\n\\n /// @notice Return whether the operator is eligible for rewards or not.\\n function isEligibleForRewards(uint32 operator) internal view returns (bool) {\\n return operatorRewards[operator].ineligibleUntil == 0;\\n }\\n\\n /// @notice Return the time the operator's reward eligibility can be restored.\\n function rewardsEligibilityRestorableAt(uint32 operator)\\n internal\\n view\\n returns (uint256)\\n {\\n uint32 until = operatorRewards[operator].ineligibleUntil;\\n require(until != 0, \\\"Operator already eligible\\\");\\n return (uint256(until) + ineligibleOffsetStart);\\n }\\n\\n /// @notice Return whether the operator is able to restore their eligibility\\n /// for rewards right away.\\n function canRestoreRewardEligibility(uint32 operator)\\n internal\\n view\\n returns (bool)\\n {\\n // solhint-disable-next-line not-rely-on-time\\n return rewardsEligibilityRestorableAt(operator) <= block.timestamp;\\n }\\n\\n /// @notice Internal function for updating the global state of rewards.\\n function addRewards(uint96 rewardAmount, uint32 currentPoolWeight) internal {\\n require(currentPoolWeight > 0, \\\"No recipients in pool\\\");\\n\\n uint96 totalAmount = rewardAmount + rewardRoundingDust;\\n uint96 perWeightReward = totalAmount / currentPoolWeight;\\n uint96 newRoundingDust = totalAmount % currentPoolWeight;\\n\\n globalRewardAccumulator += perWeightReward;\\n rewardRoundingDust = newRoundingDust;\\n }\\n\\n /// @notice Internal function for updating the operator's reward state.\\n function updateOperatorRewards(uint32 operator, uint32 newWeight) internal {\\n uint96 acc = globalRewardAccumulator;\\n OperatorRewards memory o = operatorRewards[operator];\\n uint96 accruedRewards = (acc - o.accumulated) * uint96(o.weight);\\n if (o.ineligibleUntil == 0) {\\n // If operator is not ineligible, update their earned rewards\\n o.available += accruedRewards;\\n } else {\\n // If ineligible, put the rewards into the ineligible pot\\n ineligibleEarnedRewards += accruedRewards;\\n }\\n // In any case, update their accumulator and weight\\n o.accumulated = acc;\\n o.weight = newWeight;\\n operatorRewards[operator] = o;\\n }\\n\\n /// @notice Set the amount of withdrawable tokens to zero\\n /// and return the previous withdrawable amount.\\n /// @dev Does not update the withdrawable amount,\\n /// but should usually be accompanied by an update.\\n function withdrawOperatorRewards(uint32 operator)\\n internal\\n returns (uint96 withdrawable)\\n {\\n OperatorRewards storage o = operatorRewards[operator];\\n withdrawable = o.available;\\n o.available = 0;\\n }\\n\\n /// @notice Set the amount of ineligible-earned tokens to zero\\n /// and return the previous amount.\\n function withdrawIneligibleRewards() internal returns (uint96 withdrawable) {\\n withdrawable = ineligibleEarnedRewards;\\n ineligibleEarnedRewards = 0;\\n }\\n\\n /// @notice Set the given operators as ineligible for rewards.\\n /// The operators can restore their eligibility at the given time.\\n function setIneligible(uint32[] memory operators, uint256 until) internal {\\n OperatorRewards memory o = OperatorRewards(0, 0, 0, 0);\\n uint96 globalAcc = globalRewardAccumulator;\\n uint96 accrued = 0;\\n // Record ineligibility as seconds after contract creation\\n uint32 _until = uint32(until - ineligibleOffsetStart);\\n\\n for (uint256 i = 0; i < operators.length; i++) {\\n uint32 operator = operators[i];\\n OperatorRewards storage r = operatorRewards[operator];\\n o.available = r.available;\\n o.accumulated = r.accumulated;\\n o.ineligibleUntil = r.ineligibleUntil;\\n o.weight = r.weight;\\n\\n if (o.ineligibleUntil != 0) {\\n // If operator is already ineligible,\\n // don't earn rewards or shorten its ineligibility\\n if (o.ineligibleUntil < _until) {\\n o.ineligibleUntil = _until;\\n }\\n } else {\\n // The operator becomes ineligible -> earn rewards\\n o.ineligibleUntil = _until;\\n accrued = (globalAcc - o.accumulated) * uint96(o.weight);\\n o.available += accrued;\\n }\\n o.accumulated = globalAcc;\\n\\n r.available = o.available;\\n r.accumulated = o.accumulated;\\n r.ineligibleUntil = o.ineligibleUntil;\\n r.weight = o.weight;\\n }\\n }\\n\\n /// @notice Restore the given operator's eligibility for rewards.\\n function restoreEligibility(uint32 operator) internal {\\n // solhint-disable-next-line not-rely-on-time\\n require(canRestoreRewardEligibility(operator), \\\"Operator still ineligible\\\");\\n uint96 acc = globalRewardAccumulator;\\n OperatorRewards memory o = operatorRewards[operator];\\n uint96 accruedRewards = (acc - o.accumulated) * uint96(o.weight);\\n ineligibleEarnedRewards += accruedRewards;\\n o.accumulated = acc;\\n o.ineligibleUntil = 0;\\n operatorRewards[operator] = o;\\n }\\n\\n /// @notice Returns the amount of rewards currently available for withdrawal\\n /// for the given operator.\\n function availableRewards(uint32 operator) internal view returns (uint96) {\\n uint96 acc = globalRewardAccumulator;\\n OperatorRewards memory o = operatorRewards[operator];\\n if (o.ineligibleUntil == 0) {\\n // If operator is not ineligible, calculate newly accrued rewards and add\\n // them to the available ones, calculated during the last update.\\n uint96 accruedRewards = (acc - o.accumulated) * uint96(o.weight);\\n return o.available + accruedRewards;\\n } else {\\n // If ineligible, return only the rewards calculated during the last\\n // update.\\n return o.available;\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3a10abb408b44335a092387b2c7ee01db3b27997f1f2c888d9b7a2d92934c4e2\"},\"@keep-network/sortition-pools/contracts/SortitionPool.sol\":{\"content\":\"pragma solidity 0.8.17;\\n\\nimport \\\"@thesis/solidity-contracts/contracts/token/IERC20WithPermit.sol\\\";\\nimport \\\"@thesis/solidity-contracts/contracts/token/IReceiveApproval.sol\\\";\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport \\\"./RNG.sol\\\";\\nimport \\\"./SortitionTree.sol\\\";\\nimport \\\"./Rewards.sol\\\";\\nimport \\\"./Chaosnet.sol\\\";\\n\\n/// @title Sortition Pool\\n/// @notice A logarithmic data structure used to store the pool of eligible\\n/// operators weighted by their stakes. It allows to select a group of operators\\n/// based on the provided pseudo-random seed.\\ncontract SortitionPool is\\n SortitionTree,\\n Rewards,\\n Ownable,\\n Chaosnet,\\n IReceiveApproval\\n{\\n using Branch for uint256;\\n using Leaf for uint256;\\n using Position for uint256;\\n\\n IERC20WithPermit public immutable rewardToken;\\n\\n uint256 public immutable poolWeightDivisor;\\n\\n bool public isLocked;\\n\\n event IneligibleForRewards(uint32[] ids, uint256 until);\\n\\n event RewardEligibilityRestored(address indexed operator, uint32 indexed id);\\n\\n /// @notice Reverts if called while pool is locked.\\n modifier onlyUnlocked() {\\n require(!isLocked, \\\"Sortition pool locked\\\");\\n _;\\n }\\n\\n /// @notice Reverts if called while pool is unlocked.\\n modifier onlyLocked() {\\n require(isLocked, \\\"Sortition pool unlocked\\\");\\n _;\\n }\\n\\n constructor(IERC20WithPermit _rewardToken, uint256 _poolWeightDivisor) {\\n rewardToken = _rewardToken;\\n poolWeightDivisor = _poolWeightDivisor;\\n }\\n\\n function receiveApproval(\\n address sender,\\n uint256 amount,\\n address token,\\n bytes calldata\\n ) external override {\\n require(token == address(rewardToken), \\\"Unsupported token\\\");\\n rewardToken.transferFrom(sender, address(this), amount);\\n Rewards.addRewards(uint96(amount), uint32(root.sumWeight()));\\n }\\n\\n /// @notice Withdraws all available rewards for the given operator to the\\n /// given beneficiary.\\n /// @dev Can be called only be the owner. Does not validate if the provided\\n /// beneficiary is associated with the provided operator - this needs to\\n /// be done by the owner calling this function.\\n /// @return The amount of rewards withdrawn in this call.\\n function withdrawRewards(address operator, address beneficiary)\\n public\\n onlyOwner\\n returns (uint96)\\n {\\n uint32 id = getOperatorID(operator);\\n Rewards.updateOperatorRewards(id, uint32(getPoolWeight(operator)));\\n uint96 earned = Rewards.withdrawOperatorRewards(id);\\n rewardToken.transfer(beneficiary, uint256(earned));\\n return earned;\\n }\\n\\n /// @notice Withdraws rewards not allocated to operators marked as ineligible\\n /// to the given recipient address.\\n /// @dev Can be called only by the owner.\\n function withdrawIneligible(address recipient) public onlyOwner {\\n uint96 earned = Rewards.withdrawIneligibleRewards();\\n rewardToken.transfer(recipient, uint256(earned));\\n }\\n\\n /// @notice Locks the sortition pool. In locked state, members cannot be\\n /// inserted and removed from the pool. Members statuses cannot\\n /// be updated as well.\\n /// @dev Can be called only by the contract owner.\\n function lock() public onlyOwner {\\n isLocked = true;\\n }\\n\\n /// @notice Unlocks the sortition pool. Removes all restrictions set by\\n /// the `lock` method.\\n /// @dev Can be called only by the contract owner.\\n function unlock() public onlyOwner {\\n isLocked = false;\\n }\\n\\n /// @notice Inserts an operator to the pool. Reverts if the operator is\\n /// already present. Reverts if the operator is not eligible because of their\\n /// authorized stake. Reverts if the chaosnet is active and the operator is\\n /// not a beta operator.\\n /// @dev Can be called only by the contract owner.\\n /// @param operator Address of the inserted operator.\\n /// @param authorizedStake Inserted operator's authorized stake for the application.\\n function insertOperator(address operator, uint256 authorizedStake)\\n public\\n onlyOwner\\n // TODO: Disabled temporarily for a test environment. This should never be disabled\\n // in normal circumstances.\\n // onlyUnlocked\\n {\\n uint256 weight = getWeight(authorizedStake);\\n require(weight > 0, \\\"Operator not eligible\\\");\\n\\n if (isChaosnetActive) {\\n require(isBetaOperator[operator], \\\"Not beta operator for chaosnet\\\");\\n }\\n\\n _insertOperator(operator, weight);\\n uint32 id = getOperatorID(operator);\\n Rewards.updateOperatorRewards(id, uint32(weight));\\n }\\n\\n /// @notice Update the operator's weight if present and eligible,\\n /// or remove from the pool if present and ineligible.\\n /// @dev Can be called only by the contract owner.\\n /// @param operator Address of the updated operator.\\n /// @param authorizedStake Operator's authorized stake for the application.\\n function updateOperatorStatus(address operator, uint256 authorizedStake)\\n public\\n onlyOwner\\n onlyUnlocked\\n {\\n uint256 weight = getWeight(authorizedStake);\\n\\n uint32 id = getOperatorID(operator);\\n Rewards.updateOperatorRewards(id, uint32(weight));\\n\\n if (weight == 0) {\\n _removeOperator(operator);\\n } else {\\n updateOperator(operator, weight);\\n }\\n }\\n\\n /// @notice Set the given operators as ineligible for rewards.\\n /// The operators can restore their eligibility at the given time.\\n function setRewardIneligibility(uint32[] calldata operators, uint256 until)\\n public\\n onlyOwner\\n {\\n Rewards.setIneligible(operators, until);\\n emit IneligibleForRewards(operators, until);\\n }\\n\\n /// @notice Restores reward eligibility for the operator.\\n function restoreRewardEligibility(address operator) public {\\n uint32 id = getOperatorID(operator);\\n Rewards.restoreEligibility(id);\\n emit RewardEligibilityRestored(operator, id);\\n }\\n\\n /// @notice Returns whether the operator is eligible for rewards or not.\\n function isEligibleForRewards(address operator) public view returns (bool) {\\n uint32 id = getOperatorID(operator);\\n return Rewards.isEligibleForRewards(id);\\n }\\n\\n /// @notice Returns the time the operator's reward eligibility can be restored.\\n function rewardsEligibilityRestorableAt(address operator)\\n public\\n view\\n returns (uint256)\\n {\\n uint32 id = getOperatorID(operator);\\n return Rewards.rewardsEligibilityRestorableAt(id);\\n }\\n\\n /// @notice Returns whether the operator is able to restore their eligibility\\n /// for rewards right away.\\n function canRestoreRewardEligibility(address operator)\\n public\\n view\\n returns (bool)\\n {\\n uint32 id = getOperatorID(operator);\\n return Rewards.canRestoreRewardEligibility(id);\\n }\\n\\n /// @notice Returns the amount of rewards withdrawable for the given operator.\\n function getAvailableRewards(address operator) public view returns (uint96) {\\n uint32 id = getOperatorID(operator);\\n return availableRewards(id);\\n }\\n\\n /// @notice Return whether the operator is present in the pool.\\n function isOperatorInPool(address operator) public view returns (bool) {\\n return getFlaggedLeafPosition(operator) != 0;\\n }\\n\\n /// @notice Return whether the operator's weight in the pool\\n /// matches their eligible weight.\\n function isOperatorUpToDate(address operator, uint256 authorizedStake)\\n public\\n view\\n returns (bool)\\n {\\n return getWeight(authorizedStake) == getPoolWeight(operator);\\n }\\n\\n /// @notice Return the weight of the operator in the pool,\\n /// which may or may not be out of date.\\n function getPoolWeight(address operator) public view returns (uint256) {\\n uint256 flaggedPosition = getFlaggedLeafPosition(operator);\\n if (flaggedPosition == 0) {\\n return 0;\\n } else {\\n uint256 leafPosition = flaggedPosition.unsetFlag();\\n uint256 leafWeight = getLeafWeight(leafPosition);\\n return leafWeight;\\n }\\n }\\n\\n /// @notice Selects a new group of operators of the provided size based on\\n /// the provided pseudo-random seed. At least one operator has to be\\n /// registered in the pool, otherwise the function fails reverting the\\n /// transaction.\\n /// @param groupSize Size of the requested group\\n /// @param seed Pseudo-random number used to select operators to group\\n /// @return selected Members of the selected group\\n function selectGroup(uint256 groupSize, bytes32 seed)\\n public\\n view\\n onlyLocked\\n returns (uint32[] memory)\\n {\\n uint256 _root = root;\\n\\n bytes32 rngState = seed;\\n uint256 rngRange = _root.sumWeight();\\n require(rngRange > 0, \\\"Not enough operators in pool\\\");\\n uint256 currentIndex;\\n\\n uint256 bits = RNG.bitsRequired(rngRange);\\n\\n uint32[] memory selected = new uint32[](groupSize);\\n\\n for (uint256 i = 0; i < groupSize; i++) {\\n (currentIndex, rngState) = RNG.getIndex(rngRange, rngState, bits);\\n\\n uint256 leafPosition = pickWeightedLeaf(currentIndex, _root);\\n\\n uint256 leaf = leaves[leafPosition];\\n selected[i] = leaf.id();\\n }\\n return selected;\\n }\\n\\n function getWeight(uint256 authorization) internal view returns (uint256) {\\n return authorization / poolWeightDivisor;\\n }\\n}\\n\",\"keccak256\":\"0x3c330b682bcb722bba861077a229f0605cda2142c3f0d45aaf2ce6a295e80615\"},\"@keep-network/sortition-pools/contracts/SortitionTree.sol\":{\"content\":\"pragma solidity 0.8.17;\\n\\nimport \\\"./Branch.sol\\\";\\nimport \\\"./Position.sol\\\";\\nimport \\\"./Leaf.sol\\\";\\nimport \\\"./Constants.sol\\\";\\n\\ncontract SortitionTree {\\n using Branch for uint256;\\n using Position for uint256;\\n using Leaf for uint256;\\n\\n // implicit tree\\n // root 8\\n // level2 64\\n // level3 512\\n // level4 4k\\n // level5 32k\\n // level6 256k\\n // level7 2M\\n uint256 internal root;\\n\\n // A 2-index mapping from layer => (index (0-index) => branch). For example,\\n // to access the 6th branch in the 2nd layer (right below the root node; the\\n // first branch layer), call branches[2][5]. Mappings are used in place of\\n // arrays for efficiency. The root is the first layer, the branches occupy\\n // layers 2 through 7, and layer 8 is for the leaves. Following this\\n // convention, the first index in `branches` is `2`, and the last index is\\n // `7`.\\n mapping(uint256 => mapping(uint256 => uint256)) internal branches;\\n\\n // A 0-index mapping from index => leaf, acting as an array. For example, to\\n // access the 42nd leaf, call leaves[41].\\n mapping(uint256 => uint256) internal leaves;\\n\\n // the flagged (see setFlag() and unsetFlag() in Position.sol) positions\\n // of all operators present in the pool\\n mapping(address => uint256) internal flaggedLeafPosition;\\n\\n // the leaf after the rightmost occupied leaf of each stack\\n uint256 internal rightmostLeaf;\\n\\n // the empty leaves in each stack\\n // between 0 and the rightmost occupied leaf\\n uint256[] internal emptyLeaves;\\n\\n // Each operator has an uint32 ID number\\n // which is allocated when they first join the pool\\n // and remains unchanged even if they leave and rejoin the pool.\\n mapping(address => uint32) internal operatorID;\\n\\n // The idAddress array records the address corresponding to each ID number.\\n // The ID number 0 is initialized with a zero address and is not used.\\n address[] internal idAddress;\\n\\n constructor() {\\n root = 0;\\n rightmostLeaf = 0;\\n idAddress.push();\\n }\\n\\n /// @notice Return the ID number of the given operator address. An ID number\\n /// of 0 means the operator has not been allocated an ID number yet.\\n /// @param operator Address of the operator.\\n /// @return the ID number of the given operator address\\n function getOperatorID(address operator) public view returns (uint32) {\\n return operatorID[operator];\\n }\\n\\n /// @notice Get the operator address corresponding to the given ID number. A\\n /// zero address means the ID number has not been allocated yet.\\n /// @param id ID of the operator\\n /// @return the address of the operator\\n function getIDOperator(uint32 id) public view returns (address) {\\n return idAddress.length > id ? idAddress[id] : address(0);\\n }\\n\\n /// @notice Gets the operator addresses corresponding to the given ID\\n /// numbers. A zero address means the ID number has not been allocated yet.\\n /// This function works just like getIDOperator except that it allows to fetch\\n /// operator addresses for multiple IDs in one call.\\n /// @param ids the array of the operator ids\\n /// @return an array of the associated operator addresses\\n function getIDOperators(uint32[] calldata ids)\\n public\\n view\\n returns (address[] memory)\\n {\\n uint256 idCount = idAddress.length;\\n\\n address[] memory operators = new address[](ids.length);\\n for (uint256 i = 0; i < ids.length; i++) {\\n uint32 id = ids[i];\\n operators[i] = idCount > id ? idAddress[id] : address(0);\\n }\\n return operators;\\n }\\n\\n /// @notice Checks if operator is already registered in the pool.\\n /// @param operator the address of the operator\\n /// @return whether or not the operator is already registered in the pool\\n function isOperatorRegistered(address operator) public view returns (bool) {\\n return getFlaggedLeafPosition(operator) != 0;\\n }\\n\\n /// @notice Sum the number of operators in each trunk.\\n /// @return the number of operators in the pool\\n function operatorsInPool() public view returns (uint256) {\\n // Get the number of leaves that might be occupied;\\n // if `rightmostLeaf` equals `firstLeaf()` the tree must be empty,\\n // otherwise the difference between these numbers\\n // gives the number of leaves that may be occupied.\\n uint256 nPossiblyUsedLeaves = rightmostLeaf;\\n // Get the number of empty leaves\\n // not accounted for by the `rightmostLeaf`\\n uint256 nEmptyLeaves = emptyLeaves.length;\\n\\n return (nPossiblyUsedLeaves - nEmptyLeaves);\\n }\\n\\n /// @notice Convenience method to return the total weight of the pool\\n /// @return the total weight of the pool\\n function totalWeight() public view returns (uint256) {\\n return root.sumWeight();\\n }\\n\\n /// @notice Give the operator a new ID number.\\n /// Does not check if the operator already has an ID number.\\n /// @param operator the address of the operator\\n /// @return a new ID for that operator\\n function allocateOperatorID(address operator) internal returns (uint256) {\\n uint256 id = idAddress.length;\\n\\n require(id <= type(uint32).max, \\\"Pool capacity exceeded\\\");\\n\\n operatorID[operator] = uint32(id);\\n idAddress.push(operator);\\n return id;\\n }\\n\\n /// @notice Inserts an operator into the sortition pool\\n /// @param operator the address of an operator to insert\\n /// @param weight how much weight that operator has in the pool\\n function _insertOperator(address operator, uint256 weight) internal {\\n require(\\n !isOperatorRegistered(operator),\\n \\\"Operator is already registered in the pool\\\"\\n );\\n\\n // Fetch the operator's ID, and if they don't have one, allocate them one.\\n uint256 id = getOperatorID(operator);\\n if (id == 0) {\\n id = allocateOperatorID(operator);\\n }\\n\\n // Determine which leaf to insert them into\\n uint256 position = getEmptyLeafPosition();\\n // Record the block the operator was inserted in\\n uint256 theLeaf = Leaf.make(operator, block.number, id);\\n\\n // Update the leaf, and propagate the weight changes all the way up to the\\n // root.\\n root = setLeaf(position, theLeaf, weight, root);\\n\\n // Without position flags,\\n // the position 0x000000 would be treated as empty\\n flaggedLeafPosition[operator] = position.setFlag();\\n }\\n\\n /// @notice Remove an operator (and their weight) from the pool.\\n /// @param operator the address of the operator to remove\\n function _removeOperator(address operator) internal {\\n uint256 flaggedPosition = getFlaggedLeafPosition(operator);\\n require(flaggedPosition != 0, \\\"Operator is not registered in the pool\\\");\\n uint256 unflaggedPosition = flaggedPosition.unsetFlag();\\n\\n // Update the leaf, and propagate the weight changes all the way up to the\\n // root.\\n root = removeLeaf(unflaggedPosition, root);\\n removeLeafPositionRecord(operator);\\n }\\n\\n /// @notice Update an operator's weight in the pool.\\n /// @param operator the address of the operator to update\\n /// @param weight the new weight\\n function updateOperator(address operator, uint256 weight) internal {\\n require(\\n isOperatorRegistered(operator),\\n \\\"Operator is not registered in the pool\\\"\\n );\\n\\n uint256 flaggedPosition = getFlaggedLeafPosition(operator);\\n uint256 unflaggedPosition = flaggedPosition.unsetFlag();\\n root = updateLeaf(unflaggedPosition, weight, root);\\n }\\n\\n /// @notice Helper method to remove a leaf position record for an operator.\\n /// @param operator the address of the operator to remove the record for\\n function removeLeafPositionRecord(address operator) internal {\\n flaggedLeafPosition[operator] = 0;\\n }\\n\\n /// @notice Removes the data and weight from a particular leaf.\\n /// @param position the leaf index to remove\\n /// @param _root the root node containing the leaf\\n /// @return the updated root node\\n function removeLeaf(uint256 position, uint256 _root)\\n internal\\n returns (uint256)\\n {\\n uint256 rightmostSubOne = rightmostLeaf - 1;\\n bool isRightmost = position == rightmostSubOne;\\n\\n // Clears out the data in the leaf node, and then propagates the weight\\n // changes all the way up to the root.\\n uint256 newRoot = setLeaf(position, 0, 0, _root);\\n\\n // Infer if need to fall back on emptyLeaves yet\\n if (isRightmost) {\\n rightmostLeaf = rightmostSubOne;\\n } else {\\n emptyLeaves.push(position);\\n }\\n return newRoot;\\n }\\n\\n /// @notice Updates the tree to give a particular leaf a new weight.\\n /// @param position the index of the leaf to update\\n /// @param weight the new weight\\n /// @param _root the root node containing the leaf\\n /// @return the updated root node\\n function updateLeaf(\\n uint256 position,\\n uint256 weight,\\n uint256 _root\\n ) internal returns (uint256) {\\n if (getLeafWeight(position) != weight) {\\n return updateTree(position, weight, _root);\\n } else {\\n return _root;\\n }\\n }\\n\\n /// @notice Places a leaf into a particular position, with a given weight and\\n /// propagates that change.\\n /// @param position the index to place the leaf in\\n /// @param theLeaf the new leaf to place in the position\\n /// @param leafWeight the weight of the leaf\\n /// @param _root the root containing the new leaf\\n /// @return the updated root node\\n function setLeaf(\\n uint256 position,\\n uint256 theLeaf,\\n uint256 leafWeight,\\n uint256 _root\\n ) internal returns (uint256) {\\n // set leaf\\n leaves[position] = theLeaf;\\n\\n return (updateTree(position, leafWeight, _root));\\n }\\n\\n /// @notice Propagates a weight change at a position through the tree,\\n /// eventually returning the updated root.\\n /// @param position the index of leaf to update\\n /// @param weight the new weight of the leaf\\n /// @param _root the root node containing the leaf\\n /// @return the updated root node\\n function updateTree(\\n uint256 position,\\n uint256 weight,\\n uint256 _root\\n ) internal returns (uint256) {\\n uint256 childSlot;\\n uint256 treeNode;\\n uint256 newNode;\\n uint256 nodeWeight = weight;\\n\\n uint256 parent = position;\\n // set levels 7 to 2\\n for (uint256 level = Constants.LEVELS; level >= 2; level--) {\\n childSlot = parent.slot();\\n parent = parent.parent();\\n treeNode = branches[level][parent];\\n newNode = treeNode.setSlot(childSlot, nodeWeight);\\n branches[level][parent] = newNode;\\n nodeWeight = newNode.sumWeight();\\n }\\n\\n // set level Root\\n childSlot = parent.slot();\\n return _root.setSlot(childSlot, nodeWeight);\\n }\\n\\n /// @notice Retrieves the next available empty leaf position. Tries to fill\\n /// left to right first, ignoring leaf removals, and then fills\\n /// most-recent-removals first.\\n /// @return the position of the empty leaf\\n function getEmptyLeafPosition() internal returns (uint256) {\\n uint256 rLeaf = rightmostLeaf;\\n bool spaceOnRight = (rLeaf + 1) < Constants.POOL_CAPACITY;\\n if (spaceOnRight) {\\n rightmostLeaf = rLeaf + 1;\\n return rLeaf;\\n } else {\\n uint256 emptyLeafCount = emptyLeaves.length;\\n require(emptyLeafCount > 0, \\\"Pool is full\\\");\\n uint256 emptyLeaf = emptyLeaves[emptyLeafCount - 1];\\n emptyLeaves.pop();\\n return emptyLeaf;\\n }\\n }\\n\\n /// @notice Gets the flagged leaf position for an operator.\\n /// @param operator the address of the operator\\n /// @return the leaf position of that operator\\n function getFlaggedLeafPosition(address operator)\\n internal\\n view\\n returns (uint256)\\n {\\n return flaggedLeafPosition[operator];\\n }\\n\\n /// @notice Gets the weight of a leaf at a particular position.\\n /// @param position the index of the leaf\\n /// @return the weight of the leaf at that position\\n function getLeafWeight(uint256 position) internal view returns (uint256) {\\n uint256 slot = position.slot();\\n uint256 parent = position.parent();\\n\\n // A leaf's weight information is stored a 32-bit slot in the branch layer\\n // directly above the leaf layer. To access it, we calculate that slot and\\n // parent position, and always know the hard-coded layer index.\\n uint256 node = branches[Constants.LEVELS][parent];\\n return node.getSlot(slot);\\n }\\n\\n /// @notice Picks a leaf given a random index.\\n /// @param index a number in `[0, _root.totalWeight())` used to decide\\n /// between leaves\\n /// @param _root the root of the tree\\n function pickWeightedLeaf(uint256 index, uint256 _root)\\n internal\\n view\\n returns (uint256 leafPosition)\\n {\\n uint256 currentIndex = index;\\n uint256 currentNode = _root;\\n uint256 currentPosition = 0;\\n uint256 currentSlot;\\n\\n require(index < currentNode.sumWeight(), \\\"Index exceeds weight\\\");\\n\\n // get root slot\\n (currentSlot, currentIndex) = currentNode.pickWeightedSlot(currentIndex);\\n\\n // get slots from levels 2 to 7\\n for (uint256 level = 2; level <= Constants.LEVELS; level++) {\\n currentPosition = currentPosition.child(currentSlot);\\n currentNode = branches[level][currentPosition];\\n (currentSlot, currentIndex) = currentNode.pickWeightedSlot(currentIndex);\\n }\\n\\n // get leaf position\\n leafPosition = currentPosition.child(currentSlot);\\n }\\n}\\n\",\"keccak256\":\"0x51daeca62ef52be78a1a9de4d2a1c5900c873165f59eda14d5965d7d7da90a03\"},\"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/MathUpgradeable.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary StringsUpgradeable {\\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 = MathUpgradeable.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, MathUpgradeable.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0x6b9a5d35b744b25529a2856a8093e7c03fb35a34b1c4fb5499e560f8ade140da\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../StringsUpgradeable.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", StringsUpgradeable.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0x12f297cafe6e2847ae0378502f155654d0764b532a9873c8afe4350950fa7971\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary MathUpgradeable {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xc1bd5b53319c68f84e3becd75694d941e8f4be94049903232cd8bc7c535aaa5a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@thesis/solidity-contracts/contracts/token/IApproveAndCall.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.4;\\n\\n/// @notice An interface that should be implemented by tokens supporting\\n/// `approveAndCall`/`receiveApproval` pattern.\\ninterface IApproveAndCall {\\n /// @notice Executes `receiveApproval` function on spender as specified in\\n /// `IReceiveApproval` interface. Approves spender to withdraw from\\n /// the caller multiple times, up to the `amount`. If this\\n /// function is called again, it overwrites the current allowance\\n /// with `amount`. Reverts if the approval reverted or if\\n /// `receiveApproval` call on the spender reverted.\\n function approveAndCall(\\n address spender,\\n uint256 amount,\\n bytes memory extraData\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x393d18ef81a57dcc96fff4c340cc2945deaebb37b9796c322cf2bc96872c3df8\",\"license\":\"MIT\"},\"@thesis/solidity-contracts/contracts/token/IERC20WithPermit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\\\";\\n\\nimport \\\"./IApproveAndCall.sol\\\";\\n\\n/// @title IERC20WithPermit\\n/// @notice Burnable ERC20 token with EIP2612 permit functionality. User can\\n/// authorize a transfer of their token with a signature conforming\\n/// EIP712 standard instead of an on-chain transaction from their\\n/// address. Anyone can submit this signature on the user's behalf by\\n/// calling the permit function, as specified in EIP2612 standard,\\n/// paying gas fees, and possibly performing other actions in the same\\n/// transaction.\\ninterface IERC20WithPermit is IERC20, IERC20Metadata, IApproveAndCall {\\n /// @notice EIP2612 approval made with secp256k1 signature.\\n /// Users can authorize a transfer of their tokens with a signature\\n /// conforming EIP712 standard, rather than an on-chain transaction\\n /// from their address. Anyone can submit this signature on the\\n /// user's behalf by calling the permit function, paying gas fees,\\n /// and possibly performing other actions in the same transaction.\\n /// @dev The deadline argument can be set to `type(uint256).max to create\\n /// permits that effectively never expire.\\n function permit(\\n address owner,\\n address spender,\\n uint256 amount,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /// @notice Destroys `amount` tokens from the caller.\\n function burn(uint256 amount) external;\\n\\n /// @notice Destroys `amount` of tokens from `account`, deducting the amount\\n /// from caller's allowance.\\n function burnFrom(address account, uint256 amount) external;\\n\\n /// @notice Returns hash of EIP712 Domain struct with the token name as\\n /// a signing domain and token contract as a verifying contract.\\n /// Used to construct EIP2612 signature provided to `permit`\\n /// function.\\n /* solhint-disable-next-line func-name-mixedcase */\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n\\n /// @notice Returns the current nonce for EIP2612 permission for the\\n /// provided token owner for a replay protection. Used to construct\\n /// EIP2612 signature provided to `permit` function.\\n function nonce(address owner) external view returns (uint256);\\n\\n /// @notice Returns EIP2612 Permit message hash. Used to construct EIP2612\\n /// signature provided to `permit` function.\\n /* solhint-disable-next-line func-name-mixedcase */\\n function PERMIT_TYPEHASH() external pure returns (bytes32);\\n}\\n\",\"keccak256\":\"0xdac9a5086c19a7128b505a7be1ab0ac1aa314f6989cb88d2417e9d7383f89fa9\",\"license\":\"MIT\"},\"@thesis/solidity-contracts/contracts/token/IReceiveApproval.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.4;\\n\\n/// @notice An interface that should be implemented by contracts supporting\\n/// `approveAndCall`/`receiveApproval` pattern.\\ninterface IReceiveApproval {\\n /// @notice Receives approval to spend tokens. Called as a result of\\n /// `approveAndCall` call on the token.\\n function receiveApproval(\\n address from,\\n uint256 amount,\\n address token,\\n bytes calldata extraData\\n ) external;\\n}\\n\",\"keccak256\":\"0x6a30d83ad230548b1e7839737affc8489a035314209de14b89dbef7fb0f66395\",\"license\":\"MIT\"}},\"version\":1}",
10774
+ "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"groupThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"signatureByteSize\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract SortitionPool\",\"name\":\"sortitionPool\",\"type\":\"SortitionPool\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"walletID\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"inactiveMembersIndices\",\"type\":\"uint256[]\"},{\"internalType\":\"bool\",\"name\":\"heartbeatFailed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"signatures\",\"type\":\"bytes\"},{\"internalType\":\"uint256[]\",\"name\":\"signingMembersIndices\",\"type\":\"uint256[]\"}],\"internalType\":\"struct EcdsaInactivity.Claim\",\"name\":\"claim\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"walletPubKey\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint32[]\",\"name\":\"groupMembers\",\"type\":\"uint32[]\"}],\"name\":\"verifyClaim\",\"outputs\":[{\"internalType\":\"uint32[]\",\"name\":\"inactiveMembers\",\"type\":\"uint32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"verifyClaim(SortitionPool,EcdsaInactivity.Claim,bytes,uint256,uint32[])\":{\"details\":\"Wallet signing group members hash is validated upstream in `WalletRegistry.notifyOperatorInactivity()`\",\"params\":{\"claim\":\"Inactivity claim\",\"groupMembers\":\"Identifiers of group members\",\"nonce\":\"Current inactivity nonce for wallet used in the claim\",\"sortitionPool\":\"Sortition pool reference\",\"walletPubKey\":\"Public key of the wallet\"},\"returns\":{\"inactiveMembers\":\"Identifiers of members who are inactive\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"groupThreshold()\":{\"notice\":\"The minimum number of wallet signing group members needed to interact according to the protocol to produce a valid inactivity claim.\"},\"signatureByteSize()\":{\"notice\":\"Size in bytes of a single signature produced by member supporting the inactivity claim.\"},\"verifyClaim(SortitionPool,EcdsaInactivity.Claim,bytes,uint256,uint32[])\":{\"notice\":\"Verifies the inactivity claim according to the rules defined in `Claim` struct documentation. Reverts if verification fails.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@keep-network/ecdsa/contracts/libraries/EcdsaInactivity.sol\":\"EcdsaInactivity\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[]},\"sources\":{\"@keep-network/ecdsa/contracts/libraries/EcdsaInactivity.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\n//\\n// \\u2593\\u2593\\u258c \\u2593\\u2593 \\u2590\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c\\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c\\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\u2584\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\u2584\\u2584\\u2584 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\u2584\\u2584\\u2584 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\u2580\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\u2580\\u2580\\u2580 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\u2580\\u2580\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2580\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2588\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n//\\n// Trust math, not hardware.\\n\\npragma solidity 0.8.17;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol\\\";\\n\\nimport \\\"@keep-network/random-beacon/contracts/libraries/BytesLib.sol\\\";\\nimport \\\"@keep-network/sortition-pools/contracts/SortitionPool.sol\\\";\\n\\nimport \\\"./Wallets.sol\\\";\\n\\nlibrary EcdsaInactivity {\\n using BytesLib for bytes;\\n using ECDSAUpgradeable for bytes32;\\n\\n struct Claim {\\n // ID of the wallet whose signing group is raising the inactivity claim.\\n bytes32 walletID;\\n // Indices of group members accused of being inactive. Indices must be in\\n // range [1, groupMembers.length], unique, and sorted in ascending order.\\n uint256[] inactiveMembersIndices;\\n // Indicates if inactivity claim is a wallet-wide heartbeat failure.\\n // If wallet failed a heartbeat, this is signalled to the wallet owner\\n // who may decide to move responsibilities to another wallet\\n // given that the wallet who failed the heartbeat is at risk of not\\n // being able to sign messages soon.\\n bool heartbeatFailed;\\n // Concatenation of signatures from members supporting the claim.\\n // The message to be signed by each member is keccak256 hash of the\\n // concatenation of the chain ID, inactivity claim nonce for the given\\n // wallet, wallet public key, inactive members indices, and boolean flag\\n // indicating if this is a wallet-wide heartbeat failure. The calculated\\n // hash should be prefixed with `\\\\x19Ethereum signed message:\\\\n` before\\n // signing, so the message to sign is:\\n // `\\\\x19Ethereum signed message:\\\\n${keccak256(\\n // chainID | nonce | walletPubKey | inactiveMembersIndices | heartbeatFailed\\n // )}`\\n bytes signatures;\\n // Indices of members corresponding to each signature. Indices must be\\n // in range [1, groupMembers.length], unique, and sorted in ascending\\n // order.\\n uint256[] signingMembersIndices;\\n // This struct doesn't contain `__gap` property as the structure is not\\n // stored, it is used as a function's calldata argument.\\n }\\n\\n /// @notice The minimum number of wallet signing group members needed to\\n /// interact according to the protocol to produce a valid inactivity\\n /// claim.\\n uint256 public constant groupThreshold = 51;\\n\\n /// @notice Size in bytes of a single signature produced by member\\n /// supporting the inactivity claim.\\n uint256 public constant signatureByteSize = 65;\\n\\n /// @notice Verifies the inactivity claim according to the rules defined in\\n /// `Claim` struct documentation. Reverts if verification fails.\\n /// @dev Wallet signing group members hash is validated upstream in\\n /// `WalletRegistry.notifyOperatorInactivity()`\\n /// @param sortitionPool Sortition pool reference\\n /// @param claim Inactivity claim\\n /// @param walletPubKey Public key of the wallet\\n /// @param nonce Current inactivity nonce for wallet used in the claim\\n /// @param groupMembers Identifiers of group members\\n /// @return inactiveMembers Identifiers of members who are inactive\\n function verifyClaim(\\n SortitionPool sortitionPool,\\n Claim calldata claim,\\n bytes memory walletPubKey,\\n uint256 nonce,\\n uint32[] calldata groupMembers\\n ) external view returns (uint32[] memory inactiveMembers) {\\n // Validate inactive members indices. Maximum indices count is equal to\\n // the group size and is not limited deliberately to leave a theoretical\\n // possibility to accuse more members than `groupSize - groupThreshold`.\\n validateMembersIndices(\\n claim.inactiveMembersIndices,\\n groupMembers.length\\n );\\n\\n // Validate signatures array is properly formed and number of\\n // signatures and signers is correct.\\n uint256 signaturesCount = claim.signatures.length / signatureByteSize;\\n require(claim.signatures.length != 0, \\\"No signatures provided\\\");\\n require(\\n claim.signatures.length % signatureByteSize == 0,\\n \\\"Malformed signatures array\\\"\\n );\\n require(\\n signaturesCount == claim.signingMembersIndices.length,\\n \\\"Unexpected signatures count\\\"\\n );\\n require(signaturesCount >= groupThreshold, \\\"Too few signatures\\\");\\n require(signaturesCount <= groupMembers.length, \\\"Too many signatures\\\");\\n\\n // Validate signing members indices. Note that `signingMembersIndices`\\n // were already partially validated during `signatures` parameter\\n // validation.\\n validateMembersIndices(\\n claim.signingMembersIndices,\\n groupMembers.length\\n );\\n\\n bytes32 signedMessageHash = keccak256(\\n abi.encode(\\n block.chainid,\\n nonce,\\n walletPubKey,\\n claim.inactiveMembersIndices,\\n claim.heartbeatFailed\\n )\\n ).toEthSignedMessageHash();\\n\\n address[] memory groupMembersAddresses = sortitionPool.getIDOperators(\\n groupMembers\\n );\\n\\n // Verify each signature.\\n bytes memory checkedSignature;\\n bool senderSignatureExists = false;\\n for (uint256 i = 0; i < signaturesCount; i++) {\\n uint256 memberIndex = claim.signingMembersIndices[i];\\n checkedSignature = claim.signatures.slice(\\n signatureByteSize * i,\\n signatureByteSize\\n );\\n address recoveredAddress = signedMessageHash.recover(\\n checkedSignature\\n );\\n\\n require(\\n groupMembersAddresses[memberIndex - 1] == recoveredAddress,\\n \\\"Invalid signature\\\"\\n );\\n\\n if (!senderSignatureExists && msg.sender == recoveredAddress) {\\n senderSignatureExists = true;\\n }\\n }\\n\\n require(senderSignatureExists, \\\"Sender must be claim signer\\\");\\n\\n inactiveMembers = new uint32[](claim.inactiveMembersIndices.length);\\n for (uint256 i = 0; i < claim.inactiveMembersIndices.length; i++) {\\n uint256 memberIndex = claim.inactiveMembersIndices[i];\\n inactiveMembers[i] = groupMembers[memberIndex - 1];\\n }\\n\\n return inactiveMembers;\\n }\\n\\n /// @notice Validates members indices array. Array is considered valid\\n /// if its size and each single index are in [1, groupSize] range,\\n /// indexes are unique, and sorted in an ascending order.\\n /// Reverts if validation fails.\\n /// @param indices Array to validate.\\n /// @param groupSize Group size used as reference.\\n function validateMembersIndices(\\n uint256[] calldata indices,\\n uint256 groupSize\\n ) internal pure {\\n require(\\n indices.length > 0 && indices.length <= groupSize,\\n \\\"Corrupted members indices\\\"\\n );\\n\\n // Check if first and last indices are in range [1, groupSize].\\n // This check combined with the loop below makes sure every single\\n // index is in the correct range.\\n require(\\n indices[0] > 0 && indices[indices.length - 1] <= groupSize,\\n \\\"Corrupted members indices\\\"\\n );\\n\\n for (uint256 i = 0; i < indices.length - 1; i++) {\\n // Check whether given index is smaller than the next one. This\\n // way we are sure indexes are ordered in the ascending order\\n // and there are no duplicates.\\n require(indices[i] < indices[i + 1], \\\"Corrupted members indices\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5ce38a16c97fbf1320e507667bc3d324e863e17ce81dc81d7fd3674e5a221ad5\",\"license\":\"GPL-3.0-only\"},\"@keep-network/ecdsa/contracts/libraries/Wallets.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\n//\\n// \\u2593\\u2593\\u258c \\u2593\\u2593 \\u2590\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c\\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c\\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\u2584\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\u2584\\u2584\\u2584 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\u2584\\u2584\\u2584 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\u2580\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\u2580\\u2580\\u2580 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\u2580\\u2580\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2580\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2588\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n//\\n// Trust math, not hardware.\\n\\npragma solidity 0.8.17;\\n\\nlibrary Wallets {\\n struct Wallet {\\n // Keccak256 hash of group members identifiers array. Group members do not\\n // include operators selected by the sortition pool that misbehaved during DKG.\\n bytes32 membersIdsHash;\\n // Uncompressed ECDSA public key stored as X and Y coordinates (32 bytes each).\\n bytes32 publicKeyX;\\n bytes32 publicKeyY;\\n // This struct doesn't contain `__gap` property as the structure is stored\\n // in a mapping, mappings store values in different slots and they are\\n // not contiguous with other values.\\n }\\n\\n struct Data {\\n // Mapping of keccak256 hashes of wallet public keys to wallet details.\\n // Hash of public key is considered an unique wallet identifier.\\n mapping(bytes32 => Wallet) registry;\\n // Reserved storage space in case we need to add more variables.\\n // See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n // slither-disable-next-line unused-state\\n uint256[49] __gap;\\n }\\n\\n /// @notice Performs preliminary validation of a new group public key.\\n /// The group public key must be unique and have 64 bytes in length.\\n /// If the validation fails, the function reverts. This function\\n /// must be called first for a public key of a wallet added with\\n /// `addWallet` function.\\n /// @param publicKey Uncompressed public key of a new wallet.\\n function validatePublicKey(Data storage self, bytes calldata publicKey)\\n internal\\n view\\n {\\n require(publicKey.length == 64, \\\"Invalid length of the public key\\\");\\n\\n bytes32 walletID = keccak256(publicKey);\\n require(\\n self.registry[walletID].publicKeyX == bytes32(0),\\n \\\"Wallet with the given public key already exists\\\"\\n );\\n\\n bytes32 publicKeyX = bytes32(publicKey[:32]);\\n require(publicKeyX != bytes32(0), \\\"Wallet public key must be non-zero\\\");\\n }\\n\\n /// @notice Registers a new wallet. This function does not validate\\n /// parameters. The code calling this function must call\\n /// `validatePublicKey` first.\\n /// @dev Uses a public key hash as a unique identifier of a wallet.\\n /// @param membersIdsHash Keccak256 hash of group members identifiers array\\n /// @param publicKey Uncompressed public key\\n /// @return walletID Wallet's ID\\n /// @return publicKeyX Wallet's public key's X coordinate\\n /// @return publicKeyY Wallet's public key's Y coordinate\\n function addWallet(\\n Data storage self,\\n bytes32 membersIdsHash,\\n bytes calldata publicKey\\n )\\n internal\\n returns (\\n bytes32 walletID,\\n bytes32 publicKeyX,\\n bytes32 publicKeyY\\n )\\n {\\n walletID = keccak256(publicKey);\\n\\n publicKeyX = bytes32(publicKey[:32]);\\n publicKeyY = bytes32(publicKey[32:]);\\n\\n self.registry[walletID].membersIdsHash = membersIdsHash;\\n self.registry[walletID].publicKeyX = publicKeyX;\\n self.registry[walletID].publicKeyY = publicKeyY;\\n }\\n\\n /// @notice Deletes wallet with the given ID from the registry. Reverts\\n /// if wallet with the given ID has not been registered or if it\\n /// has already been closed.\\n function deleteWallet(Data storage self, bytes32 walletID) internal {\\n require(\\n isWalletRegistered(self, walletID),\\n \\\"Wallet with the given ID has not been registered\\\"\\n );\\n\\n delete self.registry[walletID];\\n }\\n\\n /// @notice Checks if a wallet with the given ID is registered.\\n /// @param walletID Wallet's ID\\n /// @return True if a wallet is registered, false otherwise\\n function isWalletRegistered(Data storage self, bytes32 walletID)\\n internal\\n view\\n returns (bool)\\n {\\n return self.registry[walletID].publicKeyX != bytes32(0);\\n }\\n\\n /// @notice Returns Keccak256 hash of the wallet signing group members\\n /// identifiers array. Group members do not include operators\\n /// selected by the sortition pool that misbehaved during DKG.\\n /// Reverts if wallet with the given ID is not registered.\\n /// @param walletID ID of the wallet\\n /// @return Wallet signing group members hash\\n function getWalletMembersIdsHash(Data storage self, bytes32 walletID)\\n internal\\n view\\n returns (bytes32)\\n {\\n require(\\n isWalletRegistered(self, walletID),\\n \\\"Wallet with the given ID has not been registered\\\"\\n );\\n\\n return self.registry[walletID].membersIdsHash;\\n }\\n\\n /// @notice Gets public key of a wallet with the given wallet ID.\\n /// The public key is returned as X and Y coordinates.\\n /// Reverts if wallet with the given ID is not registered.\\n /// @param walletID ID of the wallet\\n /// @return x Public key X coordinate\\n /// @return y Public key Y coordinate\\n function getWalletPublicKeyCoordinates(Data storage self, bytes32 walletID)\\n internal\\n view\\n returns (bytes32 x, bytes32 y)\\n {\\n require(\\n isWalletRegistered(self, walletID),\\n \\\"Wallet with the given ID has not been registered\\\"\\n );\\n\\n Wallet storage wallet = self.registry[walletID];\\n\\n return (wallet.publicKeyX, wallet.publicKeyY);\\n }\\n\\n /// @notice Gets public key of a wallet with the given wallet ID.\\n /// The public key is returned in an uncompressed format as a 64-byte\\n /// concatenation of X and Y coordinates.\\n /// Reverts if wallet with the given ID is not registered.\\n /// @param walletID ID of the wallet\\n /// @return Uncompressed public key of the wallet\\n function getWalletPublicKey(Data storage self, bytes32 walletID)\\n internal\\n view\\n returns (bytes memory)\\n {\\n (bytes32 x, bytes32 y) = getWalletPublicKeyCoordinates(self, walletID);\\n return bytes.concat(x, y);\\n }\\n}\\n\",\"keccak256\":\"0x807b0de1b072dfe26b856771b3c77a2f5ae1e60c7cff6686383f88a4355748e4\",\"license\":\"GPL-3.0-only\"},\"@keep-network/random-beacon/contracts/libraries/BytesLib.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\n//\\n// \\u2593\\u2593\\u258c \\u2593\\u2593 \\u2590\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c\\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c\\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\u2584\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\u2584\\u2584\\u2584 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584\\u2584\\u2584\\u2584 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\u2580\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\u2580\\u2580\\u2580 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\u2580\\u2580\\u2580 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2580\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2580\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2584 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u258c\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2588\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n// \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2590\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593 \\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\n//\\n//\\n\\npragma solidity 0.8.17;\\n\\n/*\\nVersion pulled from keep-core v1:\\nhttps://github.com/keep-network/keep-core/blob/f297202db00c027978ad8e7103a356503de5773c/solidity-v1/contracts/utils/BytesLib.sol\\n\\nTo compile it with solidity 0.8 `_preBytes_slot` was replaced with `_preBytes.slot`.\\n*/\\n\\n/*\\nhttps://github.com/GNSPS/solidity-bytes-utils/\\nThis is free and unencumbered software released into the public domain.\\nAnyone is free to copy, modify, publish, use, compile, sell, or\\ndistribute this software, either in source code form or as a compiled\\nbinary, for any purpose, commercial or non-commercial, and by any\\nmeans.\\nIn jurisdictions that recognize copyright laws, the author or authors\\nof this software dedicate any and all copyright interest in the\\nsoftware to the public domain. We make this dedication for the benefit\\nof the public at large and to the detriment of our heirs and\\nsuccessors. We intend this dedication to be an overt act of\\nrelinquishment in perpetuity of all present and future rights to this\\nsoftware under copyright law.\\nTHE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND,\\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\\nIN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\\nOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\\nOTHER DEALINGS IN THE SOFTWARE.\\nFor more information, please refer to <https://unlicense.org>\\n*/\\n\\n/** @title BytesLib **/\\n/** @author https://github.com/GNSPS **/\\n\\nlibrary BytesLib {\\n function concatStorage(bytes storage _preBytes, bytes memory _postBytes)\\n internal\\n {\\n assembly {\\n // Read the first 32 bytes of _preBytes storage, which is the length\\n // of the array. (We don't need to use the offset into the slot\\n // because arrays use the entire slot.)\\n let fslot := sload(_preBytes.slot)\\n // Arrays of 31 bytes or less have an even value in their slot,\\n // while longer arrays have an odd value. The actual length is\\n // the slot divided by two for odd values, and the lowest order\\n // byte divided by two for even values.\\n // If the slot is even, bitwise and the slot with 255 and divide by\\n // two to get the length. If the slot is odd, bitwise and the slot\\n // with -1 and divide by two.\\n let slength := div(\\n and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)),\\n 2\\n )\\n let mlength := mload(_postBytes)\\n let newlength := add(slength, mlength)\\n // slength can contain both the length and contents of the array\\n // if length < 32 bytes so let's prepare for that\\n // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\\n switch add(lt(slength, 32), lt(newlength, 32))\\n case 2 {\\n // Since the new array still fits in the slot, we just need to\\n // update the contents of the slot.\\n // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length\\n sstore(\\n _preBytes.slot,\\n // all the modifications to the slot are inside this\\n // next block\\n add(\\n // we can just add to the slot contents because the\\n // bytes we want to change are the LSBs\\n fslot,\\n add(\\n mul(\\n div(\\n // load the bytes from memory\\n mload(add(_postBytes, 0x20)),\\n // zero all bytes to the right\\n exp(0x100, sub(32, mlength))\\n ),\\n // and now shift left the number of bytes to\\n // leave space for the length in the slot\\n exp(0x100, sub(32, newlength))\\n ),\\n // increase length by the double of the memory\\n // bytes length\\n mul(mlength, 2)\\n )\\n )\\n )\\n }\\n case 1 {\\n // The stored value fits in the slot, but the combined value\\n // will exceed it.\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n let sc := add(keccak256(0x0, 0x20), div(slength, 32))\\n\\n // save new length\\n sstore(_preBytes.slot, add(mul(newlength, 2), 1))\\n\\n // The contents of the _postBytes array start 32 bytes into\\n // the structure. Our first read should obtain the `submod`\\n // bytes that can fit into the unused space in the last word\\n // of the stored array. To get this, we read 32 bytes starting\\n // from `submod`, so the data we read overlaps with the array\\n // contents by `submod` bytes. Masking the lowest-order\\n // `submod` bytes allows us to add that value directly to the\\n // stored value.\\n\\n let submod := sub(32, slength)\\n let mc := add(_postBytes, submod)\\n let end := add(_postBytes, mlength)\\n let mask := sub(exp(0x100, submod), 1)\\n\\n sstore(\\n sc,\\n add(\\n and(\\n fslot,\\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00\\n ),\\n and(mload(mc), mask)\\n )\\n )\\n\\n for {\\n mc := add(mc, 0x20)\\n sc := add(sc, 1)\\n } lt(mc, end) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n sstore(sc, mload(mc))\\n }\\n\\n mask := exp(0x100, sub(mc, end))\\n\\n sstore(sc, mul(div(mload(mc), mask), mask))\\n }\\n default {\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n // Start copying to the last used word of the stored array.\\n let sc := add(keccak256(0x0, 0x20), div(slength, 32))\\n\\n // save new length\\n sstore(_preBytes.slot, add(mul(newlength, 2), 1))\\n\\n // Copy over the first `submod` bytes of the new data as in\\n // case 1 above.\\n let slengthmod := mod(slength, 32)\\n let submod := sub(32, slengthmod)\\n let mc := add(_postBytes, submod)\\n let end := add(_postBytes, mlength)\\n let mask := sub(exp(0x100, submod), 1)\\n\\n sstore(sc, add(sload(sc), and(mload(mc), mask)))\\n\\n for {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } lt(mc, end) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n sstore(sc, mload(mc))\\n }\\n\\n mask := exp(0x100, sub(mc, end))\\n\\n sstore(sc, mul(div(mload(mc), mask), mask))\\n }\\n }\\n }\\n\\n function equalStorage(bytes storage _preBytes, bytes memory _postBytes)\\n internal\\n view\\n returns (bool)\\n {\\n bool success = true;\\n\\n assembly {\\n // we know _preBytes_offset is 0\\n let fslot := sload(_preBytes.slot)\\n // Decode the length of the stored array like in concatStorage().\\n let slength := div(\\n and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)),\\n 2\\n )\\n let mlength := mload(_postBytes)\\n\\n // if lengths don't match the arrays are not equal\\n switch eq(slength, mlength)\\n case 1 {\\n // slength can contain both the length and contents of the array\\n // if length < 32 bytes so let's prepare for that\\n // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\\n if iszero(iszero(slength)) {\\n switch lt(slength, 32)\\n case 1 {\\n // blank the last byte which is the length\\n fslot := mul(div(fslot, 0x100), 0x100)\\n\\n if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) {\\n // unsuccess:\\n success := 0\\n }\\n }\\n default {\\n // cb is a circuit breaker in the for loop since there's\\n // no said feature for inline assembly loops\\n // cb = 1 - don't breaker\\n // cb = 0 - break\\n let cb := 1\\n\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n let sc := keccak256(0x0, 0x20)\\n\\n let mc := add(_postBytes, 0x20)\\n let end := add(mc, mlength)\\n\\n // the next line is the loop condition:\\n // while(uint(mc < end) + cb == 2)\\n for {\\n\\n } eq(add(lt(mc, end), cb), 2) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n if iszero(eq(sload(sc), mload(mc))) {\\n // unsuccess:\\n success := 0\\n cb := 0\\n }\\n }\\n }\\n }\\n }\\n default {\\n // unsuccess:\\n success := 0\\n }\\n }\\n\\n return success;\\n }\\n\\n function concat(bytes memory _preBytes, bytes memory _postBytes)\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory tempBytes;\\n\\n assembly {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // Store the length of the first bytes array at the beginning of\\n // the memory for tempBytes.\\n let length := mload(_preBytes)\\n mstore(tempBytes, length)\\n\\n // Maintain a memory counter for the current write location in the\\n // temp bytes array by adding the 32 bytes for the array length to\\n // the starting location.\\n let mc := add(tempBytes, 0x20)\\n // Stop copying when the memory counter reaches the length of the\\n // first bytes array.\\n let end := add(mc, length)\\n\\n for {\\n // Initialize a copy counter to the start of the _preBytes data,\\n // 32 bytes into its memory.\\n let cc := add(_preBytes, 0x20)\\n } lt(mc, end) {\\n // Increase both counters by 32 bytes each iteration.\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // Write the _preBytes data into the tempBytes memory 32 bytes\\n // at a time.\\n mstore(mc, mload(cc))\\n }\\n\\n // Add the length of _postBytes to the current length of tempBytes\\n // and store it as the new length in the first 32 bytes of the\\n // tempBytes memory.\\n length := mload(_postBytes)\\n mstore(tempBytes, add(length, mload(tempBytes)))\\n\\n // Move the memory counter back from a multiple of 0x20 to the\\n // actual end of the _preBytes data.\\n mc := end\\n // Stop copying when the memory counter reaches the new combined\\n // length of the arrays.\\n end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n // Update the free-memory pointer by padding our last write location\\n // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\\n // next 32 byte block, then round down to the nearest multiple of\\n // 32. If the sum of the length of the two arrays is zero then add\\n // one before rounding down to leave a blank 32 bytes (the length block with 0).\\n mstore(\\n 0x40,\\n and(\\n add(add(end, iszero(add(length, mload(_preBytes)))), 31),\\n not(31) // Round down to the nearest 32 bytes.\\n )\\n )\\n }\\n\\n return tempBytes;\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory res) {\\n uint256 _end = _start + _length;\\n require(_end > _start && _bytes.length >= _end, \\\"Slice out of bounds\\\");\\n\\n assembly {\\n // Alloc bytes array with additional 32 bytes afterspace and assign it's size\\n res := mload(0x40)\\n mstore(0x40, add(add(res, 64), _length))\\n mstore(res, _length)\\n\\n // Compute distance between source and destination pointers\\n let diff := sub(res, add(_bytes, _start))\\n\\n for {\\n let src := add(add(_bytes, 32), _start)\\n let end := add(src, _length)\\n } lt(src, end) {\\n src := add(src, 32)\\n } {\\n mstore(add(src, diff), mload(src))\\n }\\n }\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start)\\n internal\\n pure\\n returns (address)\\n {\\n uint256 _totalLen = _start + 20;\\n require(\\n _totalLen > _start && _bytes.length >= _totalLen,\\n \\\"Address conversion out of bounds.\\\"\\n );\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(\\n mload(add(add(_bytes, 0x20), _start)),\\n 0x1000000000000000000000000\\n )\\n }\\n\\n return tempAddress;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start)\\n internal\\n pure\\n returns (uint8)\\n {\\n require(\\n _bytes.length >= (_start + 1),\\n \\\"Uint8 conversion out of bounds.\\\"\\n );\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint(bytes memory _bytes, uint256 _start)\\n internal\\n pure\\n returns (uint256)\\n {\\n uint256 _totalLen = _start + 32;\\n require(\\n _totalLen > _start && _bytes.length >= _totalLen,\\n \\\"Uint conversion out of bounds.\\\"\\n );\\n uint256 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x20), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function equal(bytes memory _preBytes, bytes memory _postBytes)\\n internal\\n pure\\n returns (bool)\\n {\\n bool success = true;\\n\\n assembly {\\n let length := mload(_preBytes)\\n\\n // if lengths don't match the arrays are not equal\\n switch eq(length, mload(_postBytes))\\n case 1 {\\n // cb is a circuit breaker in the for loop since there's\\n // no said feature for inline assembly loops\\n // cb = 1 - don't breaker\\n // cb = 0 - break\\n let cb := 1\\n\\n let mc := add(_preBytes, 0x20)\\n let end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n // the next line is the loop condition:\\n // while(uint(mc < end) + cb == 2)\\n } eq(add(lt(mc, end), cb), 2) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // if any of these checks fails then arrays are not equal\\n if iszero(eq(mload(mc), mload(cc))) {\\n // unsuccess:\\n success := 0\\n cb := 0\\n }\\n }\\n }\\n default {\\n // unsuccess:\\n success := 0\\n }\\n }\\n\\n return success;\\n }\\n\\n function toBytes32(bytes memory _source)\\n internal\\n pure\\n returns (bytes32 result)\\n {\\n if (_source.length == 0) {\\n return 0x0;\\n }\\n\\n assembly {\\n result := mload(add(_source, 32))\\n }\\n }\\n\\n function keccak256Slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes32 result) {\\n uint256 _end = _start + _length;\\n require(_end > _start && _bytes.length >= _end, \\\"Slice out of bounds\\\");\\n\\n assembly {\\n result := keccak256(add(add(_bytes, 32), _start), _length)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3b76e2fe36eb777440250dcf2ea7a689375e8af22f3cc33521095ff6954becdb\",\"license\":\"GPL-3.0-only\"},\"@keep-network/sortition-pools/contracts/Branch.sol\":{\"content\":\"pragma solidity 0.8.17;\\n\\nimport \\\"./Constants.sol\\\";\\n\\n/// @notice The implicit 8-ary trees of the sortition pool\\n/// rely on packing 8 \\\"slots\\\" of 32-bit values into each uint256.\\n/// The Branch library permits efficient calculations on these slots.\\nlibrary Branch {\\n /// @notice Calculate the right shift required\\n /// to make the 32 least significant bits of an uint256\\n /// be the bits of the `position`th slot\\n /// when treating the uint256 as a uint32[8].\\n ///\\n /// @dev Not used for efficiency reasons,\\n /// but left to illustrate the meaning of a common pattern.\\n /// I wish solidity had macros, even C macros.\\n function slotShift(uint256 position) internal pure returns (uint256) {\\n unchecked {\\n return position * Constants.SLOT_WIDTH;\\n }\\n }\\n\\n /// @notice Return the `position`th slot of the `node`,\\n /// treating `node` as a uint32[32].\\n function getSlot(uint256 node, uint256 position)\\n internal\\n pure\\n returns (uint256)\\n {\\n unchecked {\\n uint256 shiftBits = position * Constants.SLOT_WIDTH;\\n // Doing a bitwise AND with `SLOT_MAX`\\n // clears all but the 32 least significant bits.\\n // Because of the right shift by `slotShift(position)` bits,\\n // those 32 bits contain the 32 bits in the `position`th slot of `node`.\\n return (node >> shiftBits) & Constants.SLOT_MAX;\\n }\\n }\\n\\n /// @notice Return `node` with the `position`th slot set to zero.\\n function clearSlot(uint256 node, uint256 position)\\n internal\\n pure\\n returns (uint256)\\n {\\n unchecked {\\n uint256 shiftBits = position * Constants.SLOT_WIDTH;\\n // Shifting `SLOT_MAX` left by `slotShift(position)` bits\\n // gives us a number where all bits of the `position`th slot are set,\\n // and all other bits are unset.\\n //\\n // Using a bitwise NOT on this number,\\n // we get a uint256 where all bits are set\\n // except for those of the `position`th slot.\\n //\\n // Bitwise ANDing the original `node` with this number\\n // sets the bits of `position`th slot to zero,\\n // leaving all other bits unchanged.\\n return node & ~(Constants.SLOT_MAX << shiftBits);\\n }\\n }\\n\\n /// @notice Return `node` with the `position`th slot set to `weight`.\\n ///\\n /// @param weight The weight of of the node.\\n /// Safely truncated to a 32-bit number,\\n /// but this should never be called with an overflowing weight regardless.\\n function setSlot(\\n uint256 node,\\n uint256 position,\\n uint256 weight\\n ) internal pure returns (uint256) {\\n unchecked {\\n uint256 shiftBits = position * Constants.SLOT_WIDTH;\\n // Clear the `position`th slot like in `clearSlot()`.\\n uint256 clearedNode = node & ~(Constants.SLOT_MAX << shiftBits);\\n // Bitwise AND `weight` with `SLOT_MAX`\\n // to clear all but the 32 least significant bits.\\n //\\n // Shift this left by `slotShift(position)` bits\\n // to obtain a uint256 with all bits unset\\n // except in the `position`th slot\\n // which contains the 32-bit value of `weight`.\\n uint256 shiftedWeight = (weight & Constants.SLOT_MAX) << shiftBits;\\n // When we bitwise OR these together,\\n // all other slots except the `position`th one come from the left argument,\\n // and the `position`th gets filled with `weight` from the right argument.\\n return clearedNode | shiftedWeight;\\n }\\n }\\n\\n /// @notice Calculate the summed weight of all slots in the `node`.\\n function sumWeight(uint256 node) internal pure returns (uint256 sum) {\\n unchecked {\\n sum = node & Constants.SLOT_MAX;\\n // Iterate through each slot\\n // by shifting `node` right in increments of 32 bits,\\n // and adding the 32 least significant bits to the `sum`.\\n uint256 newNode = node >> Constants.SLOT_WIDTH;\\n while (newNode > 0) {\\n sum += (newNode & Constants.SLOT_MAX);\\n newNode = newNode >> Constants.SLOT_WIDTH;\\n }\\n return sum;\\n }\\n }\\n\\n /// @notice Pick a slot in `node` that corresponds to `index`.\\n /// Treats the node like an array of virtual stakers,\\n /// the number of virtual stakers in each slot corresponding to its weight,\\n /// and picks which slot contains the `index`th virtual staker.\\n ///\\n /// @dev Requires that `index` be lower than `sumWeight(node)`.\\n /// However, this is not enforced for performance reasons.\\n /// If `index` exceeds the permitted range,\\n /// `pickWeightedSlot()` returns the rightmost slot\\n /// and an excessively high `newIndex`.\\n ///\\n /// @return slot The slot of `node` containing the `index`th virtual staker.\\n ///\\n /// @return newIndex The index of the `index`th virtual staker of `node`\\n /// within the returned slot.\\n function pickWeightedSlot(uint256 node, uint256 index)\\n internal\\n pure\\n returns (uint256 slot, uint256 newIndex)\\n {\\n unchecked {\\n newIndex = index;\\n uint256 newNode = node;\\n uint256 currentSlotWeight = newNode & Constants.SLOT_MAX;\\n while (newIndex >= currentSlotWeight) {\\n newIndex -= currentSlotWeight;\\n slot++;\\n newNode = newNode >> Constants.SLOT_WIDTH;\\n currentSlotWeight = newNode & Constants.SLOT_MAX;\\n }\\n return (slot, newIndex);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa7fb1c9c9789f30493e9a40e24a24f46875dc5e7630b4f67478167759f6d1882\"},\"@keep-network/sortition-pools/contracts/Chaosnet.sol\":{\"content\":\"pragma solidity 0.8.17;\\n\\n/// @title Chaosnet\\n/// @notice This is a beta staker program for stakers willing to go the extra\\n/// mile with monitoring, share their logs with the dev team, and allow to more\\n/// carefully monitor the bootstrapping network. As the network matures, the\\n/// beta program will be ended.\\ncontract Chaosnet {\\n /// @notice Indicates if the chaosnet is active. The chaosnet is active\\n /// after the contract deployment and can be ended with a call to\\n /// `deactivateChaosnet()`. Once deactivated chaosnet can not be activated\\n /// again.\\n bool public isChaosnetActive;\\n\\n /// @notice Indicates if the given operator is a beta operator for chaosnet.\\n mapping(address => bool) public isBetaOperator;\\n\\n /// @notice Address controlling chaosnet status and beta operator addresses.\\n address public chaosnetOwner;\\n\\n event BetaOperatorsAdded(address[] operators);\\n\\n event ChaosnetOwnerRoleTransferred(\\n address oldChaosnetOwner,\\n address newChaosnetOwner\\n );\\n\\n event ChaosnetDeactivated();\\n\\n constructor() {\\n _transferChaosnetOwner(msg.sender);\\n isChaosnetActive = true;\\n }\\n\\n modifier onlyChaosnetOwner() {\\n require(msg.sender == chaosnetOwner, \\\"Not the chaosnet owner\\\");\\n _;\\n }\\n\\n modifier onlyOnChaosnet() {\\n require(isChaosnetActive, \\\"Chaosnet is not active\\\");\\n _;\\n }\\n\\n /// @notice Adds beta operator to chaosnet. Can be called only by the\\n /// chaosnet owner when the chaosnet is active. Once the operator is added\\n /// as a beta operator, it can not be removed.\\n function addBetaOperators(address[] calldata operators)\\n public\\n onlyOnChaosnet\\n onlyChaosnetOwner\\n {\\n for (uint256 i = 0; i < operators.length; i++) {\\n isBetaOperator[operators[i]] = true;\\n }\\n\\n emit BetaOperatorsAdded(operators);\\n }\\n\\n /// @notice Deactivates the chaosnet. Can be called only by the chaosnet\\n /// owner. Once deactivated chaosnet can not be activated again.\\n function deactivateChaosnet() public onlyOnChaosnet onlyChaosnetOwner {\\n isChaosnetActive = false;\\n emit ChaosnetDeactivated();\\n }\\n\\n /// @notice Transfers the chaosnet owner role to another non-zero address.\\n function transferChaosnetOwnerRole(address newChaosnetOwner)\\n public\\n onlyChaosnetOwner\\n {\\n require(\\n newChaosnetOwner != address(0),\\n \\\"New chaosnet owner must not be zero address\\\"\\n );\\n _transferChaosnetOwner(newChaosnetOwner);\\n }\\n\\n function _transferChaosnetOwner(address newChaosnetOwner) internal {\\n address oldChaosnetOwner = chaosnetOwner;\\n chaosnetOwner = newChaosnetOwner;\\n emit ChaosnetOwnerRoleTransferred(oldChaosnetOwner, newChaosnetOwner);\\n }\\n}\\n\",\"keccak256\":\"0xeaf7bdd5626f88c329793a012621039692ce1b6e1f13013997ddb13d7e3032df\"},\"@keep-network/sortition-pools/contracts/Constants.sol\":{\"content\":\"pragma solidity 0.8.17;\\n\\nlibrary Constants {\\n ////////////////////////////////////////////////////////////////////////////\\n // Parameters for configuration\\n\\n // How many bits a position uses per level of the tree;\\n // each branch of the tree contains 2**SLOT_BITS slots.\\n uint256 constant SLOT_BITS = 3;\\n uint256 constant LEVELS = 7;\\n ////////////////////////////////////////////////////////////////////////////\\n\\n ////////////////////////////////////////////////////////////////////////////\\n // Derived constants, do not touch\\n uint256 constant SLOT_COUNT = 2**SLOT_BITS;\\n uint256 constant SLOT_WIDTH = 256 / SLOT_COUNT;\\n uint256 constant LAST_SLOT = SLOT_COUNT - 1;\\n uint256 constant SLOT_MAX = (2**SLOT_WIDTH) - 1;\\n uint256 constant POOL_CAPACITY = SLOT_COUNT**LEVELS;\\n\\n uint256 constant ID_WIDTH = SLOT_WIDTH;\\n uint256 constant ID_MAX = SLOT_MAX;\\n\\n uint256 constant BLOCKHEIGHT_WIDTH = 96 - ID_WIDTH;\\n uint256 constant BLOCKHEIGHT_MAX = (2**BLOCKHEIGHT_WIDTH) - 1;\\n\\n uint256 constant SLOT_POINTER_MAX = (2**SLOT_BITS) - 1;\\n uint256 constant LEAF_FLAG = 1 << 255;\\n\\n uint256 constant WEIGHT_WIDTH = 256 / SLOT_COUNT;\\n ////////////////////////////////////////////////////////////////////////////\\n}\\n\",\"keccak256\":\"0xaef690ced707935745ff1482b7bb9bd9eb77bf6a39c717465e64cf12db8a7d39\"},\"@keep-network/sortition-pools/contracts/Leaf.sol\":{\"content\":\"pragma solidity 0.8.17;\\n\\nimport \\\"./Constants.sol\\\";\\n\\nlibrary Leaf {\\n function make(\\n address _operator,\\n uint256 _creationBlock,\\n uint256 _id\\n ) internal pure returns (uint256) {\\n assert(_creationBlock <= type(uint64).max);\\n assert(_id <= type(uint32).max);\\n // Converting a bytesX type into a larger type\\n // adds zero bytes on the right.\\n uint256 op = uint256(bytes32(bytes20(_operator)));\\n // Bitwise AND the id to erase\\n // all but the 32 least significant bits\\n uint256 uid = _id & Constants.ID_MAX;\\n // Erase all but the 64 least significant bits,\\n // then shift left by 32 bits to make room for the id\\n uint256 cb = (_creationBlock & Constants.BLOCKHEIGHT_MAX) <<\\n Constants.ID_WIDTH;\\n // Bitwise OR them all together to get\\n // [address operator || uint64 creationBlock || uint32 id]\\n return (op | cb | uid);\\n }\\n\\n function operator(uint256 leaf) internal pure returns (address) {\\n // Converting a bytesX type into a smaller type\\n // truncates it on the right.\\n return address(bytes20(bytes32(leaf)));\\n }\\n\\n /// @notice Return the block number the leaf was created in.\\n function creationBlock(uint256 leaf) internal pure returns (uint256) {\\n return ((leaf >> Constants.ID_WIDTH) & Constants.BLOCKHEIGHT_MAX);\\n }\\n\\n function id(uint256 leaf) internal pure returns (uint32) {\\n // Id is stored in the 32 least significant bits.\\n // Bitwise AND ensures that we only get the contents of those bits.\\n return uint32(leaf & Constants.ID_MAX);\\n }\\n}\\n\",\"keccak256\":\"0xbd107a1a43e48884885e5e966ffcbcd8fa5e89863715d717bb4006e9f89cdc2b\"},\"@keep-network/sortition-pools/contracts/Position.sol\":{\"content\":\"pragma solidity 0.8.17;\\n\\nimport \\\"./Constants.sol\\\";\\n\\nlibrary Position {\\n // Return the last 3 bits of a position number,\\n // corresponding to its slot in its parent\\n function slot(uint256 a) internal pure returns (uint256) {\\n return a & Constants.SLOT_POINTER_MAX;\\n }\\n\\n // Return the parent of a position number\\n function parent(uint256 a) internal pure returns (uint256) {\\n return a >> Constants.SLOT_BITS;\\n }\\n\\n // Return the location of the child of a at the given slot\\n function child(uint256 a, uint256 s) internal pure returns (uint256) {\\n return (a << Constants.SLOT_BITS) | (s & Constants.SLOT_POINTER_MAX); // slot(s)\\n }\\n\\n // Return the uint p as a flagged position uint:\\n // the least significant 21 bits contain the position\\n // and the 22nd bit is set as a flag\\n // to distinguish the position 0x000000 from an empty field.\\n function setFlag(uint256 p) internal pure returns (uint256) {\\n return p | Constants.LEAF_FLAG;\\n }\\n\\n // Turn a flagged position into an unflagged position\\n // by removing the flag at the 22nd least significant bit.\\n //\\n // We shouldn't _actually_ need this\\n // as all position-manipulating code should ignore non-position bits anyway\\n // but it's cheap to call so might as well do it.\\n function unsetFlag(uint256 p) internal pure returns (uint256) {\\n return p & (~Constants.LEAF_FLAG);\\n }\\n}\\n\",\"keccak256\":\"0xd3a927908080ac21353a92a6bce3d69e94a5c30f6b51f16b271b6cc679f110e2\"},\"@keep-network/sortition-pools/contracts/RNG.sol\":{\"content\":\"pragma solidity 0.8.17;\\n\\nimport \\\"./Leaf.sol\\\";\\nimport \\\"./Constants.sol\\\";\\n\\nlibrary RNG {\\n /// @notice Get an index in the range `[0 .. range-1]`\\n /// and the new state of the RNG,\\n /// using the provided `state` of the RNG.\\n ///\\n /// @param range The upper bound of the index, exclusive.\\n ///\\n /// @param state The previous state of the RNG.\\n /// The initial state needs to be obtained\\n /// from a trusted randomness oracle (the random beacon),\\n /// or from a chain of earlier calls to `RNG.getIndex()`\\n /// on an originally trusted seed.\\n ///\\n /// @dev Calculates the number of bits required for the desired range,\\n /// takes the least significant bits of `state`\\n /// and checks if the obtained index is within the desired range.\\n /// The original state is hashed with `keccak256` to get a new state.\\n /// If the index is outside the range,\\n /// the function retries until it gets a suitable index.\\n ///\\n /// @return index A random integer between `0` and `range - 1`, inclusive.\\n ///\\n /// @return newState The new state of the RNG.\\n /// When `getIndex()` is called one or more times,\\n /// care must be taken to always use the output `state`\\n /// of the most recent call as the input `state` of a subsequent call.\\n /// At the end of a transaction calling `RNG.getIndex()`,\\n /// the previous stored state must be overwritten with the latest output.\\n function getIndex(\\n uint256 range,\\n bytes32 state,\\n uint256 bits\\n ) internal view returns (uint256, bytes32) {\\n bool found = false;\\n uint256 index = 0;\\n bytes32 newState = state;\\n while (!found) {\\n index = truncate(bits, uint256(newState));\\n newState = keccak256(abi.encodePacked(newState, address(this)));\\n if (index < range) {\\n found = true;\\n }\\n }\\n return (index, newState);\\n }\\n\\n /// @notice Calculate how many bits are required\\n /// for an index in the range `[0 .. range-1]`.\\n ///\\n /// @param range The upper bound of the desired range, exclusive.\\n ///\\n /// @return uint The smallest number of bits\\n /// that can contain the number `range-1`.\\n function bitsRequired(uint256 range) internal pure returns (uint256) {\\n unchecked {\\n if (range == 1) {\\n return 0;\\n }\\n\\n uint256 bits = Constants.WEIGHT_WIDTH - 1;\\n\\n // Left shift by `bits`,\\n // so we have a 1 in the (bits + 1)th least significant bit\\n // and 0 in other bits.\\n // If this number is equal or greater than `range`,\\n // the range [0, range-1] fits in `bits` bits.\\n //\\n // Because we loop from high bits to low bits,\\n // we find the highest number of bits that doesn't fit the range,\\n // and return that number + 1.\\n while (1 << bits >= range) {\\n bits--;\\n }\\n\\n return bits + 1;\\n }\\n }\\n\\n /// @notice Truncate `input` to the `bits` least significant bits.\\n function truncate(uint256 bits, uint256 input)\\n internal\\n pure\\n returns (uint256)\\n {\\n unchecked {\\n return input & ((1 << bits) - 1);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x67f87f589cd5123ffa32f883ea2f09b0e56258508bae82b8c655b3c27c71eb5e\"},\"@keep-network/sortition-pools/contracts/Rewards.sol\":{\"content\":\"pragma solidity 0.8.17;\\n\\n/// @title Rewards\\n/// @notice Rewards are allocated proportionally to operators\\n/// present in the pool at payout based on their weight in the pool.\\n///\\n/// To facilitate this, we use a global accumulator value\\n/// to track the total rewards one unit of weight would've earned\\n/// since the creation of the pool.\\n///\\n/// Whenever a reward is paid, the accumulator is increased\\n/// by the size of the reward divided by the total weight\\n/// of all eligible operators in the pool.\\n///\\n/// Each operator has an individual accumulator value,\\n/// set to equal the global accumulator when the operator joins the pool.\\n/// This accumulator reflects the amount of rewards\\n/// that have already been accounted for with that operator.\\n///\\n/// Whenever an operator's weight in the pool changes,\\n/// we can update the amount of rewards the operator has earned\\n/// by subtracting the operator's accumulator from the global accumulator.\\n/// This gives us the amount of rewards one unit of weight has earned\\n/// since the last time the operator's rewards have been updated.\\n/// Then we multiply that by the operator's previous (pre-change) weight\\n/// to determine how much rewards in total the operator has earned,\\n/// and add this to the operator's earned rewards.\\n/// Finally, we set the operator's accumulator to the global accumulator value.\\ncontract Rewards {\\n struct OperatorRewards {\\n // The state of the global accumulator\\n // when the operator's rewards were last updated\\n uint96 accumulated;\\n // The amount of rewards collected by the operator after the latest update.\\n // The amount the operator could withdraw may equal `available`\\n // or it may be greater, if more rewards have been paid in since then.\\n // To evaulate the most recent amount including rewards potentially paid\\n // since the last update, use `availableRewards` function.\\n uint96 available;\\n // If nonzero, the operator is ineligible for rewards\\n // and may only re-enable rewards after the specified timestamp.\\n // XXX: unsigned 32-bit integer unix seconds, will break around 2106\\n uint32 ineligibleUntil;\\n // Locally cached weight of the operator,\\n // used to reduce the cost of setting operators ineligible.\\n uint32 weight;\\n }\\n\\n // The global accumulator of how much rewards\\n // a hypothetical operator of weight 1 would have earned\\n // since the creation of the pool.\\n uint96 internal globalRewardAccumulator;\\n // If the amount of reward tokens paid in\\n // does not divide cleanly by pool weight,\\n // the difference is recorded as rounding dust\\n // and added to the next reward.\\n uint96 internal rewardRoundingDust;\\n\\n // The amount of rewards that would've been earned by ineligible operators\\n // had they not been ineligible.\\n uint96 public ineligibleEarnedRewards;\\n\\n // Ineligibility times are calculated from this offset,\\n // set at contract creation.\\n uint256 internal immutable ineligibleOffsetStart;\\n\\n mapping(uint32 => OperatorRewards) internal operatorRewards;\\n\\n constructor() {\\n // solhint-disable-next-line not-rely-on-time\\n ineligibleOffsetStart = block.timestamp;\\n }\\n\\n /// @notice Return whether the operator is eligible for rewards or not.\\n function isEligibleForRewards(uint32 operator) internal view returns (bool) {\\n return operatorRewards[operator].ineligibleUntil == 0;\\n }\\n\\n /// @notice Return the time the operator's reward eligibility can be restored.\\n function rewardsEligibilityRestorableAt(uint32 operator)\\n internal\\n view\\n returns (uint256)\\n {\\n uint32 until = operatorRewards[operator].ineligibleUntil;\\n require(until != 0, \\\"Operator already eligible\\\");\\n return (uint256(until) + ineligibleOffsetStart);\\n }\\n\\n /// @notice Return whether the operator is able to restore their eligibility\\n /// for rewards right away.\\n function canRestoreRewardEligibility(uint32 operator)\\n internal\\n view\\n returns (bool)\\n {\\n // solhint-disable-next-line not-rely-on-time\\n return rewardsEligibilityRestorableAt(operator) <= block.timestamp;\\n }\\n\\n /// @notice Internal function for updating the global state of rewards.\\n function addRewards(uint96 rewardAmount, uint32 currentPoolWeight) internal {\\n require(currentPoolWeight > 0, \\\"No recipients in pool\\\");\\n\\n uint96 totalAmount = rewardAmount + rewardRoundingDust;\\n uint96 perWeightReward = totalAmount / currentPoolWeight;\\n uint96 newRoundingDust = totalAmount % currentPoolWeight;\\n\\n globalRewardAccumulator += perWeightReward;\\n rewardRoundingDust = newRoundingDust;\\n }\\n\\n /// @notice Internal function for updating the operator's reward state.\\n function updateOperatorRewards(uint32 operator, uint32 newWeight) internal {\\n uint96 acc = globalRewardAccumulator;\\n OperatorRewards memory o = operatorRewards[operator];\\n uint96 accruedRewards = (acc - o.accumulated) * uint96(o.weight);\\n if (o.ineligibleUntil == 0) {\\n // If operator is not ineligible, update their earned rewards\\n o.available += accruedRewards;\\n } else {\\n // If ineligible, put the rewards into the ineligible pot\\n ineligibleEarnedRewards += accruedRewards;\\n }\\n // In any case, update their accumulator and weight\\n o.accumulated = acc;\\n o.weight = newWeight;\\n operatorRewards[operator] = o;\\n }\\n\\n /// @notice Set the amount of withdrawable tokens to zero\\n /// and return the previous withdrawable amount.\\n /// @dev Does not update the withdrawable amount,\\n /// but should usually be accompanied by an update.\\n function withdrawOperatorRewards(uint32 operator)\\n internal\\n returns (uint96 withdrawable)\\n {\\n OperatorRewards storage o = operatorRewards[operator];\\n withdrawable = o.available;\\n o.available = 0;\\n }\\n\\n /// @notice Set the amount of ineligible-earned tokens to zero\\n /// and return the previous amount.\\n function withdrawIneligibleRewards() internal returns (uint96 withdrawable) {\\n withdrawable = ineligibleEarnedRewards;\\n ineligibleEarnedRewards = 0;\\n }\\n\\n /// @notice Set the given operators as ineligible for rewards.\\n /// The operators can restore their eligibility at the given time.\\n function setIneligible(uint32[] memory operators, uint256 until) internal {\\n OperatorRewards memory o = OperatorRewards(0, 0, 0, 0);\\n uint96 globalAcc = globalRewardAccumulator;\\n uint96 accrued = 0;\\n // Record ineligibility as seconds after contract creation\\n uint32 _until = uint32(until - ineligibleOffsetStart);\\n\\n for (uint256 i = 0; i < operators.length; i++) {\\n uint32 operator = operators[i];\\n OperatorRewards storage r = operatorRewards[operator];\\n o.available = r.available;\\n o.accumulated = r.accumulated;\\n o.ineligibleUntil = r.ineligibleUntil;\\n o.weight = r.weight;\\n\\n if (o.ineligibleUntil != 0) {\\n // If operator is already ineligible,\\n // don't earn rewards or shorten its ineligibility\\n if (o.ineligibleUntil < _until) {\\n o.ineligibleUntil = _until;\\n }\\n } else {\\n // The operator becomes ineligible -> earn rewards\\n o.ineligibleUntil = _until;\\n accrued = (globalAcc - o.accumulated) * uint96(o.weight);\\n o.available += accrued;\\n }\\n o.accumulated = globalAcc;\\n\\n r.available = o.available;\\n r.accumulated = o.accumulated;\\n r.ineligibleUntil = o.ineligibleUntil;\\n r.weight = o.weight;\\n }\\n }\\n\\n /// @notice Restore the given operator's eligibility for rewards.\\n function restoreEligibility(uint32 operator) internal {\\n // solhint-disable-next-line not-rely-on-time\\n require(canRestoreRewardEligibility(operator), \\\"Operator still ineligible\\\");\\n uint96 acc = globalRewardAccumulator;\\n OperatorRewards memory o = operatorRewards[operator];\\n uint96 accruedRewards = (acc - o.accumulated) * uint96(o.weight);\\n ineligibleEarnedRewards += accruedRewards;\\n o.accumulated = acc;\\n o.ineligibleUntil = 0;\\n operatorRewards[operator] = o;\\n }\\n\\n /// @notice Returns the amount of rewards currently available for withdrawal\\n /// for the given operator.\\n function availableRewards(uint32 operator) internal view returns (uint96) {\\n uint96 acc = globalRewardAccumulator;\\n OperatorRewards memory o = operatorRewards[operator];\\n if (o.ineligibleUntil == 0) {\\n // If operator is not ineligible, calculate newly accrued rewards and add\\n // them to the available ones, calculated during the last update.\\n uint96 accruedRewards = (acc - o.accumulated) * uint96(o.weight);\\n return o.available + accruedRewards;\\n } else {\\n // If ineligible, return only the rewards calculated during the last\\n // update.\\n return o.available;\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3a10abb408b44335a092387b2c7ee01db3b27997f1f2c888d9b7a2d92934c4e2\"},\"@keep-network/sortition-pools/contracts/SortitionPool.sol\":{\"content\":\"pragma solidity 0.8.17;\\n\\nimport \\\"@thesis/solidity-contracts/contracts/token/IERC20WithPermit.sol\\\";\\nimport \\\"@thesis/solidity-contracts/contracts/token/IReceiveApproval.sol\\\";\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport \\\"./RNG.sol\\\";\\nimport \\\"./SortitionTree.sol\\\";\\nimport \\\"./Rewards.sol\\\";\\nimport \\\"./Chaosnet.sol\\\";\\n\\n/// @title Sortition Pool\\n/// @notice A logarithmic data structure used to store the pool of eligible\\n/// operators weighted by their stakes. It allows to select a group of operators\\n/// based on the provided pseudo-random seed.\\ncontract SortitionPool is\\n SortitionTree,\\n Rewards,\\n Ownable,\\n Chaosnet,\\n IReceiveApproval\\n{\\n using Branch for uint256;\\n using Leaf for uint256;\\n using Position for uint256;\\n\\n IERC20WithPermit public immutable rewardToken;\\n\\n uint256 public immutable poolWeightDivisor;\\n\\n bool public isLocked;\\n\\n event IneligibleForRewards(uint32[] ids, uint256 until);\\n\\n event RewardEligibilityRestored(address indexed operator, uint32 indexed id);\\n\\n /// @notice Reverts if called while pool is locked.\\n modifier onlyUnlocked() {\\n require(!isLocked, \\\"Sortition pool locked\\\");\\n _;\\n }\\n\\n /// @notice Reverts if called while pool is unlocked.\\n modifier onlyLocked() {\\n require(isLocked, \\\"Sortition pool unlocked\\\");\\n _;\\n }\\n\\n constructor(IERC20WithPermit _rewardToken, uint256 _poolWeightDivisor) {\\n rewardToken = _rewardToken;\\n poolWeightDivisor = _poolWeightDivisor;\\n }\\n\\n function receiveApproval(\\n address sender,\\n uint256 amount,\\n address token,\\n bytes calldata\\n ) external override {\\n require(token == address(rewardToken), \\\"Unsupported token\\\");\\n rewardToken.transferFrom(sender, address(this), amount);\\n Rewards.addRewards(uint96(amount), uint32(root.sumWeight()));\\n }\\n\\n /// @notice Withdraws all available rewards for the given operator to the\\n /// given beneficiary.\\n /// @dev Can be called only be the owner. Does not validate if the provided\\n /// beneficiary is associated with the provided operator - this needs to\\n /// be done by the owner calling this function.\\n /// @return The amount of rewards withdrawn in this call.\\n function withdrawRewards(address operator, address beneficiary)\\n public\\n onlyOwner\\n returns (uint96)\\n {\\n uint32 id = getOperatorID(operator);\\n Rewards.updateOperatorRewards(id, uint32(getPoolWeight(operator)));\\n uint96 earned = Rewards.withdrawOperatorRewards(id);\\n rewardToken.transfer(beneficiary, uint256(earned));\\n return earned;\\n }\\n\\n /// @notice Withdraws rewards not allocated to operators marked as ineligible\\n /// to the given recipient address.\\n /// @dev Can be called only by the owner.\\n function withdrawIneligible(address recipient) public onlyOwner {\\n uint96 earned = Rewards.withdrawIneligibleRewards();\\n rewardToken.transfer(recipient, uint256(earned));\\n }\\n\\n /// @notice Locks the sortition pool. In locked state, members cannot be\\n /// inserted and removed from the pool. Members statuses cannot\\n /// be updated as well.\\n /// @dev Can be called only by the contract owner.\\n function lock() public onlyOwner {\\n isLocked = true;\\n }\\n\\n /// @notice Unlocks the sortition pool. Removes all restrictions set by\\n /// the `lock` method.\\n /// @dev Can be called only by the contract owner.\\n function unlock() public onlyOwner {\\n isLocked = false;\\n }\\n\\n /// @notice Inserts an operator to the pool. Reverts if the operator is\\n /// already present. Reverts if the operator is not eligible because of their\\n /// authorized stake. Reverts if the chaosnet is active and the operator is\\n /// not a beta operator.\\n /// @dev Can be called only by the contract owner.\\n /// @param operator Address of the inserted operator.\\n /// @param authorizedStake Inserted operator's authorized stake for the application.\\n function insertOperator(address operator, uint256 authorizedStake)\\n public\\n onlyOwner\\n onlyUnlocked\\n {\\n uint256 weight = getWeight(authorizedStake);\\n require(weight > 0, \\\"Operator not eligible\\\");\\n\\n if (isChaosnetActive) {\\n require(isBetaOperator[operator], \\\"Not beta operator for chaosnet\\\");\\n }\\n\\n _insertOperator(operator, weight);\\n uint32 id = getOperatorID(operator);\\n Rewards.updateOperatorRewards(id, uint32(weight));\\n }\\n\\n /// @notice Update the operator's weight if present and eligible,\\n /// or remove from the pool if present and ineligible.\\n /// @dev Can be called only by the contract owner.\\n /// @param operator Address of the updated operator.\\n /// @param authorizedStake Operator's authorized stake for the application.\\n function updateOperatorStatus(address operator, uint256 authorizedStake)\\n public\\n onlyOwner\\n onlyUnlocked\\n {\\n uint256 weight = getWeight(authorizedStake);\\n\\n uint32 id = getOperatorID(operator);\\n Rewards.updateOperatorRewards(id, uint32(weight));\\n\\n if (weight == 0) {\\n _removeOperator(operator);\\n } else {\\n updateOperator(operator, weight);\\n }\\n }\\n\\n /// @notice Set the given operators as ineligible for rewards.\\n /// The operators can restore their eligibility at the given time.\\n function setRewardIneligibility(uint32[] calldata operators, uint256 until)\\n public\\n onlyOwner\\n {\\n Rewards.setIneligible(operators, until);\\n emit IneligibleForRewards(operators, until);\\n }\\n\\n /// @notice Restores reward eligibility for the operator.\\n function restoreRewardEligibility(address operator) public {\\n uint32 id = getOperatorID(operator);\\n Rewards.restoreEligibility(id);\\n emit RewardEligibilityRestored(operator, id);\\n }\\n\\n /// @notice Returns whether the operator is eligible for rewards or not.\\n function isEligibleForRewards(address operator) public view returns (bool) {\\n uint32 id = getOperatorID(operator);\\n return Rewards.isEligibleForRewards(id);\\n }\\n\\n /// @notice Returns the time the operator's reward eligibility can be restored.\\n function rewardsEligibilityRestorableAt(address operator)\\n public\\n view\\n returns (uint256)\\n {\\n uint32 id = getOperatorID(operator);\\n return Rewards.rewardsEligibilityRestorableAt(id);\\n }\\n\\n /// @notice Returns whether the operator is able to restore their eligibility\\n /// for rewards right away.\\n function canRestoreRewardEligibility(address operator)\\n public\\n view\\n returns (bool)\\n {\\n uint32 id = getOperatorID(operator);\\n return Rewards.canRestoreRewardEligibility(id);\\n }\\n\\n /// @notice Returns the amount of rewards withdrawable for the given operator.\\n function getAvailableRewards(address operator) public view returns (uint96) {\\n uint32 id = getOperatorID(operator);\\n return availableRewards(id);\\n }\\n\\n /// @notice Return whether the operator is present in the pool.\\n function isOperatorInPool(address operator) public view returns (bool) {\\n return getFlaggedLeafPosition(operator) != 0;\\n }\\n\\n /// @notice Return whether the operator's weight in the pool\\n /// matches their eligible weight.\\n function isOperatorUpToDate(address operator, uint256 authorizedStake)\\n public\\n view\\n returns (bool)\\n {\\n return getWeight(authorizedStake) == getPoolWeight(operator);\\n }\\n\\n /// @notice Return the weight of the operator in the pool,\\n /// which may or may not be out of date.\\n function getPoolWeight(address operator) public view returns (uint256) {\\n uint256 flaggedPosition = getFlaggedLeafPosition(operator);\\n if (flaggedPosition == 0) {\\n return 0;\\n } else {\\n uint256 leafPosition = flaggedPosition.unsetFlag();\\n uint256 leafWeight = getLeafWeight(leafPosition);\\n return leafWeight;\\n }\\n }\\n\\n /// @notice Selects a new group of operators of the provided size based on\\n /// the provided pseudo-random seed. At least one operator has to be\\n /// registered in the pool, otherwise the function fails reverting the\\n /// transaction.\\n /// @param groupSize Size of the requested group\\n /// @param seed Pseudo-random number used to select operators to group\\n /// @return selected Members of the selected group\\n function selectGroup(uint256 groupSize, bytes32 seed)\\n public\\n view\\n onlyLocked\\n returns (uint32[] memory)\\n {\\n uint256 _root = root;\\n\\n bytes32 rngState = seed;\\n uint256 rngRange = _root.sumWeight();\\n require(rngRange > 0, \\\"Not enough operators in pool\\\");\\n uint256 currentIndex;\\n\\n uint256 bits = RNG.bitsRequired(rngRange);\\n\\n uint32[] memory selected = new uint32[](groupSize);\\n\\n for (uint256 i = 0; i < groupSize; i++) {\\n (currentIndex, rngState) = RNG.getIndex(rngRange, rngState, bits);\\n\\n uint256 leafPosition = pickWeightedLeaf(currentIndex, _root);\\n\\n uint256 leaf = leaves[leafPosition];\\n selected[i] = leaf.id();\\n }\\n return selected;\\n }\\n\\n function getWeight(uint256 authorization) internal view returns (uint256) {\\n return authorization / poolWeightDivisor;\\n }\\n}\\n\",\"keccak256\":\"0xab42e7c5b1828f42a73f699eb2dc96d4f793572a6323b8b1fbd7c5e0c065bda7\"},\"@keep-network/sortition-pools/contracts/SortitionTree.sol\":{\"content\":\"pragma solidity 0.8.17;\\n\\nimport \\\"./Branch.sol\\\";\\nimport \\\"./Position.sol\\\";\\nimport \\\"./Leaf.sol\\\";\\nimport \\\"./Constants.sol\\\";\\n\\ncontract SortitionTree {\\n using Branch for uint256;\\n using Position for uint256;\\n using Leaf for uint256;\\n\\n // implicit tree\\n // root 8\\n // level2 64\\n // level3 512\\n // level4 4k\\n // level5 32k\\n // level6 256k\\n // level7 2M\\n uint256 internal root;\\n\\n // A 2-index mapping from layer => (index (0-index) => branch). For example,\\n // to access the 6th branch in the 2nd layer (right below the root node; the\\n // first branch layer), call branches[2][5]. Mappings are used in place of\\n // arrays for efficiency. The root is the first layer, the branches occupy\\n // layers 2 through 7, and layer 8 is for the leaves. Following this\\n // convention, the first index in `branches` is `2`, and the last index is\\n // `7`.\\n mapping(uint256 => mapping(uint256 => uint256)) internal branches;\\n\\n // A 0-index mapping from index => leaf, acting as an array. For example, to\\n // access the 42nd leaf, call leaves[41].\\n mapping(uint256 => uint256) internal leaves;\\n\\n // the flagged (see setFlag() and unsetFlag() in Position.sol) positions\\n // of all operators present in the pool\\n mapping(address => uint256) internal flaggedLeafPosition;\\n\\n // the leaf after the rightmost occupied leaf of each stack\\n uint256 internal rightmostLeaf;\\n\\n // the empty leaves in each stack\\n // between 0 and the rightmost occupied leaf\\n uint256[] internal emptyLeaves;\\n\\n // Each operator has an uint32 ID number\\n // which is allocated when they first join the pool\\n // and remains unchanged even if they leave and rejoin the pool.\\n mapping(address => uint32) internal operatorID;\\n\\n // The idAddress array records the address corresponding to each ID number.\\n // The ID number 0 is initialized with a zero address and is not used.\\n address[] internal idAddress;\\n\\n constructor() {\\n root = 0;\\n rightmostLeaf = 0;\\n idAddress.push();\\n }\\n\\n /// @notice Return the ID number of the given operator address. An ID number\\n /// of 0 means the operator has not been allocated an ID number yet.\\n /// @param operator Address of the operator.\\n /// @return the ID number of the given operator address\\n function getOperatorID(address operator) public view returns (uint32) {\\n return operatorID[operator];\\n }\\n\\n /// @notice Get the operator address corresponding to the given ID number. A\\n /// zero address means the ID number has not been allocated yet.\\n /// @param id ID of the operator\\n /// @return the address of the operator\\n function getIDOperator(uint32 id) public view returns (address) {\\n return idAddress.length > id ? idAddress[id] : address(0);\\n }\\n\\n /// @notice Gets the operator addresses corresponding to the given ID\\n /// numbers. A zero address means the ID number has not been allocated yet.\\n /// This function works just like getIDOperator except that it allows to fetch\\n /// operator addresses for multiple IDs in one call.\\n /// @param ids the array of the operator ids\\n /// @return an array of the associated operator addresses\\n function getIDOperators(uint32[] calldata ids)\\n public\\n view\\n returns (address[] memory)\\n {\\n uint256 idCount = idAddress.length;\\n\\n address[] memory operators = new address[](ids.length);\\n for (uint256 i = 0; i < ids.length; i++) {\\n uint32 id = ids[i];\\n operators[i] = idCount > id ? idAddress[id] : address(0);\\n }\\n return operators;\\n }\\n\\n /// @notice Checks if operator is already registered in the pool.\\n /// @param operator the address of the operator\\n /// @return whether or not the operator is already registered in the pool\\n function isOperatorRegistered(address operator) public view returns (bool) {\\n return getFlaggedLeafPosition(operator) != 0;\\n }\\n\\n /// @notice Sum the number of operators in each trunk.\\n /// @return the number of operators in the pool\\n function operatorsInPool() public view returns (uint256) {\\n // Get the number of leaves that might be occupied;\\n // if `rightmostLeaf` equals `firstLeaf()` the tree must be empty,\\n // otherwise the difference between these numbers\\n // gives the number of leaves that may be occupied.\\n uint256 nPossiblyUsedLeaves = rightmostLeaf;\\n // Get the number of empty leaves\\n // not accounted for by the `rightmostLeaf`\\n uint256 nEmptyLeaves = emptyLeaves.length;\\n\\n return (nPossiblyUsedLeaves - nEmptyLeaves);\\n }\\n\\n /// @notice Convenience method to return the total weight of the pool\\n /// @return the total weight of the pool\\n function totalWeight() public view returns (uint256) {\\n return root.sumWeight();\\n }\\n\\n /// @notice Give the operator a new ID number.\\n /// Does not check if the operator already has an ID number.\\n /// @param operator the address of the operator\\n /// @return a new ID for that operator\\n function allocateOperatorID(address operator) internal returns (uint256) {\\n uint256 id = idAddress.length;\\n\\n require(id <= type(uint32).max, \\\"Pool capacity exceeded\\\");\\n\\n operatorID[operator] = uint32(id);\\n idAddress.push(operator);\\n return id;\\n }\\n\\n /// @notice Inserts an operator into the sortition pool\\n /// @param operator the address of an operator to insert\\n /// @param weight how much weight that operator has in the pool\\n function _insertOperator(address operator, uint256 weight) internal {\\n require(\\n !isOperatorRegistered(operator),\\n \\\"Operator is already registered in the pool\\\"\\n );\\n\\n // Fetch the operator's ID, and if they don't have one, allocate them one.\\n uint256 id = getOperatorID(operator);\\n if (id == 0) {\\n id = allocateOperatorID(operator);\\n }\\n\\n // Determine which leaf to insert them into\\n uint256 position = getEmptyLeafPosition();\\n // Record the block the operator was inserted in\\n uint256 theLeaf = Leaf.make(operator, block.number, id);\\n\\n // Update the leaf, and propagate the weight changes all the way up to the\\n // root.\\n root = setLeaf(position, theLeaf, weight, root);\\n\\n // Without position flags,\\n // the position 0x000000 would be treated as empty\\n flaggedLeafPosition[operator] = position.setFlag();\\n }\\n\\n /// @notice Remove an operator (and their weight) from the pool.\\n /// @param operator the address of the operator to remove\\n function _removeOperator(address operator) internal {\\n uint256 flaggedPosition = getFlaggedLeafPosition(operator);\\n require(flaggedPosition != 0, \\\"Operator is not registered in the pool\\\");\\n uint256 unflaggedPosition = flaggedPosition.unsetFlag();\\n\\n // Update the leaf, and propagate the weight changes all the way up to the\\n // root.\\n root = removeLeaf(unflaggedPosition, root);\\n removeLeafPositionRecord(operator);\\n }\\n\\n /// @notice Update an operator's weight in the pool.\\n /// @param operator the address of the operator to update\\n /// @param weight the new weight\\n function updateOperator(address operator, uint256 weight) internal {\\n require(\\n isOperatorRegistered(operator),\\n \\\"Operator is not registered in the pool\\\"\\n );\\n\\n uint256 flaggedPosition = getFlaggedLeafPosition(operator);\\n uint256 unflaggedPosition = flaggedPosition.unsetFlag();\\n root = updateLeaf(unflaggedPosition, weight, root);\\n }\\n\\n /// @notice Helper method to remove a leaf position record for an operator.\\n /// @param operator the address of the operator to remove the record for\\n function removeLeafPositionRecord(address operator) internal {\\n flaggedLeafPosition[operator] = 0;\\n }\\n\\n /// @notice Removes the data and weight from a particular leaf.\\n /// @param position the leaf index to remove\\n /// @param _root the root node containing the leaf\\n /// @return the updated root node\\n function removeLeaf(uint256 position, uint256 _root)\\n internal\\n returns (uint256)\\n {\\n uint256 rightmostSubOne = rightmostLeaf - 1;\\n bool isRightmost = position == rightmostSubOne;\\n\\n // Clears out the data in the leaf node, and then propagates the weight\\n // changes all the way up to the root.\\n uint256 newRoot = setLeaf(position, 0, 0, _root);\\n\\n // Infer if need to fall back on emptyLeaves yet\\n if (isRightmost) {\\n rightmostLeaf = rightmostSubOne;\\n } else {\\n emptyLeaves.push(position);\\n }\\n return newRoot;\\n }\\n\\n /// @notice Updates the tree to give a particular leaf a new weight.\\n /// @param position the index of the leaf to update\\n /// @param weight the new weight\\n /// @param _root the root node containing the leaf\\n /// @return the updated root node\\n function updateLeaf(\\n uint256 position,\\n uint256 weight,\\n uint256 _root\\n ) internal returns (uint256) {\\n if (getLeafWeight(position) != weight) {\\n return updateTree(position, weight, _root);\\n } else {\\n return _root;\\n }\\n }\\n\\n /// @notice Places a leaf into a particular position, with a given weight and\\n /// propagates that change.\\n /// @param position the index to place the leaf in\\n /// @param theLeaf the new leaf to place in the position\\n /// @param leafWeight the weight of the leaf\\n /// @param _root the root containing the new leaf\\n /// @return the updated root node\\n function setLeaf(\\n uint256 position,\\n uint256 theLeaf,\\n uint256 leafWeight,\\n uint256 _root\\n ) internal returns (uint256) {\\n // set leaf\\n leaves[position] = theLeaf;\\n\\n return (updateTree(position, leafWeight, _root));\\n }\\n\\n /// @notice Propagates a weight change at a position through the tree,\\n /// eventually returning the updated root.\\n /// @param position the index of leaf to update\\n /// @param weight the new weight of the leaf\\n /// @param _root the root node containing the leaf\\n /// @return the updated root node\\n function updateTree(\\n uint256 position,\\n uint256 weight,\\n uint256 _root\\n ) internal returns (uint256) {\\n uint256 childSlot;\\n uint256 treeNode;\\n uint256 newNode;\\n uint256 nodeWeight = weight;\\n\\n uint256 parent = position;\\n // set levels 7 to 2\\n for (uint256 level = Constants.LEVELS; level >= 2; level--) {\\n childSlot = parent.slot();\\n parent = parent.parent();\\n treeNode = branches[level][parent];\\n newNode = treeNode.setSlot(childSlot, nodeWeight);\\n branches[level][parent] = newNode;\\n nodeWeight = newNode.sumWeight();\\n }\\n\\n // set level Root\\n childSlot = parent.slot();\\n return _root.setSlot(childSlot, nodeWeight);\\n }\\n\\n /// @notice Retrieves the next available empty leaf position. Tries to fill\\n /// left to right first, ignoring leaf removals, and then fills\\n /// most-recent-removals first.\\n /// @return the position of the empty leaf\\n function getEmptyLeafPosition() internal returns (uint256) {\\n uint256 rLeaf = rightmostLeaf;\\n bool spaceOnRight = (rLeaf + 1) < Constants.POOL_CAPACITY;\\n if (spaceOnRight) {\\n rightmostLeaf = rLeaf + 1;\\n return rLeaf;\\n } else {\\n uint256 emptyLeafCount = emptyLeaves.length;\\n require(emptyLeafCount > 0, \\\"Pool is full\\\");\\n uint256 emptyLeaf = emptyLeaves[emptyLeafCount - 1];\\n emptyLeaves.pop();\\n return emptyLeaf;\\n }\\n }\\n\\n /// @notice Gets the flagged leaf position for an operator.\\n /// @param operator the address of the operator\\n /// @return the leaf position of that operator\\n function getFlaggedLeafPosition(address operator)\\n internal\\n view\\n returns (uint256)\\n {\\n return flaggedLeafPosition[operator];\\n }\\n\\n /// @notice Gets the weight of a leaf at a particular position.\\n /// @param position the index of the leaf\\n /// @return the weight of the leaf at that position\\n function getLeafWeight(uint256 position) internal view returns (uint256) {\\n uint256 slot = position.slot();\\n uint256 parent = position.parent();\\n\\n // A leaf's weight information is stored a 32-bit slot in the branch layer\\n // directly above the leaf layer. To access it, we calculate that slot and\\n // parent position, and always know the hard-coded layer index.\\n uint256 node = branches[Constants.LEVELS][parent];\\n return node.getSlot(slot);\\n }\\n\\n /// @notice Picks a leaf given a random index.\\n /// @param index a number in `[0, _root.totalWeight())` used to decide\\n /// between leaves\\n /// @param _root the root of the tree\\n function pickWeightedLeaf(uint256 index, uint256 _root)\\n internal\\n view\\n returns (uint256 leafPosition)\\n {\\n uint256 currentIndex = index;\\n uint256 currentNode = _root;\\n uint256 currentPosition = 0;\\n uint256 currentSlot;\\n\\n require(index < currentNode.sumWeight(), \\\"Index exceeds weight\\\");\\n\\n // get root slot\\n (currentSlot, currentIndex) = currentNode.pickWeightedSlot(currentIndex);\\n\\n // get slots from levels 2 to 7\\n for (uint256 level = 2; level <= Constants.LEVELS; level++) {\\n currentPosition = currentPosition.child(currentSlot);\\n currentNode = branches[level][currentPosition];\\n (currentSlot, currentIndex) = currentNode.pickWeightedSlot(currentIndex);\\n }\\n\\n // get leaf position\\n leafPosition = currentPosition.child(currentSlot);\\n }\\n}\\n\",\"keccak256\":\"0x51daeca62ef52be78a1a9de4d2a1c5900c873165f59eda14d5965d7d7da90a03\"},\"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/MathUpgradeable.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary StringsUpgradeable {\\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 = MathUpgradeable.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, MathUpgradeable.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0x6b9a5d35b744b25529a2856a8093e7c03fb35a34b1c4fb5499e560f8ade140da\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../StringsUpgradeable.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", StringsUpgradeable.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0x12f297cafe6e2847ae0378502f155654d0764b532a9873c8afe4350950fa7971\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary MathUpgradeable {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xc1bd5b53319c68f84e3becd75694d941e8f4be94049903232cd8bc7c535aaa5a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@thesis/solidity-contracts/contracts/token/IApproveAndCall.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.4;\\n\\n/// @notice An interface that should be implemented by tokens supporting\\n/// `approveAndCall`/`receiveApproval` pattern.\\ninterface IApproveAndCall {\\n /// @notice Executes `receiveApproval` function on spender as specified in\\n /// `IReceiveApproval` interface. Approves spender to withdraw from\\n /// the caller multiple times, up to the `amount`. If this\\n /// function is called again, it overwrites the current allowance\\n /// with `amount`. Reverts if the approval reverted or if\\n /// `receiveApproval` call on the spender reverted.\\n function approveAndCall(\\n address spender,\\n uint256 amount,\\n bytes memory extraData\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x393d18ef81a57dcc96fff4c340cc2945deaebb37b9796c322cf2bc96872c3df8\",\"license\":\"MIT\"},\"@thesis/solidity-contracts/contracts/token/IERC20WithPermit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\\\";\\n\\nimport \\\"./IApproveAndCall.sol\\\";\\n\\n/// @title IERC20WithPermit\\n/// @notice Burnable ERC20 token with EIP2612 permit functionality. User can\\n/// authorize a transfer of their token with a signature conforming\\n/// EIP712 standard instead of an on-chain transaction from their\\n/// address. Anyone can submit this signature on the user's behalf by\\n/// calling the permit function, as specified in EIP2612 standard,\\n/// paying gas fees, and possibly performing other actions in the same\\n/// transaction.\\ninterface IERC20WithPermit is IERC20, IERC20Metadata, IApproveAndCall {\\n /// @notice EIP2612 approval made with secp256k1 signature.\\n /// Users can authorize a transfer of their tokens with a signature\\n /// conforming EIP712 standard, rather than an on-chain transaction\\n /// from their address. Anyone can submit this signature on the\\n /// user's behalf by calling the permit function, paying gas fees,\\n /// and possibly performing other actions in the same transaction.\\n /// @dev The deadline argument can be set to `type(uint256).max to create\\n /// permits that effectively never expire.\\n function permit(\\n address owner,\\n address spender,\\n uint256 amount,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /// @notice Destroys `amount` tokens from the caller.\\n function burn(uint256 amount) external;\\n\\n /// @notice Destroys `amount` of tokens from `account`, deducting the amount\\n /// from caller's allowance.\\n function burnFrom(address account, uint256 amount) external;\\n\\n /// @notice Returns hash of EIP712 Domain struct with the token name as\\n /// a signing domain and token contract as a verifying contract.\\n /// Used to construct EIP2612 signature provided to `permit`\\n /// function.\\n /* solhint-disable-next-line func-name-mixedcase */\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n\\n /// @notice Returns the current nonce for EIP2612 permission for the\\n /// provided token owner for a replay protection. Used to construct\\n /// EIP2612 signature provided to `permit` function.\\n function nonce(address owner) external view returns (uint256);\\n\\n /// @notice Returns EIP2612 Permit message hash. Used to construct EIP2612\\n /// signature provided to `permit` function.\\n /* solhint-disable-next-line func-name-mixedcase */\\n function PERMIT_TYPEHASH() external pure returns (bytes32);\\n}\\n\",\"keccak256\":\"0xdac9a5086c19a7128b505a7be1ab0ac1aa314f6989cb88d2417e9d7383f89fa9\",\"license\":\"MIT\"},\"@thesis/solidity-contracts/contracts/token/IReceiveApproval.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.4;\\n\\n/// @notice An interface that should be implemented by contracts supporting\\n/// `approveAndCall`/`receiveApproval` pattern.\\ninterface IReceiveApproval {\\n /// @notice Receives approval to spend tokens. Called as a result of\\n /// `approveAndCall` call on the token.\\n function receiveApproval(\\n address from,\\n uint256 amount,\\n address token,\\n bytes calldata extraData\\n ) external;\\n}\\n\",\"keccak256\":\"0x6a30d83ad230548b1e7839737affc8489a035314209de14b89dbef7fb0f66395\",\"license\":\"MIT\"}},\"version\":1}",
10775
10775
  "storageLayout": {
10776
10776
  "storage": [],
10777
10777
  "types": null