@keep-network/tbtc-v2 1.0.2-dev.0 → 1.0.2-dev.1

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 (80) hide show
  1. package/artifacts/BLS.json +1 -1
  2. package/artifacts/Bank.json +3 -3
  3. package/artifacts/BeaconAuthorization.json +1 -1
  4. package/artifacts/BeaconDkg.json +1 -1
  5. package/artifacts/BeaconDkgValidator.json +1 -1
  6. package/artifacts/BeaconInactivity.json +1 -1
  7. package/artifacts/BeaconSortitionPool.json +3 -3
  8. package/artifacts/Bridge.json +5 -5
  9. package/artifacts/BridgeGovernance.json +2 -2
  10. package/artifacts/BridgeGovernanceParameters.json +2 -2
  11. package/artifacts/Deposit.json +2 -2
  12. package/artifacts/DepositSweep.json +2 -2
  13. package/artifacts/DonationVault.json +2 -2
  14. package/artifacts/EcdsaDkgValidator.json +1 -1
  15. package/artifacts/EcdsaInactivity.json +1 -1
  16. package/artifacts/EcdsaSortitionPool.json +3 -3
  17. package/artifacts/Fraud.json +2 -2
  18. package/artifacts/KeepRegistry.json +1 -1
  19. package/artifacts/KeepStake.json +2 -2
  20. package/artifacts/KeepToken.json +2 -2
  21. package/artifacts/KeepTokenStaking.json +1 -1
  22. package/artifacts/LightRelay.json +3 -3
  23. package/artifacts/MaintainerProxy.json +3 -3
  24. package/artifacts/MovingFunds.json +2 -2
  25. package/artifacts/NuCypherStakingEscrow.json +1 -1
  26. package/artifacts/NuCypherToken.json +2 -2
  27. package/artifacts/RandomBeacon.json +2 -2
  28. package/artifacts/RandomBeaconChaosnet.json +2 -2
  29. package/artifacts/RandomBeaconGovernance.json +2 -2
  30. package/artifacts/Redemption.json +2 -2
  31. package/artifacts/ReimbursementPool.json +2 -2
  32. package/artifacts/T.json +2 -2
  33. package/artifacts/TBTC.json +3 -3
  34. package/artifacts/TBTCToken.json +3 -3
  35. package/artifacts/TBTCVault.json +93 -38
  36. package/artifacts/TokenStaking.json +1 -1
  37. package/artifacts/TokenholderGovernor.json +9 -9
  38. package/artifacts/TokenholderTimelock.json +8 -8
  39. package/artifacts/VendingMachine.json +3 -3
  40. package/artifacts/VendingMachineKeep.json +1 -1
  41. package/artifacts/VendingMachineNuCypher.json +1 -1
  42. package/artifacts/WalletRegistry.json +5 -5
  43. package/artifacts/WalletRegistryGovernance.json +2 -2
  44. package/artifacts/Wallets.json +2 -2
  45. package/artifacts/solcInputs/{02bce6ad4d51639a29a8a0ab743e5d10.json → bc3dee495878ca981ed1f35ee0b9d4da.json} +2 -2
  46. package/build/contracts/GovernanceUtils.sol/GovernanceUtils.dbg.json +1 -1
  47. package/build/contracts/bank/Bank.sol/Bank.dbg.json +1 -1
  48. package/build/contracts/bank/IReceiveBalanceApproval.sol/IReceiveBalanceApproval.dbg.json +1 -1
  49. package/build/contracts/bridge/BitcoinTx.sol/BitcoinTx.dbg.json +1 -1
  50. package/build/contracts/bridge/Bridge.sol/Bridge.dbg.json +1 -1
  51. package/build/contracts/bridge/BridgeGovernanceParameters.sol/BridgeGovernanceParameters.dbg.json +1 -1
  52. package/build/contracts/bridge/BridgeState.sol/BridgeState.dbg.json +1 -1
  53. package/build/contracts/bridge/Deposit.sol/Deposit.dbg.json +1 -1
  54. package/build/contracts/bridge/DepositSweep.sol/DepositSweep.dbg.json +1 -1
  55. package/build/contracts/bridge/EcdsaLib.sol/EcdsaLib.dbg.json +1 -1
  56. package/build/contracts/bridge/Fraud.sol/Fraud.dbg.json +1 -1
  57. package/build/contracts/bridge/Heartbeat.sol/Heartbeat.dbg.json +1 -1
  58. package/build/contracts/bridge/IRelay.sol/IRelay.dbg.json +1 -1
  59. package/build/contracts/bridge/MovingFunds.sol/MovingFunds.dbg.json +1 -1
  60. package/build/contracts/bridge/Redemption.sol/OutboundTx.dbg.json +1 -1
  61. package/build/contracts/bridge/Redemption.sol/Redemption.dbg.json +1 -1
  62. package/build/contracts/bridge/VendingMachine.sol/VendingMachine.dbg.json +1 -1
  63. package/build/contracts/bridge/Wallets.sol/Wallets.dbg.json +1 -1
  64. package/build/contracts/maintainer/MaintainerProxy.sol/MaintainerProxy.dbg.json +1 -1
  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/token/TBTC.sol/TBTC.dbg.json +1 -1
  69. package/build/contracts/vault/DonationVault.sol/DonationVault.dbg.json +1 -1
  70. package/build/contracts/vault/IVault.sol/IVault.dbg.json +1 -1
  71. package/build/contracts/vault/TBTCOptimisticMinting.sol/TBTCOptimisticMinting.dbg.json +1 -1
  72. package/build/contracts/vault/TBTCOptimisticMinting.sol/TBTCOptimisticMinting.json +13 -0
  73. package/build/contracts/vault/TBTCVault.sol/TBTCVault.dbg.json +1 -1
  74. package/build/contracts/vault/TBTCVault.sol/TBTCVault.json +46 -4
  75. package/contracts/vault/TBTCOptimisticMinting.sol +9 -5
  76. package/contracts/vault/TBTCVault.sol +87 -31
  77. package/export/artifacts/contracts/vault/TBTCVault.sol/TBTCVault.json +3109 -2548
  78. package/export/typechain/factories/TBTCOptimisticMinting__factory.js +13 -0
  79. package/export/typechain/factories/TBTCVault__factory.js +45 -3
  80. package/package.json +1 -1
@@ -354,6 +354,19 @@
354
354
  "stateMutability": "view",
355
355
  "type": "function"
356
356
  },
357
+ {
358
+ "inputs": [],
359
+ "name": "SATOSHI_MULTIPLIER",
360
+ "outputs": [
361
+ {
362
+ "internalType": "uint256",
363
+ "name": "",
364
+ "type": "uint256"
365
+ }
366
+ ],
367
+ "stateMutability": "view",
368
+ "type": "function"
369
+ },
357
370
  {
358
371
  "inputs": [
359
372
  {
@@ -380,6 +393,35 @@
380
393
  "stateMutability": "nonpayable",
381
394
  "type": "function"
382
395
  },
396
+ {
397
+ "inputs": [
398
+ {
399
+ "internalType": "uint256",
400
+ "name": "amount",
401
+ "type": "uint256"
402
+ }
403
+ ],
404
+ "name": "amountToSatoshis",
405
+ "outputs": [
406
+ {
407
+ "internalType": "uint256",
408
+ "name": "convertibleAmount",
409
+ "type": "uint256"
410
+ },
411
+ {
412
+ "internalType": "uint256",
413
+ "name": "remainder",
414
+ "type": "uint256"
415
+ },
416
+ {
417
+ "internalType": "uint256",
418
+ "name": "satoshis",
419
+ "type": "uint256"
420
+ }
421
+ ],
422
+ "stateMutability": "view",
423
+ "type": "function"
424
+ },
383
425
  {
384
426
  "inputs": [],
385
427
  "name": "bank",
@@ -813,7 +855,7 @@
813
855
  },
814
856
  {
815
857
  "internalType": "uint256",
816
- "name": "amount",
858
+ "name": "satoshis",
817
859
  "type": "uint256"
818
860
  },
819
861
  {
@@ -836,7 +878,7 @@
836
878
  },
837
879
  {
838
880
  "internalType": "uint256[]",
839
- "name": "depositedAmounts",
881
+ "name": "depositedSatoshiAmounts",
840
882
  "type": "uint256[]"
841
883
  }
842
884
  ],
@@ -1076,8 +1118,8 @@
1076
1118
  "type": "function"
1077
1119
  }
1078
1120
  ],
