@keep-network/tbtc-v2 1.8.0 → 1.8.2

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 (203) hide show
  1. package/artifacts/Bridge.json +1998 -1972
  2. package/artifacts/Bridge_v2_Implementation.json +2817 -0
  3. package/artifacts/Deposit.json +7 -7
  4. package/artifacts/Redemption.json +95 -171
  5. package/build/contracts/GovernanceUtils.sol/GovernanceUtils.dbg.json +1 -1
  6. package/build/contracts/Timelock.sol/Timelock.dbg.json +1 -1
  7. package/build/contracts/bank/Bank.sol/Bank.dbg.json +1 -1
  8. package/build/contracts/bank/IReceiveBalanceApproval.sol/IReceiveBalanceApproval.dbg.json +1 -1
  9. package/build/contracts/bridge/BitcoinTx.sol/BitcoinTx.dbg.json +1 -1
  10. package/build/contracts/bridge/BitcoinTx.sol/BitcoinTx.json +2 -2
  11. package/build/contracts/bridge/Bridge.sol/Bridge.dbg.json +1 -1
  12. package/build/contracts/bridge/Bridge.sol/Bridge.json +74 -48
  13. package/build/contracts/bridge/BridgeGovernance.sol/BridgeGovernance.dbg.json +1 -1
  14. package/build/contracts/bridge/BridgeGovernance.sol/BridgeGovernance.json +2 -2
  15. package/build/contracts/bridge/BridgeGovernanceParameters.sol/BridgeGovernanceParameters.dbg.json +1 -1
  16. package/build/contracts/bridge/BridgeState.sol/BridgeState.dbg.json +1 -1
  17. package/build/contracts/bridge/BridgeState.sol/BridgeState.json +2 -2
  18. package/build/contracts/bridge/Deposit.sol/Deposit.dbg.json +1 -1
  19. package/build/contracts/bridge/Deposit.sol/Deposit.json +2 -2
  20. package/build/contracts/bridge/DepositSweep.sol/DepositSweep.dbg.json +1 -1
  21. package/build/contracts/bridge/DepositSweep.sol/DepositSweep.json +2 -2
  22. package/build/contracts/bridge/EcdsaLib.sol/EcdsaLib.dbg.json +1 -1
  23. package/build/contracts/bridge/Fraud.sol/Fraud.dbg.json +1 -1
  24. package/build/contracts/bridge/Fraud.sol/Fraud.json +2 -2
  25. package/build/contracts/bridge/Heartbeat.sol/Heartbeat.dbg.json +1 -1
  26. package/build/contracts/bridge/IRelay.sol/IRelay.dbg.json +1 -1
  27. package/build/contracts/bridge/MovingFunds.sol/MovingFunds.dbg.json +1 -1
  28. package/build/contracts/bridge/MovingFunds.sol/MovingFunds.json +2 -2
  29. package/build/contracts/bridge/Redemption.sol/IRedemptionWatchtower.dbg.json +1 -1
  30. package/build/contracts/bridge/Redemption.sol/OutboundTx.dbg.json +1 -1
  31. package/build/contracts/bridge/Redemption.sol/OutboundTx.json +2 -2
  32. package/build/contracts/bridge/Redemption.sol/Redemption.dbg.json +1 -1
  33. package/build/contracts/bridge/Redemption.sol/Redemption.json +2 -2
  34. package/build/contracts/bridge/RedemptionWatchtower.sol/RedemptionWatchtower.dbg.json +1 -1
  35. package/build/contracts/bridge/RedemptionWatchtower.sol/RedemptionWatchtower.json +2 -2
  36. package/build/contracts/bridge/VendingMachine.sol/VendingMachine.dbg.json +1 -1
  37. package/build/contracts/bridge/VendingMachineV2.sol/VendingMachineV2.dbg.json +1 -1
  38. package/build/contracts/bridge/VendingMachineV3.sol/VendingMachineV3.dbg.json +1 -1
  39. package/build/contracts/bridge/WalletProposalValidator.sol/WalletProposalValidator.dbg.json +1 -1
  40. package/build/contracts/bridge/WalletProposalValidator.sol/WalletProposalValidator.json +2 -2
  41. package/build/contracts/bridge/Wallets.sol/Wallets.dbg.json +1 -1
  42. package/build/contracts/bridge/Wallets.sol/Wallets.json +2 -2
  43. package/build/contracts/cross-chain/AbstractL1BTCDepositor.sol/AbstractL1BTCDepositor.dbg.json +1 -1
  44. package/build/contracts/cross-chain/L2TBTC.sol/L2TBTC.dbg.json +1 -1
  45. package/build/contracts/cross-chain/starknet/StarkNetBitcoinDepositor.sol/StarkNetBitcoinDepositor.dbg.json +1 -1
  46. package/build/contracts/cross-chain/starknet/interfaces/IStarkGateBridge.sol/IStarkGateBridge.dbg.json +1 -1
  47. package/build/contracts/cross-chain/utils/Crosschain.sol/CrosschainUtils.dbg.json +1 -1
  48. package/build/contracts/cross-chain/wormhole/BTCDepositorWormhole.sol/BTCDepositorWormhole.dbg.json +1 -1
  49. package/build/contracts/cross-chain/wormhole/L1BTCDepositorWormhole.sol/L1BTCDepositorWormhole.dbg.json +1 -1
  50. package/build/contracts/cross-chain/wormhole/L2BTCDepositorWormhole.sol/L2BTCDepositorWormhole.dbg.json +1 -1
  51. package/build/contracts/cross-chain/wormhole/L2WormholeGateway.sol/L2WormholeGateway.dbg.json +1 -1
  52. package/build/contracts/cross-chain/wormhole/Wormhole.sol/IWormhole.dbg.json +1 -1
  53. package/build/contracts/cross-chain/wormhole/Wormhole.sol/IWormholeGateway.dbg.json +1 -1
  54. package/build/contracts/cross-chain/wormhole/Wormhole.sol/IWormholeReceiver.dbg.json +1 -1
  55. package/build/contracts/cross-chain/wormhole/Wormhole.sol/IWormholeRelayer.dbg.json +1 -1
  56. package/build/contracts/cross-chain/wormhole/Wormhole.sol/IWormholeTokenBridge.dbg.json +1 -1
  57. package/build/contracts/cross-chain/wormhole/Wormhole.sol/WormholeTypes.dbg.json +1 -1
  58. package/build/contracts/cross-chain/wormhole/Wormhole.sol/WormholeUtils.dbg.json +1 -1
  59. package/build/contracts/integrator/AbstractBTCDepositor.sol/AbstractBTCDepositor.dbg.json +1 -1
  60. package/build/contracts/integrator/IBridge.sol/IBridge.dbg.json +1 -1
  61. package/build/contracts/integrator/IBridge.sol/IBridgeTypes.dbg.json +1 -1
  62. package/build/contracts/integrator/ITBTCVault.sol/ITBTCVault.dbg.json +1 -1
  63. package/build/contracts/maintainer/MaintainerProxy.sol/MaintainerProxy.dbg.json +1 -1
  64. package/build/contracts/maintainer/MaintainerProxy.sol/MaintainerProxy.json +2 -2
  65. package/build/contracts/relay/LightRelay.sol/ILightRelay.dbg.json +1 -1
  66. package/build/contracts/relay/LightRelay.sol/LightRelay.dbg.json +1 -1
  67. package/build/contracts/relay/LightRelay.sol/RelayUtils.dbg.json +1 -1
  68. package/build/contracts/relay/LightRelayMaintainerProxy.sol/LightRelayMaintainerProxy.dbg.json +1 -1
  69. package/build/contracts/test/BankStub.sol/BankStub.dbg.json +1 -1
  70. package/build/contracts/test/BridgeStub.sol/BridgeStub.dbg.json +1 -1
  71. package/build/contracts/test/BridgeStub.sol/BridgeStub.json +74 -48
  72. package/build/contracts/test/HeartbeatStub.sol/HeartbeatStub.dbg.json +1 -1
  73. package/build/contracts/test/LightRelayStub.sol/LightRelayStub.dbg.json +1 -1
  74. package/build/contracts/test/MockBridgeForStarkNet.sol/MockBridgeForStarkNet.dbg.json +1 -1
  75. package/build/contracts/test/MockStarkGateBridge.sol/MockStarkGateBridge.dbg.json +1 -1
  76. package/build/contracts/test/MockTBTCBridge.sol/MockTBTCBridge.dbg.json +1 -1
  77. package/build/contracts/test/MockTBTCBridgeWithSweep.sol/MockTBTCBridgeWithSweep.dbg.json +1 -1
  78. package/build/contracts/test/MockTBTCToken.sol/MockTBTCToken.dbg.json +1 -1
  79. package/build/contracts/test/MockTBTCVault.sol/MockTBTCVault.dbg.json +1 -1
  80. package/build/contracts/test/ReceiveApprovalStub.sol/ReceiveApprovalStub.dbg.json +1 -1
  81. package/build/contracts/test/ReentrancyAttacker.sol/ReentrancyAttacker.dbg.json +1 -1
  82. package/build/contracts/test/SepoliaLightRelay.sol/SepoliaLightRelay.dbg.json +1 -1
  83. package/build/contracts/test/SystemTestRelay.sol/SystemTestRelay.dbg.json +1 -1
  84. package/build/contracts/test/SystemTestRelay.sol/SystemTestRelay.json +2 -2
  85. package/build/contracts/test/TestBTCDepositor.sol/MockBridge.dbg.json +1 -1
  86. package/build/contracts/test/TestBTCDepositor.sol/MockTBTCVault.dbg.json +1 -1
  87. package/build/contracts/test/TestBTCDepositor.sol/TestBTCDepositor.dbg.json +1 -1
  88. package/build/contracts/test/TestBitcoinTx.sol/TestBitcoinTx.dbg.json +1 -1
  89. package/build/contracts/test/TestBitcoinTx.sol/TestBitcoinTx.json +2 -2
  90. package/build/contracts/test/TestERC20.sol/TestERC20.dbg.json +1 -1
  91. package/build/contracts/test/TestERC721.sol/TestERC721.dbg.json +1 -1
  92. package/build/contracts/test/TestEcdsaLib.sol/TestEcdsaLib.dbg.json +1 -1
  93. package/build/contracts/test/WormholeBridgeStub.sol/WormholeBridgeStub.dbg.json +1 -1
  94. package/build/contracts/token/TBTC.sol/TBTC.dbg.json +1 -1
  95. package/build/contracts/vault/DonationVault.sol/DonationVault.dbg.json +1 -1
  96. package/build/contracts/vault/IVault.sol/IVault.dbg.json +1 -1
  97. package/build/contracts/vault/TBTCOptimisticMinting.sol/TBTCOptimisticMinting.dbg.json +1 -1
  98. package/build/contracts/vault/TBTCVault.sol/TBTCVault.dbg.json +1 -1
  99. package/build/contracts/vault/TBTCVault.sol/TBTCVault.json +2 -2
  100. package/contracts/bridge/Bridge.sol +34 -0
  101. package/contracts/bridge/Deposit.sol +7 -5
  102. package/deploy/80_upgrade_bridge_v2.ts +107 -54
  103. package/deploy/81_upgrade_bridge_v2_vault_fix.ts +160 -0
  104. package/export/artifacts/contracts/bridge/Bridge.sol/Bridge.json +4891 -4170
  105. package/export/artifacts/contracts/bridge/BridgeGovernance.sol/BridgeGovernance.json +207 -207
  106. package/export/artifacts/contracts/bridge/RedemptionWatchtower.sol/RedemptionWatchtower.json +104 -104
  107. package/export/artifacts/contracts/bridge/VendingMachine.sol/VendingMachine.json +67 -67
  108. package/export/artifacts/contracts/bridge/VendingMachineV2.sol/VendingMachineV2.json +24 -24
  109. package/export/artifacts/contracts/bridge/VendingMachineV3.sol/VendingMachineV3.json +26 -26
  110. package/export/artifacts/contracts/bridge/WalletProposalValidator.sol/WalletProposalValidator.json +72 -72
  111. package/export/artifacts/contracts/cross-chain/L2TBTC.sol/L2TBTC.json +40 -40
  112. package/export/artifacts/contracts/cross-chain/starknet/StarkNetBitcoinDepositor.sol/StarkNetBitcoinDepositor.json +3360 -3360
  113. package/export/artifacts/contracts/cross-chain/wormhole/BTCDepositorWormhole.sol/BTCDepositorWormhole.json +117 -117
  114. package/export/artifacts/contracts/cross-chain/wormhole/L1BTCDepositorWormhole.sol/L1BTCDepositorWormhole.json +140 -140
  115. package/export/artifacts/contracts/cross-chain/wormhole/L2BTCDepositorWormhole.sol/L2BTCDepositorWormhole.json +37 -37
  116. package/export/artifacts/contracts/cross-chain/wormhole/L2WormholeGateway.sol/L2WormholeGateway.json +51 -51
  117. package/export/artifacts/contracts/maintainer/MaintainerProxy.sol/MaintainerProxy.json +103 -103
  118. package/export/artifacts/contracts/relay/LightRelay.sol/LightRelay.json +57 -57
  119. package/export/artifacts/contracts/relay/LightRelayMaintainerProxy.sol/LightRelayMaintainerProxy.json +31 -31
  120. package/export/artifacts/contracts/test/BankStub.sol/BankStub.json +2 -2
  121. package/export/artifacts/contracts/test/BridgeStub.sol/BridgeStub.json +5130 -4414
  122. package/export/artifacts/contracts/test/HeartbeatStub.sol/HeartbeatStub.json +4 -4
  123. package/export/artifacts/contracts/test/LightRelayStub.sol/LightRelayStub.json +59 -59
  124. package/export/artifacts/contracts/test/MockBridgeForStarkNet.sol/MockBridgeForStarkNet.json +730 -730
  125. package/export/artifacts/contracts/test/MockStarkGateBridge.sol/MockStarkGateBridge.json +956 -956
  126. package/export/artifacts/contracts/test/MockTBTCBridge.sol/MockTBTCBridge.json +781 -781
  127. package/export/artifacts/contracts/test/MockTBTCBridgeWithSweep.sol/MockTBTCBridgeWithSweep.json +458 -458
  128. package/export/artifacts/contracts/test/MockTBTCToken.sol/MockTBTCToken.json +1273 -1273
  129. package/export/artifacts/contracts/test/MockTBTCVault.sol/MockTBTCVault.json +305 -305
  130. package/export/artifacts/contracts/test/ReceiveApprovalStub.sol/ReceiveApprovalStub.json +7 -7
  131. package/export/artifacts/contracts/test/ReentrancyAttacker.sol/ReentrancyAttacker.json +204 -204
  132. package/export/artifacts/contracts/test/SepoliaLightRelay.sol/SepoliaLightRelay.json +59 -59
  133. package/export/artifacts/contracts/test/SystemTestRelay.sol/SystemTestRelay.json +19 -19
  134. package/export/artifacts/contracts/test/TestBTCDepositor.sol/MockBridge.json +34 -34
  135. package/export/artifacts/contracts/test/TestBTCDepositor.sol/MockTBTCVault.json +20 -20
  136. package/export/artifacts/contracts/test/TestBTCDepositor.sol/TestBTCDepositor.json +52 -52
  137. package/export/artifacts/contracts/test/TestBitcoinTx.sol/TestBitcoinTx.json +124 -124
  138. package/export/artifacts/contracts/test/TestERC20.sol/TestERC20.json +6 -6
  139. package/export/artifacts/contracts/test/TestERC721.sol/TestERC721.json +8 -8
  140. package/export/artifacts/contracts/test/TestEcdsaLib.sol/TestEcdsaLib.json +4 -4
  141. package/export/artifacts/contracts/test/WormholeBridgeStub.sol/WormholeBridgeStub.json +37 -37
  142. package/export/artifacts/contracts/token/TBTC.sol/TBTC.json +2 -2
  143. package/export/artifacts/contracts/vault/DonationVault.sol/DonationVault.json +11 -11
  144. package/export/artifacts/contracts/vault/TBTCVault.sol/TBTCVault.json +144 -144
  145. package/export/deploy/80_upgrade_bridge_v2.js +127 -90
  146. package/export/deploy/81_upgrade_bridge_v2_vault_fix.js +211 -0
  147. package/export/typechain/AbstractBTCRedeemer.js +2 -0
  148. package/export/typechain/IBank.js +2 -0
  149. package/export/typechain/IL2WormholeGateway.js +2 -0
  150. package/export/typechain/INttManager.js +2 -0
  151. package/export/typechain/INttManagerWithExecutor.js +2 -0
  152. package/export/typechain/L1BTCDepositorNtt.js +2 -0
  153. package/export/typechain/L1BTCDepositorNttWithExecutor.js +2 -0
  154. package/export/typechain/L1BTCRedeemerWormhole.js +2 -0
  155. package/export/typechain/L2BTCRedeemerWormhole.js +2 -0
  156. package/export/typechain/MockBank.js +2 -0
  157. package/export/typechain/MockBridgeWithRebateStaking.js +2 -0
  158. package/export/typechain/MockL1BTCRedeemerWormhole.js +2 -0
  159. package/export/typechain/MockNttManager.js +2 -0
  160. package/export/typechain/MockNttManagerWithExecutor.js +2 -0
  161. package/export/typechain/NativeBTCDepositor.js +2 -0
  162. package/export/typechain/RebateStaking.js +2 -0
  163. package/export/typechain/TestBTCRedeemer.js +2 -0
  164. package/export/typechain/TestBTCUtilsHelper.js +2 -0
  165. package/export/typechain/TransceiverStructs.js +2 -0
  166. package/export/typechain/factories/AbstractBTCRedeemer__factory.js +204 -0
  167. package/export/typechain/factories/BridgeGovernance__factory.js +1 -1
  168. package/export/typechain/factories/BridgeState__factory.js +1 -1
  169. package/export/typechain/factories/BridgeStub__factory.js +27 -1
  170. package/export/typechain/factories/Bridge__factory.js +27 -1
  171. package/export/typechain/factories/DepositSweep__factory.js +1 -1
  172. package/export/typechain/factories/Deposit__factory.js +1 -1
  173. package/export/typechain/factories/Fraud__factory.js +1 -1
  174. package/export/typechain/factories/IBank__factory.js +138 -0
  175. package/export/typechain/factories/IL2WormholeGateway__factory.js +61 -0
  176. package/export/typechain/factories/INttManagerWithExecutor__factory.js +183 -0
  177. package/export/typechain/factories/INttManager__factory.js +51 -0
  178. package/export/typechain/factories/L1BTCDepositorNttWithExecutor__factory.js +1454 -0
  179. package/export/typechain/factories/L1BTCDepositorNtt__factory.js +920 -0
  180. package/export/typechain/factories/L1BTCRedeemerWormhole__factory.js +622 -0
  181. package/export/typechain/factories/L2BTCRedeemerWormhole__factory.js +348 -0
  182. package/export/typechain/factories/MaintainerProxy__factory.js +1 -1
  183. package/export/typechain/factories/MockBank__factory.js +248 -0
  184. package/export/typechain/factories/MockBridgeWithRebateStaking__factory.js +129 -0
  185. package/export/typechain/factories/MockL1BTCRedeemerWormhole__factory.js +638 -0
  186. package/export/typechain/factories/MockNttManagerWithExecutor__factory.js +423 -0
  187. package/export/typechain/factories/MockNttManager__factory.js +211 -0
  188. package/export/typechain/factories/MovingFunds__factory.js +1 -1
  189. package/export/typechain/factories/NativeBTCDepositor__factory.js +635 -0
  190. package/export/typechain/factories/RebateStaking__factory.js +720 -0
  191. package/export/typechain/factories/RedemptionWatchtower__factory.js +1 -1
  192. package/export/typechain/factories/Redemption__factory.js +1 -1
  193. package/export/typechain/factories/SystemTestRelay__factory.js +1 -1
  194. package/export/typechain/factories/TBTCVault__factory.js +1 -1
  195. package/export/typechain/factories/TestBTCRedeemer__factory.js +425 -0
  196. package/export/typechain/factories/TestBTCUtilsHelper__factory.js +109 -0
  197. package/export/typechain/factories/TestBitcoinTx__factory.js +1 -1
  198. package/export/typechain/factories/TransceiverStructs__factory.js +853 -0
  199. package/export/typechain/factories/WalletProposalValidator__factory.js +1 -1
  200. package/export/typechain/factories/Wallets__factory.js +1 -1
  201. package/export/typechain/index.js +40 -2
  202. package/export.json +40910 -0
  203. package/package.json +1 -1
