@gooddollar/goodprotocol 1.0.19-beta.2 → 1.0.19-beta.3

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 (179) hide show
  1. package/artifacts/abis/DistributionHelper.min.json +1 -0
  2. package/artifacts/abis/ERC20.min.json +1 -1
  3. package/artifacts/abis/GoodDollarMintBurnWrapper.min.json +1 -0
  4. package/artifacts/abis/GoodDollarStaking.min.json +1 -0
  5. package/artifacts/abis/GoodReserveCDai.min.json +1 -1
  6. package/artifacts/abis/IERC2917.min.json +1 -1
  7. package/artifacts/abis/IMultichainRouter.min.json +1 -0
  8. package/artifacts/abis/IRouter.min.json +1 -0
  9. package/artifacts/abis/Math64x64.min.json +1 -0
  10. package/artifacts/abis/PausableControl.min.json +1 -0
  11. package/artifacts/abis/RewardsMinter.min.json +1 -0
  12. package/artifacts/abis/StakingRewardsFixedAPY.min.json +1 -0
  13. package/artifacts/abis/TokenOperation.min.json +1 -0
  14. package/artifacts/abis/cERC20.min.json +1 -1
  15. package/artifacts/contracts/DAOStackInterfaces.sol/Avatar.dbg.json +1 -1
  16. package/artifacts/contracts/DAOStackInterfaces.sol/Controller.dbg.json +1 -1
  17. package/artifacts/contracts/DAOStackInterfaces.sol/GlobalConstraintInterface.dbg.json +1 -1
  18. package/artifacts/contracts/DAOStackInterfaces.sol/IntVoteInterface.dbg.json +1 -1
  19. package/artifacts/contracts/DAOStackInterfaces.sol/ReputationInterface.dbg.json +1 -1
  20. package/artifacts/contracts/DAOStackInterfaces.sol/SchemeRegistrar.dbg.json +1 -1
  21. package/artifacts/contracts/Interfaces.sol/AggregatorV3Interface.dbg.json +1 -1
  22. package/artifacts/contracts/Interfaces.sol/ERC20.dbg.json +1 -1
  23. package/artifacts/contracts/Interfaces.sol/ERC20.json +13 -0
  24. package/artifacts/contracts/Interfaces.sol/IAaveIncentivesController.dbg.json +1 -1
  25. package/artifacts/contracts/Interfaces.sol/IAdminWallet.dbg.json +1 -1
  26. package/artifacts/contracts/Interfaces.sol/IDonationStaking.dbg.json +1 -1
  27. package/artifacts/contracts/Interfaces.sol/IERC2917.dbg.json +1 -1
  28. package/artifacts/contracts/Interfaces.sol/IERC2917.json +13 -0
  29. package/artifacts/contracts/Interfaces.sol/IFirstClaimPool.dbg.json +1 -1
  30. package/artifacts/contracts/Interfaces.sol/IGoodDollar.dbg.json +1 -1
  31. package/artifacts/contracts/Interfaces.sol/IGoodStaking.dbg.json +1 -1
  32. package/artifacts/contracts/Interfaces.sol/IHasRouter.dbg.json +1 -1
  33. package/artifacts/contracts/Interfaces.sol/IIdentity.dbg.json +1 -1
  34. package/artifacts/contracts/Interfaces.sol/ILendingPool.dbg.json +1 -1
  35. package/artifacts/contracts/Interfaces.sol/IMultichainRouter.dbg.json +4 -0
  36. package/artifacts/contracts/Interfaces.sol/IMultichainRouter.json +39 -0
  37. package/artifacts/contracts/Interfaces.sol/INameService.dbg.json +1 -1
  38. package/artifacts/contracts/Interfaces.sol/IUBIScheme.dbg.json +1 -1
  39. package/artifacts/contracts/Interfaces.sol/ProxyAdmin.dbg.json +1 -1
  40. package/artifacts/contracts/Interfaces.sol/Reserve.dbg.json +1 -1
  41. package/artifacts/contracts/Interfaces.sol/Staking.dbg.json +1 -1
  42. package/artifacts/contracts/Interfaces.sol/Uniswap.dbg.json +1 -1
  43. package/artifacts/contracts/Interfaces.sol/UniswapFactory.dbg.json +1 -1
  44. package/artifacts/contracts/Interfaces.sol/UniswapPair.dbg.json +1 -1
  45. package/artifacts/contracts/Interfaces.sol/cERC20.dbg.json +1 -1
  46. package/artifacts/contracts/Interfaces.sol/cERC20.json +13 -0
  47. package/artifacts/contracts/governance/ClaimersDistribution.sol/ClaimersDistribution.dbg.json +1 -1
  48. package/artifacts/contracts/governance/ClaimersDistribution.sol/ClaimersDistribution.json +2 -2
  49. package/artifacts/contracts/governance/CompoundVotingMachine.sol/CompoundVotingMachine.dbg.json +1 -1
  50. package/artifacts/contracts/governance/CompoundVotingMachine.sol/CompoundVotingMachine.json +2 -2
  51. package/artifacts/contracts/governance/GReputation.sol/GReputation.dbg.json +1 -1
  52. package/artifacts/contracts/governance/GReputation.sol/GReputation.json +2 -2
  53. package/artifacts/contracts/governance/GoodDollarStaking.sol/GoodDollarStaking.dbg.json +4 -0
  54. package/artifacts/contracts/governance/GoodDollarStaking.sol/GoodDollarStaking.json +1028 -0
  55. package/artifacts/contracts/governance/GoodDollarStaking.sol/RewardsMinter.dbg.json +4 -0
  56. package/artifacts/contracts/governance/GoodDollarStaking.sol/RewardsMinter.json +35 -0
  57. package/artifacts/contracts/governance/GovernanceStaking.sol/GovernanceStaking.dbg.json +1 -1
  58. package/artifacts/contracts/governance/GovernanceStaking.sol/GovernanceStaking.json +2 -2
  59. package/artifacts/contracts/governance/MultiBaseGovernanceShareField.sol/MultiBaseGovernanceShareField.dbg.json +1 -1
  60. package/artifacts/contracts/governance/Reputation.sol/Reputation.dbg.json +1 -1
  61. package/artifacts/contracts/governance/Reputation.sol/Reputation.json +2 -2
  62. package/artifacts/contracts/governance/StakersDistribution.sol/StakersDistribution.dbg.json +1 -1
  63. package/artifacts/contracts/governance/StakersDistribution.sol/StakersDistribution.json +2 -2
  64. package/artifacts/contracts/mocks/AaveMock.sol/AaveMock.dbg.json +1 -1
  65. package/artifacts/contracts/mocks/DAIMock.sol/DAIMock.dbg.json +1 -1
  66. package/artifacts/contracts/mocks/DecimalsMock.sol/DecimalsMock.dbg.json +1 -1
  67. package/artifacts/contracts/mocks/GoodCompoundStakingTest.sol/GoodCompoundStakingTest.dbg.json +1 -1
  68. package/artifacts/contracts/mocks/GoodCompoundStakingTest.sol/GoodCompoundStakingTest.json +2 -2
  69. package/artifacts/contracts/mocks/GoodFundManagerTest.sol/GoodFundManagerTest.dbg.json +1 -1
  70. package/artifacts/contracts/mocks/GoodFundManagerTest.sol/GoodFundManagerTest.json +2 -2
  71. package/artifacts/contracts/mocks/IncentiveControllerMock.sol/IncentiveControllerMock.dbg.json +1 -1
  72. package/artifacts/contracts/mocks/LendingPoolMock.sol/LendingPoolMock.dbg.json +1 -1
  73. package/artifacts/contracts/mocks/OverMintTester.sol/OverMintTester.dbg.json +1 -1
  74. package/artifacts/contracts/mocks/OverMintTester.sol/OverMintTester.json +2 -2
  75. package/artifacts/contracts/mocks/OverMintTesterRegularStake.sol/OverMintTesterRegularStake.dbg.json +1 -1
  76. package/artifacts/contracts/mocks/OverMintTesterRegularStake.sol/OverMintTesterRegularStake.json +2 -2
  77. package/artifacts/contracts/mocks/SixteenDecimalsTokenMock.sol/SixteenDecimalsTokenMock.dbg.json +1 -1
  78. package/artifacts/contracts/mocks/SwapHelperTest.sol/SwapHelperTest.dbg.json +1 -1
  79. package/artifacts/contracts/mocks/SwapHelperTest.sol/SwapHelperTest.json +2 -2
  80. package/artifacts/contracts/mocks/TwentyDecimalsTokenMock.sol/TwentyDecimalsTokenMock.dbg.json +1 -1
  81. package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock.dbg.json +1 -1
  82. package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock.json +2 -2
  83. package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock2.dbg.json +1 -1
  84. package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock2.json +2 -2
  85. package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock3.dbg.json +1 -1
  86. package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock3.json +2 -2
  87. package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock4.dbg.json +1 -1
  88. package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock4.json +2 -2
  89. package/artifacts/contracts/mocks/UsdcMock.sol/USDCMock.dbg.json +1 -1
  90. package/artifacts/contracts/mocks/cBATMock.sol/cBATMock.dbg.json +1 -1
  91. package/artifacts/contracts/mocks/cDAILowWorthMock.sol/cDAILowWorthMock.dbg.json +1 -1
  92. package/artifacts/contracts/mocks/cDAIMock.sol/cDAIMock.dbg.json +1 -1
  93. package/artifacts/contracts/mocks/cDAINonMintableMock.sol/cDAINonMintableMock.dbg.json +1 -1
  94. package/artifacts/contracts/mocks/cDecimalsMock.sol/cDecimalsMock.dbg.json +1 -1
  95. package/artifacts/contracts/mocks/cSDTMock.sol/cSDTMock.dbg.json +1 -1
  96. package/artifacts/contracts/mocks/cUSDCMock.sol/cUSDCMock.dbg.json +1 -1
  97. package/artifacts/contracts/reserve/DistributionHelper.sol/DistributionHelper.dbg.json +4 -0
  98. package/artifacts/contracts/reserve/DistributionHelper.sol/DistributionHelper.json +574 -0
  99. package/artifacts/contracts/reserve/ExchangeHelper.sol/ExchangeHelper.dbg.json +1 -1
  100. package/artifacts/contracts/reserve/ExchangeHelper.sol/ExchangeHelper.json +2 -2
  101. package/artifacts/contracts/reserve/GoodMarketMaker.sol/GoodMarketMaker.dbg.json +1 -1
  102. package/artifacts/contracts/reserve/GoodMarketMaker.sol/GoodMarketMaker.json +2 -2
  103. package/artifacts/contracts/reserve/GoodReserveCDai.sol/ContributionCalc.dbg.json +1 -1
  104. package/artifacts/contracts/reserve/GoodReserveCDai.sol/GoodReserveCDai.dbg.json +1 -1
  105. package/artifacts/contracts/reserve/GoodReserveCDai.sol/GoodReserveCDai.json +65 -2
  106. package/artifacts/contracts/staking/BaseShareField.sol/BaseShareField.dbg.json +1 -1
  107. package/artifacts/contracts/staking/BaseShareField.sol/BaseShareField.json +2 -2
  108. package/artifacts/contracts/staking/BaseShareFieldV2.sol/BaseShareFieldV2.dbg.json +1 -1
  109. package/artifacts/contracts/staking/BaseShareFieldV2.sol/BaseShareFieldV2.json +2 -2
  110. package/artifacts/contracts/staking/DonationsStaking.sol/DonationsStaking.dbg.json +1 -1
  111. package/artifacts/contracts/staking/DonationsStaking.sol/DonationsStaking.json +2 -2
  112. package/artifacts/contracts/staking/GoodFundManager.sol/GoodFundManager.dbg.json +1 -1
  113. package/artifacts/contracts/staking/GoodFundManager.sol/GoodFundManager.json +2 -2
  114. package/artifacts/contracts/staking/SimpleStaking.sol/SimpleStaking.dbg.json +1 -1
  115. package/artifacts/contracts/staking/SimpleStakingV2.sol/SimpleStakingV2.dbg.json +1 -1
  116. package/artifacts/contracts/staking/UniswapV2SwapHelper.sol/UniswapV2SwapHelper.dbg.json +1 -1
  117. package/artifacts/contracts/staking/UniswapV2SwapHelper.sol/UniswapV2SwapHelper.json +2 -2
  118. package/artifacts/contracts/staking/aave/AaveStakingFactory.sol/AaveStakingFactory.dbg.json +1 -1
  119. package/artifacts/contracts/staking/aave/AaveStakingFactory.sol/AaveStakingFactory.json +2 -2
  120. package/artifacts/contracts/staking/aave/GoodAaveStaking.sol/GoodAaveStaking.dbg.json +1 -1
  121. package/artifacts/contracts/staking/aave/GoodAaveStaking.sol/GoodAaveStaking.json +2 -2
  122. package/artifacts/contracts/staking/aave/GoodAaveStakingV2.sol/GoodAaveStakingV2.dbg.json +1 -1
  123. package/artifacts/contracts/staking/aave/GoodAaveStakingV2.sol/GoodAaveStakingV2.json +2 -2
  124. package/artifacts/contracts/staking/compound/CompoundStakingFactory.sol/CompoundStakingFactory.dbg.json +1 -1
  125. package/artifacts/contracts/staking/compound/CompoundStakingFactory.sol/CompoundStakingFactory.json +2 -2
  126. package/artifacts/contracts/staking/compound/GoodCompoundStaking.sol/GoodCompoundStaking.dbg.json +1 -1
  127. package/artifacts/contracts/staking/compound/GoodCompoundStaking.sol/GoodCompoundStaking.json +2 -2
  128. package/artifacts/contracts/staking/compound/GoodCompoundStakingV2.sol/GoodCompoundStakingV2.dbg.json +1 -1
  129. package/artifacts/contracts/staking/compound/GoodCompoundStakingV2.sol/GoodCompoundStakingV2.json +2 -2
  130. package/artifacts/contracts/staking/utils/Math64X64.sol/Math64x64.dbg.json +4 -0
  131. package/artifacts/contracts/staking/utils/Math64X64.sol/Math64x64.json +10 -0
  132. package/artifacts/contracts/staking/utils/StakingRewardsFixedAPY.sol/StakingRewardsFixedAPY.dbg.json +4 -0
  133. package/artifacts/contracts/staking/utils/StakingRewardsFixedAPY.sol/StakingRewardsFixedAPY.json +153 -0
  134. package/artifacts/contracts/ubi/UBIScheme.sol/UBIScheme.dbg.json +1 -1
  135. package/artifacts/contracts/ubi/UBIScheme.sol/UBIScheme.json +2 -2
  136. package/artifacts/contracts/utils/BancorFormula.sol/BancorFormula.dbg.json +1 -1
  137. package/artifacts/contracts/utils/BulkProof.sol/BulkProof.dbg.json +1 -1
  138. package/artifacts/contracts/utils/BulkProof.sol/BulkProof.json +2 -2
  139. package/artifacts/contracts/utils/DAOContract.sol/DAOContract.dbg.json +1 -1
  140. package/artifacts/contracts/utils/DAOContract.sol/DAOContract.json +2 -2
  141. package/artifacts/contracts/utils/DAOUpgradeableContract.sol/DAOUpgradeableContract.dbg.json +1 -1
  142. package/artifacts/contracts/utils/DAOUpgradeableContract.sol/DAOUpgradeableContract.json +2 -2
  143. package/artifacts/contracts/utils/DSMath.sol/DSMath.dbg.json +1 -1
  144. package/artifacts/contracts/utils/DataTypes.sol/DataTypes.dbg.json +1 -1
  145. package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/GoodDollarMintBurnWrapper.dbg.json +4 -0
  146. package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/GoodDollarMintBurnWrapper.json +954 -0
  147. package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/IRouter.dbg.json +4 -0
  148. package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/IRouter.json +59 -0
  149. package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/PausableControl.dbg.json +4 -0
  150. package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/PausableControl.json +69 -0
  151. package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/TokenOperation.dbg.json +4 -0
  152. package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/TokenOperation.json +10 -0
  153. package/artifacts/contracts/utils/NameService.sol/NameService.dbg.json +1 -1
  154. package/artifacts/contracts/utils/ProtocolUpgrade.sol/OldMarketMaker.dbg.json +1 -1
  155. package/artifacts/contracts/utils/ProtocolUpgrade.sol/ProtocolUpgrade.dbg.json +1 -1
  156. package/artifacts/contracts/utils/ProtocolUpgrade.sol/ProtocolUpgrade.json +2 -2
  157. package/artifacts/contracts/utils/ProtocolUpgradeFuse.sol/ProtocolUpgradeFuse.dbg.json +1 -1
  158. package/artifacts/contracts/utils/ProtocolUpgradeFuse.sol/ProtocolUpgradeFuse.json +2 -2
  159. package/artifacts/contracts/utils/ProtocolUpgradeFuseRecover.sol/ProtocolUpgradeFuseRecover.dbg.json +1 -1
  160. package/artifacts/contracts/utils/ProtocolUpgradeFuseRecover.sol/ProtocolUpgradeFuseRecover.json +2 -2
  161. package/artifacts/contracts/utils/ProtocolUpgradeRecover.sol/ProtocolUpgradeRecover.dbg.json +1 -1
  162. package/artifacts/contracts/utils/ProtocolUpgradeRecover.sol/ProtocolUpgradeRecover.json +2 -2
  163. package/artifacts/contracts/utils/ProxyFactory1967.sol/ERC1967Proxy.dbg.json +1 -1
  164. package/artifacts/contracts/utils/ProxyFactory1967.sol/ProxyFactory1967.dbg.json +1 -1
  165. package/artifacts/contracts/utils/ReputationTestHelper.sol/ReputationTestHelper.dbg.json +1 -1
  166. package/artifacts/contracts/utils/ReputationTestHelper.sol/ReputationTestHelper.json +2 -2
  167. package/contracts/Interfaces.sol +12 -0
  168. package/contracts/governance/GoodDollarStaking.sol +260 -0
  169. package/contracts/reserve/DistributionHelper.sol +118 -0
  170. package/contracts/reserve/GoodReserveCDai.sol +28 -1
  171. package/contracts/staking/utils/Math64X64.sol +268 -0
  172. package/contracts/staking/utils/StakingRewardsFixedAPY.sol +141 -0
  173. package/contracts/utils/GoodDollarMintBurnWrapper.sol +417 -0
  174. package/package.json +1 -1
  175. package/releases/deployment.json +4 -1
  176. package/scripts/multichain-deploy/basicdao-deploy.ts +22 -20
  177. package/scripts/multichain-deploy/helpers.ts +5 -3
  178. package/scripts/multichain-deploy/multichainWrapper-deploy.ts +67 -0
  179. package/scripts/voltageswaps.ts +47 -0