1079
- "bytecode": "0x60e060405260008054600160a81b600160e81b031916650a8c0000007d60aa1b1790553480156200002f57600080fd5b5060405162003d0f38038062003d0f83398101604081905262000052916200020c565b806200005e33620001a3565b6001600160a01b038116620000c55760405162461bcd60e51b815260206004820152602260248201527f4272696467652063616e206e6f7420626520746865207a65726f206164647265604482015261737360f01b60648201526084015b60405180910390fd5b6001600160a01b039081166080528316620001235760405162461bcd60e51b815260206004820181905260248201527f42616e6b2063616e206e6f7420626520746865207a65726f20616464726573736044820152606401620000bc565b6001600160a01b0382166200018a5760405162461bcd60e51b815260206004820152602660248201527f5442544320746f6b656e2063616e206e6f7420626520746865207a65726f206160448201526564647265737360d01b6064820152608401620000bc565b506001600160a01b0391821660a0521660c05262000260565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146200020957600080fd5b50565b6000806000606084860312156200022257600080fd5b83516200022f81620001f3565b60208501519093506200024281620001f3565b60408501519092506200025581620001f3565b809150509250925092565b60805160a05160c0516139f36200031c600039600081816106e30152818161093001528181610ca401528181611ece015281816122b701528181612c8701528181612dfe0152612f4e01526000818161053501528181610d1001528181610e5b01528181610ee901528181610fe501528181612333015281816124520152818161254a01528181612e880152612fe701526000818161070a015281816114e30152818161167101528181611c8d0152612eb701526139f36000f3fe608060405234801561001057600080fd5b50600436106103205760003560e01c80638532c511116101a7578063a410d29b116100ee578063c36b32b711610097578063e78cea9211610071578063e78cea9214610705578063f2fde38b1461072c578063fc4e51f61461073f57600080fd5b8063c36b32b7146106bb578063d0ff65b5146106ce578063e5d3d714146106de57600080fd5b8063b0b54895116100c8578063b0b5489514610689578063b9f7879814610693578063bc7b6b99146106b357600080fd5b8063a410d29b1461064b578063a526d83b14610653578063aa271e1a1461066657600080fd5b806395131526116101505780639a508c8e1161012a5780639a508c8e14610627578063a0712d681461062f578063a0cceb951461064257600080fd5b80639513152614610603578063983b2d561461060c5780639a4e36d51461061f57600080fd5b8063897f712c11610181578063897f712c146105cb5780638da5cb5b146105df5780638f4ffcb1146105f057600080fd5b80638532c511146105955780638623ec7b146105a557806388aaf0c8146105b857600080fd5b806347c1ffdb1161026b5780636c626aa41161021457806376cdb03b116101ee57806376cdb03b1461053057806380df5ed21461056f578063820b55131461058257600080fd5b80636c626aa4146104ba5780637140415614610515578063715018a61461052857600080fd5b806364e779b11161024557806364e779b11461047f5780636abe3a6c146104925780636b32810b146104a557600080fd5b806347c1ffdb1461044d57806353dce4df146104555780635ae2da461461046857600080fd5b80633092afd5116102cd578063461c6373116102a7578063461c637314610414578063475d057014610427578063479aa9271461043a57600080fd5b80633092afd5146103e5578063317dfa76146103f857806341906ab71461040b57600080fd5b80631171bda9116102fe5780631171bda91461039e578063124f65bd146103b15780632e73e398146103d257600080fd5b806309b53f51146103255780630c68ba21146103565780630f34257314610389575b600080fd5b60005461033c90600160a81b900463ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b6103796103643660046132fc565b60036020526000908152604090205460ff1681565b604051901515815260200161034d565b61039c61039736600461332b565b610752565b005b61039c6103ac366004613348565b6107f2565b6103c46103bf366004613389565b610853565b60405190815260200161034d565b61039c6103e0366004613402565b6108b8565b61039c6103f33660046132fc565b6109a6565b61039c610406366004613348565b610c15565b6103c460095481565b61039c6104223660046134ba565b610d05565b61039c610435366004613526565b610e50565b61039c6104483660046132fc565b611048565b61039c61114d565b61039c610463366004613576565b61122b565b60005461033c90600160c81b900463ffffffff1681565b61039c61048d3660046135c2565b611237565b61039c6104a0366004613389565b611244565b6104ad611783565b60405161034d91906135db565b6104f46104c83660046135c2565b60046020526000908152604090205467ffffffffffffffff808216916801000000000000000090041682565b6040805167ffffffffffffffff93841681529290911660208301520161034d565b61039c6105233660046132fc565b6117e5565b61039c6118de565b6105577f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161034d565b61039c61057d366004613389565b611932565b61039c610590366004613389565b611b1e565b60065461033c9063ffffffff1681565b6105576105b33660046135c2565b611ea2565b600a54610557906001600160a01b031681565b60005461037990600160a01b900460ff1681565b6000546001600160a01b0316610557565b61039c6105fe366004613628565b611ecc565b6103c4600b5481565b61039c61061a3660046132fc565b611fc9565b61039c612106565b61039c6121e4565b61039c61063d3660046135c2565b61243b565b6103c460075481565b61039c6125aa565b61039c6106613660046132fc565b612692565b6103796106743660046132fc565b60016020526000908152604090205460ff1681565b6103c46201518081565b6103c46106a13660046132fc565b60056020526000908152604090205481565b61039c6127b5565b61039c6106c936600461332b565b61288c565b60085461033c9063ffffffff1681565b6105577f000000000000000000000000000000000000000000000000000000000000000081565b6105577f000000000000000000000000000000000000000000000000000000000000000081565b61039c61073a3660046132fc565b612920565b61039c61074d366004613402565b6129ed565b6000546001600160a01b0316331461079f5760405162461bcd60e51b8152602060048201819052602482015260008051602061399e83398151915260448201526064015b60405180910390fd5b426009556008805463ffffffff191663ffffffff83169081179091556040519081527f682bc0fb7e0d6bcb974cf556b95f68533cafc411d83d9f33ac192ccf45dda605906020015b60405180910390a150565b6000546001600160a01b0316331461083a5760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b61084e6001600160a01b0384168383612a82565b505050565b6000828260405160200161089692919091825260e01b7fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6040516020818303038152906040528051906020012060001c90505b92915050565b6000546001600160a01b031633146109005760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b6040517ffc4e51f60000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063fc4e51f69061096d90889088908890889088906004016136a7565b600060405180830381600087803b15801561098757600080fd5b505af115801561099b573d6000803e3d6000fd5b505050505050505050565b336109b96000546001600160a01b031690565b6001600160a01b031614806109dd57503360009081526003602052604090205460ff165b610a4f5760405162461bcd60e51b815260206004820152602360248201527f43616c6c6572206973206e6f7420746865206f776e6572206f7220677561726460448201527f69616e00000000000000000000000000000000000000000000000000000000006064820152608401610796565b6001600160a01b03811660009081526001602052604090205460ff16610ab75760405162461bcd60e51b815260206004820152601c60248201527f546869732061646472657373206973206e6f742061206d696e746572000000006044820152606401610796565b6001600160a01b0381166000908152600160205260408120805460ff191690555b600254811015610bdd57816001600160a01b031660028281548110610aff57610aff6136da565b6000918252602090912001546001600160a01b031603610bcb5760028054610b2990600190613706565b81548110610b3957610b396136da565b600091825260209091200154600280546001600160a01b039092169183908110610b6557610b656136da565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506002805480610ba457610ba4613719565b600082815260209020810160001990810180546001600160a01b0319169055019055610bdd565b80610bd58161372f565b915050610ad8565b506040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b6000546001600160a01b03163314610c5d5760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b6040517f1171bda90000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301528381166024830152604482018390527f00000000000000000000000000000000000000000000000000000000000000001690631171bda990606401600060405180830381600087803b158015610ce857600080fd5b505af1158015610cfc573d6000803e3d6000fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d7d5760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f74207468652042616e6b000000000000000000006044820152606401610796565b6000839003610dce5760405162461bcd60e51b815260206004820152601760248201527f4e6f206465706f7369746f7273207370656369666965640000000000000000006044820152606401610796565b60005b83811015610e49576000858583818110610ded57610ded6136da565b9050602002016020810190610e0291906132fc565b90506000848484818110610e1857610e186136da565b905060200201359050610e3482610e2f8484612b02565b612c05565b50508080610e419061372f565b915050610dd1565b5050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ec85760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f74207468652042616e6b000000000000000000006044820152606401610796565b6040516370a0823160e01b81526001600160a01b03858116600483015284917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610f32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f569190613748565b1015610faf5760405162461bcd60e51b815260206004820152602260248201527f416d6f756e7420657863656564732062616c616e636520696e207468652062616044820152616e6b60f01b6064820152608401610796565b610fb98484612c05565b604051631f1b6d2760e21b81526001600160a01b038581166004830152306024830152604482018590527f00000000000000000000000000000000000000000000000000000000000000001690637c6db49c906064015b600060405180830381600087803b15801561102a57600080fd5b505af115801561103e573d6000803e3d6000fd5b5050505050505050565b6000546001600160a01b031633146110905760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b6001600160a01b0381166110e65760405162461bcd60e51b815260206004820181905260248201527f4e6577207661756c7420616464726573732063616e6e6f74206265207a65726f6044820152606401610796565b604080516001600160a01b03831681524260208201527f5cc842cab066489e13292128663547c68705dbf476f0131e0107f155719c6124910160405180910390a142600b55600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146111955760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b6007546111a58162015180612ce8565b600654600080547fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1663ffffffff909216600160a81b81029290921790556040519081527fa7f4ce7c3586e2000cdec6b25c5e7d0b20f9b4f435aa22d9c1feb32dbb506f779060200160405180910390a1506006805463ffffffff191690556000600755565b61084e33848484612d95565b6112413382612ee5565b50565b3360009081526001602052604090205460ff166112a35760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f742061206d696e746572000000000000000000006044820152606401610796565b600054600160a01b900460ff16156112fd5760405162461bcd60e51b815260206004820152601960248201527f4f7074696d6973746963206d696e74696e6720706175736564000000000000006044820152606401610796565b60006113098383610853565b600081815260046020526040812080549293509167ffffffffffffffff16900361139b5760405162461bcd60e51b815260206004820152603060248201527f4f7074696d6973746963206d696e74696e67206e6f742072657175657374656460448201527f20666f7220746865206465706f736974000000000000000000000000000000006064820152608401610796565b805468010000000000000000900467ffffffffffffffff16156114265760405162461bcd60e51b815260206004820152603460248201527f4f7074696d6973746963206d696e74696e6720616c72656164792066696e616c60448201527f697a656420666f7220746865206465706f7369740000000000000000000000006064820152608401610796565b600054815461144c91600160c81b900463ffffffff169067ffffffffffffffff16613761565b67ffffffffffffffff1642116114ca5760405162461bcd60e51b815260206004820152602b60248201527f4f7074696d6973746963206d696e74696e672064656c617920686173206e6f7460448201527f20706173736564207965740000000000000000000000000000000000000000006064820152608401610796565b604051630b02c43d60e41b8152600481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b02c43d09060240160c060405180830381865afa158015611532573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155691906137b5565b90508060a0015163ffffffff166000146115b25760405162461bcd60e51b815260206004820152601c60248201527f546865206465706f73697420697320616c7265616479207377657074000000006044820152606401610796565b6000816080015182602001516115c89190613862565b6000805467ffffffffffffffff92909216925090600160a81b900463ffffffff166115f457600061160e565b60005461160e90600160a81b900463ffffffff1683613883565b83516001600160a01b0316600090815260056020526040812054919250906116379084906138a5565b84516001600160a01b03166000908152600560205260409020819055845190915061166690610e2f8486613706565b81156116f7576116f77f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166361d027b36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f191906138b8565b83612c05565b84547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff16680100000000000000004267ffffffffffffffff160217855583516040518281526001600160a01b0390911690879033907f2cffebf26d639426e79514d100febae8b2c63e700e5dc0fa6c88a129633506369060200160405180910390a45050505050505050565b606060028054806020026020016040519081016040528092919081815260200182805480156117db57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116117bd575b5050505050905090565b6000546001600160a01b0316331461182d5760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b6001600160a01b03811660009081526003602052604090205460ff166118955760405162461bcd60e51b815260206004820152601e60248201527f546869732061646472657373206973206e6f74206120677561726469616e00006044820152606401610796565b6001600160a01b038116600081815260036020526040808220805460ff19169055517fb8107d0c6b40be480ce3172ee66ba6d64b71f6b1685a851340036e6e2e3e3c529190a250565b6000546001600160a01b031633146119265760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b6119306000613018565b565b3360009081526003602052604090205460ff166119915760405162461bcd60e51b815260206004820152601860248201527f43616c6c6572206973206e6f74206120677561726469616e00000000000000006044820152606401610796565b600061199d8383610853565b600081815260046020526040812080549293509167ffffffffffffffff169003611a2f5760405162461bcd60e51b815260206004820152603060248201527f4f7074696d6973746963206d696e74696e67206e6f742072657175657374656460448201527f20666f7220746865206465706f736974000000000000000000000000000000006064820152608401610796565b805468010000000000000000900467ffffffffffffffff1615611aba5760405162461bcd60e51b815260206004820152603460248201527f4f7074696d6973746963206d696e74696e6720616c72656164792066696e616c60448201527f697a656420666f7220746865206465706f7369740000000000000000000000006064820152608401610796565b60008281526004602052604080822080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016905551839133917f1256b41d4b18d922811c358ab80cb0375aae28f45373de35cfda580662193fcd9190a350505050565b3360009081526001602052604090205460ff16611b7d5760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f742061206d696e746572000000000000000000006044820152606401610796565b600054600160a01b900460ff1615611bd75760405162461bcd60e51b815260206004820152601960248201527f4f7074696d6973746963206d696e74696e6720706175736564000000000000006044820152606401610796565b6000611be38383610853565b600081815260046020526040902080549192509067ffffffffffffffff1615611c745760405162461bcd60e51b815260206004820152603460248201527f4f7074696d6973746963206d696e74696e6720616c726561647920726571756560448201527f7374656420666f7220746865206465706f7369740000000000000000000000006064820152608401610796565b604051630b02c43d60e41b8152600481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b02c43d09060240160c060405180830381865afa158015611cdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0091906137b5565b9050806040015163ffffffff16600003611d665760405162461bcd60e51b815260206004820152602160248201527f546865206465706f73697420686173206e6f74206265656e2072657665616c656044820152601960fa1b6064820152608401610796565b60a081015163ffffffff1615611dbe5760405162461bcd60e51b815260206004820152601c60248201527f546865206465706f73697420697320616c7265616479207377657074000000006044820152606401610796565b60608101516001600160a01b03163014611e1a5760405162461bcd60e51b815260206004820152601860248201527f556e6578706563746564207661756c74206164647265737300000000000000006044820152606401610796565b815467ffffffffffffffff19164267ffffffffffffffff90811691909117835581516020808401516040805191909416815290810188905263ffffffff8716928101929092526001600160a01b031690849033907f36f39c606d55d7dd2a05b8c4e41e9a6ca8c501cea10009c1762f6826a146e0559060600160405180910390a45050505050565b60028181548110611eb257600080fd5b6000918252602090912001546001600160a01b0316905081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614611f4d5760405162461bcd60e51b815260206004820152601160248201527f546f6b656e206973206e6f7420544254430000000000000000000000000000006044820152606401610796565b336001600160a01b03841614611fa55760405162461bcd60e51b815260206004820152601860248201527f4f6e6c7920544254432063616c6c657220616c6c6f77656400000000000000006044820152606401610796565b6000819003611fbd57611fb88585612ee5565b610e49565b610e4985858484612d95565b6000546001600160a01b031633146120115760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b6001600160a01b03811660009081526001602052604090205460ff161561207a5760405162461bcd60e51b815260206004820181905260248201527f54686973206164647265737320697320616c72656164792061206d696e7465726044820152606401610796565b6001600160a01b0381166000818152600160208190526040808320805460ff19168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180546001600160a01b03191684179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b6000546001600160a01b0316331461214e5760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b60095461215e8162015180612ce8565b600854600080547fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff1663ffffffff909216600160c81b81029290921790556040519081527ff52de3377e3ae270d1e38f99b9b8d587814643811516ea55ba4d597f9950d4ec9060200160405180910390a1506008805463ffffffff191690556000600955565b6000546001600160a01b0316331461222c5760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b600b5461223c8162015180612ce8565b600a546040516001600160a01b0390911681527f81a9bb8030ed4116b405800280e065110a37afb57b69948e714c97fab23475ec9060200160405180910390a1600a546040517ff2fde38b0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063f2fde38b90602401600060405180830381600087803b1580156122fd57600080fd5b505af1158015612311573d6000803e3d6000fd5b5050600a546040516370a0823160e01b81523060048201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811694506356a6d9ef93509091169083906370a0823190602401602060405180830381865afa158015612389573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ad9190613748565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561240b57600080fd5b505af115801561241f573d6000803e3d6000fd5b5050600a80546001600160a01b031916905550506000600b5550565b6040516370a0823160e01b815233600482015281907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156124a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c59190613748565b101561251e5760405162461bcd60e51b815260206004820152602260248201527f416d6f756e7420657863656564732062616c616e636520696e207468652062616044820152616e6b60f01b6064820152608401610796565b6125283382612c05565b604051631f1b6d2760e21b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690637c6db49c90606401600060405180830381600087803b15801561259657600080fd5b505af1158015610e49573d6000803e3d6000fd5b6000546001600160a01b031633146125f25760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b600054600160a01b900460ff16156126565760405162461bcd60e51b815260206004820152602160248201527f4f7074696d6973746963206d696e74696e6720616c72656164792070617573656044820152601960fa1b6064820152608401610796565b6000805460ff60a01b1916600160a01b1781556040517f23a83c8aeda8c831401c17b5bfb8b2ead79fcfe9c027fe34a4f8576e2c7c74cc9190a1565b6000546001600160a01b031633146126da5760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b6001600160a01b03811660009081526003602052604090205460ff16156127695760405162461bcd60e51b815260206004820152602260248201527f54686973206164647265737320697320616c726561647920612067756172646960448201527f616e0000000000000000000000000000000000000000000000000000000000006064820152608401610796565b6001600160a01b038116600081815260036020526040808220805460ff19166001179055517f038596bb31e2e7d3d9f184d4c98b310103f6d7f5830e5eec32bffe6f1728f9699190a250565b6000546001600160a01b031633146127fd5760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b600054600160a01b900460ff166128565760405162461bcd60e51b815260206004820181905260248201527f4f7074696d6973746963206d696e74696e67206973206e6f74207061757365646044820152606401610796565b6000805460ff60a01b191681556040517fcb27470ed9568d9eeb8939707bafc19404d908a26ce5f468a6aa781024fd6a839190a1565b6000546001600160a01b031633146128d45760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b426007556006805463ffffffff191663ffffffff83169081179091556040519081527f0dbfec7f12acffbb5cec595ac4370907eaf84caa7025dd71f4021433be79eba9906020016107e7565b6000546001600160a01b031633146129685760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b6001600160a01b0381166129e45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610796565b61124181613018565b6000546001600160a01b03163314612a355760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b6040517fb88d4fde0000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063b88d4fde9061096d90309088908890889088906004016136a7565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261084e908490613068565b6001600160a01b038216600090815260056020526040812054808203612b2b57829150506108b2565b80831115612b92576001600160a01b0384166000818152600560209081526040808320839055519182527fb30abd1b9e3d58cd8525b3d5c5aa002db1e43a150af5b172a8d16efcc7a141f8910160405180910390a2612b8a8184613706565b9150506108b2565b612b9c8382613706565b6001600160a01b0385166000818152600560205260409020919091557fb30abd1b9e3d58cd8525b3d5c5aa002db1e43a150af5b172a8d16efcc7a141f8612be38584613706565b60405190815260200160405180910390a260009150506108b2565b5092915050565b816001600160a01b03167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe82604051612c4091815260200190565b60405180910390a26040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018390527f000000000000000000000000000000000000000000000000000000000000000016906340c10f19906044015b600060405180830381600087803b158015612ccc57600080fd5b505af1158015612ce0573d6000803e3d6000fd5b505050505050565b60008211612d385760405162461bcd60e51b815260206004820152601460248201527f4368616e6765206e6f7420696e697469617465640000000000000000000000006044820152606401610796565b80612d438342613706565b1015612d915760405162461bcd60e51b815260206004820181905260248201527f476f7665726e616e63652064656c617920686173206e6f7420656c61707365646044820152606401610796565b5050565b836001600160a01b03167f68751a4c3821398cb63d11609eca2440742ef19446f0c0261bfa8a13dd0748b884604051612dd091815260200190565b60405180910390a260405163079cc67960e41b81526001600160a01b038581166004830152602482018590527f000000000000000000000000000000000000000000000000000000000000000016906379cc679090604401600060405180830381600087803b158015612e4257600080fd5b505af1158015612e56573d6000803e3d6000fd5b50506040517f4a38757e0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169250634a38757e9150611010907f0000000000000000000000000000000000000000000000000000000000000000908790879087906004016138d5565b816001600160a01b03167f68751a4c3821398cb63d11609eca2440742ef19446f0c0261bfa8a13dd0748b882604051612f2091815260200190565b60405180910390a260405163079cc67960e41b81526001600160a01b038381166004830152602482018390527f000000000000000000000000000000000000000000000000000000000000000016906379cc679090604401600060405180830381600087803b158015612f9257600080fd5b505af1158015612fa6573d6000803e3d6000fd5b50506040517f56a6d9ef0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018590527f00000000000000000000000000000000000000000000000000000000000000001692506356a6d9ef9150604401612cb2565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006130bd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661314d9092919063ffffffff16565b80519091501561084e57808060200190518101906130db9190613908565b61084e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610796565b606061315c8484600085613166565b90505b9392505050565b6060824710156131de5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610796565b6001600160a01b0385163b6132355760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610796565b600080866001600160a01b03168587604051613251919061394e565b60006040518083038185875af1925050503d806000811461328e576040519150601f19603f3d011682016040523d82523d6000602084013e613293565b606091505b50915091506132a38282866132ae565b979650505050505050565b606083156132bd57508161315f565b8251156132cd5782518084602001fd5b8160405162461bcd60e51b8152600401610796919061396a565b6001600160a01b038116811461124157600080fd5b60006020828403121561330e57600080fd5b813561315f816132e7565b63ffffffff8116811461124157600080fd5b60006020828403121561333d57600080fd5b813561315f81613319565b60008060006060848603121561335d57600080fd5b8335613368816132e7565b92506020840135613378816132e7565b929592945050506040919091013590565b6000806040838503121561339c57600080fd5b8235915060208301356133ae81613319565b809150509250929050565b60008083601f8401126133cb57600080fd5b50813567ffffffffffffffff8111156133e357600080fd5b6020830191508360208285010111156133fb57600080fd5b9250929050565b60008060008060006080868803121561341a57600080fd5b8535613425816132e7565b94506020860135613435816132e7565b935060408601359250606086013567ffffffffffffffff81111561345857600080fd5b613464888289016133b9565b969995985093965092949392505050565b60008083601f84011261348757600080fd5b50813567ffffffffffffffff81111561349f57600080fd5b6020830191508360208260051b85010111156133fb57600080fd5b600080600080604085870312156134d057600080fd5b843567ffffffffffffffff808211156134e857600080fd5b6134f488838901613475565b9096509450602087013591508082111561350d57600080fd5b5061351a87828801613475565b95989497509550505050565b6000806000806060858703121561353c57600080fd5b8435613547816132e7565b935060208501359250604085013567ffffffffffffffff81111561356a57600080fd5b61351a878288016133b9565b60008060006040848603121561358b57600080fd5b83359250602084013567ffffffffffffffff8111156135a957600080fd5b6135b5868287016133b9565b9497909650939450505050565b6000602082840312156135d457600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b8181101561361c5783516001600160a01b0316835292840192918401916001016135f7565b50909695505050505050565b60008060008060006080868803121561364057600080fd5b853561364b816132e7565b9450602086013593506040860135613662816132e7565b9250606086013567ffffffffffffffff81111561345857600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60006001600160a01b038088168352808716602084015250846040830152608060608301526132a360808301848661367e565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b818103818111156108b2576108b26136f0565b634e487b7160e01b600052603160045260246000fd5b600060018201613741576137416136f0565b5060010190565b60006020828403121561375a57600080fd5b5051919050565b67ffffffffffffffff818116838216019080821115612bfe57612bfe6136f0565b805161378d816132e7565b919050565b805167ffffffffffffffff8116811461378d57600080fd5b805161378d81613319565b600060c082840312156137c757600080fd5b60405160c0810181811067ffffffffffffffff821117156137f857634e487b7160e01b600052604160045260246000fd5b60405261380483613782565b815261381260208401613792565b6020820152613823604084016137aa565b604082015261383460608401613782565b606082015261384560808401613792565b608082015261385660a084016137aa565b60a08201529392505050565b67ffffffffffffffff828116828216039080821115612bfe57612bfe6136f0565b6000826138a057634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156108b2576108b26136f0565b6000602082840312156138ca57600080fd5b815161315f816132e7565b6001600160a01b03851681528360208201526060604082015260006138fe60608301848661367e565b9695505050505050565b60006020828403121561391a57600080fd5b8151801515811461315f57600080fd5b60005b8381101561394557818101518382015260200161392d565b50506000910152565b6000825161396081846020870161392a565b9190910192915050565b602081526000825180602084015261398981604085016020870161392a565b601f01601f1916919091016040019291505056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122037330a9907e361443441101bb14a38c9a552ac4dacc35885d704d1021da556ed64736f6c63430008110033",
1080
- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106103205760003560e01c80638532c511116101a7578063a410d29b116100ee578063c36b32b711610097578063e78cea9211610071578063e78cea9214610705578063f2fde38b1461072c578063fc4e51f61461073f57600080fd5b8063c36b32b7146106bb578063d0ff65b5146106ce578063e5d3d714146106de57600080fd5b8063b0b54895116100c8578063b0b5489514610689578063b9f7879814610693578063bc7b6b99146106b357600080fd5b8063a410d29b1461064b578063a526d83b14610653578063aa271e1a1461066657600080fd5b806395131526116101505780639a508c8e1161012a5780639a508c8e14610627578063a0712d681461062f578063a0cceb951461064257600080fd5b80639513152614610603578063983b2d561461060c5780639a4e36d51461061f57600080fd5b8063897f712c11610181578063897f712c146105cb5780638da5cb5b146105df5780638f4ffcb1146105f057600080fd5b80638532c511146105955780638623ec7b146105a557806388aaf0c8146105b857600080fd5b806347c1ffdb1161026b5780636c626aa41161021457806376cdb03b116101ee57806376cdb03b1461053057806380df5ed21461056f578063820b55131461058257600080fd5b80636c626aa4146104ba5780637140415614610515578063715018a61461052857600080fd5b806364e779b11161024557806364e779b11461047f5780636abe3a6c146104925780636b32810b146104a557600080fd5b806347c1ffdb1461044d57806353dce4df146104555780635ae2da461461046857600080fd5b80633092afd5116102cd578063461c6373116102a7578063461c637314610414578063475d057014610427578063479aa9271461043a57600080fd5b80633092afd5146103e5578063317dfa76146103f857806341906ab71461040b57600080fd5b80631171bda9116102fe5780631171bda91461039e578063124f65bd146103b15780632e73e398146103d257600080fd5b806309b53f51146103255780630c68ba21146103565780630f34257314610389575b600080fd5b60005461033c90600160a81b900463ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b6103796103643660046132fc565b60036020526000908152604090205460ff1681565b604051901515815260200161034d565b61039c61039736600461332b565b610752565b005b61039c6103ac366004613348565b6107f2565b6103c46103bf366004613389565b610853565b60405190815260200161034d565b61039c6103e0366004613402565b6108b8565b61039c6103f33660046132fc565b6109a6565b61039c610406366004613348565b610c15565b6103c460095481565b61039c6104223660046134ba565b610d05565b61039c610435366004613526565b610e50565b61039c6104483660046132fc565b611048565b61039c61114d565b61039c610463366004613576565b61122b565b60005461033c90600160c81b900463ffffffff1681565b61039c61048d3660046135c2565b611237565b61039c6104a0366004613389565b611244565b6104ad611783565b60405161034d91906135db565b6104f46104c83660046135c2565b60046020526000908152604090205467ffffffffffffffff808216916801000000000000000090041682565b6040805167ffffffffffffffff93841681529290911660208301520161034d565b61039c6105233660046132fc565b6117e5565b61039c6118de565b6105577f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161034d565b61039c61057d366004613389565b611932565b61039c610590366004613389565b611b1e565b60065461033c9063ffffffff1681565b6105576105b33660046135c2565b611ea2565b600a54610557906001600160a01b031681565b60005461037990600160a01b900460ff1681565b6000546001600160a01b0316610557565b61039c6105fe366004613628565b611ecc565b6103c4600b5481565b61039c61061a3660046132fc565b611fc9565b61039c612106565b61039c6121e4565b61039c61063d3660046135c2565b61243b565b6103c460075481565b61039c6125aa565b61039c6106613660046132fc565b612692565b6103796106743660046132fc565b60016020526000908152604090205460ff1681565b6103c46201518081565b6103c46106a13660046132fc565b60056020526000908152604090205481565b61039c6127b5565b61039c6106c936600461332b565b61288c565b60085461033c9063ffffffff1681565b6105577f000000000000000000000000000000000000000000000000000000000000000081565b6105577f000000000000000000000000000000000000000000000000000000000000000081565b61039c61073a3660046132fc565b612920565b61039c61074d366004613402565b6129ed565b6000546001600160a01b0316331461079f5760405162461bcd60e51b8152602060048201819052602482015260008051602061399e83398151915260448201526064015b60405180910390fd5b426009556008805463ffffffff191663ffffffff83169081179091556040519081527f682bc0fb7e0d6bcb974cf556b95f68533cafc411d83d9f33ac192ccf45dda605906020015b60405180910390a150565b6000546001600160a01b0316331461083a5760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b61084e6001600160a01b0384168383612a82565b505050565b6000828260405160200161089692919091825260e01b7fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6040516020818303038152906040528051906020012060001c90505b92915050565b6000546001600160a01b031633146109005760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b6040517ffc4e51f60000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063fc4e51f69061096d90889088908890889088906004016136a7565b600060405180830381600087803b15801561098757600080fd5b505af115801561099b573d6000803e3d6000fd5b505050505050505050565b336109b96000546001600160a01b031690565b6001600160a01b031614806109dd57503360009081526003602052604090205460ff165b610a4f5760405162461bcd60e51b815260206004820152602360248201527f43616c6c6572206973206e6f7420746865206f776e6572206f7220677561726460448201527f69616e00000000000000000000000000000000000000000000000000000000006064820152608401610796565b6001600160a01b03811660009081526001602052604090205460ff16610ab75760405162461bcd60e51b815260206004820152601c60248201527f546869732061646472657373206973206e6f742061206d696e746572000000006044820152606401610796565b6001600160a01b0381166000908152600160205260408120805460ff191690555b600254811015610bdd57816001600160a01b031660028281548110610aff57610aff6136da565b6000918252602090912001546001600160a01b031603610bcb5760028054610b2990600190613706565b81548110610b3957610b396136da565b600091825260209091200154600280546001600160a01b039092169183908110610b6557610b656136da565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506002805480610ba457610ba4613719565b600082815260209020810160001990810180546001600160a01b0319169055019055610bdd565b80610bd58161372f565b915050610ad8565b506040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b6000546001600160a01b03163314610c5d5760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b6040517f1171bda90000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301528381166024830152604482018390527f00000000000000000000000000000000000000000000000000000000000000001690631171bda990606401600060405180830381600087803b158015610ce857600080fd5b505af1158015610cfc573d6000803e3d6000fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d7d5760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f74207468652042616e6b000000000000000000006044820152606401610796565b6000839003610dce5760405162461bcd60e51b815260206004820152601760248201527f4e6f206465706f7369746f7273207370656369666965640000000000000000006044820152606401610796565b60005b83811015610e49576000858583818110610ded57610ded6136da565b9050602002016020810190610e0291906132fc565b90506000848484818110610e1857610e186136da565b905060200201359050610e3482610e2f8484612b02565b612c05565b50508080610e419061372f565b915050610dd1565b5050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ec85760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f74207468652042616e6b000000000000000000006044820152606401610796565b6040516370a0823160e01b81526001600160a01b03858116600483015284917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610f32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f569190613748565b1015610faf5760405162461bcd60e51b815260206004820152602260248201527f416d6f756e7420657863656564732062616c616e636520696e207468652062616044820152616e6b60f01b6064820152608401610796565b610fb98484612c05565b604051631f1b6d2760e21b81526001600160a01b038581166004830152306024830152604482018590527f00000000000000000000000000000000000000000000000000000000000000001690637c6db49c906064015b600060405180830381600087803b15801561102a57600080fd5b505af115801561103e573d6000803e3d6000fd5b5050505050505050565b6000546001600160a01b031633146110905760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b6001600160a01b0381166110e65760405162461bcd60e51b815260206004820181905260248201527f4e6577207661756c7420616464726573732063616e6e6f74206265207a65726f6044820152606401610796565b604080516001600160a01b03831681524260208201527f5cc842cab066489e13292128663547c68705dbf476f0131e0107f155719c6124910160405180910390a142600b55600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146111955760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b6007546111a58162015180612ce8565b600654600080547fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1663ffffffff909216600160a81b81029290921790556040519081527fa7f4ce7c3586e2000cdec6b25c5e7d0b20f9b4f435aa22d9c1feb32dbb506f779060200160405180910390a1506006805463ffffffff191690556000600755565b61084e33848484612d95565b6112413382612ee5565b50565b3360009081526001602052604090205460ff166112a35760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f742061206d696e746572000000000000000000006044820152606401610796565b600054600160a01b900460ff16156112fd5760405162461bcd60e51b815260206004820152601960248201527f4f7074696d6973746963206d696e74696e6720706175736564000000000000006044820152606401610796565b60006113098383610853565b600081815260046020526040812080549293509167ffffffffffffffff16900361139b5760405162461bcd60e51b815260206004820152603060248201527f4f7074696d6973746963206d696e74696e67206e6f742072657175657374656460448201527f20666f7220746865206465706f736974000000000000000000000000000000006064820152608401610796565b805468010000000000000000900467ffffffffffffffff16156114265760405162461bcd60e51b815260206004820152603460248201527f4f7074696d6973746963206d696e74696e6720616c72656164792066696e616c60448201527f697a656420666f7220746865206465706f7369740000000000000000000000006064820152608401610796565b600054815461144c91600160c81b900463ffffffff169067ffffffffffffffff16613761565b67ffffffffffffffff1642116114ca5760405162461bcd60e51b815260206004820152602b60248201527f4f7074696d6973746963206d696e74696e672064656c617920686173206e6f7460448201527f20706173736564207965740000000000000000000000000000000000000000006064820152608401610796565b604051630b02c43d60e41b8152600481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b02c43d09060240160c060405180830381865afa158015611532573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155691906137b5565b90508060a0015163ffffffff166000146115b25760405162461bcd60e51b815260206004820152601c60248201527f546865206465706f73697420697320616c7265616479207377657074000000006044820152606401610796565b6000816080015182602001516115c89190613862565b6000805467ffffffffffffffff92909216925090600160a81b900463ffffffff166115f457600061160e565b60005461160e90600160a81b900463ffffffff1683613883565b83516001600160a01b0316600090815260056020526040812054919250906116379084906138a5565b84516001600160a01b03166000908152600560205260409020819055845190915061166690610e2f8486613706565b81156116f7576116f77f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166361d027b36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f191906138b8565b83612c05565b84547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff16680100000000000000004267ffffffffffffffff160217855583516040518281526001600160a01b0390911690879033907f2cffebf26d639426e79514d100febae8b2c63e700e5dc0fa6c88a129633506369060200160405180910390a45050505050505050565b606060028054806020026020016040519081016040528092919081815260200182805480156117db57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116117bd575b5050505050905090565b6000546001600160a01b0316331461182d5760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b6001600160a01b03811660009081526003602052604090205460ff166118955760405162461bcd60e51b815260206004820152601e60248201527f546869732061646472657373206973206e6f74206120677561726469616e00006044820152606401610796565b6001600160a01b038116600081815260036020526040808220805460ff19169055517fb8107d0c6b40be480ce3172ee66ba6d64b71f6b1685a851340036e6e2e3e3c529190a250565b6000546001600160a01b031633146119265760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b6119306000613018565b565b3360009081526003602052604090205460ff166119915760405162461bcd60e51b815260206004820152601860248201527f43616c6c6572206973206e6f74206120677561726469616e00000000000000006044820152606401610796565b600061199d8383610853565b600081815260046020526040812080549293509167ffffffffffffffff169003611a2f5760405162461bcd60e51b815260206004820152603060248201527f4f7074696d6973746963206d696e74696e67206e6f742072657175657374656460448201527f20666f7220746865206465706f736974000000000000000000000000000000006064820152608401610796565b805468010000000000000000900467ffffffffffffffff1615611aba5760405162461bcd60e51b815260206004820152603460248201527f4f7074696d6973746963206d696e74696e6720616c72656164792066696e616c60448201527f697a656420666f7220746865206465706f7369740000000000000000000000006064820152608401610796565b60008281526004602052604080822080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016905551839133917f1256b41d4b18d922811c358ab80cb0375aae28f45373de35cfda580662193fcd9190a350505050565b3360009081526001602052604090205460ff16611b7d5760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f742061206d696e746572000000000000000000006044820152606401610796565b600054600160a01b900460ff1615611bd75760405162461bcd60e51b815260206004820152601960248201527f4f7074696d6973746963206d696e74696e6720706175736564000000000000006044820152606401610796565b6000611be38383610853565b600081815260046020526040902080549192509067ffffffffffffffff1615611c745760405162461bcd60e51b815260206004820152603460248201527f4f7074696d6973746963206d696e74696e6720616c726561647920726571756560448201527f7374656420666f7220746865206465706f7369740000000000000000000000006064820152608401610796565b604051630b02c43d60e41b8152600481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b02c43d09060240160c060405180830381865afa158015611cdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0091906137b5565b9050806040015163ffffffff16600003611d665760405162461bcd60e51b815260206004820152602160248201527f546865206465706f73697420686173206e6f74206265656e2072657665616c656044820152601960fa1b6064820152608401610796565b60a081015163ffffffff1615611dbe5760405162461bcd60e51b815260206004820152601c60248201527f546865206465706f73697420697320616c7265616479207377657074000000006044820152606401610796565b60608101516001600160a01b03163014611e1a5760405162461bcd60e51b815260206004820152601860248201527f556e6578706563746564207661756c74206164647265737300000000000000006044820152606401610796565b815467ffffffffffffffff19164267ffffffffffffffff90811691909117835581516020808401516040805191909416815290810188905263ffffffff8716928101929092526001600160a01b031690849033907f36f39c606d55d7dd2a05b8c4e41e9a6ca8c501cea10009c1762f6826a146e0559060600160405180910390a45050505050565b60028181548110611eb257600080fd5b6000918252602090912001546001600160a01b0316905081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614611f4d5760405162461bcd60e51b815260206004820152601160248201527f546f6b656e206973206e6f7420544254430000000000000000000000000000006044820152606401610796565b336001600160a01b03841614611fa55760405162461bcd60e51b815260206004820152601860248201527f4f6e6c7920544254432063616c6c657220616c6c6f77656400000000000000006044820152606401610796565b6000819003611fbd57611fb88585612ee5565b610e49565b610e4985858484612d95565b6000546001600160a01b031633146120115760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b6001600160a01b03811660009081526001602052604090205460ff161561207a5760405162461bcd60e51b815260206004820181905260248201527f54686973206164647265737320697320616c72656164792061206d696e7465726044820152606401610796565b6001600160a01b0381166000818152600160208190526040808320805460ff19168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180546001600160a01b03191684179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b6000546001600160a01b0316331461214e5760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b60095461215e8162015180612ce8565b600854600080547fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff1663ffffffff909216600160c81b81029290921790556040519081527ff52de3377e3ae270d1e38f99b9b8d587814643811516ea55ba4d597f9950d4ec9060200160405180910390a1506008805463ffffffff191690556000600955565b6000546001600160a01b0316331461222c5760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b600b5461223c8162015180612ce8565b600a546040516001600160a01b0390911681527f81a9bb8030ed4116b405800280e065110a37afb57b69948e714c97fab23475ec9060200160405180910390a1600a546040517ff2fde38b0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063f2fde38b90602401600060405180830381600087803b1580156122fd57600080fd5b505af1158015612311573d6000803e3d6000fd5b5050600a546040516370a0823160e01b81523060048201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811694506356a6d9ef93509091169083906370a0823190602401602060405180830381865afa158015612389573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ad9190613748565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561240b57600080fd5b505af115801561241f573d6000803e3d6000fd5b5050600a80546001600160a01b031916905550506000600b5550565b6040516370a0823160e01b815233600482015281907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156124a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c59190613748565b101561251e5760405162461bcd60e51b815260206004820152602260248201527f416d6f756e7420657863656564732062616c616e636520696e207468652062616044820152616e6b60f01b6064820152608401610796565b6125283382612c05565b604051631f1b6d2760e21b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690637c6db49c90606401600060405180830381600087803b15801561259657600080fd5b505af1158015610e49573d6000803e3d6000fd5b6000546001600160a01b031633146125f25760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b600054600160a01b900460ff16156126565760405162461bcd60e51b815260206004820152602160248201527f4f7074696d6973746963206d696e74696e6720616c72656164792070617573656044820152601960fa1b6064820152608401610796565b6000805460ff60a01b1916600160a01b1781556040517f23a83c8aeda8c831401c17b5bfb8b2ead79fcfe9c027fe34a4f8576e2c7c74cc9190a1565b6000546001600160a01b031633146126da5760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b6001600160a01b03811660009081526003602052604090205460ff16156127695760405162461bcd60e51b815260206004820152602260248201527f54686973206164647265737320697320616c726561647920612067756172646960448201527f616e0000000000000000000000000000000000000000000000000000000000006064820152608401610796565b6001600160a01b038116600081815260036020526040808220805460ff19166001179055517f038596bb31e2e7d3d9f184d4c98b310103f6d7f5830e5eec32bffe6f1728f9699190a250565b6000546001600160a01b031633146127fd5760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b600054600160a01b900460ff166128565760405162461bcd60e51b815260206004820181905260248201527f4f7074696d6973746963206d696e74696e67206973206e6f74207061757365646044820152606401610796565b6000805460ff60a01b191681556040517fcb27470ed9568d9eeb8939707bafc19404d908a26ce5f468a6aa781024fd6a839190a1565b6000546001600160a01b031633146128d45760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b426007556006805463ffffffff191663ffffffff83169081179091556040519081527f0dbfec7f12acffbb5cec595ac4370907eaf84caa7025dd71f4021433be79eba9906020016107e7565b6000546001600160a01b031633146129685760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b6001600160a01b0381166129e45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610796565b61124181613018565b6000546001600160a01b03163314612a355760405162461bcd60e51b8152602060048201819052602482015260008051602061399e8339815191526044820152606401610796565b6040517fb88d4fde0000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063b88d4fde9061096d90309088908890889088906004016136a7565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261084e908490613068565b6001600160a01b038216600090815260056020526040812054808203612b2b57829150506108b2565b80831115612b92576001600160a01b0384166000818152600560209081526040808320839055519182527fb30abd1b9e3d58cd8525b3d5c5aa002db1e43a150af5b172a8d16efcc7a141f8910160405180910390a2612b8a8184613706565b9150506108b2565b612b9c8382613706565b6001600160a01b0385166000818152600560205260409020919091557fb30abd1b9e3d58cd8525b3d5c5aa002db1e43a150af5b172a8d16efcc7a141f8612be38584613706565b60405190815260200160405180910390a260009150506108b2565b5092915050565b816001600160a01b03167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe82604051612c4091815260200190565b60405180910390a26040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018390527f000000000000000000000000000000000000000000000000000000000000000016906340c10f19906044015b600060405180830381600087803b158015612ccc57600080fd5b505af1158015612ce0573d6000803e3d6000fd5b505050505050565b60008211612d385760405162461bcd60e51b815260206004820152601460248201527f4368616e6765206e6f7420696e697469617465640000000000000000000000006044820152606401610796565b80612d438342613706565b1015612d915760405162461bcd60e51b815260206004820181905260248201527f476f7665726e616e63652064656c617920686173206e6f7420656c61707365646044820152606401610796565b5050565b836001600160a01b03167f68751a4c3821398cb63d11609eca2440742ef19446f0c0261bfa8a13dd0748b884604051612dd091815260200190565b60405180910390a260405163079cc67960e41b81526001600160a01b038581166004830152602482018590527f000000000000000000000000000000000000000000000000000000000000000016906379cc679090604401600060405180830381600087803b158015612e4257600080fd5b505af1158015612e56573d6000803e3d6000fd5b50506040517f4a38757e0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169250634a38757e9150611010907f0000000000000000000000000000000000000000000000000000000000000000908790879087906004016138d5565b816001600160a01b03167f68751a4c3821398cb63d11609eca2440742ef19446f0c0261bfa8a13dd0748b882604051612f2091815260200190565b60405180910390a260405163079cc67960e41b81526001600160a01b038381166004830152602482018390527f000000000000000000000000000000000000000000000000000000000000000016906379cc679090604401600060405180830381600087803b158015612f9257600080fd5b505af1158015612fa6573d6000803e3d6000fd5b50506040517f56a6d9ef0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018590527f00000000000000000000000000000000000000000000000000000000000000001692506356a6d9ef9150604401612cb2565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006130bd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661314d9092919063ffffffff16565b80519091501561084e57808060200190518101906130db9190613908565b61084e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610796565b606061315c8484600085613166565b90505b9392505050565b6060824710156131de5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610796565b6001600160a01b0385163b6132355760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610796565b600080866001600160a01b03168587604051613251919061394e565b60006040518083038185875af1925050503d806000811461328e576040519150601f19603f3d011682016040523d82523d6000602084013e613293565b606091505b50915091506132a38282866132ae565b979650505050505050565b606083156132bd57508161315f565b8251156132cd5782518084602001fd5b8160405162461bcd60e51b8152600401610796919061396a565b6001600160a01b038116811461124157600080fd5b60006020828403121561330e57600080fd5b813561315f816132e7565b63ffffffff8116811461124157600080fd5b60006020828403121561333d57600080fd5b813561315f81613319565b60008060006060848603121561335d57600080fd5b8335613368816132e7565b92506020840135613378816132e7565b929592945050506040919091013590565b6000806040838503121561339c57600080fd5b8235915060208301356133ae81613319565b809150509250929050565b60008083601f8401126133cb57600080fd5b50813567ffffffffffffffff8111156133e357600080fd5b6020830191508360208285010111156133fb57600080fd5b9250929050565b60008060008060006080868803121561341a57600080fd5b8535613425816132e7565b94506020860135613435816132e7565b935060408601359250606086013567ffffffffffffffff81111561345857600080fd5b613464888289016133b9565b969995985093965092949392505050565b60008083601f84011261348757600080fd5b50813567ffffffffffffffff81111561349f57600080fd5b6020830191508360208260051b85010111156133fb57600080fd5b600080600080604085870312156134d057600080fd5b843567ffffffffffffffff808211156134e857600080fd5b6134f488838901613475565b9096509450602087013591508082111561350d57600080fd5b5061351a87828801613475565b95989497509550505050565b6000806000806060858703121561353c57600080fd5b8435613547816132e7565b935060208501359250604085013567ffffffffffffffff81111561356a57600080fd5b61351a878288016133b9565b60008060006040848603121561358b57600080fd5b83359250602084013567ffffffffffffffff8111156135a957600080fd5b6135b5868287016133b9565b9497909650939450505050565b6000602082840312156135d457600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b8181101561361c5783516001600160a01b0316835292840192918401916001016135f7565b50909695505050505050565b60008060008060006080868803121561364057600080fd5b853561364b816132e7565b9450602086013593506040860135613662816132e7565b9250606086013567ffffffffffffffff81111561345857600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60006001600160a01b038088168352808716602084015250846040830152608060608301526132a360808301848661367e565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b818103818111156108b2576108b26136f0565b634e487b7160e01b600052603160045260246000fd5b600060018201613741576137416136f0565b5060010190565b60006020828403121561375a57600080fd5b5051919050565b67ffffffffffffffff818116838216019080821115612bfe57612bfe6136f0565b805161378d816132e7565b919050565b805167ffffffffffffffff8116811461378d57600080fd5b805161378d81613319565b600060c082840312156137c757600080fd5b60405160c0810181811067ffffffffffffffff821117156137f857634e487b7160e01b600052604160045260246000fd5b60405261380483613782565b815261381260208401613792565b6020820152613823604084016137aa565b604082015261383460608401613782565b606082015261384560808401613792565b608082015261385660a084016137aa565b60a08201529392505050565b67ffffffffffffffff828116828216039080821115612bfe57612bfe6136f0565b6000826138a057634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156108b2576108b26136f0565b6000602082840312156138ca57600080fd5b815161315f816132e7565b6001600160a01b03851681528360208201526060604082015260006138fe60608301848661367e565b9695505050505050565b60006020828403121561391a57600080fd5b8151801515811461315f57600080fd5b60005b8381101561394557818101518382015260200161392d565b50506000910152565b6000825161396081846020870161392a565b9190910192915050565b602081526000825180602084015261398981604085016020870161392a565b601f01601f1916919091016040019291505056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122037330a9907e361443441101bb14a38c9a552ac4dacc35885d704d1021da556ed64736f6c63430008110033",
1121
+ "bytecode": "0x60e060405260008054600160a81b600160e81b031916650a8c0000007d60aa1b1790553480156200002f57600080fd5b5060405162003e2f38038062003e2f83398101604081905262000052916200020c565b806200005e33620001a3565b6001600160a01b038116620000c55760405162461bcd60e51b815260206004820152602260248201527f4272696467652063616e206e6f7420626520746865207a65726f206164647265604482015261737360f01b60648201526084015b60405180910390fd5b6001600160a01b039081166080528316620001235760405162461bcd60e51b815260206004820181905260248201527f42616e6b2063616e206e6f7420626520746865207a65726f20616464726573736044820152606401620000bc565b6001600160a01b0382166200018a5760405162461bcd60e51b815260206004820152602660248201527f5442544320746f6b656e2063616e206e6f7420626520746865207a65726f206160448201526564647265737360d01b6064820152608401620000bc565b506001600160a01b0391821660a0521660c05262000260565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146200020957600080fd5b50565b6000806000606084860312156200022257600080fd5b83516200022f81620001f3565b60208501519093506200024281620001f3565b60408501519092506200025581620001f3565b809150509250925092565b60805160a05160c051613b136200031c600039600081816107330152818161098001528181610cf401528181611fb0015281816123b101528181612d6d01528181612ed8015261301f01526000818161057901528181610d6101528181610ebc01528181610f4a0152818161104f0152818161242d015281816125650152818161265601528181612f36015261307d01526000818161075a015281816115720152818161170e01528181611d620152612f650152613b136000f3fe608060405234801561001057600080fd5b50600436106103365760003560e01c80638532c511116101b2578063a410d29b116100f9578063c36b32b7116100a2578063e5d3d7141161007c578063e5d3d7141461072e578063e78cea9214610755578063f2fde38b1461077c578063fc4e51f61461078f57600080fd5b8063c36b32b7146106ff578063c7ba034714610712578063d0ff65b51461071e57600080fd5b8063b0b54895116100d3578063b0b54895146106cd578063b9f78798146106d7578063bc7b6b99146106f757600080fd5b8063a410d29b1461068f578063a526d83b14610697578063aa271e1a146106aa57600080fd5b8063951315261161015b5780639a508c8e116101355780639a508c8e1461066b578063a0712d6814610673578063a0cceb951461068657600080fd5b80639513152614610647578063983b2d56146106505780639a4e36d51461066357600080fd5b8063897f712c1161018c578063897f712c1461060f5780638da5cb5b146106235780638f4ffcb11461063457600080fd5b80638532c511146105d95780638623ec7b146105e957806388aaf0c8146105fc57600080fd5b806347c1ffdb116102815780636c626aa41161022a5780637445a5a0116102045780637445a5a01461054657806376cdb03b1461057457806380df5ed2146105b3578063820b5513146105c657600080fd5b80636c626aa4146104d0578063714041561461052b578063715018a61461053e57600080fd5b806364e779b11161025b57806364e779b1146104955780636abe3a6c146104a85780636b32810b146104bb57600080fd5b806347c1ffdb1461046357806353dce4df1461046b5780635ae2da461461047e57600080fd5b80633092afd5116102e3578063461c6373116102bd578063461c63731461042a578063475d05701461043d578063479aa9271461045057600080fd5b80633092afd5146103fb578063317dfa761461040e57806341906ab71461042157600080fd5b80631171bda9116103145780631171bda9146103b4578063124f65bd146103c75780632e73e398146103e857600080fd5b806309b53f511461033b5780630c68ba211461036c5780630f3425731461039f575b600080fd5b60005461035290600160a81b900463ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b61038f61037a3660046133e9565b60036020526000908152604090205460ff1681565b6040519015158152602001610363565b6103b26103ad366004613418565b6107a2565b005b6103b26103c2366004613435565b610842565b6103da6103d5366004613476565b6108a3565b604051908152602001610363565b6103b26103f63660046134ef565b610908565b6103b26104093660046133e9565b6109f6565b6103b261041c366004613435565b610c65565b6103da60095481565b6103b26104383660046135a7565b610d56565b6103b261044b366004613613565b610eb1565b6103b261045e3660046133e9565b6110b2565b6103b26111b7565b6103b2610479366004613663565b611295565b60005461035290600160c81b900463ffffffff1681565b6103b26104a33660046136af565b6112b6565b6103b26104b6366004613476565b6112d3565b6104c3611820565b60405161036391906136c8565b61050a6104de3660046136af565b60046020526000908152604090205467ffffffffffffffff808216916801000000000000000090041682565b6040805167ffffffffffffffff938416815292909116602083015201610363565b6103b26105393660046133e9565b611882565b6103b261197b565b6105596105543660046136af565b6119cf565b60408051938452602084019290925290820152606001610363565b61059b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610363565b6103b26105c1366004613476565b611a07565b6103b26105d4366004613476565b611bf3565b6006546103529063ffffffff1681565b61059b6105f73660046136af565b611f84565b600a5461059b906001600160a01b031681565b60005461038f90600160a01b900460ff1681565b6000546001600160a01b031661059b565b6103b2610642366004613715565b611fae565b6103da600b5481565b6103b261065e3660046133e9565b6120c3565b6103b2612200565b6103b26122de565b6103b26106813660046136af565b612535565b6103da60075481565b6103b261268d565b6103b26106a53660046133e9565b612775565b61038f6106b83660046133e9565b60016020526000908152604090205460ff1681565b6103da6201518081565b6103da6106e53660046133e9565b60056020526000908152604090205481565b6103b2612898565b6103b261070d366004613418565b61296f565b6103da6402540be40081565b6008546103529063ffffffff1681565b61059b7f000000000000000000000000000000000000000000000000000000000000000081565b61059b7f000000000000000000000000000000000000000000000000000000000000000081565b6103b261078a3660046133e9565b612a03565b6103b261079d3660046134ef565b612ad3565b6000546001600160a01b031633146107ef5760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064015b60405180910390fd5b426009556008805463ffffffff191663ffffffff83169081179091556040519081527f682bc0fb7e0d6bcb974cf556b95f68533cafc411d83d9f33ac192ccf45dda605906020015b60405180910390a150565b6000546001600160a01b0316331461088a5760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b61089e6001600160a01b0384168383612b68565b505050565b600082826040516020016108e692919091825260e01b7fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6040516020818303038152906040528051906020012060001c90505b92915050565b6000546001600160a01b031633146109505760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b6040517ffc4e51f60000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063fc4e51f6906109bd9088908890889088908890600401613794565b600060405180830381600087803b1580156109d757600080fd5b505af11580156109eb573d6000803e3d6000fd5b505050505050505050565b33610a096000546001600160a01b031690565b6001600160a01b03161480610a2d57503360009081526003602052604090205460ff165b610a9f5760405162461bcd60e51b815260206004820152602360248201527f43616c6c6572206973206e6f7420746865206f776e6572206f7220677561726460448201527f69616e000000000000000000000000000000000000000000000000000000000060648201526084016107e6565b6001600160a01b03811660009081526001602052604090205460ff16610b075760405162461bcd60e51b815260206004820152601c60248201527f546869732061646472657373206973206e6f742061206d696e7465720000000060448201526064016107e6565b6001600160a01b0381166000908152600160205260408120805460ff191690555b600254811015610c2d57816001600160a01b031660028281548110610b4f57610b4f6137c7565b6000918252602090912001546001600160a01b031603610c1b5760028054610b79906001906137f3565b81548110610b8957610b896137c7565b600091825260209091200154600280546001600160a01b039092169183908110610bb557610bb56137c7565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506002805480610bf457610bf4613806565b600082815260209020810160001990810180546001600160a01b0319169055019055610c2d565b80610c258161381c565b915050610b28565b506040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b6000546001600160a01b03163314610cad5760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b6040517f1171bda90000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301528381166024830152604482018390527f00000000000000000000000000000000000000000000000000000000000000001690631171bda9906064015b600060405180830381600087803b158015610d3957600080fd5b505af1158015610d4d573d6000803e3d6000fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610dce5760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f74207468652042616e6b0000000000000000000060448201526064016107e6565b6000839003610e1f5760405162461bcd60e51b815260206004820152601760248201527f4e6f206465706f7369746f72732073706563696669656400000000000000000060448201526064016107e6565b60005b83811015610eaa576000858583818110610e3e57610e3e6137c7565b9050602002016020810190610e5391906133e9565b90506000848484818110610e6957610e696137c7565b905060200201359050610e9582610e90846402540be40085610e8b9190613835565b612be8565b612ceb565b50508080610ea29061381c565b915050610e22565b5050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f295760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f74207468652042616e6b0000000000000000000060448201526064016107e6565b6040516370a0823160e01b81526001600160a01b03858116600483015284917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610f93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb7919061384c565b10156110105760405162461bcd60e51b815260206004820152602260248201527f416d6f756e7420657863656564732062616c616e636520696e207468652062616044820152616e6b60f01b60648201526084016107e6565b61102384610e906402540be40086613835565b604051631f1b6d2760e21b81526001600160a01b038581166004830152306024830152604482018590527f00000000000000000000000000000000000000000000000000000000000000001690637c6db49c906064015b600060405180830381600087803b15801561109457600080fd5b505af11580156110a8573d6000803e3d6000fd5b5050505050505050565b6000546001600160a01b031633146110fa5760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b6001600160a01b0381166111505760405162461bcd60e51b815260206004820181905260248201527f4e6577207661756c7420616464726573732063616e6e6f74206265207a65726f60448201526064016107e6565b604080516001600160a01b03831681524260208201527f5cc842cab066489e13292128663547c68705dbf476f0131e0107f155719c6124910160405180910390a142600b55600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146111ff5760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b60075461120f8162015180612dc6565b600654600080547fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1663ffffffff909216600160a81b81029290921790556040519081527fa7f4ce7c3586e2000cdec6b25c5e7d0b20f9b4f435aa22d9c1feb32dbb506f779060200160405180910390a1506006805463ffffffff191690556000600755565b60006112a0846119cf565b505090506112b033828585612e6f565b50505050565b60006112c1826119cf565b505090506112cf3382612fb6565b5050565b3360009081526001602052604090205460ff166113325760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f742061206d696e7465720000000000000000000060448201526064016107e6565b600054600160a01b900460ff161561138c5760405162461bcd60e51b815260206004820152601960248201527f4f7074696d6973746963206d696e74696e67207061757365640000000000000060448201526064016107e6565b600061139883836108a3565b600081815260046020526040812080549293509167ffffffffffffffff16900361142a5760405162461bcd60e51b815260206004820152603060248201527f4f7074696d6973746963206d696e74696e67206e6f742072657175657374656460448201527f20666f7220746865206465706f7369740000000000000000000000000000000060648201526084016107e6565b805468010000000000000000900467ffffffffffffffff16156114b55760405162461bcd60e51b815260206004820152603460248201527f4f7074696d6973746963206d696e74696e6720616c72656164792066696e616c60448201527f697a656420666f7220746865206465706f73697400000000000000000000000060648201526084016107e6565b60005481546114db91600160c81b900463ffffffff169067ffffffffffffffff16613865565b67ffffffffffffffff1642116115595760405162461bcd60e51b815260206004820152602b60248201527f4f7074696d6973746963206d696e74696e672064656c617920686173206e6f7460448201527f207061737365642079657400000000000000000000000000000000000000000060648201526084016107e6565b604051630b02c43d60e41b8152600481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b02c43d09060240160c060405180830381865afa1580156115c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e591906138b9565b90508060a0015163ffffffff166000146116415760405162461bcd60e51b815260206004820152601c60248201527f546865206465706f73697420697320616c72656164792073776570740000000060448201526064016107e6565b60006402540be4008260800151836020015161165d9190613966565b67ffffffffffffffff166116719190613835565b6000805491925090600160a81b900463ffffffff166116915760006116ab565b6000546116ab90600160a81b900463ffffffff168361399d565b83516001600160a01b0316600090815260056020526040812054919250906116d49084906139b1565b84516001600160a01b03166000908152600560205260409020819055845190915061170390610e9084866137f3565b8115611794576117947f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166361d027b36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561176a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178e91906139c4565b83612ceb565b84547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff16680100000000000000004267ffffffffffffffff160217855583516040518281526001600160a01b0390911690879033907f2cffebf26d639426e79514d100febae8b2c63e700e5dc0fa6c88a129633506369060200160405180910390a45050505050505050565b6060600280548060200260200160405190810160405280929190818152602001828054801561187857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161185a575b5050505050905090565b6000546001600160a01b031633146118ca5760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b6001600160a01b03811660009081526003602052604090205460ff166119325760405162461bcd60e51b815260206004820152601e60248201527f546869732061646472657373206973206e6f74206120677561726469616e000060448201526064016107e6565b6001600160a01b038116600081815260036020526040808220805460ff19169055517fb8107d0c6b40be480ce3172ee66ba6d64b71f6b1685a851340036e6e2e3e3c529190a250565b6000546001600160a01b031633146119c35760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b6119cd6000613105565b565b600080806119e26402540be400856139e1565b91506119ee82856137f3565b92506119ff6402540be4008461399d565b929491935050565b3360009081526003602052604090205460ff16611a665760405162461bcd60e51b815260206004820152601860248201527f43616c6c6572206973206e6f74206120677561726469616e000000000000000060448201526064016107e6565b6000611a7283836108a3565b600081815260046020526040812080549293509167ffffffffffffffff169003611b045760405162461bcd60e51b815260206004820152603060248201527f4f7074696d6973746963206d696e74696e67206e6f742072657175657374656460448201527f20666f7220746865206465706f7369740000000000000000000000000000000060648201526084016107e6565b805468010000000000000000900467ffffffffffffffff1615611b8f5760405162461bcd60e51b815260206004820152603460248201527f4f7074696d6973746963206d696e74696e6720616c72656164792066696e616c60448201527f697a656420666f7220746865206465706f73697400000000000000000000000060648201526084016107e6565b60008281526004602052604080822080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016905551839133917f1256b41d4b18d922811c358ab80cb0375aae28f45373de35cfda580662193fcd9190a350505050565b3360009081526001602052604090205460ff16611c525760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f742061206d696e7465720000000000000000000060448201526064016107e6565b600054600160a01b900460ff1615611cac5760405162461bcd60e51b815260206004820152601960248201527f4f7074696d6973746963206d696e74696e67207061757365640000000000000060448201526064016107e6565b6000611cb883836108a3565b600081815260046020526040902080549192509067ffffffffffffffff1615611d495760405162461bcd60e51b815260206004820152603460248201527f4f7074696d6973746963206d696e74696e6720616c726561647920726571756560448201527f7374656420666f7220746865206465706f73697400000000000000000000000060648201526084016107e6565b604051630b02c43d60e41b8152600481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b02c43d09060240160c060405180830381865afa158015611db1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd591906138b9565b9050806040015163ffffffff16600003611e3b5760405162461bcd60e51b815260206004820152602160248201527f546865206465706f73697420686173206e6f74206265656e2072657665616c656044820152601960fa1b60648201526084016107e6565b60a081015163ffffffff1615611e935760405162461bcd60e51b815260206004820152601c60248201527f546865206465706f73697420697320616c72656164792073776570740000000060448201526064016107e6565b60608101516001600160a01b03163014611eef5760405162461bcd60e51b815260206004820152601860248201527f556e6578706563746564207661756c742061646472657373000000000000000060448201526064016107e6565b815467ffffffffffffffff19164267ffffffffffffffff908116919091178355815160208301516001600160a01b0390911691859133917f36f39c606d55d7dd2a05b8c4e41e9a6ca8c501cea10009c1762f6826a146e05591611f59916402540be4009116613835565b60408051918252602082018b905263ffffffff8a169082015260600160405180910390a45050505050565b60028181548110611f9457600080fd5b6000918252602090912001546001600160a01b0316905081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161461202f5760405162461bcd60e51b815260206004820152601160248201527f546f6b656e206973206e6f74205442544300000000000000000000000000000060448201526064016107e6565b336001600160a01b038416146120875760405162461bcd60e51b815260206004820152601860248201527f4f6e6c7920544254432063616c6c657220616c6c6f776564000000000000000060448201526064016107e6565b6000612092856119cf565b509091505060008290036120af576120aa8682612fb6565b6120bb565b6120bb86828585612e6f565b505050505050565b6000546001600160a01b0316331461210b5760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b6001600160a01b03811660009081526001602052604090205460ff16156121745760405162461bcd60e51b815260206004820181905260248201527f54686973206164647265737320697320616c72656164792061206d696e74657260448201526064016107e6565b6001600160a01b0381166000818152600160208190526040808320805460ff19168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180546001600160a01b03191684179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b6000546001600160a01b031633146122485760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b6009546122588162015180612dc6565b600854600080547fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff1663ffffffff909216600160c81b81029290921790556040519081527ff52de3377e3ae270d1e38f99b9b8d587814643811516ea55ba4d597f9950d4ec9060200160405180910390a1506008805463ffffffff191690556000600955565b6000546001600160a01b031633146123265760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b600b546123368162015180612dc6565b600a546040516001600160a01b0390911681527f81a9bb8030ed4116b405800280e065110a37afb57b69948e714c97fab23475ec9060200160405180910390a1600a546040517ff2fde38b0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063f2fde38b90602401600060405180830381600087803b1580156123f757600080fd5b505af115801561240b573d6000803e3d6000fd5b5050600a546040516370a0823160e01b81523060048201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811694506356a6d9ef93509091169083906370a0823190602401602060405180830381865afa158015612483573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a7919061384c565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561250557600080fd5b505af1158015612519573d6000803e3d6000fd5b5050600a80546001600160a01b031916905550506000600b5550565b600080612541836119cf565b6040516370a0823160e01b8152336004820152929450925082916001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691506370a0823190602401602060405180830381865afa1580156125ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125d1919061384c565b101561262a5760405162461bcd60e51b815260206004820152602260248201527f416d6f756e7420657863656564732062616c616e636520696e207468652062616044820152616e6b60f01b60648201526084016107e6565b6126343383612ceb565b604051631f1b6d2760e21b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690637c6db49c90606401610d1f565b6000546001600160a01b031633146126d55760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b600054600160a01b900460ff16156127395760405162461bcd60e51b815260206004820152602160248201527f4f7074696d6973746963206d696e74696e6720616c72656164792070617573656044820152601960fa1b60648201526084016107e6565b6000805460ff60a01b1916600160a01b1781556040517f23a83c8aeda8c831401c17b5bfb8b2ead79fcfe9c027fe34a4f8576e2c7c74cc9190a1565b6000546001600160a01b031633146127bd5760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b6001600160a01b03811660009081526003602052604090205460ff161561284c5760405162461bcd60e51b815260206004820152602260248201527f54686973206164647265737320697320616c726561647920612067756172646960448201527f616e00000000000000000000000000000000000000000000000000000000000060648201526084016107e6565b6001600160a01b038116600081815260036020526040808220805460ff19166001179055517f038596bb31e2e7d3d9f184d4c98b310103f6d7f5830e5eec32bffe6f1728f9699190a250565b6000546001600160a01b031633146128e05760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b600054600160a01b900460ff166129395760405162461bcd60e51b815260206004820181905260248201527f4f7074696d6973746963206d696e74696e67206973206e6f742070617573656460448201526064016107e6565b6000805460ff60a01b191681556040517fcb27470ed9568d9eeb8939707bafc19404d908a26ce5f468a6aa781024fd6a839190a1565b6000546001600160a01b031633146129b75760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b426007556006805463ffffffff191663ffffffff83169081179091556040519081527f0dbfec7f12acffbb5cec595ac4370907eaf84caa7025dd71f4021433be79eba990602001610837565b6000546001600160a01b03163314612a4b5760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b6001600160a01b038116612ac75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107e6565b612ad081613105565b50565b6000546001600160a01b03163314612b1b5760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b6040517fb88d4fde0000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063b88d4fde906109bd9030908890889088908890600401613794565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261089e908490613155565b6001600160a01b038216600090815260056020526040812054808203612c115782915050610902565b80831115612c78576001600160a01b0384166000818152600560209081526040808320839055519182527fb30abd1b9e3d58cd8525b3d5c5aa002db1e43a150af5b172a8d16efcc7a141f8910160405180910390a2612c7081846137f3565b915050610902565b612c8283826137f3565b6001600160a01b0385166000818152600560205260409020919091557fb30abd1b9e3d58cd8525b3d5c5aa002db1e43a150af5b172a8d16efcc7a141f8612cc985846137f3565b60405190815260200160405180910390a26000915050610902565b5092915050565b816001600160a01b03167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe82604051612d2691815260200190565b60405180910390a26040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018390527f000000000000000000000000000000000000000000000000000000000000000016906340c10f19906044015b600060405180830381600087803b158015612db257600080fd5b505af11580156120bb573d6000803e3d6000fd5b60008211612e165760405162461bcd60e51b815260206004820152601460248201527f4368616e6765206e6f7420696e6974696174656400000000000000000000000060448201526064016107e6565b80612e2183426137f3565b10156112cf5760405162461bcd60e51b815260206004820181905260248201527f476f7665726e616e63652064656c617920686173206e6f7420656c617073656460448201526064016107e6565b836001600160a01b03167f68751a4c3821398cb63d11609eca2440742ef19446f0c0261bfa8a13dd0748b884604051612eaa91815260200190565b60405180910390a260405163079cc67960e41b81526001600160a01b038581166004830152602482018590527f000000000000000000000000000000000000000000000000000000000000000016906379cc679090604401600060405180830381600087803b158015612f1c57600080fd5b505af1158015612f30573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634a38757e7f00000000000000000000000000000000000000000000000000000000000000006402540be40086612f95919061399d565b85856040518563ffffffff1660e01b815260040161107a94939291906139f5565b816001600160a01b03167f68751a4c3821398cb63d11609eca2440742ef19446f0c0261bfa8a13dd0748b882604051612ff191815260200190565b60405180910390a260405163079cc67960e41b81526001600160a01b038381166004830152602482018390527f000000000000000000000000000000000000000000000000000000000000000016906379cc679090604401600060405180830381600087803b15801561306357600080fd5b505af1158015613077573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166356a6d9ef836402540be400846130bc919061399d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401612d98565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006131aa826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661323a9092919063ffffffff16565b80519091501561089e57808060200190518101906131c89190613a28565b61089e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016107e6565b60606132498484600085613253565b90505b9392505050565b6060824710156132cb5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016107e6565b6001600160a01b0385163b6133225760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107e6565b600080866001600160a01b0316858760405161333e9190613a6e565b60006040518083038185875af1925050503d806000811461337b576040519150601f19603f3d011682016040523d82523d6000602084013e613380565b606091505b509150915061339082828661339b565b979650505050505050565b606083156133aa57508161324c565b8251156133ba5782518084602001fd5b8160405162461bcd60e51b81526004016107e69190613a8a565b6001600160a01b0381168114612ad057600080fd5b6000602082840312156133fb57600080fd5b813561324c816133d4565b63ffffffff81168114612ad057600080fd5b60006020828403121561342a57600080fd5b813561324c81613406565b60008060006060848603121561344a57600080fd5b8335613455816133d4565b92506020840135613465816133d4565b929592945050506040919091013590565b6000806040838503121561348957600080fd5b82359150602083013561349b81613406565b809150509250929050565b60008083601f8401126134b857600080fd5b50813567ffffffffffffffff8111156134d057600080fd5b6020830191508360208285010111156134e857600080fd5b9250929050565b60008060008060006080868803121561350757600080fd5b8535613512816133d4565b94506020860135613522816133d4565b935060408601359250606086013567ffffffffffffffff81111561354557600080fd5b613551888289016134a6565b969995985093965092949392505050565b60008083601f84011261357457600080fd5b50813567ffffffffffffffff81111561358c57600080fd5b6020830191508360208260051b85010111156134e857600080fd5b600080600080604085870312156135bd57600080fd5b843567ffffffffffffffff808211156135d557600080fd5b6135e188838901613562565b909650945060208701359150808211156135fa57600080fd5b5061360787828801613562565b95989497509550505050565b6000806000806060858703121561362957600080fd5b8435613634816133d4565b935060208501359250604085013567ffffffffffffffff81111561365757600080fd5b613607878288016134a6565b60008060006040848603121561367857600080fd5b83359250602084013567ffffffffffffffff81111561369657600080fd5b6136a2868287016134a6565b9497909650939450505050565b6000602082840312156136c157600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156137095783516001600160a01b0316835292840192918401916001016136e4565b50909695505050505050565b60008060008060006080868803121561372d57600080fd5b8535613738816133d4565b945060208601359350604086013561374f816133d4565b9250606086013567ffffffffffffffff81111561354557600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60006001600160a01b0380881683528087166020840152508460408301526080606083015261339060808301848661376b565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610902576109026137dd565b634e487b7160e01b600052603160045260246000fd5b60006001820161382e5761382e6137dd565b5060010190565b8082028115828204841417610902576109026137dd565b60006020828403121561385e57600080fd5b5051919050565b67ffffffffffffffff818116838216019080821115612ce457612ce46137dd565b8051613891816133d4565b919050565b805167ffffffffffffffff8116811461389157600080fd5b805161389181613406565b600060c082840312156138cb57600080fd5b60405160c0810181811067ffffffffffffffff821117156138fc57634e487b7160e01b600052604160045260246000fd5b60405261390883613886565b815261391660208401613896565b6020820152613927604084016138ae565b604082015261393860608401613886565b606082015261394960808401613896565b608082015261395a60a084016138ae565b60a08201529392505050565b67ffffffffffffffff828116828216039080821115612ce457612ce46137dd565b634e487b7160e01b600052601260045260246000fd5b6000826139ac576139ac613987565b500490565b80820180821115610902576109026137dd565b6000602082840312156139d657600080fd5b815161324c816133d4565b6000826139f0576139f0613987565b500690565b6001600160a01b0385168152836020820152606060408201526000613a1e60608301848661376b565b9695505050505050565b600060208284031215613a3a57600080fd5b8151801515811461324c57600080fd5b60005b83811015613a65578181015183820152602001613a4d565b50506000910152565b60008251613a80818460208701613a4a565b9190910192915050565b6020815260008251806020840152613aa9816040850160208701613a4a565b601f01601f1916919091016040019291505056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212209a07381069555c36987780153c945020363fa37b34dc75e1273fdc2b8ab2e0d464736f6c63430008110033",
1122
+ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106103365760003560e01c80638532c511116101b2578063a410d29b116100f9578063c36b32b7116100a2578063e5d3d7141161007c578063e5d3d7141461072e578063e78cea9214610755578063f2fde38b1461077c578063fc4e51f61461078f57600080fd5b8063c36b32b7146106ff578063c7ba034714610712578063d0ff65b51461071e57600080fd5b8063b0b54895116100d3578063b0b54895146106cd578063b9f78798146106d7578063bc7b6b99146106f757600080fd5b8063a410d29b1461068f578063a526d83b14610697578063aa271e1a146106aa57600080fd5b8063951315261161015b5780639a508c8e116101355780639a508c8e1461066b578063a0712d6814610673578063a0cceb951461068657600080fd5b80639513152614610647578063983b2d56146106505780639a4e36d51461066357600080fd5b8063897f712c1161018c578063897f712c1461060f5780638da5cb5b146106235780638f4ffcb11461063457600080fd5b80638532c511146105d95780638623ec7b146105e957806388aaf0c8146105fc57600080fd5b806347c1ffdb116102815780636c626aa41161022a5780637445a5a0116102045780637445a5a01461054657806376cdb03b1461057457806380df5ed2146105b3578063820b5513146105c657600080fd5b80636c626aa4146104d0578063714041561461052b578063715018a61461053e57600080fd5b806364e779b11161025b57806364e779b1146104955780636abe3a6c146104a85780636b32810b146104bb57600080fd5b806347c1ffdb1461046357806353dce4df1461046b5780635ae2da461461047e57600080fd5b80633092afd5116102e3578063461c6373116102bd578063461c63731461042a578063475d05701461043d578063479aa9271461045057600080fd5b80633092afd5146103fb578063317dfa761461040e57806341906ab71461042157600080fd5b80631171bda9116103145780631171bda9146103b4578063124f65bd146103c75780632e73e398146103e857600080fd5b806309b53f511461033b5780630c68ba211461036c5780630f3425731461039f575b600080fd5b60005461035290600160a81b900463ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b61038f61037a3660046133e9565b60036020526000908152604090205460ff1681565b6040519015158152602001610363565b6103b26103ad366004613418565b6107a2565b005b6103b26103c2366004613435565b610842565b6103da6103d5366004613476565b6108a3565b604051908152602001610363565b6103b26103f63660046134ef565b610908565b6103b26104093660046133e9565b6109f6565b6103b261041c366004613435565b610c65565b6103da60095481565b6103b26104383660046135a7565b610d56565b6103b261044b366004613613565b610eb1565b6103b261045e3660046133e9565b6110b2565b6103b26111b7565b6103b2610479366004613663565b611295565b60005461035290600160c81b900463ffffffff1681565b6103b26104a33660046136af565b6112b6565b6103b26104b6366004613476565b6112d3565b6104c3611820565b60405161036391906136c8565b61050a6104de3660046136af565b60046020526000908152604090205467ffffffffffffffff808216916801000000000000000090041682565b6040805167ffffffffffffffff938416815292909116602083015201610363565b6103b26105393660046133e9565b611882565b6103b261197b565b6105596105543660046136af565b6119cf565b60408051938452602084019290925290820152606001610363565b61059b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610363565b6103b26105c1366004613476565b611a07565b6103b26105d4366004613476565b611bf3565b6006546103529063ffffffff1681565b61059b6105f73660046136af565b611f84565b600a5461059b906001600160a01b031681565b60005461038f90600160a01b900460ff1681565b6000546001600160a01b031661059b565b6103b2610642366004613715565b611fae565b6103da600b5481565b6103b261065e3660046133e9565b6120c3565b6103b2612200565b6103b26122de565b6103b26106813660046136af565b612535565b6103da60075481565b6103b261268d565b6103b26106a53660046133e9565b612775565b61038f6106b83660046133e9565b60016020526000908152604090205460ff1681565b6103da6201518081565b6103da6106e53660046133e9565b60056020526000908152604090205481565b6103b2612898565b6103b261070d366004613418565b61296f565b6103da6402540be40081565b6008546103529063ffffffff1681565b61059b7f000000000000000000000000000000000000000000000000000000000000000081565b61059b7f000000000000000000000000000000000000000000000000000000000000000081565b6103b261078a3660046133e9565b612a03565b6103b261079d3660046134ef565b612ad3565b6000546001600160a01b031633146107ef5760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064015b60405180910390fd5b426009556008805463ffffffff191663ffffffff83169081179091556040519081527f682bc0fb7e0d6bcb974cf556b95f68533cafc411d83d9f33ac192ccf45dda605906020015b60405180910390a150565b6000546001600160a01b0316331461088a5760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b61089e6001600160a01b0384168383612b68565b505050565b600082826040516020016108e692919091825260e01b7fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6040516020818303038152906040528051906020012060001c90505b92915050565b6000546001600160a01b031633146109505760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b6040517ffc4e51f60000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063fc4e51f6906109bd9088908890889088908890600401613794565b600060405180830381600087803b1580156109d757600080fd5b505af11580156109eb573d6000803e3d6000fd5b505050505050505050565b33610a096000546001600160a01b031690565b6001600160a01b03161480610a2d57503360009081526003602052604090205460ff165b610a9f5760405162461bcd60e51b815260206004820152602360248201527f43616c6c6572206973206e6f7420746865206f776e6572206f7220677561726460448201527f69616e000000000000000000000000000000000000000000000000000000000060648201526084016107e6565b6001600160a01b03811660009081526001602052604090205460ff16610b075760405162461bcd60e51b815260206004820152601c60248201527f546869732061646472657373206973206e6f742061206d696e7465720000000060448201526064016107e6565b6001600160a01b0381166000908152600160205260408120805460ff191690555b600254811015610c2d57816001600160a01b031660028281548110610b4f57610b4f6137c7565b6000918252602090912001546001600160a01b031603610c1b5760028054610b79906001906137f3565b81548110610b8957610b896137c7565b600091825260209091200154600280546001600160a01b039092169183908110610bb557610bb56137c7565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506002805480610bf457610bf4613806565b600082815260209020810160001990810180546001600160a01b0319169055019055610c2d565b80610c258161381c565b915050610b28565b506040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b6000546001600160a01b03163314610cad5760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b6040517f1171bda90000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301528381166024830152604482018390527f00000000000000000000000000000000000000000000000000000000000000001690631171bda9906064015b600060405180830381600087803b158015610d3957600080fd5b505af1158015610d4d573d6000803e3d6000fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610dce5760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f74207468652042616e6b0000000000000000000060448201526064016107e6565b6000839003610e1f5760405162461bcd60e51b815260206004820152601760248201527f4e6f206465706f7369746f72732073706563696669656400000000000000000060448201526064016107e6565b60005b83811015610eaa576000858583818110610e3e57610e3e6137c7565b9050602002016020810190610e5391906133e9565b90506000848484818110610e6957610e696137c7565b905060200201359050610e9582610e90846402540be40085610e8b9190613835565b612be8565b612ceb565b50508080610ea29061381c565b915050610e22565b5050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f295760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f74207468652042616e6b0000000000000000000060448201526064016107e6565b6040516370a0823160e01b81526001600160a01b03858116600483015284917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610f93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb7919061384c565b10156110105760405162461bcd60e51b815260206004820152602260248201527f416d6f756e7420657863656564732062616c616e636520696e207468652062616044820152616e6b60f01b60648201526084016107e6565b61102384610e906402540be40086613835565b604051631f1b6d2760e21b81526001600160a01b038581166004830152306024830152604482018590527f00000000000000000000000000000000000000000000000000000000000000001690637c6db49c906064015b600060405180830381600087803b15801561109457600080fd5b505af11580156110a8573d6000803e3d6000fd5b5050505050505050565b6000546001600160a01b031633146110fa5760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b6001600160a01b0381166111505760405162461bcd60e51b815260206004820181905260248201527f4e6577207661756c7420616464726573732063616e6e6f74206265207a65726f60448201526064016107e6565b604080516001600160a01b03831681524260208201527f5cc842cab066489e13292128663547c68705dbf476f0131e0107f155719c6124910160405180910390a142600b55600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146111ff5760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b60075461120f8162015180612dc6565b600654600080547fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1663ffffffff909216600160a81b81029290921790556040519081527fa7f4ce7c3586e2000cdec6b25c5e7d0b20f9b4f435aa22d9c1feb32dbb506f779060200160405180910390a1506006805463ffffffff191690556000600755565b60006112a0846119cf565b505090506112b033828585612e6f565b50505050565b60006112c1826119cf565b505090506112cf3382612fb6565b5050565b3360009081526001602052604090205460ff166113325760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f742061206d696e7465720000000000000000000060448201526064016107e6565b600054600160a01b900460ff161561138c5760405162461bcd60e51b815260206004820152601960248201527f4f7074696d6973746963206d696e74696e67207061757365640000000000000060448201526064016107e6565b600061139883836108a3565b600081815260046020526040812080549293509167ffffffffffffffff16900361142a5760405162461bcd60e51b815260206004820152603060248201527f4f7074696d6973746963206d696e74696e67206e6f742072657175657374656460448201527f20666f7220746865206465706f7369740000000000000000000000000000000060648201526084016107e6565b805468010000000000000000900467ffffffffffffffff16156114b55760405162461bcd60e51b815260206004820152603460248201527f4f7074696d6973746963206d696e74696e6720616c72656164792066696e616c60448201527f697a656420666f7220746865206465706f73697400000000000000000000000060648201526084016107e6565b60005481546114db91600160c81b900463ffffffff169067ffffffffffffffff16613865565b67ffffffffffffffff1642116115595760405162461bcd60e51b815260206004820152602b60248201527f4f7074696d6973746963206d696e74696e672064656c617920686173206e6f7460448201527f207061737365642079657400000000000000000000000000000000000000000060648201526084016107e6565b604051630b02c43d60e41b8152600481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b02c43d09060240160c060405180830381865afa1580156115c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e591906138b9565b90508060a0015163ffffffff166000146116415760405162461bcd60e51b815260206004820152601c60248201527f546865206465706f73697420697320616c72656164792073776570740000000060448201526064016107e6565b60006402540be4008260800151836020015161165d9190613966565b67ffffffffffffffff166116719190613835565b6000805491925090600160a81b900463ffffffff166116915760006116ab565b6000546116ab90600160a81b900463ffffffff168361399d565b83516001600160a01b0316600090815260056020526040812054919250906116d49084906139b1565b84516001600160a01b03166000908152600560205260409020819055845190915061170390610e9084866137f3565b8115611794576117947f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166361d027b36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561176a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178e91906139c4565b83612ceb565b84547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff16680100000000000000004267ffffffffffffffff160217855583516040518281526001600160a01b0390911690879033907f2cffebf26d639426e79514d100febae8b2c63e700e5dc0fa6c88a129633506369060200160405180910390a45050505050505050565b6060600280548060200260200160405190810160405280929190818152602001828054801561187857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161185a575b5050505050905090565b6000546001600160a01b031633146118ca5760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b6001600160a01b03811660009081526003602052604090205460ff166119325760405162461bcd60e51b815260206004820152601e60248201527f546869732061646472657373206973206e6f74206120677561726469616e000060448201526064016107e6565b6001600160a01b038116600081815260036020526040808220805460ff19169055517fb8107d0c6b40be480ce3172ee66ba6d64b71f6b1685a851340036e6e2e3e3c529190a250565b6000546001600160a01b031633146119c35760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b6119cd6000613105565b565b600080806119e26402540be400856139e1565b91506119ee82856137f3565b92506119ff6402540be4008461399d565b929491935050565b3360009081526003602052604090205460ff16611a665760405162461bcd60e51b815260206004820152601860248201527f43616c6c6572206973206e6f74206120677561726469616e000000000000000060448201526064016107e6565b6000611a7283836108a3565b600081815260046020526040812080549293509167ffffffffffffffff169003611b045760405162461bcd60e51b815260206004820152603060248201527f4f7074696d6973746963206d696e74696e67206e6f742072657175657374656460448201527f20666f7220746865206465706f7369740000000000000000000000000000000060648201526084016107e6565b805468010000000000000000900467ffffffffffffffff1615611b8f5760405162461bcd60e51b815260206004820152603460248201527f4f7074696d6973746963206d696e74696e6720616c72656164792066696e616c60448201527f697a656420666f7220746865206465706f73697400000000000000000000000060648201526084016107e6565b60008281526004602052604080822080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016905551839133917f1256b41d4b18d922811c358ab80cb0375aae28f45373de35cfda580662193fcd9190a350505050565b3360009081526001602052604090205460ff16611c525760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f742061206d696e7465720000000000000000000060448201526064016107e6565b600054600160a01b900460ff1615611cac5760405162461bcd60e51b815260206004820152601960248201527f4f7074696d6973746963206d696e74696e67207061757365640000000000000060448201526064016107e6565b6000611cb883836108a3565b600081815260046020526040902080549192509067ffffffffffffffff1615611d495760405162461bcd60e51b815260206004820152603460248201527f4f7074696d6973746963206d696e74696e6720616c726561647920726571756560448201527f7374656420666f7220746865206465706f73697400000000000000000000000060648201526084016107e6565b604051630b02c43d60e41b8152600481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b02c43d09060240160c060405180830381865afa158015611db1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd591906138b9565b9050806040015163ffffffff16600003611e3b5760405162461bcd60e51b815260206004820152602160248201527f546865206465706f73697420686173206e6f74206265656e2072657665616c656044820152601960fa1b60648201526084016107e6565b60a081015163ffffffff1615611e935760405162461bcd60e51b815260206004820152601c60248201527f546865206465706f73697420697320616c72656164792073776570740000000060448201526064016107e6565b60608101516001600160a01b03163014611eef5760405162461bcd60e51b815260206004820152601860248201527f556e6578706563746564207661756c742061646472657373000000000000000060448201526064016107e6565b815467ffffffffffffffff19164267ffffffffffffffff908116919091178355815160208301516001600160a01b0390911691859133917f36f39c606d55d7dd2a05b8c4e41e9a6ca8c501cea10009c1762f6826a146e05591611f59916402540be4009116613835565b60408051918252602082018b905263ffffffff8a169082015260600160405180910390a45050505050565b60028181548110611f9457600080fd5b6000918252602090912001546001600160a01b0316905081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161461202f5760405162461bcd60e51b815260206004820152601160248201527f546f6b656e206973206e6f74205442544300000000000000000000000000000060448201526064016107e6565b336001600160a01b038416146120875760405162461bcd60e51b815260206004820152601860248201527f4f6e6c7920544254432063616c6c657220616c6c6f776564000000000000000060448201526064016107e6565b6000612092856119cf565b509091505060008290036120af576120aa8682612fb6565b6120bb565b6120bb86828585612e6f565b505050505050565b6000546001600160a01b0316331461210b5760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b6001600160a01b03811660009081526001602052604090205460ff16156121745760405162461bcd60e51b815260206004820181905260248201527f54686973206164647265737320697320616c72656164792061206d696e74657260448201526064016107e6565b6001600160a01b0381166000818152600160208190526040808320805460ff19168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180546001600160a01b03191684179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b6000546001600160a01b031633146122485760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b6009546122588162015180612dc6565b600854600080547fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff1663ffffffff909216600160c81b81029290921790556040519081527ff52de3377e3ae270d1e38f99b9b8d587814643811516ea55ba4d597f9950d4ec9060200160405180910390a1506008805463ffffffff191690556000600955565b6000546001600160a01b031633146123265760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b600b546123368162015180612dc6565b600a546040516001600160a01b0390911681527f81a9bb8030ed4116b405800280e065110a37afb57b69948e714c97fab23475ec9060200160405180910390a1600a546040517ff2fde38b0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063f2fde38b90602401600060405180830381600087803b1580156123f757600080fd5b505af115801561240b573d6000803e3d6000fd5b5050600a546040516370a0823160e01b81523060048201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811694506356a6d9ef93509091169083906370a0823190602401602060405180830381865afa158015612483573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a7919061384c565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561250557600080fd5b505af1158015612519573d6000803e3d6000fd5b5050600a80546001600160a01b031916905550506000600b5550565b600080612541836119cf565b6040516370a0823160e01b8152336004820152929450925082916001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691506370a0823190602401602060405180830381865afa1580156125ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125d1919061384c565b101561262a5760405162461bcd60e51b815260206004820152602260248201527f416d6f756e7420657863656564732062616c616e636520696e207468652062616044820152616e6b60f01b60648201526084016107e6565b6126343383612ceb565b604051631f1b6d2760e21b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690637c6db49c90606401610d1f565b6000546001600160a01b031633146126d55760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b600054600160a01b900460ff16156127395760405162461bcd60e51b815260206004820152602160248201527f4f7074696d6973746963206d696e74696e6720616c72656164792070617573656044820152601960fa1b60648201526084016107e6565b6000805460ff60a01b1916600160a01b1781556040517f23a83c8aeda8c831401c17b5bfb8b2ead79fcfe9c027fe34a4f8576e2c7c74cc9190a1565b6000546001600160a01b031633146127bd5760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b6001600160a01b03811660009081526003602052604090205460ff161561284c5760405162461bcd60e51b815260206004820152602260248201527f54686973206164647265737320697320616c726561647920612067756172646960448201527f616e00000000000000000000000000000000000000000000000000000000000060648201526084016107e6565b6001600160a01b038116600081815260036020526040808220805460ff19166001179055517f038596bb31e2e7d3d9f184d4c98b310103f6d7f5830e5eec32bffe6f1728f9699190a250565b6000546001600160a01b031633146128e05760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b600054600160a01b900460ff166129395760405162461bcd60e51b815260206004820181905260248201527f4f7074696d6973746963206d696e74696e67206973206e6f742070617573656460448201526064016107e6565b6000805460ff60a01b191681556040517fcb27470ed9568d9eeb8939707bafc19404d908a26ce5f468a6aa781024fd6a839190a1565b6000546001600160a01b031633146129b75760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b426007556006805463ffffffff191663ffffffff83169081179091556040519081527f0dbfec7f12acffbb5cec595ac4370907eaf84caa7025dd71f4021433be79eba990602001610837565b6000546001600160a01b03163314612a4b5760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b6001600160a01b038116612ac75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107e6565b612ad081613105565b50565b6000546001600160a01b03163314612b1b5760405162461bcd60e51b81526020600482018190526024820152600080516020613abe83398151915260448201526064016107e6565b6040517fb88d4fde0000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063b88d4fde906109bd9030908890889088908890600401613794565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261089e908490613155565b6001600160a01b038216600090815260056020526040812054808203612c115782915050610902565b80831115612c78576001600160a01b0384166000818152600560209081526040808320839055519182527fb30abd1b9e3d58cd8525b3d5c5aa002db1e43a150af5b172a8d16efcc7a141f8910160405180910390a2612c7081846137f3565b915050610902565b612c8283826137f3565b6001600160a01b0385166000818152600560205260409020919091557fb30abd1b9e3d58cd8525b3d5c5aa002db1e43a150af5b172a8d16efcc7a141f8612cc985846137f3565b60405190815260200160405180910390a26000915050610902565b5092915050565b816001600160a01b03167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe82604051612d2691815260200190565b60405180910390a26040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018390527f000000000000000000000000000000000000000000000000000000000000000016906340c10f19906044015b600060405180830381600087803b158015612db257600080fd5b505af11580156120bb573d6000803e3d6000fd5b60008211612e165760405162461bcd60e51b815260206004820152601460248201527f4368616e6765206e6f7420696e6974696174656400000000000000000000000060448201526064016107e6565b80612e2183426137f3565b10156112cf5760405162461bcd60e51b815260206004820181905260248201527f476f7665726e616e63652064656c617920686173206e6f7420656c617073656460448201526064016107e6565b836001600160a01b03167f68751a4c3821398cb63d11609eca2440742ef19446f0c0261bfa8a13dd0748b884604051612eaa91815260200190565b60405180910390a260405163079cc67960e41b81526001600160a01b038581166004830152602482018590527f000000000000000000000000000000000000000000000000000000000000000016906379cc679090604401600060405180830381600087803b158015612f1c57600080fd5b505af1158015612f30573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634a38757e7f00000000000000000000000000000000000000000000000000000000000000006402540be40086612f95919061399d565b85856040518563ffffffff1660e01b815260040161107a94939291906139f5565b816001600160a01b03167f68751a4c3821398cb63d11609eca2440742ef19446f0c0261bfa8a13dd0748b882604051612ff191815260200190565b60405180910390a260405163079cc67960e41b81526001600160a01b038381166004830152602482018390527f000000000000000000000000000000000000000000000000000000000000000016906379cc679090604401600060405180830381600087803b15801561306357600080fd5b505af1158015613077573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166356a6d9ef836402540be400846130bc919061399d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401612d98565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006131aa826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661323a9092919063ffffffff16565b80519091501561089e57808060200190518101906131c89190613a28565b61089e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016107e6565b60606132498484600085613253565b90505b9392505050565b6060824710156132cb5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016107e6565b6001600160a01b0385163b6133225760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107e6565b600080866001600160a01b0316858760405161333e9190613a6e565b60006040518083038185875af1925050503d806000811461337b576040519150601f19603f3d011682016040523d82523d6000602084013e613380565b606091505b509150915061339082828661339b565b979650505050505050565b606083156133aa57508161324c565b8251156133ba5782518084602001fd5b8160405162461bcd60e51b81526004016107e69190613a8a565b6001600160a01b0381168114612ad057600080fd5b6000602082840312156133fb57600080fd5b813561324c816133d4565b63ffffffff81168114612ad057600080fd5b60006020828403121561342a57600080fd5b813561324c81613406565b60008060006060848603121561344a57600080fd5b8335613455816133d4565b92506020840135613465816133d4565b929592945050506040919091013590565b6000806040838503121561348957600080fd5b82359150602083013561349b81613406565b809150509250929050565b60008083601f8401126134b857600080fd5b50813567ffffffffffffffff8111156134d057600080fd5b6020830191508360208285010111156134e857600080fd5b9250929050565b60008060008060006080868803121561350757600080fd5b8535613512816133d4565b94506020860135613522816133d4565b935060408601359250606086013567ffffffffffffffff81111561354557600080fd5b613551888289016134a6565b969995985093965092949392505050565b60008083601f84011261357457600080fd5b50813567ffffffffffffffff81111561358c57600080fd5b6020830191508360208260051b85010111156134e857600080fd5b600080600080604085870312156135bd57600080fd5b843567ffffffffffffffff808211156135d557600080fd5b6135e188838901613562565b909650945060208701359150808211156135fa57600080fd5b5061360787828801613562565b95989497509550505050565b6000806000806060858703121561362957600080fd5b8435613634816133d4565b935060208501359250604085013567ffffffffffffffff81111561365757600080fd5b613607878288016134a6565b60008060006040848603121561367857600080fd5b83359250602084013567ffffffffffffffff81111561369657600080fd5b6136a2868287016134a6565b9497909650939450505050565b6000602082840312156136c157600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156137095783516001600160a01b0316835292840192918401916001016136e4565b50909695505050505050565b60008060008060006080868803121561372d57600080fd5b8535613738816133d4565b945060208601359350604086013561374f816133d4565b9250606086013567ffffffffffffffff81111561354557600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60006001600160a01b0380881683528087166020840152508460408301526080606083015261339060808301848661376b565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610902576109026137dd565b634e487b7160e01b600052603160045260246000fd5b60006001820161382e5761382e6137dd565b5060010190565b8082028115828204841417610902576109026137dd565b60006020828403121561385e57600080fd5b5051919050565b67ffffffffffffffff818116838216019080821115612ce457612ce46137dd565b8051613891816133d4565b919050565b805167ffffffffffffffff8116811461389157600080fd5b805161389181613406565b600060c082840312156138cb57600080fd5b60405160c0810181811067ffffffffffffffff821117156138fc57634e487b7160e01b600052604160045260246000fd5b60405261390883613886565b815261391660208401613896565b6020820152613927604084016138ae565b604082015261393860608401613886565b606082015261394960808401613896565b608082015261395a60a084016138ae565b60a08201529392505050565b67ffffffffffffffff828116828216039080821115612ce457612ce46137dd565b634e487b7160e01b600052601260045260246000fd5b6000826139ac576139ac613987565b500490565b80820180821115610902576109026137dd565b6000602082840312156139d657600080fd5b815161324c816133d4565b6000826139f0576139f0613987565b500690565b6001600160a01b0385168152836020820152606060408201526000613a1e60608301848661376b565b9695505050505050565b600060208284031215613a3a57600080fd5b8151801515811461324c57600080fd5b60005b83811015613a65578181015183820152602001613a4d565b50506000910152565b60008251613a80818460208701613a4a565b9190910192915050565b6020815260008251806020840152613aa9816040850160208701613a4a565b601f01601f1916919091016040019291505056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212209a07381069555c36987780153c945020363fa37b34dc75e1273fdc2b8ab2e0d464736f6c63430008110033",
1081
1123
  "linkReferences": {},