@@ -1118,8 +1118,8 @@
1118
1118
  "type": "function"
1119
1119
  }
1120
1120
  ],
1121
- "bytecode": "0x60e060405260008054600160a81b600160e81b031916650a8c0000007d60aa1b1790553480156200002f57600080fd5b5060405162003a4a38038062003a4a83398101604081905262000052916200020c565b806200005e33620001a3565b6001600160a01b038116620000c55760405162461bcd60e51b815260206004820152602260248201527f4272696467652063616e206e6f7420626520746865207a65726f206164647265604482015261737360f01b60648201526084015b60405180910390fd5b6001600160a01b039081166080528316620001235760405162461bcd60e51b815260206004820181905260248201527f42616e6b2063616e206e6f7420626520746865207a65726f20616464726573736044820152606401620000bc565b6001600160a01b0382166200018a5760405162461bcd60e51b815260206004820152602660248201527f5442544320746f6b656e2063616e206e6f7420626520746865207a65726f206160448201526564647265737360d01b6064820152608401620000bc565b506001600160a01b0391821660a0521660c05262000260565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146200020957600080fd5b50565b6000806000606084860312156200022257600080fd5b83516200022f81620001f3565b60208501519093506200024281620001f3565b60408501519092506200025581620001f3565b809150509250925092565b60805160a05160c05161372e6200031c60003960008181610733015281816108bb01528181610bf401528181611db0015281816120f10152818161298701528181612af20152612c3901526000818161057901528181610c6101528181610dbc01528181610e4a01528181610f4f0152818161216d015281816122a50152818161239601528181612b500152612c9701526000818161075a015281816113f20152818161158e01528181611b620152612b7f015261372e6000f3fe608060405234801561001057600080fd5b50600436106103365760003560e01c80638532c511116101b2578063a410d29b116100f9578063c36b32b7116100a2578063e5d3d7141161007c578063e5d3d7141461072e578063e78cea9214610755578063f2fde38b1461077c578063fc4e51f61461078f57600080fd5b8063c36b32b7146106ff578063c7ba034714610712578063d0ff65b51461071e57600080fd5b8063b0b54895116100d3578063b0b54895146106cd578063b9f78798146106d7578063bc7b6b99146106f757600080fd5b8063a410d29b1461068f578063a526d83b14610697578063aa271e1a146106aa57600080fd5b8063951315261161015b5780639a508c8e116101355780639a508c8e1461066b578063a0712d6814610673578063a0cceb951461068657600080fd5b80639513152614610647578063983b2d56146106505780639a4e36d51461066357600080fd5b8063897f712c1161018c578063897f712c1461060f5780638da5cb5b146106235780638f4ffcb11461063457600080fd5b80638532c511146105d95780638623ec7b146105e957806388aaf0c8146105fc57600080fd5b806347c1ffdb116102815780636c626aa41161022a5780637445a5a0116102045780637445a5a01461054657806376cdb03b1461057457806380df5ed2146105b3578063820b5513146105c657600080fd5b80636c626aa4146104d0578063714041561461052b578063715018a61461053e57600080fd5b806364e779b11161025b57806364e779b1146104955780636abe3a6c146104a85780636b32810b146104bb57600080fd5b806347c1ffdb1461046357806353dce4df1461046b5780635ae2da461461047e57600080fd5b80633092afd5116102e3578063461c6373116102bd578063461c63731461042a578063475d05701461043d578063479aa9271461045057600080fd5b80633092afd5146103fb578063317dfa761461040e57806341906ab71461042157600080fd5b80631171bda9116103145780631171bda9146103b4578063124f65bd146103c75780632e73e398146103e857600080fd5b806309b53f511461033b5780630c68ba211461036c5780630f3425731461039f575b600080fd5b60005461035290600160a81b900463ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b61038f61037a366004613010565b60036020526000908152604090205460ff1681565b6040519015158152602001610363565b6103b26103ad366004613046565b6107a2565b005b6103b26103c2366004613063565b6107fd565b6103da6103d53660046130a4565b61081e565b604051908152602001610363565b6103b26103f636600461311d565b610883565b6103b2610409366004613010565b610931565b6103b261041c366004613063565b610ba5565b6103da60095481565b6103b26104383660046131d5565b610c56565b6103b261044b366004613241565b610db1565b6103b261045e366004613010565b610fb2565b6103b2611077565b6103b2610479366004613291565b611115565b60005461035290600160c81b900463ffffffff1681565b6103b26104a33660046132dd565b611136565b6103b26104b63660046130a4565b611153565b6104c36116a0565b60405161036391906132f6565b61050a6104de3660046132dd565b60046020526000908152604090205467ffffffffffffffff808216916801000000000000000090041682565b6040805167ffffffffffffffff938416815292909116602083015201610363565b6103b2610539366004613010565b611702565b6103b26117bb565b6105596105543660046132dd565b6117cf565b60408051938452602084019290925290820152606001610363565b61059b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610363565b6103b26105c13660046130a4565b611807565b6103b26105d43660046130a4565b6119f3565b6006546103529063ffffffff1681565b61059b6105f73660046132dd565b611d84565b600a5461059b906001600160a01b031681565b60005461038f90600160a01b900460ff1681565b6000546001600160a01b031661059b565b6103b2610642366004613343565b611dae565b6103da600b5481565b6103b261065e366004613010565b611ec3565b6103b2611fc0565b6103b261205e565b6103b26106813660046132dd565b612275565b6103da60075481565b6103b26123cd565b6103b26106a5366004613010565b612475565b61038f6106b8366004613010565b60016020526000908152604090205460ff1681565b6103da6201518081565b6103da6106e5366004613010565b60056020526000908152604090205481565b6103b2612558565b6103b261070d366004613046565b6125ef565b6103da6402540be40081565b6008546103529063ffffffff1681565b61059b7f000000000000000000000000000000000000000000000000000000000000000081565b61059b7f000000000000000000000000000000000000000000000000000000000000000081565b6103b261078a366004613010565b612643565b6103b261079d36600461311d565b6126d3565b6107aa612728565b426009556008805463ffffffff191663ffffffff83169081179091556040519081527f682bc0fb7e0d6bcb974cf556b95f68533cafc411d83d9f33ac192ccf45dda605906020015b60405180910390a150565b610805612728565b6108196001600160a01b0384168383612782565b505050565b6000828260405160200161086192919091825260e01b7fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6040516020818303038152906040528051906020012060001c90505b92915050565b61088b612728565b6040517ffc4e51f60000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063fc4e51f6906108f890889088908890889088906004016133c2565b600060405180830381600087803b15801561091257600080fd5b505af1158015610926573d6000803e3d6000fd5b505050505050505050565b336109446000546001600160a01b031690565b6001600160a01b0316148061096857503360009081526003602052604090205460ff165b6109df5760405162461bcd60e51b815260206004820152602360248201527f43616c6c6572206973206e6f7420746865206f776e6572206f7220677561726460448201527f69616e000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6001600160a01b03811660009081526001602052604090205460ff16610a475760405162461bcd60e51b815260206004820152601c60248201527f546869732061646472657373206973206e6f742061206d696e7465720000000060448201526064016109d6565b6001600160a01b0381166000908152600160205260408120805460ff191690555b600254811015610b6d57816001600160a01b031660028281548110610a8f57610a8f6133f5565b6000918252602090912001546001600160a01b031603610b5b5760028054610ab990600190613421565b81548110610ac957610ac96133f5565b600091825260209091200154600280546001600160a01b039092169183908110610af557610af56133f5565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506002805480610b3457610b34613434565b600082815260209020810160001990810180546001600160a01b0319169055019055610b6d565b80610b658161344a565b915050610a68565b506040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b610bad612728565b6040517f1171bda90000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301528381166024830152604482018390527f00000000000000000000000000000000000000000000000000000000000000001690631171bda9906064015b600060405180830381600087803b158015610c3957600080fd5b505af1158015610c4d573d6000803e3d6000fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cce5760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f74207468652042616e6b0000000000000000000060448201526064016109d6565b6000839003610d1f5760405162461bcd60e51b815260206004820152601760248201527f4e6f206465706f7369746f72732073706563696669656400000000000000000060448201526064016109d6565b60005b83811015610daa576000858583818110610d3e57610d3e6133f5565b9050602002016020810190610d539190613010565b90506000848484818110610d6957610d696133f5565b905060200201359050610d9582610d90846402540be40085610d8b9190613463565b612802565b612905565b50508080610da29061344a565b915050610d22565b5050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e295760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f74207468652042616e6b0000000000000000000060448201526064016109d6565b6040516370a0823160e01b81526001600160a01b03858116600483015284917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610e93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb7919061347a565b1015610f105760405162461bcd60e51b815260206004820152602260248201527f416d6f756e7420657863656564732062616c616e636520696e207468652062616044820152616e6b60f01b60648201526084016109d6565b610f2384610d906402540be40086613463565b604051631f1b6d2760e21b81526001600160a01b038581166004830152306024830152604482018590527f00000000000000000000000000000000000000000000000000000000000000001690637c6db49c906064015b600060405180830381600087803b158015610f9457600080fd5b505af1158015610fa8573d6000803e3d6000fd5b5050505050505050565b610fba612728565b6001600160a01b0381166110105760405162461bcd60e51b815260206004820181905260248201527f4e6577207661756c7420616464726573732063616e6e6f74206265207a65726f60448201526064016109d6565b604080516001600160a01b03831681524260208201527f5cc842cab066489e13292128663547c68705dbf476f0131e0107f155719c6124910160405180910390a142600b55600a80546001600160a01b0319166001600160a01b0392909216919091179055565b61107f612728565b60075461108f81620151806129e0565b600654600080547fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1663ffffffff909216600160a81b81029290921790556040519081527fa7f4ce7c3586e2000cdec6b25c5e7d0b20f9b4f435aa22d9c1feb32dbb506f779060200160405180910390a1506006805463ffffffff191690556000600755565b6000611120846117cf565b5050905061113033828585612a89565b50505050565b6000611141826117cf565b5050905061114f3382612bd0565b5050565b3360009081526001602052604090205460ff166111b25760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f742061206d696e7465720000000000000000000060448201526064016109d6565b600054600160a01b900460ff161561120c5760405162461bcd60e51b815260206004820152601960248201527f4f7074696d6973746963206d696e74696e67207061757365640000000000000060448201526064016109d6565b6000611218838361081e565b600081815260046020526040812080549293509167ffffffffffffffff1690036112aa5760405162461bcd60e51b815260206004820152603060248201527f4f7074696d6973746963206d696e74696e67206e6f742072657175657374656460448201527f20666f7220746865206465706f7369740000000000000000000000000000000060648201526084016109d6565b805468010000000000000000900467ffffffffffffffff16156113355760405162461bcd60e51b815260206004820152603460248201527f4f7074696d6973746963206d696e74696e6720616c72656164792066696e616c60448201527f697a656420666f7220746865206465706f73697400000000000000000000000060648201526084016109d6565b600054815461135b91600160c81b900463ffffffff169067ffffffffffffffff16613493565b67ffffffffffffffff1642116113d95760405162461bcd60e51b815260206004820152602b60248201527f4f7074696d6973746963206d696e74696e672064656c617920686173206e6f7460448201527f207061737365642079657400000000000000000000000000000000000000000060648201526084016109d6565b604051630b02c43d60e41b8152600481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b02c43d09060240160e060405180830381865afa158015611441573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146591906134e7565b90508060a0015163ffffffff166000146114c15760405162461bcd60e51b815260206004820152601c60248201527f546865206465706f73697420697320616c72656164792073776570740000000060448201526064016109d6565b60006402540be400826080015183602001516114dd91906135a1565b67ffffffffffffffff166114f19190613463565b6000805491925090600160a81b900463ffffffff1661151157600061152b565b60005461152b90600160a81b900463ffffffff16836135d8565b83516001600160a01b0316600090815260056020526040812054919250906115549084906135ec565b84516001600160a01b03166000908152600560205260409020819055845190915061158390610d908486613421565b8115611614576116147f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166361d027b36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160e91906135ff565b83612905565b84547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff16680100000000000000004267ffffffffffffffff160217855583516040518281526001600160a01b0390911690879033907f2cffebf26d639426e79514d100febae8b2c63e700e5dc0fa6c88a129633506369060200160405180910390a45050505050505050565b606060028054806020026020016040519081016040528092919081815260200182805480156116f857602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116116da575b5050505050905090565b61170a612728565b6001600160a01b03811660009081526003602052604090205460ff166117725760405162461bcd60e51b815260206004820152601e60248201527f546869732061646472657373206973206e6f74206120677561726469616e000060448201526064016109d6565b6001600160a01b038116600081815260036020526040808220805460ff19169055517fb8107d0c6b40be480ce3172ee66ba6d64b71f6b1685a851340036e6e2e3e3c529190a250565b6117c3612728565b6117cd6000612d1f565b565b600080806117e26402540be4008561361c565b91506117ee8285613421565b92506117ff6402540be400846135d8565b929491935050565b3360009081526003602052604090205460ff166118665760405162461bcd60e51b815260206004820152601860248201527f43616c6c6572206973206e6f74206120677561726469616e000000000000000060448201526064016109d6565b6000611872838361081e565b600081815260046020526040812080549293509167ffffffffffffffff1690036119045760405162461bcd60e51b815260206004820152603060248201527f4f7074696d6973746963206d696e74696e67206e6f742072657175657374656460448201527f20666f7220746865206465706f7369740000000000000000000000000000000060648201526084016109d6565b805468010000000000000000900467ffffffffffffffff161561198f5760405162461bcd60e51b815260206004820152603460248201527f4f7074696d6973746963206d696e74696e6720616c72656164792066696e616c60448201527f697a656420666f7220746865206465706f73697400000000000000000000000060648201526084016109d6565b60008281526004602052604080822080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016905551839133917f1256b41d4b18d922811c358ab80cb0375aae28f45373de35cfda580662193fcd9190a350505050565b3360009081526001602052604090205460ff16611a525760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f742061206d696e7465720000000000000000000060448201526064016109d6565b600054600160a01b900460ff1615611aac5760405162461bcd60e51b815260206004820152601960248201527f4f7074696d6973746963206d696e74696e67207061757365640000000000000060448201526064016109d6565b6000611ab8838361081e565b600081815260046020526040902080549192509067ffffffffffffffff1615611b495760405162461bcd60e51b815260206004820152603460248201527f4f7074696d6973746963206d696e74696e6720616c726561647920726571756560448201527f7374656420666f7220746865206465706f73697400000000000000000000000060648201526084016109d6565b604051630b02c43d60e41b8152600481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b02c43d09060240160e060405180830381865afa158015611bb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd591906134e7565b9050806040015163ffffffff16600003611c3b5760405162461bcd60e51b815260206004820152602160248201527f546865206465706f73697420686173206e6f74206265656e2072657665616c656044820152601960fa1b60648201526084016109d6565b60a081015163ffffffff1615611c935760405162461bcd60e51b815260206004820152601c60248201527f546865206465706f73697420697320616c72656164792073776570740000000060448201526064016109d6565b60608101516001600160a01b03163014611cef5760405162461bcd60e51b815260206004820152601860248201527f556e6578706563746564207661756c742061646472657373000000000000000060448201526064016109d6565b815467ffffffffffffffff19164267ffffffffffffffff908116919091178355815160208301516001600160a01b0390911691859133917f36f39c606d55d7dd2a05b8c4e41e9a6ca8c501cea10009c1762f6826a146e05591611d59916402540be4009116613463565b60408051918252602082018b905263ffffffff8a169082015260600160405180910390a45050505050565b60028181548110611d9457600080fd5b6000918252602090912001546001600160a01b0316905081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614611e2f5760405162461bcd60e51b815260206004820152601160248201527f546f6b656e206973206e6f74205442544300000000000000000000000000000060448201526064016109d6565b336001600160a01b03841614611e875760405162461bcd60e51b815260206004820152601860248201527f4f6e6c7920544254432063616c6c657220616c6c6f776564000000000000000060448201526064016109d6565b6000611e92856117cf565b50909150506000829003611eaf57611eaa8682612bd0565b611ebb565b611ebb86828585612a89565b505050505050565b611ecb612728565b6001600160a01b03811660009081526001602052604090205460ff1615611f345760405162461bcd60e51b815260206004820181905260248201527f54686973206164647265737320697320616c72656164792061206d696e74657260448201526064016109d6565b6001600160a01b0381166000818152600160208190526040808320805460ff19168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180546001600160a01b03191684179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b611fc8612728565b600954611fd881620151806129e0565b600854600080547fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff1663ffffffff909216600160c81b81029290921790556040519081527ff52de3377e3ae270d1e38f99b9b8d587814643811516ea55ba4d597f9950d4ec9060200160405180910390a1506008805463ffffffff191690556000600955565b612066612728565b600b5461207681620151806129e0565b600a546040516001600160a01b0390911681527f81a9bb8030ed4116b405800280e065110a37afb57b69948e714c97fab23475ec9060200160405180910390a1600a546040517ff2fde38b0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063f2fde38b90602401600060405180830381600087803b15801561213757600080fd5b505af115801561214b573d6000803e3d6000fd5b5050600a546040516370a0823160e01b81523060048201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811694506356a6d9ef93509091169083906370a0823190602401602060405180830381865afa1580156121c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e7919061347a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561224557600080fd5b505af1158015612259573d6000803e3d6000fd5b5050600a80546001600160a01b031916905550506000600b5550565b600080612281836117cf565b6040516370a0823160e01b8152336004820152929450925082916001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691506370a0823190602401602060405180830381865afa1580156122ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612311919061347a565b101561236a5760405162461bcd60e51b815260206004820152602260248201527f416d6f756e7420657863656564732062616c616e636520696e207468652062616044820152616e6b60f01b60648201526084016109d6565b6123743383612905565b604051631f1b6d2760e21b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690637c6db49c90606401610c1f565b6123d5612728565b600054600160a01b900460ff16156124395760405162461bcd60e51b815260206004820152602160248201527f4f7074696d6973746963206d696e74696e6720616c72656164792070617573656044820152601960fa1b60648201526084016109d6565b6000805460ff60a01b1916600160a01b1781556040517f23a83c8aeda8c831401c17b5bfb8b2ead79fcfe9c027fe34a4f8576e2c7c74cc9190a1565b61247d612728565b6001600160a01b03811660009081526003602052604090205460ff161561250c5760405162461bcd60e51b815260206004820152602260248201527f54686973206164647265737320697320616c726561647920612067756172646960448201527f616e00000000000000000000000000000000000000000000000000000000000060648201526084016109d6565b6001600160a01b038116600081815260036020526040808220805460ff19166001179055517f038596bb31e2e7d3d9f184d4c98b310103f6d7f5830e5eec32bffe6f1728f9699190a250565b612560612728565b600054600160a01b900460ff166125b95760405162461bcd60e51b815260206004820181905260248201527f4f7074696d6973746963206d696e74696e67206973206e6f742070617573656460448201526064016109d6565b6000805460ff60a01b191681556040517fcb27470ed9568d9eeb8939707bafc19404d908a26ce5f468a6aa781024fd6a839190a1565b6125f7612728565b426007556006805463ffffffff191663ffffffff83169081179091556040519081527f0dbfec7f12acffbb5cec595ac4370907eaf84caa7025dd71f4021433be79eba9906020016107f2565b61264b612728565b6001600160a01b0381166126c75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109d6565b6126d081612d1f565b50565b6126db612728565b6040517fb88d4fde0000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063b88d4fde906108f890309088908890889088906004016133c2565b6000546001600160a01b031633146117cd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109d6565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610819908490612d6f565b6001600160a01b03821660009081526005602052604081205480820361282b578291505061087d565b80831115612892576001600160a01b0384166000818152600560209081526040808320839055519182527fb30abd1b9e3d58cd8525b3d5c5aa002db1e43a150af5b172a8d16efcc7a141f8910160405180910390a261288a8184613421565b91505061087d565b61289c8382613421565b6001600160a01b0385166000818152600560205260409020919091557fb30abd1b9e3d58cd8525b3d5c5aa002db1e43a150af5b172a8d16efcc7a141f86128e38584613421565b60405190815260200160405180910390a2600091505061087d565b5092915050565b816001600160a01b03167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe8260405161294091815260200190565b60405180910390a26040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018390527f000000000000000000000000000000000000000000000000000000000000000016906340c10f19906044015b600060405180830381600087803b1580156129cc57600080fd5b505af1158015611ebb573d6000803e3d6000fd5b60008211612a305760405162461bcd60e51b815260206004820152601460248201527f4368616e6765206e6f7420696e6974696174656400000000000000000000000060448201526064016109d6565b80612a3b8342613421565b101561114f5760405162461bcd60e51b815260206004820181905260248201527f476f7665726e616e63652064656c617920686173206e6f7420656c617073656460448201526064016109d6565b836001600160a01b03167f68751a4c3821398cb63d11609eca2440742ef19446f0c0261bfa8a13dd0748b884604051612ac491815260200190565b60405180910390a260405163079cc67960e41b81526001600160a01b038581166004830152602482018590527f000000000000000000000000000000000000000000000000000000000000000016906379cc679090604401600060405180830381600087803b158015612b3657600080fd5b505af1158015612b4a573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634a38757e7f00000000000000000000000000000000000000000000000000000000000000006402540be40086612baf91906135d8565b85856040518563ffffffff1660e01b8152600401610f7a9493929190613630565b816001600160a01b03167f68751a4c3821398cb63d11609eca2440742ef19446f0c0261bfa8a13dd0748b882604051612c0b91815260200190565b60405180910390a260405163079cc67960e41b81526001600160a01b038381166004830152602482018390527f000000000000000000000000000000000000000000000000000000000000000016906379cc679090604401600060405180830381600087803b158015612c7d57600080fd5b505af1158015612c91573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166356a6d9ef836402540be40084612cd691906135d8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03909216600483015260248201526044016129b2565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000612dc4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e549092919063ffffffff16565b8051909150156108195780806020019051810190612de29190613663565b6108195760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016109d6565b6060612e638484600085612e6b565b949350505050565b606082471015612ee35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016109d6565b600080866001600160a01b03168587604051612eff91906136a9565b60006040518083038185875af1925050503d8060008114612f3c576040519150601f19603f3d011682016040523d82523d6000602084013e612f41565b606091505b5091509150612f5287838387612f5d565b979650505050505050565b60608315612fcc578251600003612fc5576001600160a01b0385163b612fc55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109d6565b5081612e63565b612e638383815115612fe15781518083602001fd5b8060405162461bcd60e51b81526004016109d691906136c5565b6001600160a01b03811681146126d057600080fd5b60006020828403121561302257600080fd5b813561302d81612ffb565b9392505050565b63ffffffff811681146126d057600080fd5b60006020828403121561305857600080fd5b813561302d81613034565b60008060006060848603121561307857600080fd5b833561308381612ffb565b9250602084013561309381612ffb565b929592945050506040919091013590565b600080604083850312156130b757600080fd5b8235915060208301356130c981613034565b809150509250929050565b60008083601f8401126130e657600080fd5b50813567ffffffffffffffff8111156130fe57600080fd5b60208301915083602082850101111561311657600080fd5b9250929050565b60008060008060006080868803121561313557600080fd5b853561314081612ffb565b9450602086013561315081612ffb565b935060408601359250606086013567ffffffffffffffff81111561317357600080fd5b61317f888289016130d4565b969995985093965092949392505050565b60008083601f8401126131a257600080fd5b50813567ffffffffffffffff8111156131ba57600080fd5b6020830191508360208260051b850101111561311657600080fd5b600080600080604085870312156131eb57600080fd5b843567ffffffffffffffff8082111561320357600080fd5b61320f88838901613190565b9096509450602087013591508082111561322857600080fd5b5061323587828801613190565b95989497509550505050565b6000806000806060858703121561325757600080fd5b843561326281612ffb565b935060208501359250604085013567ffffffffffffffff81111561328557600080fd5b613235878288016130d4565b6000806000604084860312156132a657600080fd5b83359250602084013567ffffffffffffffff8111156132c457600080fd5b6132d0868287016130d4565b9497909650939450505050565b6000602082840312156132ef57600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156133375783516001600160a01b031683529284019291840191600101613312565b50909695505050505050565b60008060008060006080868803121561335b57600080fd5b853561336681612ffb565b945060208601359350604086013561337d81612ffb565b9250606086013567ffffffffffffffff81111561317357600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60006001600160a01b03808816835280871660208401525084604083015260806060830152612f52608083018486613399565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111561087d5761087d61340b565b634e487b7160e01b600052603160045260246000fd5b60006001820161345c5761345c61340b565b5060010190565b808202811582820484141761087d5761087d61340b565b60006020828403121561348c57600080fd5b5051919050565b67ffffffffffffffff8181168382160190808211156128fe576128fe61340b565b80516134bf81612ffb565b919050565b805167ffffffffffffffff811681146134bf57600080fd5b80516134bf81613034565b600060e082840312156134f957600080fd5b60405160e0810181811067ffffffffffffffff8211171561352a57634e487b7160e01b600052604160045260246000fd5b604052613536836134b4565b8152613544602084016134c4565b6020820152613555604084016134dc565b6040820152613566606084016134b4565b6060820152613577608084016134c4565b608082015261358860a084016134dc565b60a082015260c083015160c08201528091505092915050565b67ffffffffffffffff8281168282160390808211156128fe576128fe61340b565b634e487b7160e01b600052601260045260246000fd5b6000826135e7576135e76135c2565b500490565b8082018082111561087d5761087d61340b565b60006020828403121561361157600080fd5b815161302d81612ffb565b60008261362b5761362b6135c2565b500690565b6001600160a01b0385168152836020820152606060408201526000613659606083018486613399565b9695505050505050565b60006020828403121561367557600080fd5b8151801515811461302d57600080fd5b60005b838110156136a0578181015183820152602001613688565b50506000910152565b600082516136bb818460208701613685565b9190910192915050565b60208152600082518060208401526136e4816040850160208701613685565b601f01601f1916919091016040019291505056fea264697066735822122096f3c5aa9034e76be31911fe56250e678f8a0e9cb1ded1db9bc00345a94d656364736f6c63430008110033",
1122
- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106103365760003560e01c80638532c511116101b2578063a410d29b116100f9578063c36b32b7116100a2578063e5d3d7141161007c578063e5d3d7141461072e578063e78cea9214610755578063f2fde38b1461077c578063fc4e51f61461078f57600080fd5b8063c36b32b7146106ff578063c7ba034714610712578063d0ff65b51461071e57600080fd5b8063b0b54895116100d3578063b0b54895146106cd578063b9f78798146106d7578063bc7b6b99146106f757600080fd5b8063a410d29b1461068f578063a526d83b14610697578063aa271e1a146106aa57600080fd5b8063951315261161015b5780639a508c8e116101355780639a508c8e1461066b578063a0712d6814610673578063a0cceb951461068657600080fd5b80639513152614610647578063983b2d56146106505780639a4e36d51461066357600080fd5b8063897f712c1161018c578063897f712c1461060f5780638da5cb5b146106235780638f4ffcb11461063457600080fd5b80638532c511146105d95780638623ec7b146105e957806388aaf0c8146105fc57600080fd5b806347c1ffdb116102815780636c626aa41161022a5780637445a5a0116102045780637445a5a01461054657806376cdb03b1461057457806380df5ed2146105b3578063820b5513146105c657600080fd5b80636c626aa4146104d0578063714041561461052b578063715018a61461053e57600080fd5b806364e779b11161025b57806364e779b1146104955780636abe3a6c146104a85780636b32810b146104bb57600080fd5b806347c1ffdb1461046357806353dce4df1461046b5780635ae2da461461047e57600080fd5b80633092afd5116102e3578063461c6373116102bd578063461c63731461042a578063475d05701461043d578063479aa9271461045057600080fd5b80633092afd5146103fb578063317dfa761461040e57806341906ab71461042157600080fd5b80631171bda9116103145780631171bda9146103b4578063124f65bd146103c75780632e73e398146103e857600080fd5b806309b53f511461033b5780630c68ba211461036c5780630f3425731461039f575b600080fd5b60005461035290600160a81b900463ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b61038f61037a366004613010565b60036020526000908152604090205460ff1681565b6040519015158152602001610363565b6103b26103ad366004613046565b6107a2565b005b6103b26103c2366004613063565b6107fd565b6103da6103d53660046130a4565b61081e565b604051908152602001610363565b6103b26103f636600461311d565b610883565b6103b2610409366004613010565b610931565b6103b261041c366004613063565b610ba5565b6103da60095481565b6103b26104383660046131d5565b610c56565b6103b261044b366004613241565b610db1565b6103b261045e366004613010565b610fb2565b6103b2611077565b6103b2610479366004613291565b611115565b60005461035290600160c81b900463ffffffff1681565b6103b26104a33660046132dd565b611136565b6103b26104b63660046130a4565b611153565b6104c36116a0565b60405161036391906132f6565b61050a6104de3660046132dd565b60046020526000908152604090205467ffffffffffffffff808216916801000000000000000090041682565b6040805167ffffffffffffffff938416815292909116602083015201610363565b6103b2610539366004613010565b611702565b6103b26117bb565b6105596105543660046132dd565b6117cf565b60408051938452602084019290925290820152606001610363565b61059b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610363565b6103b26105c13660046130a4565b611807565b6103b26105d43660046130a4565b6119f3565b6006546103529063ffffffff1681565b61059b6105f73660046132dd565b611d84565b600a5461059b906001600160a01b031681565b60005461038f90600160a01b900460ff1681565b6000546001600160a01b031661059b565b6103b2610642366004613343565b611dae565b6103da600b5481565b6103b261065e366004613010565b611ec3565b6103b2611fc0565b6103b261205e565b6103b26106813660046132dd565b612275565b6103da60075481565b6103b26123cd565b6103b26106a5366004613010565b612475565b61038f6106b8366004613010565b60016020526000908152604090205460ff1681565b6103da6201518081565b6103da6106e5366004613010565b60056020526000908152604090205481565b6103b2612558565b6103b261070d366004613046565b6125ef565b6103da6402540be40081565b6008546103529063ffffffff1681565b61059b7f000000000000000000000000000000000000000000000000000000000000000081565b61059b7f000000000000000000000000000000000000000000000000000000000000000081565b6103b261078a366004613010565b612643565b6103b261079d36600461311d565b6126d3565b6107aa612728565b426009556008805463ffffffff191663ffffffff83169081179091556040519081527f682bc0fb7e0d6bcb974cf556b95f68533cafc411d83d9f33ac192ccf45dda605906020015b60405180910390a150565b610805612728565b6108196001600160a01b0384168383612782565b505050565b6000828260405160200161086192919091825260e01b7fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6040516020818303038152906040528051906020012060001c90505b92915050565b61088b612728565b6040517ffc4e51f60000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063fc4e51f6906108f890889088908890889088906004016133c2565b600060405180830381600087803b15801561091257600080fd5b505af1158015610926573d6000803e3d6000fd5b505050505050505050565b336109446000546001600160a01b031690565b6001600160a01b0316148061096857503360009081526003602052604090205460ff165b6109df5760405162461bcd60e51b815260206004820152602360248201527f43616c6c6572206973206e6f7420746865206f776e6572206f7220677561726460448201527f69616e000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6001600160a01b03811660009081526001602052604090205460ff16610a475760405162461bcd60e51b815260206004820152601c60248201527f546869732061646472657373206973206e6f742061206d696e7465720000000060448201526064016109d6565b6001600160a01b0381166000908152600160205260408120805460ff191690555b600254811015610b6d57816001600160a01b031660028281548110610a8f57610a8f6133f5565b6000918252602090912001546001600160a01b031603610b5b5760028054610ab990600190613421565b81548110610ac957610ac96133f5565b600091825260209091200154600280546001600160a01b039092169183908110610af557610af56133f5565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506002805480610b3457610b34613434565b600082815260209020810160001990810180546001600160a01b0319169055019055610b6d565b80610b658161344a565b915050610a68565b506040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b610bad612728565b6040517f1171bda90000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301528381166024830152604482018390527f00000000000000000000000000000000000000000000000000000000000000001690631171bda9906064015b600060405180830381600087803b158015610c3957600080fd5b505af1158015610c4d573d6000803e3d6000fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cce5760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f74207468652042616e6b0000000000000000000060448201526064016109d6565b6000839003610d1f5760405162461bcd60e51b815260206004820152601760248201527f4e6f206465706f7369746f72732073706563696669656400000000000000000060448201526064016109d6565b60005b83811015610daa576000858583818110610d3e57610d3e6133f5565b9050602002016020810190610d539190613010565b90506000848484818110610d6957610d696133f5565b905060200201359050610d9582610d90846402540be40085610d8b9190613463565b612802565b612905565b50508080610da29061344a565b915050610d22565b5050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e295760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f74207468652042616e6b0000000000000000000060448201526064016109d6565b6040516370a0823160e01b81526001600160a01b03858116600483015284917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610e93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb7919061347a565b1015610f105760405162461bcd60e51b815260206004820152602260248201527f416d6f756e7420657863656564732062616c616e636520696e207468652062616044820152616e6b60f01b60648201526084016109d6565b610f2384610d906402540be40086613463565b604051631f1b6d2760e21b81526001600160a01b038581166004830152306024830152604482018590527f00000000000000000000000000000000000000000000000000000000000000001690637c6db49c906064015b600060405180830381600087803b158015610f9457600080fd5b505af1158015610fa8573d6000803e3d6000fd5b5050505050505050565b610fba612728565b6001600160a01b0381166110105760405162461bcd60e51b815260206004820181905260248201527f4e6577207661756c7420616464726573732063616e6e6f74206265207a65726f60448201526064016109d6565b604080516001600160a01b03831681524260208201527f5cc842cab066489e13292128663547c68705dbf476f0131e0107f155719c6124910160405180910390a142600b55600a80546001600160a01b0319166001600160a01b0392909216919091179055565b61107f612728565b60075461108f81620151806129e0565b600654600080547fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1663ffffffff909216600160a81b81029290921790556040519081527fa7f4ce7c3586e2000cdec6b25c5e7d0b20f9b4f435aa22d9c1feb32dbb506f779060200160405180910390a1506006805463ffffffff191690556000600755565b6000611120846117cf565b5050905061113033828585612a89565b50505050565b6000611141826117cf565b5050905061114f3382612bd0565b5050565b3360009081526001602052604090205460ff166111b25760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f742061206d696e7465720000000000000000000060448201526064016109d6565b600054600160a01b900460ff161561120c5760405162461bcd60e51b815260206004820152601960248201527f4f7074696d6973746963206d696e74696e67207061757365640000000000000060448201526064016109d6565b6000611218838361081e565b600081815260046020526040812080549293509167ffffffffffffffff1690036112aa5760405162461bcd60e51b815260206004820152603060248201527f4f7074696d6973746963206d696e74696e67206e6f742072657175657374656460448201527f20666f7220746865206465706f7369740000000000000000000000000000000060648201526084016109d6565b805468010000000000000000900467ffffffffffffffff16156113355760405162461bcd60e51b815260206004820152603460248201527f4f7074696d6973746963206d696e74696e6720616c72656164792066696e616c60448201527f697a656420666f7220746865206465706f73697400000000000000000000000060648201526084016109d6565b600054815461135b91600160c81b900463ffffffff169067ffffffffffffffff16613493565b67ffffffffffffffff1642116113d95760405162461bcd60e51b815260206004820152602b60248201527f4f7074696d6973746963206d696e74696e672064656c617920686173206e6f7460448201527f207061737365642079657400000000000000000000000000000000000000000060648201526084016109d6565b604051630b02c43d60e41b8152600481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b02c43d09060240160e060405180830381865afa158015611441573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146591906134e7565b90508060a0015163ffffffff166000146114c15760405162461bcd60e51b815260206004820152601c60248201527f546865206465706f73697420697320616c72656164792073776570740000000060448201526064016109d6565b60006402540be400826080015183602001516114dd91906135a1565b67ffffffffffffffff166114f19190613463565b6000805491925090600160a81b900463ffffffff1661151157600061152b565b60005461152b90600160a81b900463ffffffff16836135d8565b83516001600160a01b0316600090815260056020526040812054919250906115549084906135ec565b84516001600160a01b03166000908152600560205260409020819055845190915061158390610d908486613421565b8115611614576116147f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166361d027b36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160e91906135ff565b83612905565b84547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff16680100000000000000004267ffffffffffffffff160217855583516040518281526001600160a01b0390911690879033907f2cffebf26d639426e79514d100febae8b2c63e700e5dc0fa6c88a129633506369060200160405180910390a45050505050505050565b606060028054806020026020016040519081016040528092919081815260200182805480156116f857602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116116da575b5050505050905090565b61170a612728565b6001600160a01b03811660009081526003602052604090205460ff166117725760405162461bcd60e51b815260206004820152601e60248201527f546869732061646472657373206973206e6f74206120677561726469616e000060448201526064016109d6565b6001600160a01b038116600081815260036020526040808220805460ff19169055517fb8107d0c6b40be480ce3172ee66ba6d64b71f6b1685a851340036e6e2e3e3c529190a250565b6117c3612728565b6117cd6000612d1f565b565b600080806117e26402540be4008561361c565b91506117ee8285613421565b92506117ff6402540be400846135d8565b929491935050565b3360009081526003602052604090205460ff166118665760405162461bcd60e51b815260206004820152601860248201527f43616c6c6572206973206e6f74206120677561726469616e000000000000000060448201526064016109d6565b6000611872838361081e565b600081815260046020526040812080549293509167ffffffffffffffff1690036119045760405162461bcd60e51b815260206004820152603060248201527f4f7074696d6973746963206d696e74696e67206e6f742072657175657374656460448201527f20666f7220746865206465706f7369740000000000000000000000000000000060648201526084016109d6565b805468010000000000000000900467ffffffffffffffff161561198f5760405162461bcd60e51b815260206004820152603460248201527f4f7074696d6973746963206d696e74696e6720616c72656164792066696e616c60448201527f697a656420666f7220746865206465706f73697400000000000000000000000060648201526084016109d6565b60008281526004602052604080822080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016905551839133917f1256b41d4b18d922811c358ab80cb0375aae28f45373de35cfda580662193fcd9190a350505050565b3360009081526001602052604090205460ff16611a525760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f742061206d696e7465720000000000000000000060448201526064016109d6565b600054600160a01b900460ff1615611aac5760405162461bcd60e51b815260206004820152601960248201527f4f7074696d6973746963206d696e74696e67207061757365640000000000000060448201526064016109d6565b6000611ab8838361081e565b600081815260046020526040902080549192509067ffffffffffffffff1615611b495760405162461bcd60e51b815260206004820152603460248201527f4f7074696d6973746963206d696e74696e6720616c726561647920726571756560448201527f7374656420666f7220746865206465706f73697400000000000000000000000060648201526084016109d6565b604051630b02c43d60e41b8152600481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b02c43d09060240160e060405180830381865afa158015611bb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd591906134e7565b9050806040015163ffffffff16600003611c3b5760405162461bcd60e51b815260206004820152602160248201527f546865206465706f73697420686173206e6f74206265656e2072657665616c656044820152601960fa1b60648201526084016109d6565b60a081015163ffffffff1615611c935760405162461bcd60e51b815260206004820152601c60248201527f546865206465706f73697420697320616c72656164792073776570740000000060448201526064016109d6565b60608101516001600160a01b03163014611cef5760405162461bcd60e51b815260206004820152601860248201527f556e6578706563746564207661756c742061646472657373000000000000000060448201526064016109d6565b815467ffffffffffffffff19164267ffffffffffffffff908116919091178355815160208301516001600160a01b0390911691859133917f36f39c606d55d7dd2a05b8c4e41e9a6ca8c501cea10009c1762f6826a146e05591611d59916402540be4009116613463565b60408051918252602082018b905263ffffffff8a169082015260600160405180910390a45050505050565b60028181548110611d9457600080fd5b6000918252602090912001546001600160a01b0316905081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614611e2f5760405162461bcd60e51b815260206004820152601160248201527f546f6b656e206973206e6f74205442544300000000000000000000000000000060448201526064016109d6565b336001600160a01b03841614611e875760405162461bcd60e51b815260206004820152601860248201527f4f6e6c7920544254432063616c6c657220616c6c6f776564000000000000000060448201526064016109d6565b6000611e92856117cf565b50909150506000829003611eaf57611eaa8682612bd0565b611ebb565b611ebb86828585612a89565b505050505050565b611ecb612728565b6001600160a01b03811660009081526001602052604090205460ff1615611f345760405162461bcd60e51b815260206004820181905260248201527f54686973206164647265737320697320616c72656164792061206d696e74657260448201526064016109d6565b6001600160a01b0381166000818152600160208190526040808320805460ff19168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180546001600160a01b03191684179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b611fc8612728565b600954611fd881620151806129e0565b600854600080547fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff1663ffffffff909216600160c81b81029290921790556040519081527ff52de3377e3ae270d1e38f99b9b8d587814643811516ea55ba4d597f9950d4ec9060200160405180910390a1506008805463ffffffff191690556000600955565b612066612728565b600b5461207681620151806129e0565b600a546040516001600160a01b0390911681527f81a9bb8030ed4116b405800280e065110a37afb57b69948e714c97fab23475ec9060200160405180910390a1600a546040517ff2fde38b0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063f2fde38b90602401600060405180830381600087803b15801561213757600080fd5b505af115801561214b573d6000803e3d6000fd5b5050600a546040516370a0823160e01b81523060048201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811694506356a6d9ef93509091169083906370a0823190602401602060405180830381865afa1580156121c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e7919061347a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561224557600080fd5b505af1158015612259573d6000803e3d6000fd5b5050600a80546001600160a01b031916905550506000600b5550565b600080612281836117cf565b6040516370a0823160e01b8152336004820152929450925082916001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691506370a0823190602401602060405180830381865afa1580156122ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612311919061347a565b101561236a5760405162461bcd60e51b815260206004820152602260248201527f416d6f756e7420657863656564732062616c616e636520696e207468652062616044820152616e6b60f01b60648201526084016109d6565b6123743383612905565b604051631f1b6d2760e21b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690637c6db49c90606401610c1f565b6123d5612728565b600054600160a01b900460ff16156124395760405162461bcd60e51b815260206004820152602160248201527f4f7074696d6973746963206d696e74696e6720616c72656164792070617573656044820152601960fa1b60648201526084016109d6565b6000805460ff60a01b1916600160a01b1781556040517f23a83c8aeda8c831401c17b5bfb8b2ead79fcfe9c027fe34a4f8576e2c7c74cc9190a1565b61247d612728565b6001600160a01b03811660009081526003602052604090205460ff161561250c5760405162461bcd60e51b815260206004820152602260248201527f54686973206164647265737320697320616c726561647920612067756172646960448201527f616e00000000000000000000000000000000000000000000000000000000000060648201526084016109d6565b6001600160a01b038116600081815260036020526040808220805460ff19166001179055517f038596bb31e2e7d3d9f184d4c98b310103f6d7f5830e5eec32bffe6f1728f9699190a250565b612560612728565b600054600160a01b900460ff166125b95760405162461bcd60e51b815260206004820181905260248201527f4f7074696d6973746963206d696e74696e67206973206e6f742070617573656460448201526064016109d6565b6000805460ff60a01b191681556040517fcb27470ed9568d9eeb8939707bafc19404d908a26ce5f468a6aa781024fd6a839190a1565b6125f7612728565b426007556006805463ffffffff191663ffffffff83169081179091556040519081527f0dbfec7f12acffbb5cec595ac4370907eaf84caa7025dd71f4021433be79eba9906020016107f2565b61264b612728565b6001600160a01b0381166126c75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109d6565b6126d081612d1f565b50565b6126db612728565b6040517fb88d4fde0000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063b88d4fde906108f890309088908890889088906004016133c2565b6000546001600160a01b031633146117cd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109d6565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610819908490612d6f565b6001600160a01b03821660009081526005602052604081205480820361282b578291505061087d565b80831115612892576001600160a01b0384166000818152600560209081526040808320839055519182527fb30abd1b9e3d58cd8525b3d5c5aa002db1e43a150af5b172a8d16efcc7a141f8910160405180910390a261288a8184613421565b91505061087d565b61289c8382613421565b6001600160a01b0385166000818152600560205260409020919091557fb30abd1b9e3d58cd8525b3d5c5aa002db1e43a150af5b172a8d16efcc7a141f86128e38584613421565b60405190815260200160405180910390a2600091505061087d565b5092915050565b816001600160a01b03167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe8260405161294091815260200190565b60405180910390a26040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018390527f000000000000000000000000000000000000000000000000000000000000000016906340c10f19906044015b600060405180830381600087803b1580156129cc57600080fd5b505af1158015611ebb573d6000803e3d6000fd5b60008211612a305760405162461bcd60e51b815260206004820152601460248201527f4368616e6765206e6f7420696e6974696174656400000000000000000000000060448201526064016109d6565b80612a3b8342613421565b101561114f5760405162461bcd60e51b815260206004820181905260248201527f476f7665726e616e63652064656c617920686173206e6f7420656c617073656460448201526064016109d6565b836001600160a01b03167f68751a4c3821398cb63d11609eca2440742ef19446f0c0261bfa8a13dd0748b884604051612ac491815260200190565b60405180910390a260405163079cc67960e41b81526001600160a01b038581166004830152602482018590527f000000000000000000000000000000000000000000000000000000000000000016906379cc679090604401600060405180830381600087803b158015612b3657600080fd5b505af1158015612b4a573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634a38757e7f00000000000000000000000000000000000000000000000000000000000000006402540be40086612baf91906135d8565b85856040518563ffffffff1660e01b8152600401610f7a9493929190613630565b816001600160a01b03167f68751a4c3821398cb63d11609eca2440742ef19446f0c0261bfa8a13dd0748b882604051612c0b91815260200190565b60405180910390a260405163079cc67960e41b81526001600160a01b038381166004830152602482018390527f000000000000000000000000000000000000000000000000000000000000000016906379cc679090604401600060405180830381600087803b158015612c7d57600080fd5b505af1158015612c91573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166356a6d9ef836402540be40084612cd691906135d8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03909216600483015260248201526044016129b2565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000612dc4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e549092919063ffffffff16565b8051909150156108195780806020019051810190612de29190613663565b6108195760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016109d6565b6060612e638484600085612e6b565b949350505050565b606082471015612ee35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016109d6565b600080866001600160a01b03168587604051612eff91906136a9565b60006040518083038185875af1925050503d8060008114612f3c576040519150601f19603f3d011682016040523d82523d6000602084013e612f41565b606091505b5091509150612f5287838387612f5d565b979650505050505050565b60608315612fcc578251600003612fc5576001600160a01b0385163b612fc55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109d6565b5081612e63565b612e638383815115612fe15781518083602001fd5b8060405162461bcd60e51b81526004016109d691906136c5565b6001600160a01b03811681146126d057600080fd5b60006020828403121561302257600080fd5b813561302d81612ffb565b9392505050565b63ffffffff811681146126d057600080fd5b60006020828403121561305857600080fd5b813561302d81613034565b60008060006060848603121561307857600080fd5b833561308381612ffb565b9250602084013561309381612ffb565b929592945050506040919091013590565b600080604083850312156130b757600080fd5b8235915060208301356130c981613034565b809150509250929050565b60008083601f8401126130e657600080fd5b50813567ffffffffffffffff8111156130fe57600080fd5b60208301915083602082850101111561311657600080fd5b9250929050565b60008060008060006080868803121561313557600080fd5b853561314081612ffb565b9450602086013561315081612ffb565b935060408601359250606086013567ffffffffffffffff81111561317357600080fd5b61317f888289016130d4565b969995985093965092949392505050565b60008083601f8401126131a257600080fd5b50813567ffffffffffffffff8111156131ba57600080fd5b6020830191508360208260051b850101111561311657600080fd5b600080600080604085870312156131eb57600080fd5b843567ffffffffffffffff8082111561320357600080fd5b61320f88838901613190565b9096509450602087013591508082111561322857600080fd5b5061323587828801613190565b95989497509550505050565b6000806000806060858703121561325757600080fd5b843561326281612ffb565b935060208501359250604085013567ffffffffffffffff81111561328557600080fd5b613235878288016130d4565b6000806000604084860312156132a657600080fd5b83359250602084013567ffffffffffffffff8111156132c457600080fd5b6132d0868287016130d4565b9497909650939450505050565b6000602082840312156132ef57600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156133375783516001600160a01b031683529284019291840191600101613312565b50909695505050505050565b60008060008060006080868803121561335b57600080fd5b853561336681612ffb565b945060208601359350604086013561337d81612ffb565b9250606086013567ffffffffffffffff81111561317357600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60006001600160a01b03808816835280871660208401525084604083015260806060830152612f52608083018486613399565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111561087d5761087d61340b565b634e487b7160e01b600052603160045260246000fd5b60006001820161345c5761345c61340b565b5060010190565b808202811582820484141761087d5761087d61340b565b60006020828403121561348c57600080fd5b5051919050565b67ffffffffffffffff8181168382160190808211156128fe576128fe61340b565b80516134bf81612ffb565b919050565b805167ffffffffffffffff811681146134bf57600080fd5b80516134bf81613034565b600060e082840312156134f957600080fd5b60405160e0810181811067ffffffffffffffff8211171561352a57634e487b7160e01b600052604160045260246000fd5b604052613536836134b4565b8152613544602084016134c4565b6020820152613555604084016134dc565b6040820152613566606084016134b4565b6060820152613577608084016134c4565b608082015261358860a084016134dc565b60a082015260c083015160c08201528091505092915050565b67ffffffffffffffff8281168282160390808211156128fe576128fe61340b565b634e487b7160e01b600052601260045260246000fd5b6000826135e7576135e76135c2565b500490565b8082018082111561087d5761087d61340b565b60006020828403121561361157600080fd5b815161302d81612ffb565b60008261362b5761362b6135c2565b500690565b6001600160a01b0385168152836020820152606060408201526000613659606083018486613399565b9695505050505050565b60006020828403121561367557600080fd5b8151801515811461302d57600080fd5b60005b838110156136a0578181015183820152602001613688565b50506000910152565b600082516136bb818460208701613685565b9190910192915050565b60208152600082518060208401526136e4816040850160208701613685565b601f01601f1916919091016040019291505056fea264697066735822122096f3c5aa9034e76be31911fe56250e678f8a0e9cb1ded1db9bc00345a94d656364736f6c63430008110033",
1121
+ "bytecode": "0x60e060405260008054600160a81b600160e81b031916650a8c0000007d60aa1b1790553480156200002f57600080fd5b5060405162003a4a38038062003a4a83398101604081905262000052916200020c565b806200005e33620001a3565b6001600160a01b038116620000c55760405162461bcd60e51b815260206004820152602260248201527f4272696467652063616e206e6f7420626520746865207a65726f206164647265604482015261737360f01b60648201526084015b60405180910390fd5b6001600160a01b039081166080528316620001235760405162461bcd60e51b815260206004820181905260248201527f42616e6b2063616e206e6f7420626520746865207a65726f20616464726573736044820152606401620000bc565b6001600160a01b0382166200018a5760405162461bcd60e51b815260206004820152602660248201527f5442544320746f6b656e2063616e206e6f7420626520746865207a65726f206160448201526564647265737360d01b6064820152608401620000bc565b506001600160a01b0391821660a0521660c05262000260565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146200020957600080fd5b50565b6000806000606084860312156200022257600080fd5b83516200022f81620001f3565b60208501519093506200024281620001f3565b60408501519092506200025581620001f3565b809150509250925092565b60805160a05160c05161372e6200031c60003960008181610733015281816108bb01528181610bf401528181611db0015281816120f10152818161298701528181612af20152612c3901526000818161057901528181610c6101528181610dbc01528181610e4a01528181610f4f0152818161216d015281816122a50152818161239601528181612b500152612c9701526000818161075a015281816113f20152818161158e01528181611b620152612b7f015261372e6000f3fe608060405234801561001057600080fd5b50600436106103365760003560e01c80638532c511116101b2578063a410d29b116100f9578063c36b32b7116100a2578063e5d3d7141161007c578063e5d3d7141461072e578063e78cea9214610755578063f2fde38b1461077c578063fc4e51f61461078f57600080fd5b8063c36b32b7146106ff578063c7ba034714610712578063d0ff65b51461071e57600080fd5b8063b0b54895116100d3578063b0b54895146106cd578063b9f78798146106d7578063bc7b6b99146106f757600080fd5b8063a410d29b1461068f578063a526d83b14610697578063aa271e1a146106aa57600080fd5b8063951315261161015b5780639a508c8e116101355780639a508c8e1461066b578063a0712d6814610673578063a0cceb951461068657600080fd5b80639513152614610647578063983b2d56146106505780639a4e36d51461066357600080fd5b8063897f712c1161018c578063897f712c1461060f5780638da5cb5b146106235780638f4ffcb11461063457600080fd5b80638532c511146105d95780638623ec7b146105e957806388aaf0c8146105fc57600080fd5b806347c1ffdb116102815780636c626aa41161022a5780637445a5a0116102045780637445a5a01461054657806376cdb03b1461057457806380df5ed2146105b3578063820b5513146105c657600080fd5b80636c626aa4146104d0578063714041561461052b578063715018a61461053e57600080fd5b806364e779b11161025b57806364e779b1146104955780636abe3a6c146104a85780636b32810b146104bb57600080fd5b806347c1ffdb1461046357806353dce4df1461046b5780635ae2da461461047e57600080fd5b80633092afd5116102e3578063461c6373116102bd578063461c63731461042a578063475d05701461043d578063479aa9271461045057600080fd5b80633092afd5146103fb578063317dfa761461040e57806341906ab71461042157600080fd5b80631171bda9116103145780631171bda9146103b4578063124f65bd146103c75780632e73e398146103e857600080fd5b806309b53f511461033b5780630c68ba211461036c5780630f3425731461039f575b600080fd5b60005461035290600160a81b900463ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b61038f61037a366004613010565b60036020526000908152604090205460ff1681565b6040519015158152602001610363565b6103b26103ad366004613046565b6107a2565b005b6103b26103c2366004613063565b6107fd565b6103da6103d53660046130a4565b61081e565b604051908152602001610363565b6103b26103f636600461311d565b610883565b6103b2610409366004613010565b610931565b6103b261041c366004613063565b610ba5565b6103da60095481565b6103b26104383660046131d5565b610c56565b6103b261044b366004613241565b610db1565b6103b261045e366004613010565b610fb2565b6103b2611077565b6103b2610479366004613291565b611115565b60005461035290600160c81b900463ffffffff1681565b6103b26104a33660046132dd565b611136565b6103b26104b63660046130a4565b611153565b6104c36116a0565b60405161036391906132f6565b61050a6104de3660046132dd565b60046020526000908152604090205467ffffffffffffffff808216916801000000000000000090041682565b6040805167ffffffffffffffff938416815292909116602083015201610363565b6103b2610539366004613010565b611702565b6103b26117bb565b6105596105543660046132dd565b6117cf565b60408051938452602084019290925290820152606001610363565b61059b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610363565b6103b26105c13660046130a4565b611807565b6103b26105d43660046130a4565b6119f3565b6006546103529063ffffffff1681565b61059b6105f73660046132dd565b611d84565b600a5461059b906001600160a01b031681565b60005461038f90600160a01b900460ff1681565b6000546001600160a01b031661059b565b6103b2610642366004613343565b611dae565b6103da600b5481565b6103b261065e366004613010565b611ec3565b6103b2611fc0565b6103b261205e565b6103b26106813660046132dd565b612275565b6103da60075481565b6103b26123cd565b6103b26106a5366004613010565b612475565b61038f6106b8366004613010565b60016020526000908152604090205460ff1681565b6103da6201518081565b6103da6106e5366004613010565b60056020526000908152604090205481565b6103b2612558565b6103b261070d366004613046565b6125ef565b6103da6402540be40081565b6008546103529063ffffffff1681565b61059b7f000000000000000000000000000000000000000000000000000000000000000081565b61059b7f000000000000000000000000000000000000000000000000000000000000000081565b6103b261078a366004613010565b612643565b6103b261079d36600461311d565b6126d3565b6107aa612728565b426009556008805463ffffffff191663ffffffff83169081179091556040519081527f682bc0fb7e0d6bcb974cf556b95f68533cafc411d83d9f33ac192ccf45dda605906020015b60405180910390a150565b610805612728565b6108196001600160a01b0384168383612782565b505050565b6000828260405160200161086192919091825260e01b7fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6040516020818303038152906040528051906020012060001c90505b92915050565b61088b612728565b6040517ffc4e51f60000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063fc4e51f6906108f890889088908890889088906004016133c2565b600060405180830381600087803b15801561091257600080fd5b505af1158015610926573d6000803e3d6000fd5b505050505050505050565b336109446000546001600160a01b031690565b6001600160a01b0316148061096857503360009081526003602052604090205460ff165b6109df5760405162461bcd60e51b815260206004820152602360248201527f43616c6c6572206973206e6f7420746865206f776e6572206f7220677561726460448201527f69616e000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6001600160a01b03811660009081526001602052604090205460ff16610a475760405162461bcd60e51b815260206004820152601c60248201527f546869732061646472657373206973206e6f742061206d696e7465720000000060448201526064016109d6565b6001600160a01b0381166000908152600160205260408120805460ff191690555b600254811015610b6d57816001600160a01b031660028281548110610a8f57610a8f6133f5565b6000918252602090912001546001600160a01b031603610b5b5760028054610ab990600190613421565b81548110610ac957610ac96133f5565b600091825260209091200154600280546001600160a01b039092169183908110610af557610af56133f5565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506002805480610b3457610b34613434565b600082815260209020810160001990810180546001600160a01b0319169055019055610b6d565b80610b658161344a565b915050610a68565b506040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b610bad612728565b6040517f1171bda90000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301528381166024830152604482018390527f00000000000000000000000000000000000000000000000000000000000000001690631171bda9906064015b600060405180830381600087803b158015610c3957600080fd5b505af1158015610c4d573d6000803e3d6000fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cce5760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f74207468652042616e6b0000000000000000000060448201526064016109d6565b6000839003610d1f5760405162461bcd60e51b815260206004820152601760248201527f4e6f206465706f7369746f72732073706563696669656400000000000000000060448201526064016109d6565b60005b83811015610daa576000858583818110610d3e57610d3e6133f5565b9050602002016020810190610d539190613010565b90506000848484818110610d6957610d696133f5565b905060200201359050610d9582610d90846402540be40085610d8b9190613463565b612802565b612905565b50508080610da29061344a565b915050610d22565b5050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e295760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f74207468652042616e6b0000000000000000000060448201526064016109d6565b6040516370a0823160e01b81526001600160a01b03858116600483015284917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610e93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb7919061347a565b1015610f105760405162461bcd60e51b815260206004820152602260248201527f416d6f756e7420657863656564732062616c616e636520696e207468652062616044820152616e6b60f01b60648201526084016109d6565b610f2384610d906402540be40086613463565b604051631f1b6d2760e21b81526001600160a01b038581166004830152306024830152604482018590527f00000000000000000000000000000000000000000000000000000000000000001690637c6db49c906064015b600060405180830381600087803b158015610f9457600080fd5b505af1158015610fa8573d6000803e3d6000fd5b5050505050505050565b610fba612728565b6001600160a01b0381166110105760405162461bcd60e51b815260206004820181905260248201527f4e6577207661756c7420616464726573732063616e6e6f74206265207a65726f60448201526064016109d6565b604080516001600160a01b03831681524260208201527f5cc842cab066489e13292128663547c68705dbf476f0131e0107f155719c6124910160405180910390a142600b55600a80546001600160a01b0319166001600160a01b0392909216919091179055565b61107f612728565b60075461108f81620151806129e0565b600654600080547fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1663ffffffff909216600160a81b81029290921790556040519081527fa7f4ce7c3586e2000cdec6b25c5e7d0b20f9b4f435aa22d9c1feb32dbb506f779060200160405180910390a1506006805463ffffffff191690556000600755565b6000611120846117cf565b5050905061113033828585612a89565b50505050565b6000611141826117cf565b5050905061114f3382612bd0565b5050565b3360009081526001602052604090205460ff166111b25760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f742061206d696e7465720000000000000000000060448201526064016109d6565b600054600160a01b900460ff161561120c5760405162461bcd60e51b815260206004820152601960248201527f4f7074696d6973746963206d696e74696e67207061757365640000000000000060448201526064016109d6565b6000611218838361081e565b600081815260046020526040812080549293509167ffffffffffffffff1690036112aa5760405162461bcd60e51b815260206004820152603060248201527f4f7074696d6973746963206d696e74696e67206e6f742072657175657374656460448201527f20666f7220746865206465706f7369740000000000000000000000000000000060648201526084016109d6565b805468010000000000000000900467ffffffffffffffff16156113355760405162461bcd60e51b815260206004820152603460248201527f4f7074696d6973746963206d696e74696e6720616c72656164792066696e616c60448201527f697a656420666f7220746865206465706f73697400000000000000000000000060648201526084016109d6565b600054815461135b91600160c81b900463ffffffff169067ffffffffffffffff16613493565b67ffffffffffffffff1642116113d95760405162461bcd60e51b815260206004820152602b60248201527f4f7074696d6973746963206d696e74696e672064656c617920686173206e6f7460448201527f207061737365642079657400000000000000000000000000000000000000000060648201526084016109d6565b604051630b02c43d60e41b8152600481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b02c43d09060240160e060405180830381865afa158015611441573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146591906134e7565b90508060a0015163ffffffff166000146114c15760405162461bcd60e51b815260206004820152601c60248201527f546865206465706f73697420697320616c72656164792073776570740000000060448201526064016109d6565b60006402540be400826080015183602001516114dd91906135a1565b67ffffffffffffffff166114f19190613463565b6000805491925090600160a81b900463ffffffff1661151157600061152b565b60005461152b90600160a81b900463ffffffff16836135d8565b83516001600160a01b0316600090815260056020526040812054919250906115549084906135ec565b84516001600160a01b03166000908152600560205260409020819055845190915061158390610d908486613421565b8115611614576116147f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166361d027b36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160e91906135ff565b83612905565b84547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff16680100000000000000004267ffffffffffffffff160217855583516040518281526001600160a01b0390911690879033907f2cffebf26d639426e79514d100febae8b2c63e700e5dc0fa6c88a129633506369060200160405180910390a45050505050505050565b606060028054806020026020016040519081016040528092919081815260200182805480156116f857602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116116da575b5050505050905090565b61170a612728565b6001600160a01b03811660009081526003602052604090205460ff166117725760405162461bcd60e51b815260206004820152601e60248201527f546869732061646472657373206973206e6f74206120677561726469616e000060448201526064016109d6565b6001600160a01b038116600081815260036020526040808220805460ff19169055517fb8107d0c6b40be480ce3172ee66ba6d64b71f6b1685a851340036e6e2e3e3c529190a250565b6117c3612728565b6117cd6000612d1f565b565b600080806117e26402540be4008561361c565b91506117ee8285613421565b92506117ff6402540be400846135d8565b929491935050565b3360009081526003602052604090205460ff166118665760405162461bcd60e51b815260206004820152601860248201527f43616c6c6572206973206e6f74206120677561726469616e000000000000000060448201526064016109d6565b6000611872838361081e565b600081815260046020526040812080549293509167ffffffffffffffff1690036119045760405162461bcd60e51b815260206004820152603060248201527f4f7074696d6973746963206d696e74696e67206e6f742072657175657374656460448201527f20666f7220746865206465706f7369740000000000000000000000000000000060648201526084016109d6565b805468010000000000000000900467ffffffffffffffff161561198f5760405162461bcd60e51b815260206004820152603460248201527f4f7074696d6973746963206d696e74696e6720616c72656164792066696e616c60448201527f697a656420666f7220746865206465706f73697400000000000000000000000060648201526084016109d6565b60008281526004602052604080822080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016905551839133917f1256b41d4b18d922811c358ab80cb0375aae28f45373de35cfda580662193fcd9190a350505050565b3360009081526001602052604090205460ff16611a525760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f742061206d696e7465720000000000000000000060448201526064016109d6565b600054600160a01b900460ff1615611aac5760405162461bcd60e51b815260206004820152601960248201527f4f7074696d6973746963206d696e74696e67207061757365640000000000000060448201526064016109d6565b6000611ab8838361081e565b600081815260046020526040902080549192509067ffffffffffffffff1615611b495760405162461bcd60e51b815260206004820152603460248201527f4f7074696d6973746963206d696e74696e6720616c726561647920726571756560448201527f7374656420666f7220746865206465706f73697400000000000000000000000060648201526084016109d6565b604051630b02c43d60e41b8152600481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b02c43d09060240160e060405180830381865afa158015611bb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd591906134e7565b9050806040015163ffffffff16600003611c3b5760405162461bcd60e51b815260206004820152602160248201527f546865206465706f73697420686173206e6f74206265656e2072657665616c656044820152601960fa1b60648201526084016109d6565b60a081015163ffffffff1615611c935760405162461bcd60e51b815260206004820152601c60248201527f546865206465706f73697420697320616c72656164792073776570740000000060448201526064016109d6565b60608101516001600160a01b03163014611cef5760405162461bcd60e51b815260206004820152601860248201527f556e6578706563746564207661756c742061646472657373000000000000000060448201526064016109d6565b815467ffffffffffffffff19164267ffffffffffffffff908116919091178355815160208301516001600160a01b0390911691859133917f36f39c606d55d7dd2a05b8c4e41e9a6ca8c501cea10009c1762f6826a146e05591611d59916402540be4009116613463565b60408051918252602082018b905263ffffffff8a169082015260600160405180910390a45050505050565b60028181548110611d9457600080fd5b6000918252602090912001546001600160a01b0316905081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614611e2f5760405162461bcd60e51b815260206004820152601160248201527f546f6b656e206973206e6f74205442544300000000000000000000000000000060448201526064016109d6565b336001600160a01b03841614611e875760405162461bcd60e51b815260206004820152601860248201527f4f6e6c7920544254432063616c6c657220616c6c6f776564000000000000000060448201526064016109d6565b6000611e92856117cf565b50909150506000829003611eaf57611eaa8682612bd0565b611ebb565b611ebb86828585612a89565b505050505050565b611ecb612728565b6001600160a01b03811660009081526001602052604090205460ff1615611f345760405162461bcd60e51b815260206004820181905260248201527f54686973206164647265737320697320616c72656164792061206d696e74657260448201526064016109d6565b6001600160a01b0381166000818152600160208190526040808320805460ff19168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180546001600160a01b03191684179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b611fc8612728565b600954611fd881620151806129e0565b600854600080547fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff1663ffffffff909216600160c81b81029290921790556040519081527ff52de3377e3ae270d1e38f99b9b8d587814643811516ea55ba4d597f9950d4ec9060200160405180910390a1506008805463ffffffff191690556000600955565b612066612728565b600b5461207681620151806129e0565b600a546040516001600160a01b0390911681527f81a9bb8030ed4116b405800280e065110a37afb57b69948e714c97fab23475ec9060200160405180910390a1600a546040517ff2fde38b0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063f2fde38b90602401600060405180830381600087803b15801561213757600080fd5b505af115801561214b573d6000803e3d6000fd5b5050600a546040516370a0823160e01b81523060048201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811694506356a6d9ef93509091169083906370a0823190602401602060405180830381865afa1580156121c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e7919061347a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561224557600080fd5b505af1158015612259573d6000803e3d6000fd5b5050600a80546001600160a01b031916905550506000600b5550565b600080612281836117cf565b6040516370a0823160e01b8152336004820152929450925082916001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691506370a0823190602401602060405180830381865afa1580156122ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612311919061347a565b101561236a5760405162461bcd60e51b815260206004820152602260248201527f416d6f756e7420657863656564732062616c616e636520696e207468652062616044820152616e6b60f01b60648201526084016109d6565b6123743383612905565b604051631f1b6d2760e21b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690637c6db49c90606401610c1f565b6123d5612728565b600054600160a01b900460ff16156124395760405162461bcd60e51b815260206004820152602160248201527f4f7074696d6973746963206d696e74696e6720616c72656164792070617573656044820152601960fa1b60648201526084016109d6565b6000805460ff60a01b1916600160a01b1781556040517f23a83c8aeda8c831401c17b5bfb8b2ead79fcfe9c027fe34a4f8576e2c7c74cc9190a1565b61247d612728565b6001600160a01b03811660009081526003602052604090205460ff161561250c5760405162461bcd60e51b815260206004820152602260248201527f54686973206164647265737320697320616c726561647920612067756172646960448201527f616e00000000000000000000000000000000000000000000000000000000000060648201526084016109d6565b6001600160a01b038116600081815260036020526040808220805460ff19166001179055517f038596bb31e2e7d3d9f184d4c98b310103f6d7f5830e5eec32bffe6f1728f9699190a250565b612560612728565b600054600160a01b900460ff166125b95760405162461bcd60e51b815260206004820181905260248201527f4f7074696d6973746963206d696e74696e67206973206e6f742070617573656460448201526064016109d6565b6000805460ff60a01b191681556040517fcb27470ed9568d9eeb8939707bafc19404d908a26ce5f468a6aa781024fd6a839190a1565b6125f7612728565b426007556006805463ffffffff191663ffffffff83169081179091556040519081527f0dbfec7f12acffbb5cec595ac4370907eaf84caa7025dd71f4021433be79eba9906020016107f2565b61264b612728565b6001600160a01b0381166126c75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109d6565b6126d081612d1f565b50565b6126db612728565b6040517fb88d4fde0000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063b88d4fde906108f890309088908890889088906004016133c2565b6000546001600160a01b031633146117cd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109d6565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610819908490612d6f565b6001600160a01b03821660009081526005602052604081205480820361282b578291505061087d565b80831115612892576001600160a01b0384166000818152600560209081526040808320839055519182527fb30abd1b9e3d58cd8525b3d5c5aa002db1e43a150af5b172a8d16efcc7a141f8910160405180910390a261288a8184613421565b91505061087d565b61289c8382613421565b6001600160a01b0385166000818152600560205260409020919091557fb30abd1b9e3d58cd8525b3d5c5aa002db1e43a150af5b172a8d16efcc7a141f86128e38584613421565b60405190815260200160405180910390a2600091505061087d565b5092915050565b816001600160a01b03167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe8260405161294091815260200190565b60405180910390a26040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018390527f000000000000000000000000000000000000000000000000000000000000000016906340c10f19906044015b600060405180830381600087803b1580156129cc57600080fd5b505af1158015611ebb573d6000803e3d6000fd5b60008211612a305760405162461bcd60e51b815260206004820152601460248201527f4368616e6765206e6f7420696e6974696174656400000000000000000000000060448201526064016109d6565b80612a3b8342613421565b101561114f5760405162461bcd60e51b815260206004820181905260248201527f476f7665726e616e63652064656c617920686173206e6f7420656c617073656460448201526064016109d6565b836001600160a01b03167f68751a4c3821398cb63d11609eca2440742ef19446f0c0261bfa8a13dd0748b884604051612ac491815260200190565b60405180910390a260405163079cc67960e41b81526001600160a01b038581166004830152602482018590527f000000000000000000000000000000000000000000000000000000000000000016906379cc679090604401600060405180830381600087803b158015612b3657600080fd5b505af1158015612b4a573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634a38757e7f00000000000000000000000000000000000000000000000000000000000000006402540be40086612baf91906135d8565b85856040518563ffffffff1660e01b8152600401610f7a9493929190613630565b816001600160a01b03167f68751a4c3821398cb63d11609eca2440742ef19446f0c0261bfa8a13dd0748b882604051612c0b91815260200190565b60405180910390a260405163079cc67960e41b81526001600160a01b038381166004830152602482018390527f000000000000000000000000000000000000000000000000000000000000000016906379cc679090604401600060405180830381600087803b158015612c7d57600080fd5b505af1158015612c91573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166356a6d9ef836402540be40084612cd691906135d8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03909216600483015260248201526044016129b2565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000612dc4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e549092919063ffffffff16565b8051909150156108195780806020019051810190612de29190613663565b6108195760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016109d6565b6060612e638484600085612e6b565b949350505050565b606082471015612ee35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016109d6565b600080866001600160a01b03168587604051612eff91906136a9565b60006040518083038185875af1925050503d8060008114612f3c576040519150601f19603f3d011682016040523d82523d6000602084013e612f41565b606091505b5091509150612f5287838387612f5d565b979650505050505050565b60608315612fcc578251600003612fc5576001600160a01b0385163b612fc55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109d6565b5081612e63565b612e638383815115612fe15781518083602001fd5b8060405162461bcd60e51b81526004016109d691906136c5565b6001600160a01b03811681146126d057600080fd5b60006020828403121561302257600080fd5b813561302d81612ffb565b9392505050565b63ffffffff811681146126d057600080fd5b60006020828403121561305857600080fd5b813561302d81613034565b60008060006060848603121561307857600080fd5b833561308381612ffb565b9250602084013561309381612ffb565b929592945050506040919091013590565b600080604083850312156130b757600080fd5b8235915060208301356130c981613034565b809150509250929050565b60008083601f8401126130e657600080fd5b50813567ffffffffffffffff8111156130fe57600080fd5b60208301915083602082850101111561311657600080fd5b9250929050565b60008060008060006080868803121561313557600080fd5b853561314081612ffb565b9450602086013561315081612ffb565b935060408601359250606086013567ffffffffffffffff81111561317357600080fd5b61317f888289016130d4565b969995985093965092949392505050565b60008083601f8401126131a257600080fd5b50813567ffffffffffffffff8111156131ba57600080fd5b6020830191508360208260051b850101111561311657600080fd5b600080600080604085870312156131eb57600080fd5b843567ffffffffffffffff8082111561320357600080fd5b61320f88838901613190565b9096509450602087013591508082111561322857600080fd5b5061323587828801613190565b95989497509550505050565b6000806000806060858703121561325757600080fd5b843561326281612ffb565b935060208501359250604085013567ffffffffffffffff81111561328557600080fd5b613235878288016130d4565b6000806000604084860312156132a657600080fd5b83359250602084013567ffffffffffffffff8111156132c457600080fd5b6132d0868287016130d4565b9497909650939450505050565b6000602082840312156132ef57600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156133375783516001600160a01b031683529284019291840191600101613312565b50909695505050505050565b60008060008060006080868803121561335b57600080fd5b853561336681612ffb565b945060208601359350604086013561337d81612ffb565b9250606086013567ffffffffffffffff81111561317357600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60006001600160a01b03808816835280871660208401525084604083015260806060830152612f52608083018486613399565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111561087d5761087d61340b565b634e487b7160e01b600052603160045260246000fd5b60006001820161345c5761345c61340b565b5060010190565b808202811582820484141761087d5761087d61340b565b60006020828403121561348c57600080fd5b5051919050565b67ffffffffffffffff8181168382160190808211156128fe576128fe61340b565b80516134bf81612ffb565b919050565b805167ffffffffffffffff811681146134bf57600080fd5b80516134bf81613034565b600060e082840312156134f957600080fd5b60405160e0810181811067ffffffffffffffff8211171561352a57634e487b7160e01b600052604160045260246000fd5b604052613536836134b4565b8152613544602084016134c4565b6020820152613555604084016134dc565b6040820152613566606084016134b4565b6060820152613577608084016134c4565b608082015261358860a084016134dc565b60a082015260c083015160c08201528091505092915050565b67ffffffffffffffff8281168282160390808211156128fe576128fe61340b565b634e487b7160e01b600052601260045260246000fd5b6000826135e7576135e76135c2565b500490565b8082018082111561087d5761087d61340b565b60006020828403121561361157600080fd5b815161302d81612ffb565b60008261362b5761362b6135c2565b500690565b6001600160a01b0385168152836020820152606060408201526000613659606083018486613399565b9695505050505050565b60006020828403121561367557600080fd5b8151801515811461302d57600080fd5b60005b838110156136a0578181015183820152602001613688565b50506000910152565b600082516136bb818460208701613685565b9190910192915050565b60208152600082518060208401526136e4816040850160208701613685565b601f01601f1916919091016040019291505056fea26469706673582212205cfa0e3c059114b59182c0ff6a595c5ed0ead73dde175a16155df451100c53a964736f6c63430008110033",
1122
+ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106103365760003560e01c80638532c511116101b2578063a410d29b116100f9578063c36b32b7116100a2578063e5d3d7141161007c578063e5d3d7141461072e578063e78cea9214610755578063f2fde38b1461077c578063fc4e51f61461078f57600080fd5b8063c36b32b7146106ff578063c7ba034714610712578063d0ff65b51461071e57600080fd5b8063b0b54895116100d3578063b0b54895146106cd578063b9f78798146106d7578063bc7b6b99146106f757600080fd5b8063a410d29b1461068f578063a526d83b14610697578063aa271e1a146106aa57600080fd5b8063951315261161015b5780639a508c8e116101355780639a508c8e1461066b578063a0712d6814610673578063a0cceb951461068657600080fd5b80639513152614610647578063983b2d56146106505780639a4e36d51461066357600080fd5b8063897f712c1161018c578063897f712c1461060f5780638da5cb5b146106235780638f4ffcb11461063457600080fd5b80638532c511146105d95780638623ec7b146105e957806388aaf0c8146105fc57600080fd5b806347c1ffdb116102815780636c626aa41161022a5780637445a5a0116102045780637445a5a01461054657806376cdb03b1461057457806380df5ed2146105b3578063820b5513146105c657600080fd5b80636c626aa4146104d0578063714041561461052b578063715018a61461053e57600080fd5b806364e779b11161025b57806364e779b1146104955780636abe3a6c146104a85780636b32810b146104bb57600080fd5b806347c1ffdb1461046357806353dce4df1461046b5780635ae2da461461047e57600080fd5b80633092afd5116102e3578063461c6373116102bd578063461c63731461042a578063475d05701461043d578063479aa9271461045057600080fd5b80633092afd5146103fb578063317dfa761461040e57806341906ab71461042157600080fd5b80631171bda9116103145780631171bda9146103b4578063124f65bd146103c75780632e73e398146103e857600080fd5b806309b53f511461033b5780630c68ba211461036c5780630f3425731461039f575b600080fd5b60005461035290600160a81b900463ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b61038f61037a366004613010565b60036020526000908152604090205460ff1681565b6040519015158152602001610363565b6103b26103ad366004613046565b6107a2565b005b6103b26103c2366004613063565b6107fd565b6103da6103d53660046130a4565b61081e565b604051908152602001610363565b6103b26103f636600461311d565b610883565b6103b2610409366004613010565b610931565b6103b261041c366004613063565b610ba5565b6103da60095481565b6103b26104383660046131d5565b610c56565b6103b261044b366004613241565b610db1565b6103b261045e366004613010565b610fb2565b6103b2611077565b6103b2610479366004613291565b611115565b60005461035290600160c81b900463ffffffff1681565b6103b26104a33660046132dd565b611136565b6103b26104b63660046130a4565b611153565b6104c36116a0565b60405161036391906132f6565b61050a6104de3660046132dd565b60046020526000908152604090205467ffffffffffffffff808216916801000000000000000090041682565b6040805167ffffffffffffffff938416815292909116602083015201610363565b6103b2610539366004613010565b611702565b6103b26117bb565b6105596105543660046132dd565b6117cf565b60408051938452602084019290925290820152606001610363565b61059b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610363565b6103b26105c13660046130a4565b611807565b6103b26105d43660046130a4565b6119f3565b6006546103529063ffffffff1681565b61059b6105f73660046132dd565b611d84565b600a5461059b906001600160a01b031681565b60005461038f90600160a01b900460ff1681565b6000546001600160a01b031661059b565b6103b2610642366004613343565b611dae565b6103da600b5481565b6103b261065e366004613010565b611ec3565b6103b2611fc0565b6103b261205e565b6103b26106813660046132dd565b612275565b6103da60075481565b6103b26123cd565b6103b26106a5366004613010565b612475565b61038f6106b8366004613010565b60016020526000908152604090205460ff1681565b6103da6201518081565b6103da6106e5366004613010565b60056020526000908152604090205481565b6103b2612558565b6103b261070d366004613046565b6125ef565b6103da6402540be40081565b6008546103529063ffffffff1681565b61059b7f000000000000000000000000000000000000000000000000000000000000000081565b61059b7f000000000000000000000000000000000000000000000000000000000000000081565b6103b261078a366004613010565b612643565b6103b261079d36600461311d565b6126d3565b6107aa612728565b426009556008805463ffffffff191663ffffffff83169081179091556040519081527f682bc0fb7e0d6bcb974cf556b95f68533cafc411d83d9f33ac192ccf45dda605906020015b60405180910390a150565b610805612728565b6108196001600160a01b0384168383612782565b505050565b6000828260405160200161086192919091825260e01b7fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6040516020818303038152906040528051906020012060001c90505b92915050565b61088b612728565b6040517ffc4e51f60000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063fc4e51f6906108f890889088908890889088906004016133c2565b600060405180830381600087803b15801561091257600080fd5b505af1158015610926573d6000803e3d6000fd5b505050505050505050565b336109446000546001600160a01b031690565b6001600160a01b0316148061096857503360009081526003602052604090205460ff165b6109df5760405162461bcd60e51b815260206004820152602360248201527f43616c6c6572206973206e6f7420746865206f776e6572206f7220677561726460448201527f69616e000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6001600160a01b03811660009081526001602052604090205460ff16610a475760405162461bcd60e51b815260206004820152601c60248201527f546869732061646472657373206973206e6f742061206d696e7465720000000060448201526064016109d6565b6001600160a01b0381166000908152600160205260408120805460ff191690555b600254811015610b6d57816001600160a01b031660028281548110610a8f57610a8f6133f5565b6000918252602090912001546001600160a01b031603610b5b5760028054610ab990600190613421565b81548110610ac957610ac96133f5565b600091825260209091200154600280546001600160a01b039092169183908110610af557610af56133f5565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506002805480610b3457610b34613434565b600082815260209020810160001990810180546001600160a01b0319169055019055610b6d565b80610b658161344a565b915050610a68565b506040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b610bad612728565b6040517f1171bda90000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301528381166024830152604482018390527f00000000000000000000000000000000000000000000000000000000000000001690631171bda9906064015b600060405180830381600087803b158015610c3957600080fd5b505af1158015610c4d573d6000803e3d6000fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cce5760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f74207468652042616e6b0000000000000000000060448201526064016109d6565b6000839003610d1f5760405162461bcd60e51b815260206004820152601760248201527f4e6f206465706f7369746f72732073706563696669656400000000000000000060448201526064016109d6565b60005b83811015610daa576000858583818110610d3e57610d3e6133f5565b9050602002016020810190610d539190613010565b90506000848484818110610d6957610d696133f5565b905060200201359050610d9582610d90846402540be40085610d8b9190613463565b612802565b612905565b50508080610da29061344a565b915050610d22565b5050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e295760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f74207468652042616e6b0000000000000000000060448201526064016109d6565b6040516370a0823160e01b81526001600160a01b03858116600483015284917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610e93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb7919061347a565b1015610f105760405162461bcd60e51b815260206004820152602260248201527f416d6f756e7420657863656564732062616c616e636520696e207468652062616044820152616e6b60f01b60648201526084016109d6565b610f2384610d906402540be40086613463565b604051631f1b6d2760e21b81526001600160a01b038581166004830152306024830152604482018590527f00000000000000000000000000000000000000000000000000000000000000001690637c6db49c906064015b600060405180830381600087803b158015610f9457600080fd5b505af1158015610fa8573d6000803e3d6000fd5b5050505050505050565b610fba612728565b6001600160a01b0381166110105760405162461bcd60e51b815260206004820181905260248201527f4e6577207661756c7420616464726573732063616e6e6f74206265207a65726f60448201526064016109d6565b604080516001600160a01b03831681524260208201527f5cc842cab066489e13292128663547c68705dbf476f0131e0107f155719c6124910160405180910390a142600b55600a80546001600160a01b0319166001600160a01b0392909216919091179055565b61107f612728565b60075461108f81620151806129e0565b600654600080547fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1663ffffffff909216600160a81b81029290921790556040519081527fa7f4ce7c3586e2000cdec6b25c5e7d0b20f9b4f435aa22d9c1feb32dbb506f779060200160405180910390a1506006805463ffffffff191690556000600755565b6000611120846117cf565b5050905061113033828585612a89565b50505050565b6000611141826117cf565b5050905061114f3382612bd0565b5050565b3360009081526001602052604090205460ff166111b25760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f742061206d696e7465720000000000000000000060448201526064016109d6565b600054600160a01b900460ff161561120c5760405162461bcd60e51b815260206004820152601960248201527f4f7074696d6973746963206d696e74696e67207061757365640000000000000060448201526064016109d6565b6000611218838361081e565b600081815260046020526040812080549293509167ffffffffffffffff1690036112aa5760405162461bcd60e51b815260206004820152603060248201527f4f7074696d6973746963206d696e74696e67206e6f742072657175657374656460448201527f20666f7220746865206465706f7369740000000000000000000000000000000060648201526084016109d6565b805468010000000000000000900467ffffffffffffffff16156113355760405162461bcd60e51b815260206004820152603460248201527f4f7074696d6973746963206d696e74696e6720616c72656164792066696e616c60448201527f697a656420666f7220746865206465706f73697400000000000000000000000060648201526084016109d6565b600054815461135b91600160c81b900463ffffffff169067ffffffffffffffff16613493565b67ffffffffffffffff1642116113d95760405162461bcd60e51b815260206004820152602b60248201527f4f7074696d6973746963206d696e74696e672064656c617920686173206e6f7460448201527f207061737365642079657400000000000000000000000000000000000000000060648201526084016109d6565b604051630b02c43d60e41b8152600481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b02c43d09060240160e060405180830381865afa158015611441573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146591906134e7565b90508060a0015163ffffffff166000146114c15760405162461bcd60e51b815260206004820152601c60248201527f546865206465706f73697420697320616c72656164792073776570740000000060448201526064016109d6565b60006402540be400826080015183602001516114dd91906135a1565b67ffffffffffffffff166114f19190613463565b6000805491925090600160a81b900463ffffffff1661151157600061152b565b60005461152b90600160a81b900463ffffffff16836135d8565b83516001600160a01b0316600090815260056020526040812054919250906115549084906135ec565b84516001600160a01b03166000908152600560205260409020819055845190915061158390610d908486613421565b8115611614576116147f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166361d027b36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160e91906135ff565b83612905565b84547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff16680100000000000000004267ffffffffffffffff160217855583516040518281526001600160a01b0390911690879033907f2cffebf26d639426e79514d100febae8b2c63e700e5dc0fa6c88a129633506369060200160405180910390a45050505050505050565b606060028054806020026020016040519081016040528092919081815260200182805480156116f857602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116116da575b5050505050905090565b61170a612728565b6001600160a01b03811660009081526003602052604090205460ff166117725760405162461bcd60e51b815260206004820152601e60248201527f546869732061646472657373206973206e6f74206120677561726469616e000060448201526064016109d6565b6001600160a01b038116600081815260036020526040808220805460ff19169055517fb8107d0c6b40be480ce3172ee66ba6d64b71f6b1685a851340036e6e2e3e3c529190a250565b6117c3612728565b6117cd6000612d1f565b565b600080806117e26402540be4008561361c565b91506117ee8285613421565b92506117ff6402540be400846135d8565b929491935050565b3360009081526003602052604090205460ff166118665760405162461bcd60e51b815260206004820152601860248201527f43616c6c6572206973206e6f74206120677561726469616e000000000000000060448201526064016109d6565b6000611872838361081e565b600081815260046020526040812080549293509167ffffffffffffffff1690036119045760405162461bcd60e51b815260206004820152603060248201527f4f7074696d6973746963206d696e74696e67206e6f742072657175657374656460448201527f20666f7220746865206465706f7369740000000000000000000000000000000060648201526084016109d6565b805468010000000000000000900467ffffffffffffffff161561198f5760405162461bcd60e51b815260206004820152603460248201527f4f7074696d6973746963206d696e74696e6720616c72656164792066696e616c60448201527f697a656420666f7220746865206465706f73697400000000000000000000000060648201526084016109d6565b60008281526004602052604080822080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016905551839133917f1256b41d4b18d922811c358ab80cb0375aae28f45373de35cfda580662193fcd9190a350505050565b3360009081526001602052604090205460ff16611a525760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f742061206d696e7465720000000000000000000060448201526064016109d6565b600054600160a01b900460ff1615611aac5760405162461bcd60e51b815260206004820152601960248201527f4f7074696d6973746963206d696e74696e67207061757365640000000000000060448201526064016109d6565b6000611ab8838361081e565b600081815260046020526040902080549192509067ffffffffffffffff1615611b495760405162461bcd60e51b815260206004820152603460248201527f4f7074696d6973746963206d696e74696e6720616c726561647920726571756560448201527f7374656420666f7220746865206465706f73697400000000000000000000000060648201526084016109d6565b604051630b02c43d60e41b8152600481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b02c43d09060240160e060405180830381865afa158015611bb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd591906134e7565b9050806040015163ffffffff16600003611c3b5760405162461bcd60e51b815260206004820152602160248201527f546865206465706f73697420686173206e6f74206265656e2072657665616c656044820152601960fa1b60648201526084016109d6565b60a081015163ffffffff1615611c935760405162461bcd60e51b815260206004820152601c60248201527f546865206465706f73697420697320616c72656164792073776570740000000060448201526064016109d6565b60608101516001600160a01b03163014611cef5760405162461bcd60e51b815260206004820152601860248201527f556e6578706563746564207661756c742061646472657373000000000000000060448201526064016109d6565b815467ffffffffffffffff19164267ffffffffffffffff908116919091178355815160208301516001600160a01b0390911691859133917f36f39c606d55d7dd2a05b8c4e41e9a6ca8c501cea10009c1762f6826a146e05591611d59916402540be4009116613463565b60408051918252602082018b905263ffffffff8a169082015260600160405180910390a45050505050565b60028181548110611d9457600080fd5b6000918252602090912001546001600160a01b0316905081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614611e2f5760405162461bcd60e51b815260206004820152601160248201527f546f6b656e206973206e6f74205442544300000000000000000000000000000060448201526064016109d6565b336001600160a01b03841614611e875760405162461bcd60e51b815260206004820152601860248201527f4f6e6c7920544254432063616c6c657220616c6c6f776564000000000000000060448201526064016109d6565b6000611e92856117cf565b50909150506000829003611eaf57611eaa8682612bd0565b611ebb565b611ebb86828585612a89565b505050505050565b611ecb612728565b6001600160a01b03811660009081526001602052604090205460ff1615611f345760405162461bcd60e51b815260206004820181905260248201527f54686973206164647265737320697320616c72656164792061206d696e74657260448201526064016109d6565b6001600160a01b0381166000818152600160208190526040808320805460ff19168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180546001600160a01b03191684179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b611fc8612728565b600954611fd881620151806129e0565b600854600080547fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff1663ffffffff909216600160c81b81029290921790556040519081527ff52de3377e3ae270d1e38f99b9b8d587814643811516ea55ba4d597f9950d4ec9060200160405180910390a1506008805463ffffffff191690556000600955565b612066612728565b600b5461207681620151806129e0565b600a546040516001600160a01b0390911681527f81a9bb8030ed4116b405800280e065110a37afb57b69948e714c97fab23475ec9060200160405180910390a1600a546040517ff2fde38b0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063f2fde38b90602401600060405180830381600087803b15801561213757600080fd5b505af115801561214b573d6000803e3d6000fd5b5050600a546040516370a0823160e01b81523060048201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811694506356a6d9ef93509091169083906370a0823190602401602060405180830381865afa1580156121c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e7919061347a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561224557600080fd5b505af1158015612259573d6000803e3d6000fd5b5050600a80546001600160a01b031916905550506000600b5550565b600080612281836117cf565b6040516370a0823160e01b8152336004820152929450925082916001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691506370a0823190602401602060405180830381865afa1580156122ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612311919061347a565b101561236a5760405162461bcd60e51b815260206004820152602260248201527f416d6f756e7420657863656564732062616c616e636520696e207468652062616044820152616e6b60f01b60648201526084016109d6565b6123743383612905565b604051631f1b6d2760e21b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690637c6db49c90606401610c1f565b6123d5612728565b600054600160a01b900460ff16156124395760405162461bcd60e51b815260206004820152602160248201527f4f7074696d6973746963206d696e74696e6720616c72656164792070617573656044820152601960fa1b60648201526084016109d6565b6000805460ff60a01b1916600160a01b1781556040517f23a83c8aeda8c831401c17b5bfb8b2ead79fcfe9c027fe34a4f8576e2c7c74cc9190a1565b61247d612728565b6001600160a01b03811660009081526003602052604090205460ff161561250c5760405162461bcd60e51b815260206004820152602260248201527f54686973206164647265737320697320616c726561647920612067756172646960448201527f616e00000000000000000000000000000000000000000000000000000000000060648201526084016109d6565b6001600160a01b038116600081815260036020526040808220805460ff19166001179055517f038596bb31e2e7d3d9f184d4c98b310103f6d7f5830e5eec32bffe6f1728f9699190a250565b612560612728565b600054600160a01b900460ff166125b95760405162461bcd60e51b815260206004820181905260248201527f4f7074696d6973746963206d696e74696e67206973206e6f742070617573656460448201526064016109d6565b6000805460ff60a01b191681556040517fcb27470ed9568d9eeb8939707bafc19404d908a26ce5f468a6aa781024fd6a839190a1565b6125f7612728565b426007556006805463ffffffff191663ffffffff83169081179091556040519081527f0dbfec7f12acffbb5cec595ac4370907eaf84caa7025dd71f4021433be79eba9906020016107f2565b61264b612728565b6001600160a01b0381166126c75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109d6565b6126d081612d1f565b50565b6126db612728565b6040517fb88d4fde0000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063b88d4fde906108f890309088908890889088906004016133c2565b6000546001600160a01b031633146117cd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109d6565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610819908490612d6f565b6001600160a01b03821660009081526005602052604081205480820361282b578291505061087d565b80831115612892576001600160a01b0384166000818152600560209081526040808320839055519182527fb30abd1b9e3d58cd8525b3d5c5aa002db1e43a150af5b172a8d16efcc7a141f8910160405180910390a261288a8184613421565b91505061087d565b61289c8382613421565b6001600160a01b0385166000818152600560205260409020919091557fb30abd1b9e3d58cd8525b3d5c5aa002db1e43a150af5b172a8d16efcc7a141f86128e38584613421565b60405190815260200160405180910390a2600091505061087d565b5092915050565b816001600160a01b03167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe8260405161294091815260200190565b60405180910390a26040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018390527f000000000000000000000000000000000000000000000000000000000000000016906340c10f19906044015b600060405180830381600087803b1580156129cc57600080fd5b505af1158015611ebb573d6000803e3d6000fd5b60008211612a305760405162461bcd60e51b815260206004820152601460248201527f4368616e6765206e6f7420696e6974696174656400000000000000000000000060448201526064016109d6565b80612a3b8342613421565b101561114f5760405162461bcd60e51b815260206004820181905260248201527f476f7665726e616e63652064656c617920686173206e6f7420656c617073656460448201526064016109d6565b836001600160a01b03167f68751a4c3821398cb63d11609eca2440742ef19446f0c0261bfa8a13dd0748b884604051612ac491815260200190565b60405180910390a260405163079cc67960e41b81526001600160a01b038581166004830152602482018590527f000000000000000000000000000000000000000000000000000000000000000016906379cc679090604401600060405180830381600087803b158015612b3657600080fd5b505af1158015612b4a573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634a38757e7f00000000000000000000000000000000000000000000000000000000000000006402540be40086612baf91906135d8565b85856040518563ffffffff1660e01b8152600401610f7a9493929190613630565b816001600160a01b03167f68751a4c3821398cb63d11609eca2440742ef19446f0c0261bfa8a13dd0748b882604051612c0b91815260200190565b60405180910390a260405163079cc67960e41b81526001600160a01b038381166004830152602482018390527f000000000000000000000000000000000000000000000000000000000000000016906379cc679090604401600060405180830381600087803b158015612c7d57600080fd5b505af1158015612c91573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166356a6d9ef836402540be40084612cd691906135d8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03909216600483015260248201526044016129b2565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000612dc4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e549092919063ffffffff16565b8051909150156108195780806020019051810190612de29190613663565b6108195760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016109d6565b6060612e638484600085612e6b565b949350505050565b606082471015612ee35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016109d6565b600080866001600160a01b03168587604051612eff91906136a9565b60006040518083038185875af1925050503d8060008114612f3c576040519150601f19603f3d011682016040523d82523d6000602084013e612f41565b606091505b5091509150612f5287838387612f5d565b979650505050505050565b60608315612fcc578251600003612fc5576001600160a01b0385163b612fc55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109d6565b5081612e63565b612e638383815115612fe15781518083602001fd5b8060405162461bcd60e51b81526004016109d691906136c5565b6001600160a01b03811681146126d057600080fd5b60006020828403121561302257600080fd5b813561302d81612ffb565b9392505050565b63ffffffff811681146126d057600080fd5b60006020828403121561305857600080fd5b813561302d81613034565b60008060006060848603121561307857600080fd5b833561308381612ffb565b9250602084013561309381612ffb565b929592945050506040919091013590565b600080604083850312156130b757600080fd5b8235915060208301356130c981613034565b809150509250929050565b60008083601f8401126130e657600080fd5b50813567ffffffffffffffff8111156130fe57600080fd5b60208301915083602082850101111561311657600080fd5b9250929050565b60008060008060006080868803121561313557600080fd5b853561314081612ffb565b9450602086013561315081612ffb565b935060408601359250606086013567ffffffffffffffff81111561317357600080fd5b61317f888289016130d4565b969995985093965092949392505050565b60008083601f8401126131a257600080fd5b50813567ffffffffffffffff8111156131ba57600080fd5b6020830191508360208260051b850101111561311657600080fd5b600080600080604085870312156131eb57600080fd5b843567ffffffffffffffff8082111561320357600080fd5b61320f88838901613190565b9096509450602087013591508082111561322857600080fd5b5061323587828801613190565b95989497509550505050565b6000806000806060858703121561325757600080fd5b843561326281612ffb565b935060208501359250604085013567ffffffffffffffff81111561328557600080fd5b613235878288016130d4565b6000806000604084860312156132a657600080fd5b83359250602084013567ffffffffffffffff8111156132c457600080fd5b6132d0868287016130d4565b9497909650939450505050565b6000602082840312156132ef57600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156133375783516001600160a01b031683529284019291840191600101613312565b50909695505050505050565b60008060008060006080868803121561335b57600080fd5b853561336681612ffb565b945060208601359350604086013561337d81612ffb565b9250606086013567ffffffffffffffff81111561317357600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60006001600160a01b03808816835280871660208401525084604083015260806060830152612f52608083018486613399565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111561087d5761087d61340b565b634e487b7160e01b600052603160045260246000fd5b60006001820161345c5761345c61340b565b5060010190565b808202811582820484141761087d5761087d61340b565b60006020828403121561348c57600080fd5b5051919050565b67ffffffffffffffff8181168382160190808211156128fe576128fe61340b565b80516134bf81612ffb565b919050565b805167ffffffffffffffff811681146134bf57600080fd5b80516134bf81613034565b600060e082840312156134f957600080fd5b60405160e0810181811067ffffffffffffffff8211171561352a57634e487b7160e01b600052604160045260246000fd5b604052613536836134b4565b8152613544602084016134c4565b6020820152613555604084016134dc565b6040820152613566606084016134b4565b6060820152613577608084016134c4565b608082015261358860a084016134dc565b60a082015260c083015160c08201528091505092915050565b67ffffffffffffffff8281168282160390808211156128fe576128fe61340b565b634e487b7160e01b600052601260045260246000fd5b6000826135e7576135e76135c2565b500490565b8082018082111561087d5761087d61340b565b60006020828403121561361157600080fd5b815161302d81612ffb565b60008261362b5761362b6135c2565b500690565b6001600160a01b0385168152836020820152606060408201526000613659606083018486613399565b9695505050505050565b60006020828403121561367557600080fd5b8151801515811461302d57600080fd5b60005b838110156136a0578181015183820152602001613688565b50506000910152565b600082516136bb818460208701613685565b9190910192915050565b60208152600082518060208401526136e4816040850160208701613685565b601f01601f1916919091016040019291505056fea26469706673582212205cfa0e3c059114b59182c0ff6a595c5ed0ead73dde175a16155df451100c53a964736f6c63430008110033",
1123
1123
  "linkReferences": {},