@@ -114,8 +114,8 @@
114
114
  "type": "receive"
115
115
  }
116
116
  ],
117
- "bytecode": "0x60806040523480156200001157600080fd5b5060405162001ae138038062001ae1833981016040819052620000349162000116565b600080546001600160a01b038085166001600160a01b03199283168117909355600180549185169190921617905560408051632d77bef360e11b81529051635aef7de691600480820192602092909190829003018186803b1580156200009957600080fd5b505afa158015620000ae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d4919062000155565b600280546001600160a01b0319166001600160a01b0392909216919091179055506200017c9050565b6001600160a01b03811681146200011357600080fd5b50565b600080604083850312156200012a57600080fd5b82516200013781620000fd565b60208401519092506200014a81620000fd565b809150509250929050565b6000602082840312156200016857600080fd5b81516200017581620000fd565b9392505050565b611955806200018c6000396000f3fe60806040526004361061004e5760003560e01c80631fedded51461005a5780633f40cf5b1461007c5780638815bdae1461009c57806391ea50ae146100bc578063bdc27b9b146100dc57600080fd5b3661005557005b600080fd5b34801561006657600080fd5b5061007a61007536600461138f565b6100fc565b005b34801561008857600080fd5b5061007a6100973660046113b3565b610314565b3480156100a857600080fd5b5061007a6100b736600461142a565b6104e6565b3480156100c857600080fd5b5061007a6100d7366004611580565b6105c6565b3480156100e857600080fd5b5061007a6100f736600461138f565b61086c565b6001546001600160a01b0316331461012f5760405162461bcd60e51b815260040161012690611655565b60405180910390fd5b6000805460025460405163e869d45f60e01b81526001600160a01b0385811660048301526024820194909452601f60e01b6044820152908316606482015291169063e869d45f90608401602060405180830381600087803b15801561019357600080fd5b505af11580156101a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101cb919061168e565b6102285760405162461bcd60e51b815260206004820152602860248201527f7265676973746572696e6720636f6d706f756e64566f74696e674d616368696e604482015267194819985a5b195960c21b6064820152608401610126565b600054600254604051636c525b1360e01b81526001600160a01b0392831692636c525b139261025c929116906004016116a9565b602060405180830381600087803b15801561027657600080fd5b505af115801561028a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ae919061168e565b6103065760405162461bcd60e51b8152602060048201526024808201527f756e7265676973746572696e672070726f746f636f6c757067726164652066616044820152631a5b195960e21b6064820152608401610126565b6001546001600160a01b0316ff5b6001546001600160a01b0316331461033e5760405162461bcd60e51b815260040161012690611655565b6000805460405163bf40fac160e01b81526001600160a01b039182169163d1b7089a919086169063bf40fac190610377906004016116bd565b60206040518083038186803b15801561038f57600080fd5b505afa1580156103a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c791906116de565b6040516024810186905260440160408051601f198184030181529181526020820180516001600160e01b0316630a7445bf60e41b179052600254905160e085901b6001600160e01b031916815261042f9392916001600160a01b031690600090600401611727565b600060405180830381600087803b15801561044957600080fd5b505af115801561045d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104859190810190611778565b509050806104e15760405162461bcd60e51b815260206004820152602360248201527f43616c6c696e67207365745265736572766547445841697264726f70206661696044820152621b195960ea1b6064820152608401610126565b505050565b6001546001600160a01b031633146105105760405162461bcd60e51b815260040161012690611655565b8281146105515760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610126565b6105bf85858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040805160208089028281018201909352888252909350889250879182918501908490808284376000920191909152506108ab92505050565b5050505050565b6001546001600160a01b031633146105f05760405162461bcd60e51b815260040161012690611655565b805182511461063b5760405162461bcd60e51b81526020600482015260176024820152760e6e8c2d6d2dcce40d8cadccee8d040dad2e6dac2e8c6d604b1b6044820152606401610126565b60005b8251811015610866576000805460405163bf40fac160e01b815260206004820152600c60248201526b232aa7222fa6a0a720a3a2a960a11b60448201526001600160a01b039182169163d1b7089a919088169063bf40fac19060640160206040518083038186803b1580156106b257600080fd5b505afa1580156106c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ea91906116de565b8585815181106106fc576106fc61181f565b60200260200101518786815181106107165761071661181f565b602090810291909101015160405160248101929092526001600160a01b031660448201526000606482018190526084820181905260a482015260c40160408051601f198184030181529181526020820180516001600160e01b0316631f1ad8ed60e21b179052600254905160e085901b6001600160e01b03191681526107ad9392916001600160a01b031690600090600401611727565b600060405180830381600087803b1580156107c757600080fd5b505af11580156107db573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108039190810190611778565b509050806108535760405162461bcd60e51b815260206004820181905260248201527f43616c6c696e67207365745374616b696e6752657761726473206661696c65646044820152606401610126565b508061085e81611835565b91505061063e565b50505050565b6001546001600160a01b031633146108965760405162461bcd60e51b815260040161012690611655565b61089f816109e6565b6108a881610eea565b50565b600080546040516001600160a01b039091169063d1b7089a9086906108d6908790879060240161185e565b60408051601f198184030181529181526020820180516001600160e01b0316634ab01f5b60e01b179052600254905160e085901b6001600160e01b03191681526109319392916001600160a01b031690600090600401611727565b600060405180830381600087803b15801561094b57600080fd5b505af115801561095f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109879190810190611778565b509050806108665760405162461bcd60e51b815260206004820152602660248201527f43616c6c696e67207365744e616d6553657276696365436f6e7472616374732060448201526519985a5b195960d21b6064820152608401610126565b6000805460405163bf40fac160e01b81526001600160a01b039182169163d1b7089a919085169063bf40fac190610a1f906004016118e2565b60206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6f91906116de565b60405163bf40fac160e01b81526001600160a01b0386169063bf40fac190610a99906004016116bd565b60206040518083038186803b158015610ab157600080fd5b505afa158015610ac5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae991906116de565b604051602401610af991906116a9565b60408051601f198184030181529181526020820180516001600160e01b0316634c1d96ab60e11b179052600254905160e085901b6001600160e01b0319168152610b549392916001600160a01b031690600090600401611727565b600060405180830381600087803b158015610b6e57600080fd5b505af1158015610b82573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610baa9190810190611778565b50905080610bf55760405162461bcd60e51b815260206004820152601860248201527710d85b1b1a5b99c8185919135a5b9d195c8819985a5b195960421b6044820152606401610126565b60005460405163bf40fac160e01b81526001600160a01b039182169163d1b7089a919085169063bf40fac190610c2d906004016118e2565b60206040518083038186803b158015610c4557600080fd5b505afa158015610c59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7d91906116de565b6040805160048082526024820183526020820180516001600160e01b0316639865027560e01b179052600254925160e086901b6001600160e01b0319168152610cd494936001600160a01b03169160009101611727565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d2a9190810190611778565b50905080610d7a5760405162461bcd60e51b815260206004820152601d60248201527f43616c6c696e672072656e6f756e63654d696e746572206661696c65640000006044820152606401610126565b60005460405163bf40fac160e01b81526001600160a01b039182169163e4537a74919085169063bf40fac190610db2906004016116bd565b60206040518083038186803b158015610dca57600080fd5b505afa158015610dde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0291906116de565b60025460405160e084901b6001600160e01b03191681526001600160a01b0392831660048201526000602482015291166044820152606401602060405180830381600087803b158015610e5457600080fd5b505af1158015610e68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8c919061168e565b905080610ee65760405162461bcd60e51b815260206004820152602260248201527f43616c6c696e6720616464476c6f62616c436f6e73747261696e74206661696c604482015261195960f21b6064820152608401610126565b5050565b600080826001600160a01b031663bf40fac16040518163ffffffff1660e01b8152600401610f30906020808252600490820152634344414960e01b604082015260600190565b60206040518083038186803b158015610f4857600080fd5b505afa158015610f5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8091906116de565b6002546040516370a0823160e01b81529192506000916001600160a01b03808516926370a0823192610fb892909116906004016116a9565b60206040518083038186803b158015610fd057600080fd5b505afa158015610fe4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110089190611906565b60005460405163bf40fac160e01b81529192506001600160a01b039081169163b9a04cdd9185919088169063bf40fac190611045906004016116bd565b60206040518083038186803b15801561105d57600080fd5b505afa158015611071573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109591906116de565b60025460405160e085901b6001600160e01b03191681526001600160a01b039384166004820152918316602483015260448201869052919091166064820152608401602060405180830381600087803b1580156110f157600080fd5b505af1158015611105573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611129919061168e565b9250826111845760405162461bcd60e51b815260206004820152602360248201527f7472616e73666572206364616920746f206e65772072657365727665206661696044820152621b195960ea1b6064820152608401610126565b60005460405163bf40fac160e01b815260206004820152600c60248201526b26a0a925a2aa2fa6a0a5a2a960a11b60448201526001600160a01b039182169163d1b7089a919087169063bf40fac19060640160206040518083038186803b1580156111ee57600080fd5b505afa158015611202573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122691906116de565b6040516001600160a01b0386166024820152648cd0c73ebb6044820152660f5e1925bd0bc76064820152620c4b0b6084820152636216391460a482015260c40160408051601f198184030181529181526020820180516001600160e01b0316638ee090fb60e01b179052600254905160e085901b6001600160e01b03191681526112c19392916001600160a01b031690600090600401611727565b600060405180830381600087803b1580156112db57600080fd5b505af11580156112ef573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113179190810190611778565b509250826108665760405162461bcd60e51b815260206004820152602a60248201527f63616c6c696e67206d61726b65744d616b657220696e697469616c697a65546f6044820152691ad95b8819985a5b195960b21b6064820152608401610126565b6001600160a01b03811681146108a857600080fd5b6000602082840312156113a157600080fd5b81356113ac8161137a565b9392505050565b600080604083850312156113c657600080fd5b82356113d18161137a565b946020939093013593505050565b60008083601f8401126113f157600080fd5b5081356001600160401b0381111561140857600080fd5b6020830191508360208260051b850101111561142357600080fd5b9250929050565b60008060008060006060868803121561144257600080fd5b853561144d8161137a565b945060208601356001600160401b038082111561146957600080fd5b61147589838a016113df565b9096509450604088013591508082111561148e57600080fd5b5061149b888289016113df565b969995985093965092949392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156114ea576114ea6114ac565b604052919050565b60006001600160401b0382111561150b5761150b6114ac565b5060051b60200190565b600082601f83011261152657600080fd5b8135602061153b611536836114f2565b6114c2565b82815260059290921b8401810191818101908684111561155a57600080fd5b8286015b84811015611575578035835291830191830161155e565b509695505050505050565b60008060006060848603121561159557600080fd5b83356115a08161137a565b92506020848101356001600160401b03808211156115bd57600080fd5b818701915087601f8301126115d157600080fd5b81356115df611536826114f2565b81815260059190911b8301840190848101908a8311156115fe57600080fd5b938501935b828510156116255784356116168161137a565b82529385019390850190611603565b96505050604087013592508083111561163d57600080fd5b505061164b86828701611515565b9150509250925092565b6020808252600a908201526937b7363c9037bbb732b960b11b604082015260600190565b8051801515811461168957600080fd5b919050565b6000602082840312156116a057600080fd5b6113ac82611679565b6001600160a01b0391909116815260200190565b6020808252600790820152665245534552564560c81b604082015260600190565b6000602082840312156116f057600080fd5b81516113ac8161137a565b60005b838110156117165781810151838201526020016116fe565b838111156108665750506000910152565b600060018060a01b0380871683526080602084015285518060808501526117558160a0860160208a016116fb565b9416604083015250606081019190915260a0601f909201601f1916010192915050565b6000806040838503121561178b57600080fd5b61179483611679565b60208401519092506001600160401b03808211156117b157600080fd5b818501915085601f8301126117c557600080fd5b8151818111156117d7576117d76114ac565b6117ea601f8201601f19166020016114c2565b915080825286602082850101111561180157600080fd5b6118128160208401602086016116fb565b5080925050509250929050565b634e487b7160e01b600052603260045260246000fd5b600060001982141561185757634e487b7160e01b600052601160045260246000fd5b5060010190565b604080825283519082018190526000906020906060840190828701845b828110156118975781518452928401929084019060010161187b565b5050508381038285015284518082528583019183019060005b818110156118d55783516001600160a01b0316835292840192918401916001016118b0565b5090979650505050505050565b6020808252600a908201526923a7a7a22227a62620a960b11b604082015260600190565b60006020828403121561191857600080fd5b505191905056fea2646970667358221220a21b279b283883dd54445ef1b90ca1c3c566c619ccfbff391ee6831d72a3031b64736f6c63430008080033",
118
- "deployedBytecode": "0x60806040526004361061004e5760003560e01c80631fedded51461005a5780633f40cf5b1461007c5780638815bdae1461009c57806391ea50ae146100bc578063bdc27b9b146100dc57600080fd5b3661005557005b600080fd5b34801561006657600080fd5b5061007a61007536600461138f565b6100fc565b005b34801561008857600080fd5b5061007a6100973660046113b3565b610314565b3480156100a857600080fd5b5061007a6100b736600461142a565b6104e6565b3480156100c857600080fd5b5061007a6100d7366004611580565b6105c6565b3480156100e857600080fd5b5061007a6100f736600461138f565b61086c565b6001546001600160a01b0316331461012f5760405162461bcd60e51b815260040161012690611655565b60405180910390fd5b6000805460025460405163e869d45f60e01b81526001600160a01b0385811660048301526024820194909452601f60e01b6044820152908316606482015291169063e869d45f90608401602060405180830381600087803b15801561019357600080fd5b505af11580156101a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101cb919061168e565b6102285760405162461bcd60e51b815260206004820152602860248201527f7265676973746572696e6720636f6d706f756e64566f74696e674d616368696e604482015267194819985a5b195960c21b6064820152608401610126565b600054600254604051636c525b1360e01b81526001600160a01b0392831692636c525b139261025c929116906004016116a9565b602060405180830381600087803b15801561027657600080fd5b505af115801561028a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ae919061168e565b6103065760405162461bcd60e51b8152602060048201526024808201527f756e7265676973746572696e672070726f746f636f6c757067726164652066616044820152631a5b195960e21b6064820152608401610126565b6001546001600160a01b0316ff5b6001546001600160a01b0316331461033e5760405162461bcd60e51b815260040161012690611655565b6000805460405163bf40fac160e01b81526001600160a01b039182169163d1b7089a919086169063bf40fac190610377906004016116bd565b60206040518083038186803b15801561038f57600080fd5b505afa1580156103a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c791906116de565b6040516024810186905260440160408051601f198184030181529181526020820180516001600160e01b0316630a7445bf60e41b179052600254905160e085901b6001600160e01b031916815261042f9392916001600160a01b031690600090600401611727565b600060405180830381600087803b15801561044957600080fd5b505af115801561045d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104859190810190611778565b509050806104e15760405162461bcd60e51b815260206004820152602360248201527f43616c6c696e67207365745265736572766547445841697264726f70206661696044820152621b195960ea1b6064820152608401610126565b505050565b6001546001600160a01b031633146105105760405162461bcd60e51b815260040161012690611655565b8281146105515760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610126565b6105bf85858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040805160208089028281018201909352888252909350889250879182918501908490808284376000920191909152506108ab92505050565b5050505050565b6001546001600160a01b031633146105f05760405162461bcd60e51b815260040161012690611655565b805182511461063b5760405162461bcd60e51b81526020600482015260176024820152760e6e8c2d6d2dcce40d8cadccee8d040dad2e6dac2e8c6d604b1b6044820152606401610126565b60005b8251811015610866576000805460405163bf40fac160e01b815260206004820152600c60248201526b232aa7222fa6a0a720a3a2a960a11b60448201526001600160a01b039182169163d1b7089a919088169063bf40fac19060640160206040518083038186803b1580156106b257600080fd5b505afa1580156106c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ea91906116de565b8585815181106106fc576106fc61181f565b60200260200101518786815181106107165761071661181f565b602090810291909101015160405160248101929092526001600160a01b031660448201526000606482018190526084820181905260a482015260c40160408051601f198184030181529181526020820180516001600160e01b0316631f1ad8ed60e21b179052600254905160e085901b6001600160e01b03191681526107ad9392916001600160a01b031690600090600401611727565b600060405180830381600087803b1580156107c757600080fd5b505af11580156107db573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108039190810190611778565b509050806108535760405162461bcd60e51b815260206004820181905260248201527f43616c6c696e67207365745374616b696e6752657761726473206661696c65646044820152606401610126565b508061085e81611835565b91505061063e565b50505050565b6001546001600160a01b031633146108965760405162461bcd60e51b815260040161012690611655565b61089f816109e6565b6108a881610eea565b50565b600080546040516001600160a01b039091169063d1b7089a9086906108d6908790879060240161185e565b60408051601f198184030181529181526020820180516001600160e01b0316634ab01f5b60e01b179052600254905160e085901b6001600160e01b03191681526109319392916001600160a01b031690600090600401611727565b600060405180830381600087803b15801561094b57600080fd5b505af115801561095f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109879190810190611778565b509050806108665760405162461bcd60e51b815260206004820152602660248201527f43616c6c696e67207365744e616d6553657276696365436f6e7472616374732060448201526519985a5b195960d21b6064820152608401610126565b6000805460405163bf40fac160e01b81526001600160a01b039182169163d1b7089a919085169063bf40fac190610a1f906004016118e2565b60206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6f91906116de565b60405163bf40fac160e01b81526001600160a01b0386169063bf40fac190610a99906004016116bd565b60206040518083038186803b158015610ab157600080fd5b505afa158015610ac5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae991906116de565b604051602401610af991906116a9565b60408051601f198184030181529181526020820180516001600160e01b0316634c1d96ab60e11b179052600254905160e085901b6001600160e01b0319168152610b549392916001600160a01b031690600090600401611727565b600060405180830381600087803b158015610b6e57600080fd5b505af1158015610b82573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610baa9190810190611778565b50905080610bf55760405162461bcd60e51b815260206004820152601860248201527710d85b1b1a5b99c8185919135a5b9d195c8819985a5b195960421b6044820152606401610126565b60005460405163bf40fac160e01b81526001600160a01b039182169163d1b7089a919085169063bf40fac190610c2d906004016118e2565b60206040518083038186803b158015610c4557600080fd5b505afa158015610c59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7d91906116de565b6040805160048082526024820183526020820180516001600160e01b0316639865027560e01b179052600254925160e086901b6001600160e01b0319168152610cd494936001600160a01b03169160009101611727565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d2a9190810190611778565b50905080610d7a5760405162461bcd60e51b815260206004820152601d60248201527f43616c6c696e672072656e6f756e63654d696e746572206661696c65640000006044820152606401610126565b60005460405163bf40fac160e01b81526001600160a01b039182169163e4537a74919085169063bf40fac190610db2906004016116bd565b60206040518083038186803b158015610dca57600080fd5b505afa158015610dde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0291906116de565b60025460405160e084901b6001600160e01b03191681526001600160a01b0392831660048201526000602482015291166044820152606401602060405180830381600087803b158015610e5457600080fd5b505af1158015610e68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8c919061168e565b905080610ee65760405162461bcd60e51b815260206004820152602260248201527f43616c6c696e6720616464476c6f62616c436f6e73747261696e74206661696c604482015261195960f21b6064820152608401610126565b5050565b600080826001600160a01b031663bf40fac16040518163ffffffff1660e01b8152600401610f30906020808252600490820152634344414960e01b604082015260600190565b60206040518083038186803b158015610f4857600080fd5b505afa158015610f5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8091906116de565b6002546040516370a0823160e01b81529192506000916001600160a01b03808516926370a0823192610fb892909116906004016116a9565b60206040518083038186803b158015610fd057600080fd5b505afa158015610fe4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110089190611906565b60005460405163bf40fac160e01b81529192506001600160a01b039081169163b9a04cdd9185919088169063bf40fac190611045906004016116bd565b60206040518083038186803b15801561105d57600080fd5b505afa158015611071573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109591906116de565b60025460405160e085901b6001600160e01b03191681526001600160a01b039384166004820152918316602483015260448201869052919091166064820152608401602060405180830381600087803b1580156110f157600080fd5b505af1158015611105573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611129919061168e565b9250826111845760405162461bcd60e51b815260206004820152602360248201527f7472616e73666572206364616920746f206e65772072657365727665206661696044820152621b195960ea1b6064820152608401610126565b60005460405163bf40fac160e01b815260206004820152600c60248201526b26a0a925a2aa2fa6a0a5a2a960a11b60448201526001600160a01b039182169163d1b7089a919087169063bf40fac19060640160206040518083038186803b1580156111ee57600080fd5b505afa158015611202573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122691906116de565b6040516001600160a01b0386166024820152648cd0c73ebb6044820152660f5e1925bd0bc76064820152620c4b0b6084820152636216391460a482015260c40160408051601f198184030181529181526020820180516001600160e01b0316638ee090fb60e01b179052600254905160e085901b6001600160e01b03191681526112c19392916001600160a01b031690600090600401611727565b600060405180830381600087803b1580156112db57600080fd5b505af11580156112ef573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113179190810190611778565b509250826108665760405162461bcd60e51b815260206004820152602a60248201527f63616c6c696e67206d61726b65744d616b657220696e697469616c697a65546f6044820152691ad95b8819985a5b195960b21b6064820152608401610126565b6001600160a01b03811681146108a857600080fd5b6000602082840312156113a157600080fd5b81356113ac8161137a565b9392505050565b600080604083850312156113c657600080fd5b82356113d18161137a565b946020939093013593505050565b60008083601f8401126113f157600080fd5b5081356001600160401b0381111561140857600080fd5b6020830191508360208260051b850101111561142357600080fd5b9250929050565b60008060008060006060868803121561144257600080fd5b853561144d8161137a565b945060208601356001600160401b038082111561146957600080fd5b61147589838a016113df565b9096509450604088013591508082111561148e57600080fd5b5061149b888289016113df565b969995985093965092949392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156114ea576114ea6114ac565b604052919050565b60006001600160401b0382111561150b5761150b6114ac565b5060051b60200190565b600082601f83011261152657600080fd5b8135602061153b611536836114f2565b6114c2565b82815260059290921b8401810191818101908684111561155a57600080fd5b8286015b84811015611575578035835291830191830161155e565b509695505050505050565b60008060006060848603121561159557600080fd5b83356115a08161137a565b92506020848101356001600160401b03808211156115bd57600080fd5b818701915087601f8301126115d157600080fd5b81356115df611536826114f2565b81815260059190911b8301840190848101908a8311156115fe57600080fd5b938501935b828510156116255784356116168161137a565b82529385019390850190611603565b96505050604087013592508083111561163d57600080fd5b505061164b86828701611515565b9150509250925092565b6020808252600a908201526937b7363c9037bbb732b960b11b604082015260600190565b8051801515811461168957600080fd5b919050565b6000602082840312156116a057600080fd5b6113ac82611679565b6001600160a01b0391909116815260200190565b6020808252600790820152665245534552564560c81b604082015260600190565b6000602082840312156116f057600080fd5b81516113ac8161137a565b60005b838110156117165781810151838201526020016116fe565b838111156108665750506000910152565b600060018060a01b0380871683526080602084015285518060808501526117558160a0860160208a016116fb565b9416604083015250606081019190915260a0601f909201601f1916010192915050565b6000806040838503121561178b57600080fd5b61179483611679565b60208401519092506001600160401b03808211156117b157600080fd5b818501915085601f8301126117c557600080fd5b8151818111156117d7576117d76114ac565b6117ea601f8201601f19166020016114c2565b915080825286602082850101111561180157600080fd5b6118128160208401602086016116fb565b5080925050509250929050565b634e487b7160e01b600052603260045260246000fd5b600060001982141561185757634e487b7160e01b600052601160045260246000fd5b5060010190565b604080825283519082018190526000906020906060840190828701845b828110156118975781518452928401929084019060010161187b565b5050508381038285015284518082528583019183019060005b818110156118d55783516001600160a01b0316835292840192918401916001016118b0565b5090979650505050505050565b6020808252600a908201526923a7a7a22227a62620a960b11b604082015260600190565b60006020828403121561191857600080fd5b505191905056fea2646970667358221220a21b279b283883dd54445ef1b90ca1c3c566c619ccfbff391ee6831d72a3031b64736f6c63430008080033",
117
+ "bytecode": "0x60806040523480156200001157600080fd5b5060405162001ae138038062001ae1833981016040819052620000349162000116565b600080546001600160a01b038085166001600160a01b03199283168117909355600180549185169190921617905560408051632d77bef360e11b81529051635aef7de691600480820192602092909190829003018186803b1580156200009957600080fd5b505afa158015620000ae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d4919062000155565b600280546001600160a01b0319166001600160a01b0392909216919091179055506200017c9050565b6001600160a01b03811681146200011357600080fd5b50565b600080604083850312156200012a57600080fd5b82516200013781620000fd565b60208401519092506200014a81620000fd565b809150509250929050565b6000602082840312156200016857600080fd5b81516200017581620000fd565b9392505050565b611955806200018c6000396000f3fe60806040526004361061004e5760003560e01c80631fedded51461005a5780633f40cf5b1461007c5780638815bdae1461009c57806391ea50ae146100bc578063bdc27b9b146100dc57600080fd5b3661005557005b600080fd5b34801561006657600080fd5b5061007a61007536600461138f565b6100fc565b005b34801561008857600080fd5b5061007a6100973660046113b3565b610314565b3480156100a857600080fd5b5061007a6100b736600461142a565b6104e6565b3480156100c857600080fd5b5061007a6100d7366004611580565b6105c6565b3480156100e857600080fd5b5061007a6100f736600461138f565b61086c565b6001546001600160a01b0316331461012f5760405162461bcd60e51b815260040161012690611655565b60405180910390fd5b6000805460025460405163e869d45f60e01b81526001600160a01b0385811660048301526024820194909452601f60e01b6044820152908316606482015291169063e869d45f90608401602060405180830381600087803b15801561019357600080fd5b505af11580156101a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101cb919061168e565b6102285760405162461bcd60e51b815260206004820152602860248201527f7265676973746572696e6720636f6d706f756e64566f74696e674d616368696e604482015267194819985a5b195960c21b6064820152608401610126565b600054600254604051636c525b1360e01b81526001600160a01b0392831692636c525b139261025c929116906004016116a9565b602060405180830381600087803b15801561027657600080fd5b505af115801561028a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ae919061168e565b6103065760405162461bcd60e51b8152602060048201526024808201527f756e7265676973746572696e672070726f746f636f6c757067726164652066616044820152631a5b195960e21b6064820152608401610126565b6001546001600160a01b0316ff5b6001546001600160a01b0316331461033e5760405162461bcd60e51b815260040161012690611655565b6000805460405163bf40fac160e01b81526001600160a01b039182169163d1b7089a919086169063bf40fac190610377906004016116bd565b60206040518083038186803b15801561038f57600080fd5b505afa1580156103a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c791906116de565b6040516024810186905260440160408051601f198184030181529181526020820180516001600160e01b0316630a7445bf60e41b179052600254905160e085901b6001600160e01b031916815261042f9392916001600160a01b031690600090600401611727565b600060405180830381600087803b15801561044957600080fd5b505af115801561045d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104859190810190611778565b509050806104e15760405162461bcd60e51b815260206004820152602360248201527f43616c6c696e67207365745265736572766547445841697264726f70206661696044820152621b195960ea1b6064820152608401610126565b505050565b6001546001600160a01b031633146105105760405162461bcd60e51b815260040161012690611655565b8281146105515760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610126565b6105bf85858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040805160208089028281018201909352888252909350889250879182918501908490808284376000920191909152506108ab92505050565b5050505050565b6001546001600160a01b031633146105f05760405162461bcd60e51b815260040161012690611655565b805182511461063b5760405162461bcd60e51b81526020600482015260176024820152760e6e8c2d6d2dcce40d8cadccee8d040dad2e6dac2e8c6d604b1b6044820152606401610126565b60005b8251811015610866576000805460405163bf40fac160e01b815260206004820152600c60248201526b232aa7222fa6a0a720a3a2a960a11b60448201526001600160a01b039182169163d1b7089a919088169063bf40fac19060640160206040518083038186803b1580156106b257600080fd5b505afa1580156106c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ea91906116de565b8585815181106106fc576106fc61181f565b60200260200101518786815181106107165761071661181f565b602090810291909101015160405160248101929092526001600160a01b031660448201526000606482018190526084820181905260a482015260c40160408051601f198184030181529181526020820180516001600160e01b0316631f1ad8ed60e21b179052600254905160e085901b6001600160e01b03191681526107ad9392916001600160a01b031690600090600401611727565b600060405180830381600087803b1580156107c757600080fd5b505af11580156107db573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108039190810190611778565b509050806108535760405162461bcd60e51b815260206004820181905260248201527f43616c6c696e67207365745374616b696e6752657761726473206661696c65646044820152606401610126565b508061085e81611835565b91505061063e565b50505050565b6001546001600160a01b031633146108965760405162461bcd60e51b815260040161012690611655565b61089f816109e6565b6108a881610eea565b50565b600080546040516001600160a01b039091169063d1b7089a9086906108d6908790879060240161185e565b60408051601f198184030181529181526020820180516001600160e01b0316634ab01f5b60e01b179052600254905160e085901b6001600160e01b03191681526109319392916001600160a01b031690600090600401611727565b600060405180830381600087803b15801561094b57600080fd5b505af115801561095f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109879190810190611778565b509050806108665760405162461bcd60e51b815260206004820152602660248201527f43616c6c696e67207365744e616d6553657276696365436f6e7472616374732060448201526519985a5b195960d21b6064820152608401610126565b6000805460405163bf40fac160e01b81526001600160a01b039182169163d1b7089a919085169063bf40fac190610a1f906004016118e2565b60206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6f91906116de565b60405163bf40fac160e01b81526001600160a01b0386169063bf40fac190610a99906004016116bd565b60206040518083038186803b158015610ab157600080fd5b505afa158015610ac5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae991906116de565b604051602401610af991906116a9565b60408051601f198184030181529181526020820180516001600160e01b0316634c1d96ab60e11b179052600254905160e085901b6001600160e01b0319168152610b549392916001600160a01b031690600090600401611727565b600060405180830381600087803b158015610b6e57600080fd5b505af1158015610b82573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610baa9190810190611778565b50905080610bf55760405162461bcd60e51b815260206004820152601860248201527710d85b1b1a5b99c8185919135a5b9d195c8819985a5b195960421b6044820152606401610126565b60005460405163bf40fac160e01b81526001600160a01b039182169163d1b7089a919085169063bf40fac190610c2d906004016118e2565b60206040518083038186803b158015610c4557600080fd5b505afa158015610c59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7d91906116de565b6040805160048082526024820183526020820180516001600160e01b0316639865027560e01b179052600254925160e086901b6001600160e01b0319168152610cd494936001600160a01b03169160009101611727565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d2a9190810190611778565b50905080610d7a5760405162461bcd60e51b815260206004820152601d60248201527f43616c6c696e672072656e6f756e63654d696e746572206661696c65640000006044820152606401610126565b60005460405163bf40fac160e01b81526001600160a01b039182169163e4537a74919085169063bf40fac190610db2906004016116bd565b60206040518083038186803b158015610dca57600080fd5b505afa158015610dde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0291906116de565b60025460405160e084901b6001600160e01b03191681526001600160a01b0392831660048201526000602482015291166044820152606401602060405180830381600087803b158015610e5457600080fd5b505af1158015610e68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8c919061168e565b905080610ee65760405162461bcd60e51b815260206004820152602260248201527f43616c6c696e6720616464476c6f62616c436f6e73747261696e74206661696c604482015261195960f21b6064820152608401610126565b5050565b600080826001600160a01b031663bf40fac16040518163ffffffff1660e01b8152600401610f30906020808252600490820152634344414960e01b604082015260600190565b60206040518083038186803b158015610f4857600080fd5b505afa158015610f5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8091906116de565b6002546040516370a0823160e01b81529192506000916001600160a01b03808516926370a0823192610fb892909116906004016116a9565b60206040518083038186803b158015610fd057600080fd5b505afa158015610fe4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110089190611906565b60005460405163bf40fac160e01b81529192506001600160a01b039081169163b9a04cdd9185919088169063bf40fac190611045906004016116bd565b60206040518083038186803b15801561105d57600080fd5b505afa158015611071573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109591906116de565b60025460405160e085901b6001600160e01b03191681526001600160a01b039384166004820152918316602483015260448201869052919091166064820152608401602060405180830381600087803b1580156110f157600080fd5b505af1158015611105573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611129919061168e565b9250826111845760405162461bcd60e51b815260206004820152602360248201527f7472616e73666572206364616920746f206e65772072657365727665206661696044820152621b195960ea1b6064820152608401610126565b60005460405163bf40fac160e01b815260206004820152600c60248201526b26a0a925a2aa2fa6a0a5a2a960a11b60448201526001600160a01b039182169163d1b7089a919087169063bf40fac19060640160206040518083038186803b1580156111ee57600080fd5b505afa158015611202573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122691906116de565b6040516001600160a01b0386166024820152648cd0c73ebb6044820152660f5e1925bd0bc76064820152620c4b0b6084820152636216391460a482015260c40160408051601f198184030181529181526020820180516001600160e01b0316638ee090fb60e01b179052600254905160e085901b6001600160e01b03191681526112c19392916001600160a01b031690600090600401611727565b600060405180830381600087803b1580156112db57600080fd5b505af11580156112ef573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113179190810190611778565b509250826108665760405162461bcd60e51b815260206004820152602a60248201527f63616c6c696e67206d61726b65744d616b657220696e697469616c697a65546f6044820152691ad95b8819985a5b195960b21b6064820152608401610126565b6001600160a01b03811681146108a857600080fd5b6000602082840312156113a157600080fd5b81356113ac8161137a565b9392505050565b600080604083850312156113c657600080fd5b82356113d18161137a565b946020939093013593505050565b60008083601f8401126113f157600080fd5b5081356001600160401b0381111561140857600080fd5b6020830191508360208260051b850101111561142357600080fd5b9250929050565b60008060008060006060868803121561144257600080fd5b853561144d8161137a565b945060208601356001600160401b038082111561146957600080fd5b61147589838a016113df565b9096509450604088013591508082111561148e57600080fd5b5061149b888289016113df565b969995985093965092949392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156114ea576114ea6114ac565b604052919050565b60006001600160401b0382111561150b5761150b6114ac565b5060051b60200190565b600082601f83011261152657600080fd5b8135602061153b611536836114f2565b6114c2565b82815260059290921b8401810191818101908684111561155a57600080fd5b8286015b84811015611575578035835291830191830161155e565b509695505050505050565b60008060006060848603121561159557600080fd5b83356115a08161137a565b92506020848101356001600160401b03808211156115bd57600080fd5b818701915087601f8301126115d157600080fd5b81356115df611536826114f2565b81815260059190911b8301840190848101908a8311156115fe57600080fd5b938501935b828510156116255784356116168161137a565b82529385019390850190611603565b96505050604087013592508083111561163d57600080fd5b505061164b86828701611515565b9150509250925092565b6020808252600a908201526937b7363c9037bbb732b960b11b604082015260600190565b8051801515811461168957600080fd5b919050565b6000602082840312156116a057600080fd5b6113ac82611679565b6001600160a01b0391909116815260200190565b6020808252600790820152665245534552564560c81b604082015260600190565b6000602082840312156116f057600080fd5b81516113ac8161137a565b60005b838110156117165781810151838201526020016116fe565b838111156108665750506000910152565b600060018060a01b0380871683526080602084015285518060808501526117558160a0860160208a016116fb565b9416604083015250606081019190915260a0601f909201601f1916010192915050565b6000806040838503121561178b57600080fd5b61179483611679565b60208401519092506001600160401b03808211156117b157600080fd5b818501915085601f8301126117c557600080fd5b8151818111156117d7576117d76114ac565b6117ea601f8201601f19166020016114c2565b915080825286602082850101111561180157600080fd5b6118128160208401602086016116fb565b5080925050509250929050565b634e487b7160e01b600052603260045260246000fd5b600060001982141561185757634e487b7160e01b600052601160045260246000fd5b5060010190565b604080825283519082018190526000906020906060840190828701845b828110156118975781518452928401929084019060010161187b565b5050508381038285015284518082528583019183019060005b818110156118d55783516001600160a01b0316835292840192918401916001016118b0565b5090979650505050505050565b6020808252600a908201526923a7a7a22227a62620a960b11b604082015260600190565b60006020828403121561191857600080fd5b505191905056fea2646970667358221220ae686dd4dc14e86bbfdf3210ae5519430163a6f4fface8619bf0e6734522674a64736f6c63430008080033",
118
+ "deployedBytecode": "0x60806040526004361061004e5760003560e01c80631fedded51461005a5780633f40cf5b1461007c5780638815bdae1461009c57806391ea50ae146100bc578063bdc27b9b146100dc57600080fd5b3661005557005b600080fd5b34801561006657600080fd5b5061007a61007536600461138f565b6100fc565b005b34801561008857600080fd5b5061007a6100973660046113b3565b610314565b3480156100a857600080fd5b5061007a6100b736600461142a565b6104e6565b3480156100c857600080fd5b5061007a6100d7366004611580565b6105c6565b3480156100e857600080fd5b5061007a6100f736600461138f565b61086c565b6001546001600160a01b0316331461012f5760405162461bcd60e51b815260040161012690611655565b60405180910390fd5b6000805460025460405163e869d45f60e01b81526001600160a01b0385811660048301526024820194909452601f60e01b6044820152908316606482015291169063e869d45f90608401602060405180830381600087803b15801561019357600080fd5b505af11580156101a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101cb919061168e565b6102285760405162461bcd60e51b815260206004820152602860248201527f7265676973746572696e6720636f6d706f756e64566f74696e674d616368696e604482015267194819985a5b195960c21b6064820152608401610126565b600054600254604051636c525b1360e01b81526001600160a01b0392831692636c525b139261025c929116906004016116a9565b602060405180830381600087803b15801561027657600080fd5b505af115801561028a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ae919061168e565b6103065760405162461bcd60e51b8152602060048201526024808201527f756e7265676973746572696e672070726f746f636f6c757067726164652066616044820152631a5b195960e21b6064820152608401610126565b6001546001600160a01b0316ff5b6001546001600160a01b0316331461033e5760405162461bcd60e51b815260040161012690611655565b6000805460405163bf40fac160e01b81526001600160a01b039182169163d1b7089a919086169063bf40fac190610377906004016116bd565b60206040518083038186803b15801561038f57600080fd5b505afa1580156103a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c791906116de565b6040516024810186905260440160408051601f198184030181529181526020820180516001600160e01b0316630a7445bf60e41b179052600254905160e085901b6001600160e01b031916815261042f9392916001600160a01b031690600090600401611727565b600060405180830381600087803b15801561044957600080fd5b505af115801561045d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104859190810190611778565b509050806104e15760405162461bcd60e51b815260206004820152602360248201527f43616c6c696e67207365745265736572766547445841697264726f70206661696044820152621b195960ea1b6064820152608401610126565b505050565b6001546001600160a01b031633146105105760405162461bcd60e51b815260040161012690611655565b8281146105515760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610126565b6105bf85858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040805160208089028281018201909352888252909350889250879182918501908490808284376000920191909152506108ab92505050565b5050505050565b6001546001600160a01b031633146105f05760405162461bcd60e51b815260040161012690611655565b805182511461063b5760405162461bcd60e51b81526020600482015260176024820152760e6e8c2d6d2dcce40d8cadccee8d040dad2e6dac2e8c6d604b1b6044820152606401610126565b60005b8251811015610866576000805460405163bf40fac160e01b815260206004820152600c60248201526b232aa7222fa6a0a720a3a2a960a11b60448201526001600160a01b039182169163d1b7089a919088169063bf40fac19060640160206040518083038186803b1580156106b257600080fd5b505afa1580156106c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ea91906116de565b8585815181106106fc576106fc61181f565b60200260200101518786815181106107165761071661181f565b602090810291909101015160405160248101929092526001600160a01b031660448201526000606482018190526084820181905260a482015260c40160408051601f198184030181529181526020820180516001600160e01b0316631f1ad8ed60e21b179052600254905160e085901b6001600160e01b03191681526107ad9392916001600160a01b031690600090600401611727565b600060405180830381600087803b1580156107c757600080fd5b505af11580156107db573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108039190810190611778565b509050806108535760405162461bcd60e51b815260206004820181905260248201527f43616c6c696e67207365745374616b696e6752657761726473206661696c65646044820152606401610126565b508061085e81611835565b91505061063e565b50505050565b6001546001600160a01b031633146108965760405162461bcd60e51b815260040161012690611655565b61089f816109e6565b6108a881610eea565b50565b600080546040516001600160a01b039091169063d1b7089a9086906108d6908790879060240161185e565b60408051601f198184030181529181526020820180516001600160e01b0316634ab01f5b60e01b179052600254905160e085901b6001600160e01b03191681526109319392916001600160a01b031690600090600401611727565b600060405180830381600087803b15801561094b57600080fd5b505af115801561095f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109879190810190611778565b509050806108665760405162461bcd60e51b815260206004820152602660248201527f43616c6c696e67207365744e616d6553657276696365436f6e7472616374732060448201526519985a5b195960d21b6064820152608401610126565b6000805460405163bf40fac160e01b81526001600160a01b039182169163d1b7089a919085169063bf40fac190610a1f906004016118e2565b60206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6f91906116de565b60405163bf40fac160e01b81526001600160a01b0386169063bf40fac190610a99906004016116bd565b60206040518083038186803b158015610ab157600080fd5b505afa158015610ac5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae991906116de565b604051602401610af991906116a9565b60408051601f198184030181529181526020820180516001600160e01b0316634c1d96ab60e11b179052600254905160e085901b6001600160e01b0319168152610b549392916001600160a01b031690600090600401611727565b600060405180830381600087803b158015610b6e57600080fd5b505af1158015610b82573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610baa9190810190611778565b50905080610bf55760405162461bcd60e51b815260206004820152601860248201527710d85b1b1a5b99c8185919135a5b9d195c8819985a5b195960421b6044820152606401610126565b60005460405163bf40fac160e01b81526001600160a01b039182169163d1b7089a919085169063bf40fac190610c2d906004016118e2565b60206040518083038186803b158015610c4557600080fd5b505afa158015610c59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7d91906116de565b6040805160048082526024820183526020820180516001600160e01b0316639865027560e01b179052600254925160e086901b6001600160e01b0319168152610cd494936001600160a01b03169160009101611727565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d2a9190810190611778565b50905080610d7a5760405162461bcd60e51b815260206004820152601d60248201527f43616c6c696e672072656e6f756e63654d696e746572206661696c65640000006044820152606401610126565b60005460405163bf40fac160e01b81526001600160a01b039182169163e4537a74919085169063bf40fac190610db2906004016116bd565b60206040518083038186803b158015610dca57600080fd5b505afa158015610dde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0291906116de565b60025460405160e084901b6001600160e01b03191681526001600160a01b0392831660048201526000602482015291166044820152606401602060405180830381600087803b158015610e5457600080fd5b505af1158015610e68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8c919061168e565b905080610ee65760405162461bcd60e51b815260206004820152602260248201527f43616c6c696e6720616464476c6f62616c436f6e73747261696e74206661696c604482015261195960f21b6064820152608401610126565b5050565b600080826001600160a01b031663bf40fac16040518163ffffffff1660e01b8152600401610f30906020808252600490820152634344414960e01b604082015260600190565b60206040518083038186803b158015610f4857600080fd5b505afa158015610f5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8091906116de565b6002546040516370a0823160e01b81529192506000916001600160a01b03808516926370a0823192610fb892909116906004016116a9565b60206040518083038186803b158015610fd057600080fd5b505afa158015610fe4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110089190611906565b60005460405163bf40fac160e01b81529192506001600160a01b039081169163b9a04cdd9185919088169063bf40fac190611045906004016116bd565b60206040518083038186803b15801561105d57600080fd5b505afa158015611071573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109591906116de565b60025460405160e085901b6001600160e01b03191681526001600160a01b039384166004820152918316602483015260448201869052919091166064820152608401602060405180830381600087803b1580156110f157600080fd5b505af1158015611105573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611129919061168e565b9250826111845760405162461bcd60e51b815260206004820152602360248201527f7472616e73666572206364616920746f206e65772072657365727665206661696044820152621b195960ea1b6064820152608401610126565b60005460405163bf40fac160e01b815260206004820152600c60248201526b26a0a925a2aa2fa6a0a5a2a960a11b60448201526001600160a01b039182169163d1b7089a919087169063bf40fac19060640160206040518083038186803b1580156111ee57600080fd5b505afa158015611202573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122691906116de565b6040516001600160a01b0386166024820152648cd0c73ebb6044820152660f5e1925bd0bc76064820152620c4b0b6084820152636216391460a482015260c40160408051601f198184030181529181526020820180516001600160e01b0316638ee090fb60e01b179052600254905160e085901b6001600160e01b03191681526112c19392916001600160a01b031690600090600401611727565b600060405180830381600087803b1580156112db57600080fd5b505af11580156112ef573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113179190810190611778565b509250826108665760405162461bcd60e51b815260206004820152602a60248201527f63616c6c696e67206d61726b65744d616b657220696e697469616c697a65546f6044820152691ad95b8819985a5b195960b21b6064820152608401610126565b6001600160a01b03811681146108a857600080fd5b6000602082840312156113a157600080fd5b81356113ac8161137a565b9392505050565b600080604083850312156113c657600080fd5b82356113d18161137a565b946020939093013593505050565b60008083601f8401126113f157600080fd5b5081356001600160401b0381111561140857600080fd5b6020830191508360208260051b850101111561142357600080fd5b9250929050565b60008060008060006060868803121561144257600080fd5b853561144d8161137a565b945060208601356001600160401b038082111561146957600080fd5b61147589838a016113df565b9096509450604088013591508082111561148e57600080fd5b5061149b888289016113df565b969995985093965092949392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156114ea576114ea6114ac565b604052919050565b60006001600160401b0382111561150b5761150b6114ac565b5060051b60200190565b600082601f83011261152657600080fd5b8135602061153b611536836114f2565b6114c2565b82815260059290921b8401810191818101908684111561155a57600080fd5b8286015b84811015611575578035835291830191830161155e565b509695505050505050565b60008060006060848603121561159557600080fd5b83356115a08161137a565b92506020848101356001600160401b03808211156115bd57600080fd5b818701915087601f8301126115d157600080fd5b81356115df611536826114f2565b81815260059190911b8301840190848101908a8311156115fe57600080fd5b938501935b828510156116255784356116168161137a565b82529385019390850190611603565b96505050604087013592508083111561163d57600080fd5b505061164b86828701611515565b9150509250925092565b6020808252600a908201526937b7363c9037bbb732b960b11b604082015260600190565b8051801515811461168957600080fd5b919050565b6000602082840312156116a057600080fd5b6113ac82611679565b6001600160a01b0391909116815260200190565b6020808252600790820152665245534552564560c81b604082015260600190565b6000602082840312156116f057600080fd5b81516113ac8161137a565b60005b838110156117165781810151838201526020016116fe565b838111156108665750506000910152565b600060018060a01b0380871683526080602084015285518060808501526117558160a0860160208a016116fb565b9416604083015250606081019190915260a0601f909201601f1916010192915050565b6000806040838503121561178b57600080fd5b61179483611679565b60208401519092506001600160401b03808211156117b157600080fd5b818501915085601f8301126117c557600080fd5b8151818111156117d7576117d76114ac565b6117ea601f8201601f19166020016114c2565b915080825286602082850101111561180157600080fd5b6118128160208401602086016116fb565b5080925050509250929050565b634e487b7160e01b600052603260045260246000fd5b600060001982141561185757634e487b7160e01b600052601160045260246000fd5b5060010190565b604080825283519082018190526000906020906060840190828701845b828110156118975781518452928401929084019060010161187b565b5050508381038285015284518082528583019183019060005b818110156118d55783516001600160a01b0316835292840192918401916001016118b0565b5090979650505050505050565b6020808252600a908201526923a7a7a22227a62620a960b11b604082015260600190565b60006020828403121561191857600080fd5b505191905056fea2646970667358221220ae686dd4dc14e86bbfdf3210ae5519430163a6f4fface8619bf0e6734522674a64736f6c63430008080033",
119
119
  "linkReferences": {},