1082
1124
  "deployedLinkReferences": {}
1083
1125
  }
@@ -46,6 +46,9 @@ abstract contract TBTCOptimisticMinting is Ownable {
46
46
  /// finalizing the upgrade of governable parameters.
47
47
  uint256 public constant GOVERNANCE_DELAY = 24 hours;
48
48
 
49
+ /// @notice Multiplier to convert satoshi to TBTC token units.
50
+ uint256 public constant SATOSHI_MULTIPLIER = 10**10;
51
+
49
52
  Bridge public immutable bridge;
50
53
 
51
54
  /// @notice Indicates if the optimistic minting has been paused. Only the
@@ -97,7 +100,7 @@ abstract contract TBTCOptimisticMinting is Ownable {
97
100
  /// optimistic minting of TBTC. When `TBTCVault` sweeps a deposit,
98
101
  /// the debt is fully or partially paid off, no matter if that
99
102
  /// particular swept deposit was used for the optimistic minting or
100
- /// not.
103
+ /// not. The values are in 1e18 Ethereum precision.
101
104
  mapping(address => uint256) public optimisticMintingDebt;
102
105
 
103
106
  /// @notice New optimistic minting fee divisor value. Set only when the
@@ -120,7 +123,7 @@ abstract contract TBTCOptimisticMinting is Ownable {
120
123
  address indexed minter,
121
124
  uint256 indexed depositKey,
122
125
  address indexed depositor,
123
- uint256 amount,
126
+ uint256 amount, // amount in 1e18 Ethereum precision
124
127
  bytes32 fundingTxHash,
125
128
  uint32 fundingOutputIndex
126
129
  );
@@ -261,7 +264,7 @@ abstract contract TBTCOptimisticMinting is Ownable {
261
264
  msg.sender,
262
265
  depositKey,
263
266
  deposit.depositor,
264
- deposit.amount,
267
+ deposit.amount * SATOSHI_MULTIPLIER,
265
268
  fundingTxHash,
266
269
  fundingOutputIndex
267
270
  );
@@ -323,7 +326,8 @@ abstract contract TBTCOptimisticMinting is Ownable {
323
326
  // deposit is swept.
324
327
  //
325
328
  // This imbalance is supposed to be solved by a donation to the Bridge.
326
- uint256 amountToMint = deposit.amount - deposit.treasuryFee;
329
+ uint256 amountToMint = (deposit.amount - deposit.treasuryFee) *
330
+ SATOSHI_MULTIPLIER;
327
331
 
328
332
  // The Optimistic Minting mechanism may additionally cut a fee from the
329
333
  // amount that is left after deducting the Bridge deposit treasury fee.
@@ -332,7 +336,7 @@ abstract contract TBTCOptimisticMinting is Ownable {
332
336
  // and they may wait for the Bridge to sweep their deposit if they do
333
337
  // not want to pay the Optimistic Minting fee.
334
338
  uint256 optimisticMintFee = optimisticMintingFeeDivisor > 0
335
- ? amountToMint / optimisticMintingFeeDivisor
339
+ ? (amountToMint / optimisticMintingFeeDivisor)
336
340
  : 0;
337
341
 
338
342
  // Both the optimistic minting fee and the share that goes to the
@@ -74,68 +74,88 @@ contract TBTCVault is IVault, Ownable, TBTCOptimisticMinting {
74
74
  tbtcToken = _tbtcToken;
75
75
  }
76
76
 
77
- /// @notice Transfers the given `amount` of the Bank balance from caller
78
- /// to TBTC Vault, and mints `amount` of TBTC to the caller.
79
- /// @dev TBTC Vault must have an allowance for caller's balance in the Bank
80
- /// for at least `amount`.
77
+ /// @notice Mints the given `amount` of TBTC to the caller previously
78
+ /// transferring `amount / SATOSHI_MULTIPLIER` of the Bank balance
79
+ /// from caller to TBTC Vault. If `amount` is not divisible by
80
+ /// SATOSHI_MULTIPLIER, the remainder is left on the caller's
81
+ /// Bank balance.
82
+ /// @dev TBTC Vault must have an allowance for caller's balance in the
83
+ /// Bank for at least `amount / SATOSHI_MULTIPLIER`.
81
84
  /// @param amount Amount of TBTC to mint.
82
85
  function mint(uint256 amount) external {
86
+ (uint256 convertibleAmount, , uint256 satoshis) = amountToSatoshis(
87
+ amount
88
+ );
89
+
83
90
  require(
84
- bank.balanceOf(msg.sender) >= amount,
91
+ bank.balanceOf(msg.sender) >= satoshis,
85
92
  "Amount exceeds balance in the bank"
86
93
  );
87
- _mint(msg.sender, amount);
88
- bank.transferBalanceFrom(msg.sender, address(this), amount);
94
+ _mint(msg.sender, convertibleAmount);
95
+ bank.transferBalanceFrom(msg.sender, address(this), satoshis);
89
96
  }
90
97
 
91
- /// @notice Transfers the given `amount` of the Bank balance from the caller
92
- /// to TBTC Vault and mints `amount` of TBTC to the caller.
98
+ /// @notice Transfers `satoshis` of the Bank balance from the caller
99
+ /// to TBTC Vault and mints `satoshis * SATOSHI_MULTIPLIER` of TBTC
100
+ /// to the caller.
93
101
  /// @dev Can only be called by the Bank via `approveBalanceAndCall`.
94
102
  /// @param owner The owner who approved their Bank balance.
95
- /// @param amount Amount of TBTC to mint.
103
+ /// @param satoshis Amount of satoshis used to mint TBTC.
96
104
  function receiveBalanceApproval(
97
105
  address owner,
98
- uint256 amount,
106
+ uint256 satoshis,
99
107
  bytes calldata
100
108
  ) external override onlyBank {
101
109
  require(
102
- bank.balanceOf(owner) >= amount,
110
+ bank.balanceOf(owner) >= satoshis,
103
111
  "Amount exceeds balance in the bank"
104
112
  );
105
- _mint(owner, amount);
106
- bank.transferBalanceFrom(owner, address(this), amount);
113
+ _mint(owner, satoshis * SATOSHI_MULTIPLIER);
114
+ bank.transferBalanceFrom(owner, address(this), satoshis);
107
115
  }
108
116
 
109
- /// @notice Mints the same amount of TBTC as the deposited amount for each
110
- /// depositor in the array. Can only be called by the Bank after the
111
- /// Bridge swept deposits and Bank increased balance for the
112
- /// vault.
117
+ /// @notice Mints the same amount of TBTC as the deposited satoshis amount
118
+ /// multiplied by SATOSHI_MULTIPLIER for each depositor in the array.
119
+ /// Can only be called by the Bank after the Bridge swept deposits
120
+ /// and Bank increased balance for the vault.
113
121
  /// @dev Fails if `depositors` array is empty. Expects the length of
114
- /// `depositors` and `depositedAmounts` is the same.
122
+ /// `depositors` and `depositedSatoshiAmounts` is the same.
115
123
  function receiveBalanceIncrease(
116
124
  address[] calldata depositors,
117
- uint256[] calldata depositedAmounts
125
+ uint256[] calldata depositedSatoshiAmounts
118
126
  ) external override onlyBank {
119
127
  require(depositors.length != 0, "No depositors specified");
120
128
  for (uint256 i = 0; i < depositors.length; i++) {
121
129
  address depositor = depositors[i];
122
- uint256 amount = depositedAmounts[i];
123
- _mint(depositor, repayOptimisticMintingDebt(depositor, amount));
130
+ uint256 satoshis = depositedSatoshiAmounts[i];
131
+ _mint(
132
+ depositor,
133
+ repayOptimisticMintingDebt(
134
+ depositor,
135
+ satoshis * SATOSHI_MULTIPLIER
136
+ )
137
+ );
124
138
  }
125
139
  }
126
140
 
127
141
  /// @notice Burns `amount` of TBTC from the caller's balance and transfers
128
- /// `amount` back to the caller's balance in the Bank.
142
+ /// `amount / SATOSHI_MULTIPLIER` back to the caller's balance in
143
+ /// the Bank. If `amount` is not divisible by SATOSHI_MULTIPLIER,
144
+ /// the remainder is left on the caller's account.
129
145
  /// @dev Caller must have at least `amount` of TBTC approved to
130
146
  /// TBTC Vault.
131
147
  /// @param amount Amount of TBTC to unmint.
132
148
  function unmint(uint256 amount) external {
133
- _unmint(msg.sender, amount);
149
+ (uint256 convertibleAmount, , ) = amountToSatoshis(amount);
150
+
151
+ _unmint(msg.sender, convertibleAmount);
134
152
  }
135
153
 
136
154
  /// @notice Burns `amount` of TBTC from the caller's balance and transfers
137
- /// `amount` of Bank balance to the Bridge requesting redemption
138
- /// based on the provided `redemptionData`.
155
+ /// `amount / SATOSHI_MULTIPLIER` of Bank balance to the Bridge
156
+ /// requesting redemption based on the provided `redemptionData`.
157
+ /// If `amount` is not divisible by SATOSHI_MULTIPLIER, the
158
+ /// remainder is left on the caller's account.
139
159
  /// @dev Caller must have at least `amount` of TBTC approved to
140
160
  /// TBTC Vault.
141
161
  /// @param amount Amount of TBTC to unmint and request to redeem in Bridge.
@@ -145,7 +165,9 @@ contract TBTCVault is IVault, Ownable, TBTCOptimisticMinting {
145
165
  function unmintAndRedeem(uint256 amount, bytes calldata redemptionData)
146
166
  external
147
167
  {
148
- _unmintAndRedeem(msg.sender, amount, redemptionData);
168
+ (uint256 convertibleAmount, , ) = amountToSatoshis(amount);
169
+
170
+ _unmintAndRedeem(msg.sender, convertibleAmount, redemptionData);
149
171
  }
150
172
 
151
173
  /// @notice Burns `amount` of TBTC from the caller's balance. If `extraData`
@@ -153,6 +175,9 @@ contract TBTCVault is IVault, Ownable, TBTCOptimisticMinting {
153
175
  /// Bank. If `extraData` is not empty, requests redemption in the
154
176
  /// Bridge using the `extraData` as a `redemptionData` parameter to
155
177
  /// Bridge's `receiveBalanceApproval` function.
178
+ /// If `amount` is not divisible by SATOSHI_MULTIPLIER, the
179
+ /// remainder is left on the caller's account. Note that it may
180
+ /// left a token approval equal to the remainder.
156
181
  /// @dev This function is doing the same as `unmint` or `unmintAndRedeem`
157
182
  /// (depending on `extraData` parameter) but it allows to execute
158
183
  /// unminting without a separate approval transaction. The function can
@@ -173,10 +198,11 @@ contract TBTCVault is IVault, Ownable, TBTCOptimisticMinting {
173
198
  ) external {
174
199
  require(token == address(tbtcToken), "Token is not TBTC");
175
200
  require(msg.sender == token, "Only TBTC caller allowed");
201
+ (uint256 convertibleAmount, , ) = amountToSatoshis(amount);
176
202
  if (extraData.length == 0) {
177
- _unmint(from, amount);
203
+ _unmint(from, convertibleAmount);
178
204
  } else {
179
- _unmintAndRedeem(from, amount, extraData);
205
+ _unmintAndRedeem(from, convertibleAmount, extraData);
180
206
  }
181
207
  }
182
208
 
@@ -271,18 +297,44 @@ contract TBTCVault is IVault, Ownable, TBTCOptimisticMinting {
271
297
  token.safeTransferFrom(address(this), recipient, tokenId, data);
272
298
  }
273
299
 
300
+ /// @notice Returns the amount of TBTC to be minted/unminted, the remainder,
301
+ /// and the Bank balance to be transferred for the given mint/unmint.
302
+ /// Note that if the `amount` is not divisible by SATOSHI_MULTIPLIER,
303
+ /// the remainder is left on the caller's account when minting or
304
+ /// unminting.
305
+ /// @return convertibleAmount Amount of TBTC to be minted/unminted.
306
+ /// @return remainder Not convertible remainder if amount is not divisible
307
+ /// by SATOSHI_MULTIPLIER.
308
+ /// @return satoshis Amount in satoshis - the Bank balance to be transferred
309
+ /// for the given mint/unmint
310
+ function amountToSatoshis(uint256 amount)
311
+ public
312
+ view
313
+ returns (
314
+ uint256 convertibleAmount,
315
+ uint256 remainder,
316
+ uint256 satoshis
317
+ )
318
+ {
319
+ remainder = amount % SATOSHI_MULTIPLIER;
320
+ convertibleAmount = amount - remainder;
321
+ satoshis = convertibleAmount / SATOSHI_MULTIPLIER;
322
+ }
323
+
274
324
  // slither-disable-next-line calls-loop
275
325
  function _mint(address minter, uint256 amount) internal override {
276
326
  emit Minted(minter, amount);
277
327
  tbtcToken.mint(minter, amount);
278
328
  }
279
329
 
330
+ /// @dev `amount` MUST be divisible by SATOSHI_MULTIPLIER with no change.
280
331
  function _unmint(address unminter, uint256 amount) internal {
281
332
  emit Unminted(unminter, amount);
282
333
  tbtcToken.burnFrom(unminter, amount);
283
- bank.transferBalance(unminter, amount);
334
+ bank.transferBalance(unminter, amount / SATOSHI_MULTIPLIER);
284
335
  }
285
336
 
337
+ /// @dev `amount` MUST be divisible by SATOSHI_MULTIPLIER with no change.
286
338
  function _unmintAndRedeem(
287
339
  address redeemer,
288
340
  uint256 amount,
@@ -290,6 +342,10 @@ contract TBTCVault is IVault, Ownable, TBTCOptimisticMinting {
290
342
  ) internal {
291
343
  emit Unminted(redeemer, amount);
292
344
  tbtcToken.burnFrom(redeemer, amount);
293
- bank.approveBalanceAndCall(address(bridge), amount, redemptionData);
345
+ bank.approveBalanceAndCall(
346
+ address(bridge),
347
+ amount / SATOSHI_MULTIPLIER,
348
+ redemptionData
349
+ );
294
350
  }
295
351
  }