1124
1124
  "deployedLinkReferences": {}
1125
1125
  }
@@ -238,6 +238,11 @@ contract Bridge is
238
238
 
239
239
  event RedemptionWatchtowerSet(address redemptionWatchtower);
240
240
 
241
+ /// @notice Emitted when a deposit's vault field is corrected via governance.
242
+ /// @dev This event is used for transparency when fixing deposits that were
243
+ /// revealed with incorrect vault targets.
244
+ event DepositVaultFixed(uint256 indexed depositKey, address newVault);
245
+
241
246
  modifier onlySpvMaintainer() {
242
247
  require(
243
248
  self.isSpvMaintainer[msg.sender],
@@ -337,6 +342,35 @@ contract Bridge is
337
342
  _transferGovernance(msg.sender);
338
343
  }
339
344
 
345
+ /// @notice Fixes the vault=0x0 deposit that is blocking sweeps for wallet
346
+ /// 71bfad9a. This deposit was revealed on 2026-01-08 by depositor
347
+ /// 0xe7c9a5298A2d2e48B5df3F9D361BA1469B0f436B with an incorrect
348
+ /// vault target. This function runs once during the upgrade to v2,
349
+ /// directly modifying the deposit's vault field in storage.
350
+ /// @dev The deposit key is computed as:
351
+ /// keccak256(fundingTxHash || fundingOutputIndex) where:
352
+ /// - fundingTxHash (little-endian): 0x7ee3fcd03309745af5f35f07572b68affb3f551d8de70b194773644a47c9bb9c
353
+ /// - fundingOutputIndex: 1
354
+ function initializeV2_FixVaultZeroDeposit() external reinitializer(2) {
355
+ // Deposit key: keccak256(fundingTxHash || fundingOutputIndex)
356
+ uint256 depositKey = 0xf3bc9cd6f46f4c206bc8711e40bb5692e8fe5f0ac4d4da0a709dc71bb751c98a;
357
+
358
+ // Target vault: TBTCVault on mainnet
359
+ address tbtcVault = 0x9C070027cdC9dc8F82416B2e5314E11DFb4FE3CD;
360
+
361
+ // Safety checks
362
+ Deposit.DepositRequest storage deposit = self.deposits[depositKey];
363
+ require(deposit.revealedAt != 0, "Deposit not revealed");
364
+ require(deposit.vault == address(0), "Vault already set");
365
+ require(deposit.sweptAt == 0, "Deposit already swept");
366
+
367
+ // Fix the vault
368
+ deposit.vault = tbtcVault;
369
+
370
+ // Emit event for transparency
371
+ emit DepositVaultFixed(depositKey, tbtcVault);
372
+ }
373
+
340
374
  /// @notice Used by the depositor to reveal information about their P2(W)SH
341
375
  /// Bitcoin deposit to the Bridge on Ethereum chain. The off-chain
342
376
  /// wallet listens for revealed deposit events and may decide to
@@ -284,11 +284,13 @@ library Deposit {
284
284
  // A 20-byte output hash is used by P2SH. That hash is constructed
285
285
  // by applying OP_HASH160 on the locking script. A 20-byte output
286
286
  // hash is used as well by P2PKH and P2WPKH (OP_HASH160 on the
287
- // public key). However, since we compare the actual output hash
288
- // with an expected locking script hash, this check will succeed only
289
- // for P2SH transaction type with expected script hash value. For
290
- // P2PKH and P2WPKH, it will fail on the output hash comparison with
291
- // the expected locking script hash.
287
+ // public key). That said, we need to additionally check
288
+ // whether the hash prefix corresponds to P2SH. To do so,
289
+ // we need to omit the 8 value bytes from the output and compare
290
+ // the 3 prefix bytes of the hash with the expected P2SH prefix.
291
+ bool isP2SH = fundingOutput.slice3(8) == hex"17a914";
292
+ require(isP2SH, "Output must be P2SH");
293
+
292
294
  require(
293
295
  fundingOutputHash.slice20(0) == expectedScript.hash160View(),
294
296
  "Wrong 20-byte script hash"
@@ -1,8 +1,10 @@
1
1
  import { HardhatRuntimeEnvironment } from "hardhat/types"
2
2
  import { DeployFunction } from "hardhat-deploy/types"
3
+ import fs from "fs"
4
+ import path from "path"
3
5
 
4
6
  const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
5
- const { ethers, helpers, deployments, getNamedAccounts } = hre
7
+ const { ethers, deployments, getNamedAccounts } = hre
6
8
  const { get } = deployments
7
9
  const { deployer, treasury } = await getNamedAccounts()
8
10
 
@@ -13,73 +15,124 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
13
15
 
14
16
  const txProofDifficultyFactor = 6
15
17
 
16
- // WARNING: This script expects no changes in the external libraries and uses
17
- // `get` function to load the ones that were already published before.
18
- // If there are any changes in the external libraries make sure to deploy fresh
19
- // versions of the libraries and link them to the implementation.
20
- const Deposit = await get("Deposit")
18
+ // Deploy the Deposit library. hardhat-deploy detects bytecode changes
19
+ // and deploys a new version if the compiled artifact differs from the
20
+ // on-chain code at the address recorded in Deposit.json.
21
+ const Deposit = await deployments.deploy("Deposit", {
22
+ from: deployer,
23
+ log: true,
24
+ waitConfirmations: 1,
25
+ })
26
+ if (Deposit.newlyDeployed) {
27
+ console.log(`New Deposit library deployed at: ${Deposit.address}`)
28
+ }
29
+
21
30
  const DepositSweep = await get("DepositSweep")
22
31
  const Redemption = await get("Redemption")
23
32
  const Wallets = await get("Wallets")
24
33
  const Fraud = await get("Fraud")
25
34
  const MovingFunds = await get("MovingFunds")
26
35
 
27
- const [bridge, proxyDeployment] = await helpers.upgrades.upgradeProxy(
28
- "Bridge",
29
- "Bridge",
30
- {
31
- contractName: "Bridge",
32
- initializerArgs: [
33
- Bank.address,
34
- LightRelay.address,
35
- treasury,
36
- WalletRegistry.address,
37
- ReimbursementPool.address,
38
- txProofDifficultyFactor,
39
- ],
40
- factoryOpts: {
41
- signer: await ethers.getSigner(deployer),
42
- libraries: {
43
- Deposit: Deposit.address,
44
- DepositSweep: DepositSweep.address,
45
- Redemption: Redemption.address,
46
- Wallets: Wallets.address,
47
- Fraud: Fraud.address,
48
- MovingFunds: MovingFunds.address,
49
- },
50
- },
51
- proxyOpts: {
52
- kind: "transparent",
53
- // Allow external libraries linking. We need to ensure manually that the
54
- // external libraries we link are upgrade safe, as the OpenZeppelin plugin
55
- // doesn't perform such a validation yet.
56
- // See: https://docs.openzeppelin.com/upgrades-plugins/1.x/faq#why-cant-i-use-external-libraries
57
- unsafeAllow: ["external-library-linking"],
58
- },
59
- }
60
- )
36
+ const Bridge = await deployments.get("Bridge")
61
37
 
62
- if (hre.network.tags.etherscan) {
63
- // We use `verify` instead of `verify:verify` as the `verify` task is defined
64
- // in "@openzeppelin/hardhat-upgrades" to perform Etherscan verification
65
- // of Proxy and Implementation contracts.
66
- await hre.run("verify", {
67
- address: proxyDeployment.address,
68
- constructorArgsParams: proxyDeployment.args,
69
- })
38
+ const bridgeLibraries = {
39
+ Deposit: Deposit.address,
40
+ DepositSweep: DepositSweep.address,
41
+ Redemption: Redemption.address,
42
+ Wallets: Wallets.address,
43
+ Fraud: Fraud.address,
44
+ MovingFunds: MovingFunds.address,
70
45
  }
71
46
 
72
- if (hre.network.tags.tenderly) {
73
- await hre.tenderly.verify({
74
- name: "Bridge",
75
- address: bridge.address,
47
+ const bridgeFactory = await ethers.getContractFactory("Bridge", {
48
+ signer: await ethers.getSigner(deployer),
49
+ libraries: bridgeLibraries,
50
+ })
51
+
52
+ const deployBridgeImplementation = async (): Promise<string> => {
53
+ const implementationDeployment = await deployments.deploy(
54
+ "BridgeImplementation",
55
+ {
56
+ contract: "Bridge",
57
+ from: deployer,
58
+ log: true,
59
+ waitConfirmations: 1,
60
+ skipIfAlreadyDeployed: false,
61
+ libraries: bridgeLibraries,
62
+ }
63
+ )
64
+ return implementationDeployment.address
65
+ }
66
+
67
+ let isProxyRegistered = false
68
+ const ozNetworkFile = path.join(
69
+ __dirname,
70
+ `../.openzeppelin/${hre.network.name}.json`
71
+ )
72
+ if (fs.existsSync(ozNetworkFile)) {
73
+ const ozData = JSON.parse(fs.readFileSync(ozNetworkFile, "utf8"))
74
+ isProxyRegistered = (ozData.proxies || []).some(
75
+ (proxy: { address?: string }) =>
76
+ proxy.address?.toLowerCase() === Bridge.address.toLowerCase()
77
+ )
78
+ }
79
+ if (!isProxyRegistered) {
80
+ await hre.upgrades.forceImport(Bridge.address, bridgeFactory, {
81
+ kind: "transparent",
76
82
  })
77
83
  }
84
+
85
+ const adminSlot =
86
+ "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"
87
+ const adminData = await ethers.provider.getStorageAt(
88
+ Bridge.address,
89
+ adminSlot
90
+ )
91
+ const proxyAdminAddress = ethers.utils.getAddress(`0x${adminData.slice(26)}`)
92
+ const proxyAdmin = await ethers.getContractAt(
93
+ ["function owner() view returns (address)"],
94
+ proxyAdminAddress
95
+ )
96
+ const proxyAdminOwner = await proxyAdmin.owner()
97
+ const deployerSigner = await ethers.getSigner(deployer)
98
+ const deployerAddress = await deployerSigner.getAddress()
99
+
100
+ const implementationAddress = await deployBridgeImplementation()
101
+ const proxyAdminInterface = new ethers.utils.Interface([
102
+ "function upgrade(address proxy, address implementation)",
103
+ ])
104
+ const upgradeCalldata = proxyAdminInterface.encodeFunctionData("upgrade", [
105
+ Bridge.address,
106
+ implementationAddress,
107
+ ])
108
+
109
+ if (proxyAdminOwner.toLowerCase() !== deployerAddress.toLowerCase()) {
110
+ console.log("ProxyAdmin owner:", proxyAdminOwner)
111
+ console.log("ProxyAdmin address:", proxyAdminAddress)
112
+ console.log("Bridge implementation:", implementationAddress)
113
+ console.log("Upgrade calldata:", upgradeCalldata)
114
+ return
115
+ }
116
+
117
+ const proxyAdminWithUpgrade = await ethers.getContractAt(
118
+ ["function upgrade(address proxy, address implementation)"],
119
+ proxyAdminAddress
120
+ )
121
+ const upgradeTx = await proxyAdminWithUpgrade.upgrade(
122
+ Bridge.address,
123
+ implementationAddress
124
+ )
125
+ await upgradeTx.wait(1)
126
+ console.log("ProxyAdmin owner:", proxyAdminOwner)
127
+ console.log("ProxyAdmin address:", proxyAdminAddress)
128
+ console.log("Bridge implementation:", implementationAddress)
129
+ console.log("Upgrade tx:", upgradeTx.hash)
130
+ console.log("Upgrade calldata:", upgradeCalldata)
78
131
  }
79
132
 
80
133
  export default func
81
134
 
82
135
  func.tags = ["UpgradeBridge"]
83
- // When running an upgrade uncomment the skip below and run the command:
136
+ // Set UPGRADE_BRIDGE=true when running an upgrade.
84
137
  // yarn deploy --tags UpgradeBridge --network <NETWORK>
85
- func.skip = async () => true
138
+ func.skip = async () => process.env.UPGRADE_BRIDGE !== "true"