120
120
  "deployedLinkReferences": {}
121
121
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "_format": "hh-sol-dbg-1",
3
- "buildInfo": "../../../build-info/4f8206a440cfa6bac16c5683c5407b03.json"
3
+ "buildInfo": "../../../build-info/e24cb5d66832fe0d27930372c68ab4cd.json"
4
4
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "_format": "hh-sol-dbg-1",
3
- "buildInfo": "../../../build-info/4f8206a440cfa6bac16c5683c5407b03.json"
3
+ "buildInfo": "../../../build-info/e24cb5d66832fe0d27930372c68ab4cd.json"
4
4
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "_format": "hh-sol-dbg-1",
3
- "buildInfo": "../../../build-info/4e461a2f16a31f5f1913266e3929a03c.json"
3
+ "buildInfo": "../../../build-info/e24cb5d66832fe0d27930372c68ab4cd.json"
4
4
  }
@@ -74,8 +74,8 @@
74
74
  "type": "function"
75
75
  }
76
76
  ],
77
- "bytecode": "0x608060405234801561001057600080fd5b5060405161035c38038061035c83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b6102c9806100936000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80635653eeeb1461004657806391d61f3e1461005b578063c52164c61461006e575b600080fd5b6100596100543660046101e7565b61009d565b005b6100596100693660046101e7565b610145565b600054610081906001600160a01b031681565b6040516001600160a01b03909116815260200160405180910390f35b60005b8181101561013f576000546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906100da9087908790600401610228565b602060405180830381600087803b1580156100f457600080fd5b505af1158015610108573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061012c9190610241565b50806101378161026a565b9150506100a0565b50505050565b60005b8181101561013f57600054604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac906101829087908790600401610228565b602060405180830381600087803b15801561019c57600080fd5b505af11580156101b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d49190610241565b50806101df8161026a565b915050610148565b6000806000606084860312156101fc57600080fd5b83356001600160a01b038116811461021357600080fd5b95602085013595506040909401359392505050565b6001600160a01b03929092168252602082015260400190565b60006020828403121561025357600080fd5b8151801515811461026357600080fd5b9392505050565b600060001982141561028c57634e487b7160e01b600052601160045260246000fd5b506001019056fea2646970667358221220fde96c0140534281b2023b496f1ce00db0a20029d246a9149dab11c8062ac9ff64736f6c63430008080033",
78
- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c80635653eeeb1461004657806391d61f3e1461005b578063c52164c61461006e575b600080fd5b6100596100543660046101e7565b61009d565b005b6100596100693660046101e7565b610145565b600054610081906001600160a01b031681565b6040516001600160a01b03909116815260200160405180910390f35b60005b8181101561013f576000546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906100da9087908790600401610228565b602060405180830381600087803b1580156100f457600080fd5b505af1158015610108573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061012c9190610241565b50806101378161026a565b9150506100a0565b50505050565b60005b8181101561013f57600054604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac906101829087908790600401610228565b602060405180830381600087803b15801561019c57600080fd5b505af11580156101b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d49190610241565b50806101df8161026a565b915050610148565b6000806000606084860312156101fc57600080fd5b83356001600160a01b038116811461021357600080fd5b95602085013595506040909401359392505050565b6001600160a01b03929092168252602082015260400190565b60006020828403121561025357600080fd5b8151801515811461026357600080fd5b9392505050565b600060001982141561028c57634e487b7160e01b600052601160045260246000fd5b506001019056fea2646970667358221220fde96c0140534281b2023b496f1ce00db0a20029d246a9149dab11c8062ac9ff64736f6c63430008080033",
77
+ "bytecode": "0x608060405234801561001057600080fd5b5060405161035c38038061035c83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b6102c9806100936000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80635653eeeb1461004657806391d61f3e1461005b578063c52164c61461006e575b600080fd5b6100596100543660046101e7565b61009d565b005b6100596100693660046101e7565b610145565b600054610081906001600160a01b031681565b6040516001600160a01b03909116815260200160405180910390f35b60005b8181101561013f576000546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906100da9087908790600401610228565b602060405180830381600087803b1580156100f457600080fd5b505af1158015610108573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061012c9190610241565b50806101378161026a565b9150506100a0565b50505050565b60005b8181101561013f57600054604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac906101829087908790600401610228565b602060405180830381600087803b15801561019c57600080fd5b505af11580156101b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d49190610241565b50806101df8161026a565b915050610148565b6000806000606084860312156101fc57600080fd5b83356001600160a01b038116811461021357600080fd5b95602085013595506040909401359392505050565b6001600160a01b03929092168252602082015260400190565b60006020828403121561025357600080fd5b8151801515811461026357600080fd5b9392505050565b600060001982141561028c57634e487b7160e01b600052601160045260246000fd5b506001019056fea26469706673582212204e7ecf50608024b30b943ad63c2e064e321d773f386de2f9a7c838fe1a54e40964736f6c63430008080033",
78
+ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c80635653eeeb1461004657806391d61f3e1461005b578063c52164c61461006e575b600080fd5b6100596100543660046101e7565b61009d565b005b6100596100693660046101e7565b610145565b600054610081906001600160a01b031681565b6040516001600160a01b03909116815260200160405180910390f35b60005b8181101561013f576000546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906100da9087908790600401610228565b602060405180830381600087803b1580156100f457600080fd5b505af1158015610108573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061012c9190610241565b50806101378161026a565b9150506100a0565b50505050565b60005b8181101561013f57600054604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac906101829087908790600401610228565b602060405180830381600087803b15801561019c57600080fd5b505af11580156101b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d49190610241565b50806101df8161026a565b915050610148565b6000806000606084860312156101fc57600080fd5b83356001600160a01b038116811461021357600080fd5b95602085013595506040909401359392505050565b6001600160a01b03929092168252602082015260400190565b60006020828403121561025357600080fd5b8151801515811461026357600080fd5b9392505050565b600060001982141561028c57634e487b7160e01b600052601160045260246000fd5b506001019056fea26469706673582212204e7ecf50608024b30b943ad63c2e064e321d773f386de2f9a7c838fe1a54e40964736f6c63430008080033",
79
79
  "linkReferences": {},
80
80
  "deployedLinkReferences": {}
81
81
  }
@@ -15,6 +15,8 @@ interface ERC20 {
15
15
 
16
16
  function mint(address to, uint256 mintAmount) external returns (uint256);
17
17
 
18
+ function burn(uint256 amount) external;
19
+
18
20
  function totalSupply() external view returns (uint256);
19
21
 
20
22
  function allowance(address owner, address spender)
@@ -447,3 +449,13 @@ interface IAdminWallet {
447
449
 
448
450
  function transferOwnership(address _owner) external;
449
451
  }
452
+
453
+ interface IMultichainRouter {
454
+ // Swaps `amount` `token` from this chain to `toChainID` chain with recipient `to`
455
+ function anySwapOut(
456
+ address token,
457
+ address to,
458
+ uint256 amount,
459
+ uint256 toChainID
460
+ ) external;
461
+ }
@@ -0,0 +1,260 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ pragma solidity >=0.8.0;
4
+
5
+ import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
6
+ import "../utils/DAOUpgradeableContract.sol";
7
+ import "../utils/NameService.sol";
8
+ import "../Interfaces.sol";
9
+ import "../DAOStackInterfaces.sol";
10
+ import "./MultiBaseGovernanceShareField.sol";
11
+ import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol";
12
+ import "../staking/utils/StakingRewardsFixedAPY.sol";
13
+
14
+ interface RewardsMinter {
15
+ function sendOrMint(address to, uint256 amount) external returns (uint256);
16
+ }
17
+
18
+ /**
19
+ * @title Staking contract that allows citizens to stake G$ to get GOOD + G$ rewards
20
+ * it implements
21
+ */
22
+ contract GoodDollarStaking is
23
+ ERC20Upgradeable,
24
+ MultiBaseGovernanceShareField,
25
+ DAOUpgradeableContract,
26
+ ReentrancyGuardUpgradeable,
27
+ StakingRewardsFixedAPY
28
+ {
29
+ // Token address
30
+ ERC20 token;
31
+
32
+ uint128 public numberOfBlocksPerYear;
33
+
34
+ /**
35
+ * @dev Emitted when `staker` earns an `amount` of GOOD tokens
36
+ */
37
+ event ReputationEarned(address indexed staker, uint256 amount);
38
+
39
+ /**
40
+ * @dev Emitted when `staker` stakes an `amount` of GoodDollars
41
+ */
42
+ event Staked(address indexed staker, uint256 amount);
43
+
44
+ /**
45
+ * @dev Emitted when `staker` withdraws an `amount` of staked GoodDollars
46
+ */
47
+ event StakeWithdraw(address indexed staker, uint256 amount);
48
+
49
+ /**
50
+ * @dev Constructor
51
+ * @param _ns The address of the INameService contract
52
+ */
53
+ constructor(
54
+ INameService _ns,
55
+ uint128 _interestRatePerBlock,
56
+ uint128 _numberOfBlocksPerYear
57
+ ) StakingRewardsFixedAPY(_interestRatePerBlock) {
58
+ setDAO(_ns);
59
+ require(
60
+ nameService.getAddress("MintBurnWrapper") != address(0),
61
+ "rewards minter not set"
62
+ );
63
+ numberOfBlocksPerYear = _numberOfBlocksPerYear;
64
+ token = ERC20(nameService.getAddress("GOODDOLLAR"));
65
+ __ERC20_init("G$ Savings", "svG$");
66
+ rewardsPerBlock[address(this)] = (2 ether * 1e6) / getChainBlocksPerMonth(); // (2M monthly GDAO as specified in specs, divided by blocks in month )
67
+ }
68
+
69
+ function getChainBlocksPerMonth() public view override returns (uint256) {
70
+ return numberOfBlocksPerYear / 12;
71
+ }
72
+
73
+ /**
74
+ * @dev Allows a staker to deposit Tokens. Notice that `approve` is
75
+ * needed to be executed before the execution of this method.
76
+ * Can be executed only when the contract is not paused.
77
+ * @param _amount The amount of GD to stake
78
+ */
79
+ function stake(uint256 _amount) external {
80
+ require(_amount > 0, "You need to stake a positive token amount");
81
+ require(
82
+ token.transferFrom(_msgSender(), address(this), _amount),
83
+ "transferFrom failed, make sure you approved token transfer"
84
+ );
85
+ /* GOOD rewards Updates */
86
+ _increaseProductivity(
87
+ address(this),
88
+ _msgSender(),
89
+ _amount,
90
+ 0,
91
+ block.number
92
+ );
93
+ _mint(_msgSender(), _amount); // mint Staking token for staker
94
+ _mintRewards(_msgSender());
95
+ /* end GOOD rewards Updates */
96
+
97
+ /* G$ rewards updates */
98
+ _stake(_msgSender(), _amount);
99
+
100
+ emit Staked(_msgSender(), _amount);
101
+ }
102
+
103
+ /**
104
+ * @dev Withdraws the sender staked Token.
105
+ */
106
+ function withdrawStake(uint256 _amount) external nonReentrant {
107
+ (uint256 userProductivity, ) = getProductivity(address(this), _msgSender());
108
+ if (_amount == 0) _amount = userProductivity;
109
+ require(_amount > 0, "Should withdraw positive amount");
110
+ require(userProductivity >= _amount, "Not enough token staked");
111
+ uint256 tokenWithdraw = _amount;
112
+
113
+ _burn(_msgSender(), _amount); // burn their staking tokens
114
+
115
+ /* Good rewards update */
116
+ _decreaseProductivity(
117
+ address(this),
118
+ _msgSender(),
119
+ _amount,
120
+ 0,
121
+ block.number
122
+ );
123
+ _mintRewards(_msgSender());
124
+ /* end Good rewards update */
125
+
126
+ /* G$ rewards update */
127
+ _withdraw(_msgSender(), tokenWithdraw);
128
+ if (stakersInfo[_msgSender()].balance == 0) {
129
+ _mintGDRewards(_msgSender()); //we mint GD rewards only when balance is 0 or upon request
130
+ }
131
+
132
+ /* end G$ rewards update */
133
+
134
+ require(
135
+ token.transfer(_msgSender(), tokenWithdraw),
136
+ "withdraw transfer failed"
137
+ );
138
+ emit StakeWithdraw(_msgSender(), _amount);
139
+ }
140
+
141
+ function _mintGDRewards(address _to) internal returns (uint256 actualSent) {
142
+ uint256 rewards = _getReward(_to);
143
+
144
+ //make sure RewardsMinter failure doesnt prevent withdrawl of stake
145
+ try
146
+ RewardsMinter(nameService.getAddress("MintBurnWrapper")).sendOrMint(
147
+ _to,
148
+ rewards
149
+ )
150
+ returns (uint256 _res) {
151
+ actualSent = _res;
152
+ } catch {
153
+ actualSent = 0;
154
+ }
155
+ //it could be that rewards minter doesnt have enough or passed cap
156
+ //so we keep track of debt to user
157
+ if (actualSent < rewards) {
158
+ _undoReward(_to, rewards - actualSent);
159
+ }
160
+ }
161
+
162
+ /**
163
+ * @dev Staker can withdraw their rewards without withdraw their stake
164
+ */
165
+ function withdrawRewards()
166
+ public
167
+ nonReentrant
168
+ returns (uint256 goodRewards, uint256 gdRewards)
169
+ {
170
+ goodRewards = _mintRewards(_msgSender());
171
+ gdRewards = _mintGDRewards(_msgSender());
172
+ }
173
+
174
+ /**
175
+ * @dev Mint rewards of the staker
176
+ * @param user Receipent address of the rewards
177
+ * @return Returns amount of the minted rewards
178
+ * emits 'ReputationEarned' event for staker earned GOOD amount
179
+ */
180
+ function _mintRewards(address user) internal returns (uint256) {
181
+ uint256 amount = _issueEarnedRewards(address(this), user, 0, block.number);
182
+ if (amount > 0) {
183
+ ERC20(nameService.getAddress("REPUTATION")).mint(user, amount);
184
+ emit ReputationEarned(_msgSender(), amount);
185
+ }
186
+ return amount;
187
+ }
188
+
189
+ /**
190
+ * @dev Returns the number of decimals used to get its user representation.
191
+ */
192
+ function decimals() public view virtual override returns (uint8) {
193
+ return 2;
194
+ }
195
+
196
+ /**
197
+ * @dev override _transfer to handle rewards calculations when transfer the stake
198
+ */
199
+ function _transfer(
200
+ address from,
201
+ address to,
202
+ uint256 value
203
+ ) internal override {
204
+ _decreaseProductivity(address(this), from, value, 0, block.number);
205
+ _withdraw(from, value); //update G$ rewards
206
+ _increaseProductivity(address(this), to, value, 0, block.number);
207
+ _stake(to, value); //update G$ rewards
208
+
209
+ //mint GOOD rewards
210
+ _mintRewards(from);
211
+ _mintRewards(to);
212
+
213
+ if (stakersInfo[from].balance == 0) {
214
+ _mintGDRewards(from); //we mint GD rewards only when balance is 0 or upon request
215
+ }
216
+ super._transfer(from, to, value);
217
+ }
218
+
219
+ /**
220
+ * @dev Calculate rewards per block from monthly amount of rewards and set it
221
+ * @param _monthlyAmount total rewards which will distribute monthly
222
+ */
223
+ function setMonthlyGOODRewards(uint256 _monthlyAmount) public {
224
+ _onlyAvatar();
225
+ _setMonthlyRewards(address(this), _monthlyAmount);
226
+ }
227
+
228
+ /**
229
+ * @dev Calculate rewards per block from monthly amount of rewards and set it
230
+ * @param _interestRatePerBlock bps yearly apy
231
+ */
232
+ function setGdApy(uint128 _interestRatePerBlock) public {
233
+ _onlyAvatar();
234
+ _setAPY(_interestRatePerBlock);
235
+ }
236
+
237
+ /// @dev helper function for multibase
238
+ function getRewardsPerBlock() public view returns (uint256) {
239
+ return rewardsPerBlock[address(this)];
240
+ }
241
+
242
+ /// @dev helper function for multibase
243
+ function getStaked(address _user) public view returns (uint256, uint256) {
244
+ return getProductivity(address(this), _user);
245
+ }
246
+
247
+ /// @dev helper function for multibase
248
+ function getUserPendingReward(address _user) public view returns (uint256) {
249
+ return getUserPendingReward(address(this), 0, block.number, _user);
250
+ }
251
+
252
+ /// @dev helper function for multibase
253
+ function goodStakerInfo(address _user) public view returns (UserInfo memory) {
254
+ return contractToUsers[address(this)][_user];
255
+ }
256
+
257
+ function totalRewardsPerShare() public view returns (uint256) {
258
+ return totalRewardsPerShare(address(this));
259
+ }
260
+ }
@@ -0,0 +1,118 @@
1
+ // SPDX-License-Identifier: MIT
2
+ /**
3
+ Wrap the G$ token to provide mint permissions to multichain.org router/bridge
4
+ based on https://github.com/anyswap/multichain-smart-contracts/blob/1459fe6281867319af8ffb1849e5c16d242d6530/contracts/wrapper/MintBurnWrapper.sol
5
+
6
+ Added onTokenTransfer
7
+
8
+ Fixed:
9
+ https://github.com/anyswap/multichain-smart-contracts/issues/4
10
+ https://github.com/anyswap/multichain-smart-contracts/issues/3
11
+ */
12
+
13
+ pragma solidity ^0.8;
14
+
15
+ import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
16
+ import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
17
+ import "@openzeppelin/contracts-upgradeable/access/AccessControlEnumerableUpgradeable.sol";
18
+ import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
19
+ import "@openzeppelin/contracts/utils/math/Math.sol";
20
+
21
+ import "../utils/DAOUpgradeableContract.sol";
22
+
23
+ contract DistributionHelper is
24
+ DAOUpgradeableContract,
25
+ AccessControlEnumerableUpgradeable
26
+ {
27
+ enum TransferType {
28
+ FuseBridge,
29
+ MultichainBridge,
30
+ Contract
31
+ }
32
+
33
+ struct DistributionRecipient {
34
+ uint32 bps;
35
+ uint32 chainId;
36
+ address addr;
37
+ TransferType transferType;
38
+ }
39
+
40
+ DistributionRecipient[] public distributionRecipients;
41
+ address public fuseBridge;
42
+ IMultichainRouter public multiChainBridge;
43
+
44
+ event Distribution(
45
+ uint256 distributed,
46
+ uint256 startingBalance,
47
+ uint256 incomingAmount
48
+ );
49
+
50
+ function initialize(INameService _ns) external initializer {
51
+ __AccessControlEnumerable_init();
52
+ setDAO(_ns);
53
+ _setupRole(DEFAULT_ADMIN_ROLE, avatar);
54
+ fuseBridge = nameService.getAddress("BRIDGE_CONTRACT");
55
+ multiChainBridge = IMultichainRouter(
56
+ 0xf27Ee99622C3C9b264583dACB2cCE056e194494f
57
+ );
58
+ }
59
+
60
+ function onDistribution(uint256 _amount) external {
61
+ //we consider the actuall balance and not _amount
62
+ uint256 toDistribute = nativeToken().balanceOf(address(this));
63
+ if (toDistribute == 0) return;
64
+
65
+ uint256 totalDistributed;
66
+ for (uint256 i = 0; i < distributionRecipients.length; i++) {
67
+ DistributionRecipient storage r = distributionRecipients[i];
68
+ if (r.bps > 0) {
69
+ uint256 toTransfer = (toDistribute * r.bps) / 10000;
70
+ totalDistributed += toTransfer;
71
+ distribute(r, toTransfer);
72
+ }
73
+ }
74
+
75
+ emit Distribution(totalDistributed, toDistribute, _amount);
76
+ }
77
+
78
+ function addRecipient(DistributionRecipient memory _recipient)
79
+ external
80
+ onlyRole(DEFAULT_ADMIN_ROLE)
81
+ {
82
+ distributionRecipients.push(_recipient);
83
+ }
84
+
85
+ function updateRecipient(DistributionRecipient memory _recipient)
86
+ external
87
+ onlyRole(DEFAULT_ADMIN_ROLE)
88
+ {
89
+ for (uint256 i = 0; i < distributionRecipients.length; i++) {
90
+ if (distributionRecipients[i].addr == _recipient.addr) {
91
+ distributionRecipients[i] = _recipient;
92
+ return;
93
+ }
94
+ }
95
+ }
96
+
97
+ function distribute(DistributionRecipient storage _recipient, uint256 _amount)
98
+ internal
99
+ {
100
+ if (_recipient.transferType == TransferType.FuseBridge) {
101
+ nativeToken().transferAndCall(
102
+ fuseBridge,
103
+ _amount,
104
+ abi.encodePacked(_recipient.addr)
105
+ );
106
+ } else if (_recipient.transferType == TransferType.MultichainBridge) {
107
+ nativeToken().approve(address(multiChainBridge), _amount);
108
+ multiChainBridge.anySwapOut(
109
+ address(nativeToken()),
110
+ _recipient.addr,
111
+ _amount,
112
+ _recipient.chainId
113
+ );
114
+ } else if (_recipient.transferType == TransferType.Contract) {
115
+ nativeToken().transferAndCall(_recipient.addr, _amount, "");
116
+ }
117
+ }
118
+ }
@@ -11,6 +11,7 @@ import "../utils/NameService.sol";
11
11
  import "../DAOStackInterfaces.sol";
12
12
  import "../Interfaces.sol";
13
13
  import "./GoodMarketMaker.sol";
14
+ import "./DistributionHelper.sol";
14
15
 
15
16
  interface ContributionCalc {
16
17
  function calculateContribution(
@@ -51,6 +52,9 @@ contract GoodReserveCDai is
51
52
  /// @dev mark if user claimed his GDX
52
53
  mapping(address => bool) public isClaimedGDX;
53
54
 
55
+ uint32 public nonUbiBps; //how much of expansion G$ to allocate for non Ubi causes
56
+ DistributionHelper public distributionHelper; //in charge of distributing non UBI to different recipients
57
+
54
58
  // Emits when new GD tokens minted
55
59
  event UBIMinted(
56
60
  //epoch of UBI
@@ -109,6 +113,8 @@ contract GoodReserveCDai is
109
113
  address indexed receiverAddress
110
114
  );
111
115
 
116
+ event NonUBIMinted(address distributionHelper, uint256 amountMinted);
117
+
112
118
  function initialize(INameService _ns, bytes32 _gdxAirdrop)
113
119
  public
114
120
  virtual
@@ -353,10 +359,22 @@ contract GoodReserveCDai is
353
359
  interestInCdai
354
360
  );
355
361
  uint256 gdExpansionToMint = getMarketMaker().mintExpansion(_interestToken);
362
+
363
+ uint256 nonUBI;
364
+
365
+ lastMinted = block.number;
356
366
  uint256 gdUBI = gdInterestToMint + gdExpansionToMint;
367
+
368
+ if (nonUbiBps > 0) {
369
+ nonUBI = (gdExpansionToMint * nonUbiBps) / 10000;
370
+ gdUBI -= nonUBI;
371
+ _mintGoodDollars(address(distributionHelper), nonUBI, false);
372
+ emit NonUBIMinted(address(distributionHelper), nonUBI);
373
+ try distributionHelper.onDistribution(nonUBI) {} catch {}
374
+ }
357
375
  //this enforces who can call the public mintUBI method. only an address with permissions at reserve of RESERVE_MINTER_ROLE
376
+
358
377
  _mintGoodDollars(nameService.getAddress("FUND_MANAGER"), gdUBI, false);
359
- lastMinted = block.number;
360
378
  emit UBIMinted(
361
379
  lastMinted,
362
380
  address(_interestToken),
@@ -365,9 +383,18 @@ contract GoodReserveCDai is
365
383
  gdExpansionToMint,
366
384
  gdUBI
367
385
  );
386
+
368
387
  return (gdUBI, interestInCdai);
369
388
  }
370
389
 
390
+ function setDistributionHelper(DistributionHelper _helper, uint32 _bps)
391
+ public
392
+ {
393
+ _onlyAvatar();
394
+ distributionHelper = _helper;
395
+ nonUbiBps = _bps;
396
+ }
397
+
371
398
  /**
372
399
  * @dev Allows the DAO to change the daily expansion rate
373
400
  * it is calculated by _nom/_denom with e27 precision. Emits