@gooddollar/goodprotocol 2.0.24 → 2.0.25-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/artifacts/contracts/DAOStackInterfaces.sol/Avatar.dbg.json +1 -1
  2. package/artifacts/contracts/DAOStackInterfaces.sol/Controller.dbg.json +1 -1
  3. package/artifacts/contracts/DAOStackInterfaces.sol/GlobalConstraintInterface.dbg.json +1 -1
  4. package/artifacts/contracts/DAOStackInterfaces.sol/IntVoteInterface.dbg.json +1 -1
  5. package/artifacts/contracts/DAOStackInterfaces.sol/ReputationInterface.dbg.json +1 -1
  6. package/artifacts/contracts/DAOStackInterfaces.sol/SchemeRegistrar.dbg.json +1 -1
  7. package/artifacts/contracts/Interfaces.sol/AggregatorV3Interface.dbg.json +1 -1
  8. package/artifacts/contracts/Interfaces.sol/ERC20.dbg.json +1 -1
  9. package/artifacts/contracts/Interfaces.sol/IAaveIncentivesController.dbg.json +1 -1
  10. package/artifacts/contracts/Interfaces.sol/IAdminWallet.dbg.json +1 -1
  11. package/artifacts/contracts/Interfaces.sol/IDonationStaking.dbg.json +1 -1
  12. package/artifacts/contracts/Interfaces.sol/IERC2917.dbg.json +1 -1
  13. package/artifacts/contracts/Interfaces.sol/IFirstClaimPool.dbg.json +1 -1
  14. package/artifacts/contracts/Interfaces.sol/IGoodDollar.dbg.json +1 -1
  15. package/artifacts/contracts/Interfaces.sol/IGoodStaking.dbg.json +1 -1
  16. package/artifacts/contracts/Interfaces.sol/IHasRouter.dbg.json +1 -1
  17. package/artifacts/contracts/Interfaces.sol/IIdentity.dbg.json +1 -1
  18. package/artifacts/contracts/Interfaces.sol/IIdentityV2.dbg.json +1 -1
  19. package/artifacts/contracts/Interfaces.sol/ILendingPool.dbg.json +1 -1
  20. package/artifacts/contracts/Interfaces.sol/IMultichainRouter.dbg.json +1 -1
  21. package/artifacts/contracts/Interfaces.sol/INameService.dbg.json +1 -1
  22. package/artifacts/contracts/Interfaces.sol/IUBIScheme.dbg.json +1 -1
  23. package/artifacts/contracts/Interfaces.sol/ProxyAdmin.dbg.json +1 -1
  24. package/artifacts/contracts/Interfaces.sol/Reserve.dbg.json +1 -1
  25. package/artifacts/contracts/Interfaces.sol/Staking.dbg.json +1 -1
  26. package/artifacts/contracts/Interfaces.sol/Uniswap.dbg.json +1 -1
  27. package/artifacts/contracts/Interfaces.sol/UniswapFactory.dbg.json +1 -1
  28. package/artifacts/contracts/Interfaces.sol/UniswapPair.dbg.json +1 -1
  29. package/artifacts/contracts/Interfaces.sol/cERC20.dbg.json +1 -1
  30. package/artifacts/contracts/fuseFaucet/Faucet.sol/Faucet.dbg.json +1 -1
  31. package/artifacts/contracts/fuseFaucet/FuseFaucet.sol/FuseFaucet.dbg.json +1 -1
  32. package/artifacts/contracts/fuseFaucet/FuseFaucetV2.sol/FuseFaucetV2.dbg.json +1 -1
  33. package/artifacts/contracts/governance/ClaimersDistribution.sol/ClaimersDistribution.dbg.json +1 -1
  34. package/artifacts/contracts/governance/CompoundVotingMachine.sol/CompoundVotingMachine.dbg.json +1 -1
  35. package/artifacts/contracts/governance/GReputation.sol/GReputation.dbg.json +1 -1
  36. package/artifacts/contracts/governance/GoodDollarStaking.sol/GoodDollarStaking.dbg.json +1 -1
  37. package/artifacts/contracts/governance/GoodDollarStaking.sol/IGovernanceStaking.dbg.json +1 -1
  38. package/artifacts/contracts/governance/GoodDollarStaking.sol/IStakingUpgrade.dbg.json +1 -1
  39. package/artifacts/contracts/governance/GoodDollarStaking.sol/RewardsMinter.dbg.json +1 -1
  40. package/artifacts/contracts/governance/GovernanceStaking.sol/GovernanceStaking.dbg.json +1 -1
  41. package/artifacts/contracts/governance/MultiBaseGovernanceShareField.sol/MultiBaseGovernanceShareField.dbg.json +1 -1
  42. package/artifacts/contracts/governance/Reputation.sol/Reputation.dbg.json +1 -1
  43. package/artifacts/contracts/governance/StakersDistribution.sol/StakersDistribution.dbg.json +1 -1
  44. package/artifacts/contracts/identity/IdentityV2.sol/IdentityV2.dbg.json +1 -1
  45. package/artifacts/contracts/invite/InvitesFuseV2.sol/InvitesFuseV2.dbg.json +1 -1
  46. package/artifacts/contracts/invite/InvitesV1.sol/InvitesV1.dbg.json +1 -1
  47. package/artifacts/contracts/invite/InvitesV2.sol/InvitesV2.dbg.json +1 -1
  48. package/artifacts/contracts/mocks/AaveMock.sol/AaveMock.dbg.json +1 -1
  49. package/artifacts/contracts/mocks/AaveUSDMockOracle.sol/AaveUSDMockOracle.dbg.json +1 -1
  50. package/artifacts/contracts/mocks/BatUSDMockOracle.sol/BatUSDMockOracle.dbg.json +1 -1
  51. package/artifacts/contracts/mocks/CompUsdMockOracle.sol/CompUSDMockOracle.dbg.json +1 -1
  52. package/artifacts/contracts/mocks/DAIMock.sol/DAIMock.dbg.json +1 -1
  53. package/artifacts/contracts/mocks/DaiEthPriceMockOracle.sol/DaiEthPriceMockOracle.dbg.json +1 -1
  54. package/artifacts/contracts/mocks/DecimalsMock.sol/DecimalsMock.dbg.json +1 -1
  55. package/artifacts/contracts/mocks/DistributionBridgeMock.sol/DistributionBridgeMock.dbg.json +1 -1
  56. package/artifacts/contracts/mocks/DistributionHelperTest.sol/DistributionHelperTest.dbg.json +1 -1
  57. package/artifacts/contracts/mocks/DistributionHelperTest.sol/DistributionHelperTestHelper.dbg.json +1 -1
  58. package/artifacts/contracts/mocks/EthUSDMockOracle.sol/EthUSDMockOracle.dbg.json +1 -1
  59. package/artifacts/contracts/mocks/FeesFormularMock.sol/FeesFormulaMock.dbg.json +1 -1
  60. package/artifacts/contracts/mocks/GasPriceMockOracle.sol/GasPriceMockOracle.dbg.json +1 -1
  61. package/artifacts/contracts/mocks/GoodCompoundStakingTest.sol/GoodCompoundStakingTest.dbg.json +1 -1
  62. package/artifacts/contracts/mocks/GoodDollarStakingMock.sol/GoodDollarStakingMock.dbg.json +1 -1
  63. package/artifacts/contracts/mocks/GoodFundManagerTest.sol/GoodFundManagerTest.dbg.json +1 -1
  64. package/artifacts/contracts/mocks/IdentityMock.sol/IdentityMock.dbg.json +1 -1
  65. package/artifacts/contracts/mocks/IncentiveControllerMock.sol/IncentiveControllerMock.dbg.json +1 -1
  66. package/artifacts/contracts/mocks/LendingPoolMock.sol/LendingPoolMock.dbg.json +1 -1
  67. package/artifacts/contracts/mocks/MultichainRouterMock.sol/IWrapper.dbg.json +1 -1
  68. package/artifacts/contracts/mocks/MultichainRouterMock.sol/MultichainRouterMock.dbg.json +1 -1
  69. package/artifacts/contracts/mocks/OverMintTester.sol/IGoodDollarStakingTest.dbg.json +1 -1
  70. package/artifacts/contracts/mocks/OverMintTester.sol/OverMintTester.dbg.json +1 -1
  71. package/artifacts/contracts/mocks/OverMintTesterRegularStake.sol/OverMintTesterRegularStake.dbg.json +1 -1
  72. package/artifacts/contracts/mocks/PayableMock.sol/PayableMock.dbg.json +1 -1
  73. package/artifacts/contracts/mocks/SixteenDecimalsTokenMock.sol/SixteenDecimalsTokenMock.dbg.json +1 -1
  74. package/artifacts/contracts/mocks/StakingMockFixedAPY.sol/StakingMockFixedAPY.dbg.json +1 -1
  75. package/artifacts/contracts/mocks/SwapHelperTest.sol/SwapHelperTest.dbg.json +1 -1
  76. package/artifacts/contracts/mocks/TwentyDecimalsTokenMock.sol/TwentyDecimalsTokenMock.dbg.json +1 -1
  77. package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock.dbg.json +1 -1
  78. package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock2.dbg.json +1 -1
  79. package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock3.dbg.json +1 -1
  80. package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock4.dbg.json +1 -1
  81. package/artifacts/contracts/mocks/UsdcMock.sol/USDCMock.dbg.json +1 -1
  82. package/artifacts/contracts/mocks/cBATMock.sol/cBATMock.dbg.json +1 -1
  83. package/artifacts/contracts/mocks/cDAILowWorthMock.sol/cDAILowWorthMock.dbg.json +1 -1
  84. package/artifacts/contracts/mocks/cDAIMock.sol/cDAIMock.dbg.json +1 -1
  85. package/artifacts/contracts/mocks/cDAINonMintableMock.sol/cDAINonMintableMock.dbg.json +1 -1
  86. package/artifacts/contracts/mocks/cDecimalsMock.sol/cDecimalsMock.dbg.json +1 -1
  87. package/artifacts/contracts/mocks/cSDTMock.sol/cSDTMock.dbg.json +1 -1
  88. package/artifacts/contracts/mocks/cUSDCMock.sol/cUSDCMock.dbg.json +1 -1
  89. package/artifacts/contracts/reserve/DistributionHelper.sol/DistributionHelper.dbg.json +1 -1
  90. package/artifacts/contracts/reserve/ExchangeHelper.sol/ExchangeHelper.dbg.json +1 -1
  91. package/artifacts/contracts/reserve/GoodMarketMaker.sol/GoodMarketMaker.dbg.json +1 -1
  92. package/artifacts/contracts/reserve/GoodReserveCDai.sol/ContributionCalc.dbg.json +1 -1
  93. package/artifacts/contracts/reserve/GoodReserveCDai.sol/GoodReserveCDai.dbg.json +1 -1
  94. package/artifacts/contracts/staking/BaseShareField.sol/BaseShareField.dbg.json +1 -1
  95. package/artifacts/contracts/staking/BaseShareFieldV2.sol/BaseShareFieldV2.dbg.json +1 -1
  96. package/artifacts/contracts/staking/DonationsStaking.sol/DonationsStaking.dbg.json +1 -1
  97. package/artifacts/contracts/staking/FuseStakingV3.sol/FuseStakingV3.dbg.json +1 -1
  98. package/artifacts/contracts/staking/FuseStakingV3.sol/IConsensus.dbg.json +1 -1
  99. package/artifacts/contracts/staking/FuseStakingV3.sol/PegSwap.dbg.json +1 -1
  100. package/artifacts/contracts/staking/GoodFundManager.sol/GoodFundManager.dbg.json +1 -1
  101. package/artifacts/contracts/staking/SimpleStaking.sol/SimpleStaking.dbg.json +1 -1
  102. package/artifacts/contracts/staking/SimpleStakingV2.sol/SimpleStakingV2.dbg.json +1 -1
  103. package/artifacts/contracts/staking/UniswapV2SwapHelper.sol/UniswapV2SwapHelper.dbg.json +1 -1
  104. package/artifacts/contracts/staking/aave/AaveStakingFactory.sol/AaveStakingFactory.dbg.json +1 -1
  105. package/artifacts/contracts/staking/aave/GoodAaveStaking.sol/GoodAaveStaking.dbg.json +1 -1
  106. package/artifacts/contracts/staking/aave/GoodAaveStakingV2.sol/GoodAaveStakingV2.dbg.json +1 -1
  107. package/artifacts/contracts/staking/compound/CompoundStakingFactory.sol/CompoundStakingFactory.dbg.json +1 -1
  108. package/artifacts/contracts/staking/compound/GoodCompoundStaking.sol/GoodCompoundStaking.dbg.json +1 -1
  109. package/artifacts/contracts/staking/compound/GoodCompoundStakingV2.sol/GoodCompoundStakingV2.dbg.json +1 -1
  110. package/artifacts/contracts/staking/utils/Math64X64.sol/Math64x64.dbg.json +1 -1
  111. package/artifacts/contracts/staking/utils/StakingRewardsFixedAPY.sol/StakingRewardsFixedAPY.dbg.json +1 -1
  112. package/artifacts/contracts/token/ERC20PresetMinterPauserUpgradeable.sol/ERC20PresetMinterPauserUpgradeable.dbg.json +1 -1
  113. package/artifacts/contracts/token/ERC677.sol/ERC677.dbg.json +1 -1
  114. package/artifacts/contracts/token/ERC677.sol/ERC677Receiver.dbg.json +1 -1
  115. package/artifacts/contracts/token/GoodDollar.sol/GoodDollar.dbg.json +1 -1
  116. package/artifacts/contracts/token/IFeesFormula.sol/IFeesFormula.dbg.json +1 -1
  117. package/artifacts/contracts/token/MultichainFeeFormula.sol/MultichainFeeFormula.dbg.json +1 -1
  118. package/artifacts/contracts/token/MultichainFeeFormula.sol/MultichainFeeFormula.json +2 -2
  119. package/artifacts/contracts/token/superfluid/ERC20Permit.sol/ERC20Permit.dbg.json +1 -1
  120. package/artifacts/contracts/token/superfluid/ERC20Permit.sol/SelfApprove.dbg.json +1 -1
  121. package/artifacts/contracts/token/superfluid/ISuperGoodDollar.sol/IGoodDollarCustom.dbg.json +1 -1
  122. package/artifacts/contracts/token/superfluid/ISuperGoodDollar.sol/ISuperGoodDollar.dbg.json +1 -1
  123. package/artifacts/contracts/token/superfluid/ISuperToken.sol/ISuperToken.dbg.json +1 -1
  124. package/artifacts/contracts/token/superfluid/SuperGoodDollar.sol/SuperGoodDollar.dbg.json +1 -1
  125. package/artifacts/contracts/token/superfluid/SuperToken.sol/SuperToken.dbg.json +1 -1
  126. package/artifacts/contracts/token/superfluid/SuperfluidToken.sol/SuperfluidToken.dbg.json +1 -1
  127. package/artifacts/contracts/token/superfluid/UUPSProxiable.sol/UUPSProxiable.dbg.json +1 -1
  128. package/artifacts/contracts/token/superfluid/UUPSProxy.sol/Proxy.dbg.json +1 -1
  129. package/artifacts/contracts/token/superfluid/UUPSProxy.sol/UUPSProxy.dbg.json +1 -1
  130. package/artifacts/contracts/token/superfluid/UUPSProxy.sol/UUPSUtils.dbg.json +1 -1
  131. package/artifacts/contracts/ubi/UBIScheme.sol/UBIScheme.dbg.json +1 -1
  132. package/artifacts/contracts/ubi/UBISchemeV2.sol/UBISchemeV2.dbg.json +1 -1
  133. package/artifacts/contracts/ubi/UBISchemeV2.sol/UBISchemeV2.json +2 -2
  134. package/artifacts/contracts/utils/AdminWallet.sol/AdminWallet.dbg.json +1 -1
  135. package/artifacts/contracts/utils/AdminWalletFuse.sol/AdminWalletFuse.dbg.json +1 -1
  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/BuyAndBridgeHelper.sol/BuyAndBridgeHelper.dbg.json +1 -1
  139. package/artifacts/contracts/utils/BuyGDClone.sol/BuyGDClone.dbg.json +1 -1
  140. package/artifacts/contracts/utils/BuyGDClone.sol/BuyGDCloneFactory.dbg.json +1 -1
  141. package/artifacts/contracts/utils/BuyGDClone.sol/DonateGDClone.dbg.json +1 -1
  142. package/artifacts/contracts/utils/BuyGDClone.sol/IQuoterV2.dbg.json +1 -1
  143. package/artifacts/contracts/utils/BuyGDClone.sol/ISwapRouter.dbg.json +1 -1
  144. package/artifacts/contracts/utils/DAOContract.sol/DAOContract.dbg.json +1 -1
  145. package/artifacts/contracts/utils/DAOUpgradeableContract.sol/DAOUpgradeableContract.dbg.json +1 -1
  146. package/artifacts/contracts/utils/DSMath.sol/DSMath.dbg.json +1 -1
  147. package/artifacts/contracts/utils/DataTypes.sol/DataTypes.dbg.json +1 -1
  148. package/artifacts/contracts/utils/GDFaucet.sol/GDFaucet.dbg.json +1 -1
  149. package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/GoodDollarMintBurnWrapper.dbg.json +1 -1
  150. package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/IRouter.dbg.json +1 -1
  151. package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/PausableControl.dbg.json +1 -1
  152. package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/TokenOperation.dbg.json +1 -1
  153. package/artifacts/contracts/utils/IdentityFix.sol/IdentityFix.dbg.json +1 -1
  154. package/artifacts/contracts/utils/MultiCall.sol/Multicall.dbg.json +1 -1
  155. package/artifacts/contracts/utils/MultichainBridgeHelper.sol/MultichainBridgeHelper.dbg.json +1 -1
  156. package/artifacts/contracts/utils/NameService.sol/NameService.dbg.json +1 -1
  157. package/artifacts/contracts/utils/OneTimePayments.sol/OneTimePayments.dbg.json +1 -1
  158. package/artifacts/contracts/utils/OneTimePaymentsV2.sol/OneTimePaymentsV2.dbg.json +1 -1
  159. package/artifacts/contracts/utils/ProtocolUpgrade.sol/OldMarketMaker.dbg.json +1 -1
  160. package/artifacts/contracts/utils/ProtocolUpgrade.sol/ProtocolUpgrade.dbg.json +1 -1
  161. package/artifacts/contracts/utils/ProtocolUpgradeFuse.sol/ProtocolUpgradeFuse.dbg.json +1 -1
  162. package/artifacts/contracts/utils/ProtocolUpgradeFuseRecover.sol/ProtocolUpgradeFuseRecover.dbg.json +1 -1
  163. package/artifacts/contracts/utils/ProtocolUpgradeRecover.sol/ProtocolUpgradeRecover.dbg.json +1 -1
  164. package/artifacts/contracts/utils/ProxyFactory1967.sol/ERC1967Proxy.dbg.json +1 -1
  165. package/artifacts/contracts/utils/ProxyFactory1967.sol/ProxyFactory1967.dbg.json +1 -1
  166. package/artifacts/contracts/utils/ReputationTestHelper.sol/ReputationTestHelper.dbg.json +1 -1
  167. package/contracts/token/MultichainFeeFormula.sol +5 -2
  168. package/contracts/ubi/UBISchemeV2.sol +3 -3
  169. package/package.json +1 -1
  170. package/releases/deploy-settings.json +1 -1
  171. package/scripts/analytics/activeWalletsStats.ts +53 -23
  172. package/scripts/analytics/faucetStats.ts +19 -15
  173. package/scripts/multichain-deploy/helpers.ts +46 -118
  174. package/scripts/proposals/hack-ubi-recovery.ts +414 -0
  175. package/scripts/upgrades/multichain-formula-upgrade.ts +4 -1
  176. package/types/factories/contracts/token/MultichainFeeFormula__factory.ts +1 -1
  177. package/types/factories/contracts/ubi/UBISchemeV2__factory.ts +1 -1
@@ -0,0 +1,414 @@
1
+ /***
2
+ * Bring UBI distribution to a temporary working state
3
+ * Celo:
4
+ * - upgrade bridge to be able to prevent UBI bridge transfers as result of the hack
5
+ * - mark unexecuted bridge transfers as executed
6
+ * - set UBI with new cycle params
7
+ * - unpause ubi contract
8
+ * Fuse:
9
+ * - withdraw ubi to avatar and bridge ubi to contract on celo
10
+ * - burn excess UBI tokens
11
+ * - set UBI with new cycle params
12
+ * - unpause ubi contract
13
+ * Mainnet:
14
+ * - withdraw excess UBI from bridge to avatar
15
+ * - burn excess UBI from bridge
16
+ *
17
+ */
18
+
19
+ import { network, ethers } from "hardhat";
20
+ import { defaultsDeep, last } from "lodash";
21
+ import prompt from "prompt";
22
+
23
+ import { executeViaGuardian, executeViaSafe, verifyProductionSigner } from "../multichain-deploy/helpers";
24
+
25
+ import ProtocolSettings from "../../releases/deploy-settings.json";
26
+
27
+ import dao from "../../releases/deployment.json";
28
+ import { BigNumber } from "ethers";
29
+ let { name: networkName } = network;
30
+
31
+ export const upgradeCelo = async () => {
32
+ const isProduction = networkName.includes("production");
33
+ let [root, ...signers] = await ethers.getSigners();
34
+
35
+ if (isProduction) verifyProductionSigner(root);
36
+
37
+ let guardian = root;
38
+
39
+ //simulate produciton on fork
40
+ if (network.name === "hardhat" || network.name === "fork" || network.name === "localhost") {
41
+ networkName = "production-celo";
42
+ }
43
+
44
+ let release: { [key: string]: any } = dao[networkName];
45
+ let protocolSettings = defaultsDeep({}, ProtocolSettings[networkName], ProtocolSettings["default"]);
46
+
47
+ //simulate on fork, make sure safe has enough eth to simulate txs
48
+ if (network.name === "hardhat" || network.name === "fork" || network.name === "localhost") {
49
+ guardian = await ethers.getImpersonatedSigner(protocolSettings.guardiansSafe);
50
+
51
+ await root.sendTransaction({
52
+ value: ethers.constants.WeiPerEther.mul(3),
53
+ to: protocolSettings.guardiansSafe
54
+ });
55
+ }
56
+
57
+ const rootBalance = await ethers.provider.getBalance(root.address).then(_ => _.toString());
58
+ const guardianBalance = await ethers.provider.getBalance(guardian.address).then(_ => _.toString());
59
+
60
+ const NEWBRIDGE_IMPL = "0x691dE730D97d545c141D13ED5e9c12b7cB384a73";
61
+
62
+ const ubiImpl = await ethers.deployContract("UBISchemeV2");
63
+
64
+ console.log("got signers:", {
65
+ networkName,
66
+ root: root.address,
67
+ guardian: guardian.address,
68
+ balance: rootBalance,
69
+ guardianBalance: guardianBalance
70
+ });
71
+
72
+ console.log("executing proposals");
73
+
74
+ const proposalContracts = [
75
+ release.MpbBridge, //controller -> upgrade bridge contract
76
+ release.MpbBridge, //mark request 0x3d959d3438182af92242207591931a28de09296035c08e355167c1f9aae0f7ab as executed
77
+ release.MpbBridge, //mark request 0x73dff6aa07a76330c9dbcb0920d9cbb67489e22d9dd452aaf867f4008f4e7598 as executed
78
+ release.MpbBridge, //mark request 0x8bf2c3df2954005b4ce077b68fce35f80b0e94efee349db5a417cdc8e2c52ba2 as executed
79
+ release.MpbBridge, //mark request 0x06d2ae5f6b7943c6d36da248512dfad48ace22c9447c3cacb9b403907678e5a2 as executed
80
+ release.UBIScheme, //set new ubi contract
81
+ release.UBIScheme, //set cycle length to 60 days
82
+ release.UBIScheme //unpause ubi
83
+ ];
84
+
85
+ const proposalEthValues = proposalContracts.map(_ => 0);
86
+
87
+ const proposalFunctionSignatures = [
88
+ "upgradeTo(address)", // set new bridge name
89
+ "preventRequest(uint256)", //prevent bridge hack ubi request
90
+ "preventRequest(uint256)", //prevent bridge hack ubi request
91
+ "preventRequest(uint256)", //prevent bridge hack ubi request
92
+ "preventRequest(uint256)", //prevent bridge hack ubi request
93
+ "upgradeTo(address)", // set new ubi contract
94
+ "setCycleLength(uint256)", //set new cycle length
95
+ "pause(bool)" // unpause ubi
96
+ ];
97
+
98
+ const proposalFunctionInputs = [
99
+ ethers.utils.defaultAbiCoder.encode(["address"], [NEWBRIDGE_IMPL]),
100
+ ethers.utils.defaultAbiCoder.encode(
101
+ ["uint256"],
102
+ ["0x3d959d3438182af92242207591931a28de09296035c08e355167c1f9aae0f7ab"]
103
+ ),
104
+ ethers.utils.defaultAbiCoder.encode(
105
+ ["uint256"],
106
+ ["0x73dff6aa07a76330c9dbcb0920d9cbb67489e22d9dd452aaf867f4008f4e7598"]
107
+ ),
108
+ ethers.utils.defaultAbiCoder.encode(
109
+ ["uint256"],
110
+ ["0x8bf2c3df2954005b4ce077b68fce35f80b0e94efee349db5a417cdc8e2c52ba2"]
111
+ ),
112
+ ethers.utils.defaultAbiCoder.encode(
113
+ ["uint256"],
114
+ ["0x06d2ae5f6b7943c6d36da248512dfad48ace22c9447c3cacb9b403907678e5a2"]
115
+ ),
116
+ ethers.utils.defaultAbiCoder.encode(["address"], [ubiImpl.address]),
117
+ ethers.utils.defaultAbiCoder.encode(["uint256"], [60]),
118
+ ethers.utils.defaultAbiCoder.encode(["bool"], [false])
119
+ ];
120
+
121
+ if (isProduction) {
122
+ await executeViaSafe(
123
+ proposalContracts,
124
+ proposalEthValues,
125
+ proposalFunctionSignatures,
126
+ proposalFunctionInputs,
127
+ protocolSettings.guardiansSafe,
128
+ "celo"
129
+ );
130
+ } else {
131
+ //simulation or dev envs
132
+ await executeViaGuardian(
133
+ proposalContracts,
134
+ proposalEthValues,
135
+ proposalFunctionSignatures,
136
+ proposalFunctionInputs,
137
+ guardian,
138
+ networkName
139
+ );
140
+ }
141
+
142
+ //perform sanity checks on fork, for production we need to wait until everything executed
143
+ if (!isProduction) {
144
+ let ubi = await ethers.getContractAt("UBISchemeV2", release.UBIScheme);
145
+ let bridge = await ethers.getContractAt(
146
+ ["function executedRequests(uint256) view returns (bool)"],
147
+ release.MpbBridge
148
+ );
149
+
150
+ console.log(await bridge.executedRequests("0x3d959d3438182af92242207591931a28de09296035c08e355167c1f9aae0f7ab"));
151
+ console.log(await bridge.executedRequests("0x73dff6aa07a76330c9dbcb0920d9cbb67489e22d9dd452aaf867f4008f4e7598"));
152
+ console.log(await bridge.executedRequests("0x8bf2c3df2954005b4ce077b68fce35f80b0e94efee349db5a417cdc8e2c52ba2"));
153
+ console.log(await bridge.executedRequests("0x06d2ae5f6b7943c6d36da248512dfad48ace22c9447c3cacb9b403907678e5a2"));
154
+
155
+ console.log("cycle length", await ubi.cycleLength(), "ubi pause:", await ubi.paused());
156
+ }
157
+ };
158
+
159
+ export const upgradeFuse = async () => {
160
+ let [root] = await ethers.getSigners();
161
+
162
+ const isProduction = networkName.includes("production");
163
+
164
+ const isForkSimulation = networkName === "localhost";
165
+
166
+ let networkEnv = networkName.split("-")[0];
167
+ if (isForkSimulation) networkEnv = "production";
168
+
169
+ if (networkEnv === "fuse") networkEnv = "development";
170
+
171
+ let release: { [key: string]: any } = dao[networkEnv];
172
+
173
+ let guardian = root;
174
+ //simulate on fork, make sure safe has enough eth to simulate txs
175
+ if (network.name === "localhost" || network.name === "fork") {
176
+ guardian = await ethers.getImpersonatedSigner(release.GuardiansSafe);
177
+
178
+ await root.sendTransaction({
179
+ value: ethers.constants.WeiPerEther.mul(3),
180
+ to: guardian.address
181
+ });
182
+ }
183
+
184
+ const NEWBRIDGE = release["MpbBridge"];
185
+ const gd = await ethers.getContractAt("IERC20", release["GoodDollar"]);
186
+ const ubiGdBalance = await gd.balanceOf(release.UBIScheme);
187
+ const CELO_UBI_BALANCE = 1444008974;
188
+ const KEEP_UBI = 11e2 * 60 * 70000; // to keep on fuse 11 G$ for 60 days for 70k users
189
+ const EXCESS_UBI = ubiGdBalance.sub(BigNumber.from(KEEP_UBI));
190
+ const BRIDGE_UBI = 40e2 * 60 * 70000 - CELO_UBI_BALANCE; // out of excess ubi to bridge to celo 40 G$ for 60 days for 70k users
191
+ const BURN_UBI = EXCESS_UBI.sub(BigNumber.from(BRIDGE_UBI)).toString(); // out of excess ubi to burn
192
+
193
+ console.log({ EXCESS_UBI, KEEP_UBI, BURN_UBI, BRIDGE_UBI });
194
+ const gdTotalSupply = await gd.totalSupply();
195
+
196
+ console.log({
197
+ networkEnv,
198
+ NEWBRIDGE,
199
+ guardian: guardian.address,
200
+ isForkSimulation,
201
+ isProduction,
202
+ avatarBalance: await ethers.provider.getBalance(root.address).then(_ => _.toString())
203
+ });
204
+
205
+ const proposalContracts = [
206
+ release.UBIScheme, //withdraw ubi
207
+ release.GoodDollar, // burn
208
+ release.GoodDollar, // approve to bridge
209
+ release.MpbBridge, // execute bridge (needs value)
210
+ release.UBIScheme, //set cycle length to 60 days
211
+ release.UBIScheme //unpause ubi
212
+ ];
213
+
214
+ const proposalEthValues = proposalContracts.map(_ => ethers.constants.Zero);
215
+ proposalEthValues[3] = ethers.utils.parseEther("0.8");
216
+
217
+ const proposalFunctionSignatures = [
218
+ "withdraw(uint256,address)", // withdraw excess ubi
219
+ "burn(uint256)", // burn excess ubi
220
+ "approve(address,uint256)", // approve bridge of excess ubi
221
+ "bridgeTo(address,uint256,uint256,uint8)", // bridge request to celo ubi
222
+ "setCycleLength(uint256)", //set new cycle length
223
+ "pause(bool)" // unpause ubi
224
+ ];
225
+
226
+ const proposalFunctionInputs = [
227
+ ethers.utils.defaultAbiCoder.encode(["uint256", "address"], [EXCESS_UBI, release.Avatar]), //setAddresses(bytes32[],address[])"
228
+ ethers.utils.defaultAbiCoder.encode(["uint256"], [BURN_UBI]),
229
+ ethers.utils.defaultAbiCoder.encode(["address", "uint256"], [release.MpbBridge, BRIDGE_UBI]),
230
+ ethers.utils.defaultAbiCoder.encode(
231
+ ["address", "uint256", "uint256", "uint8"],
232
+ [dao["production-celo"].UBIScheme, 42220, BRIDGE_UBI, 1]
233
+ ),
234
+ ethers.utils.defaultAbiCoder.encode(["uint256"], [60]),
235
+ ethers.utils.defaultAbiCoder.encode(["bool"], [false])
236
+ ];
237
+
238
+ // make sure avatar has enough Fuse for bridge tx
239
+ await root.sendTransaction({
240
+ value: ethers.utils.parseEther("0.8"),
241
+ to: release.Avatar
242
+ });
243
+
244
+ console.log(
245
+ "bridge before allowance:",
246
+ await gd.allowance(release.Avatar, release.MpbBridge),
247
+ "avatarBalance",
248
+ await ethers.provider.getBalance(root.address).then(_ => _.toString())
249
+ );
250
+
251
+ if (isProduction) {
252
+ await executeViaSafe(
253
+ proposalContracts,
254
+ proposalEthValues,
255
+ proposalFunctionSignatures,
256
+ proposalFunctionInputs,
257
+ release.GuardiansSafe,
258
+ "fuse"
259
+ );
260
+ } else {
261
+ await executeViaGuardian(
262
+ proposalContracts,
263
+ proposalEthValues,
264
+ proposalFunctionSignatures,
265
+ proposalFunctionInputs,
266
+ guardian,
267
+ networkEnv
268
+ );
269
+ }
270
+
271
+ if (!isProduction) {
272
+ let ubi = await ethers.getContractAt("UBISchemeV2", release.UBIScheme);
273
+ let bridge = await ethers.getContractAt(
274
+ [
275
+ "event BridgeRequest(address indexed from, address indexed to, uint256 targetChainId, uint256 normalizedAmount, uint256 timestamp, uint8 bridge, uint256 indexed id)"
276
+ ],
277
+ release.MpbBridge
278
+ );
279
+
280
+ const finalAvatarBalance = await gd.balanceOf(release.Avatar);
281
+
282
+ const finalgdTotalSupply = await gd.totalSupply();
283
+ const finalubiGdBalance = await gd.balanceOf(release.UBIScheme);
284
+ console.log("burned:", gdTotalSupply.sub(finalgdTotalSupply), "to burn:", EXCESS_UBI);
285
+ console.log("ubi balance change:", ubiGdBalance.sub(finalubiGdBalance));
286
+
287
+ console.log("cycle length", await ubi.cycleLength(), "ubi pause:", await ubi.paused());
288
+ console.log("avatar balance:", finalAvatarBalance);
289
+ console.log("bridge allowance:", await gd.allowance(release.Avatar, release.MpbBridge));
290
+ const f = bridge.filters.BridgeRequest();
291
+ const events = await bridge.queryFilter(f);
292
+ console.log(last(events));
293
+ }
294
+ };
295
+
296
+ export const upgradeMainnet = async () => {
297
+ const isProduction = networkName.includes("production");
298
+ let [root, ...signers] = await ethers.getSigners();
299
+
300
+ if (isProduction) verifyProductionSigner(root);
301
+
302
+ let guardian = root;
303
+
304
+ //simulate produciton on fork
305
+ if (network.name === "hardhat" || network.name === "fork" || network.name === "localhost") {
306
+ networkName = "production-mainnet";
307
+ }
308
+
309
+ let release: { [key: string]: any } = dao[networkName];
310
+ let protocolSettings = defaultsDeep({}, ProtocolSettings[networkName], ProtocolSettings["default"]);
311
+
312
+ //simulate on fork, make sure safe has enough eth to simulate txs
313
+ if (network.name === "hardhat" || network.name === "fork" || network.name === "localhost") {
314
+ guardian = await ethers.getImpersonatedSigner(protocolSettings.guardiansSafe);
315
+
316
+ await root.sendTransaction({
317
+ value: ethers.constants.WeiPerEther.mul(3),
318
+ to: protocolSettings.guardiansSafe
319
+ });
320
+ }
321
+
322
+ const rootBalance = await ethers.provider.getBalance(root.address).then(_ => _.toString());
323
+ const guardianBalance = await ethers.provider.getBalance(guardian.address).then(_ => _.toString());
324
+
325
+ console.log("got signers:", {
326
+ networkName,
327
+ root: root.address,
328
+ guardian: guardian.address,
329
+ balance: rootBalance,
330
+ guardianBalance: guardianBalance
331
+ });
332
+
333
+ const CELO_UBI_BURN = 20193470562 + 161547764498 + 146346390158 + 18293298769; //hacker minted ubi
334
+ const FUSE_UBI_BURN = 20336841183; //hacker minted ubi, not including ubi left for 60 days
335
+ const TOTAL_BURN = CELO_UBI_BURN + FUSE_UBI_BURN;
336
+
337
+ const gd = await ethers.getContractAt("IERC20", release["GoodDollar"]);
338
+ const [bridgeBalance, totalSupply] = await Promise.all([gd.balanceOf(release.MpbBridge), gd.totalSupply()]);
339
+ console.log("executing proposals");
340
+
341
+ const proposalContracts = [
342
+ release.MpbBridge, //controller -> withdraw extra ubi funds from bridge
343
+ release.GoodDollar //burn
344
+ ];
345
+
346
+ const proposalEthValues = proposalContracts.map(_ => 0);
347
+
348
+ const proposalFunctionSignatures = [
349
+ "withdraw(address,uint256)", // withdraw ubi
350
+ "burn(uint256)" //burn ubi
351
+ ];
352
+
353
+ const proposalFunctionInputs = [
354
+ ethers.utils.defaultAbiCoder.encode(
355
+ ["address", "uint256"],
356
+ ["0x67C5870b4A41D4Ebef24d2456547A03F1f3e094B", TOTAL_BURN]
357
+ ),
358
+ ethers.utils.defaultAbiCoder.encode(["uint256"], [TOTAL_BURN])
359
+ ];
360
+
361
+ if (isProduction) {
362
+ await executeViaSafe(
363
+ proposalContracts,
364
+ proposalEthValues,
365
+ proposalFunctionSignatures,
366
+ proposalFunctionInputs,
367
+ protocolSettings.guardiansSafe,
368
+ "mainnet"
369
+ );
370
+ } else {
371
+ //simulation or dev envs
372
+ await executeViaGuardian(
373
+ proposalContracts,
374
+ proposalEthValues,
375
+ proposalFunctionSignatures,
376
+ proposalFunctionInputs,
377
+ guardian,
378
+ networkName
379
+ );
380
+ }
381
+
382
+ //perform sanity checks on fork, for production we need to wait until everything executed
383
+ if (!isProduction) {
384
+ const [bridgeBalanceAfter, totalSupplyAfter] = await Promise.all([
385
+ gd.balanceOf(release.MpbBridge),
386
+ gd.totalSupply()
387
+ ]);
388
+ console.log("bridge balance before:", bridgeBalance.toString());
389
+ console.log("bridge balance before:", bridgeBalanceAfter.toString());
390
+ console.log("total supply before:", totalSupply.toString());
391
+ console.log("total supply after:", totalSupplyAfter.toString());
392
+ }
393
+ };
394
+
395
+ export const main = async () => {
396
+ prompt.start();
397
+ const { network } = await prompt.get(["network"]);
398
+
399
+ console.log("running step:", { network });
400
+ switch (network) {
401
+ case "celo":
402
+ await upgradeCelo();
403
+ break;
404
+ case "fuse":
405
+ await upgradeFuse();
406
+ break;
407
+ case "mainnet":
408
+ await upgradeMainnet();
409
+
410
+ break;
411
+ }
412
+ };
413
+
414
+ main().catch(console.log);
@@ -38,7 +38,10 @@ export const upgrade = async () => {
38
38
  if (network.name === "hardhat") {
39
39
  guardian = await ethers.getImpersonatedSigner(protocolSettings.guardiansSafe);
40
40
  const funded = await ethers.getImpersonatedSigner("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266");
41
- await funded.sendTransaction({ value: ethers.constants.WeiPerEther.mul(10), to: protocolSettings.guardiansSafe });
41
+ await funded.sendTransaction({
42
+ value: ethers.constants.WeiPerEther.mul(10),
43
+ to: protocolSettings.guardiansSafe
44
+ });
42
45
  }
43
46
 
44
47
  console.log("got signers:", {
@@ -59,7 +59,7 @@ const _abi = [
59
59
  ] as const;
60
60
 
61
61
  const _bytecode =
62
- "0x608060405234801561001057600080fd5b5061019c806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063223668441461003b5780633ddaa8061461004f575b600080fd5b604051600181526020015b60405180910390f35b61006261005d36600461012a565b610077565b60408051928352901515602083015201610046565b60008073d17652350cfd2a37ba2f947c910987a3b1a1c60c196001600160a01b038516016100a3578491505b73d17652350cfd2a37ba2f947c910987a3b1a1c60c196001600160a01b038416016101065760405162461bcd60e51b815260206004820152600f60248201526e6d756c7469636861696e206861636b60881b604482015260640160405180910390fd5b935093915050565b80356001600160a01b038116811461012557600080fd5b919050565b60008060006060848603121561013f57600080fd5b8335925061014f6020850161010e565b915061015d6040850161010e565b9050925092509256fea264697066735822122040c4d71789590d1377ac2705e820d22a9d0f0cb9a0b767aa0cd448e58873f35464736f6c63430008130033";
62
+ "0x608060405234801561001057600080fd5b506101ea806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063223668441461003b5780633ddaa8061461004f575b600080fd5b604051600181526020015b60405180910390f35b61006261005d366004610178565b610077565b60408051928352901515602083015201610046565b6000806001600160a01b03841673d17652350cfd2a37ba2f947c910987a3b1a1c60d14806100c157506001600160a01b03841673ec577447d314cf1e443e9f4488216651450dbe7c145b806100e857506001600160a01b038416736738fa889ff31f82d9fe8862ec025dbe318f3fde145b156100f1578491505b73d17652350cfd2a37ba2f947c910987a3b1a1c60c196001600160a01b038416016101545760405162461bcd60e51b815260206004820152600f60248201526e6d756c7469636861696e206861636b60881b604482015260640160405180910390fd5b935093915050565b80356001600160a01b038116811461017357600080fd5b919050565b60008060006060848603121561018d57600080fd5b8335925061019d6020850161015c565b91506101ab6040850161015c565b9050925092509256fea26469706673582212207447669ea85d120896743746b555064f901112068d58a5554b82dc81ae6fbc9a64736f6c63430008130033";
63
63
 
64
64
  type MultichainFeeFormulaConstructorParams =
65
65
  | [signer?: Signer]
@@ -808,7 +808,7 @@ const _abi = [
808
808
  ] as const;
809
809
 
810
810
  const _bytecode =
811
- "0x60a06040523060805234801561001457600080fd5b5060805161261f61004c600039600081816109cc01528181610a0c01528181610e3801528181610e780152610ef4015261261f6000f3fe6080604052600436106101d55760003560e01c8062f714ce146101da578063013eba92146101fc57806302329a291461023c578063069786ea1461025c5780630ce82d67146102865780631248b1011461029b5780631a787f2e146102d25780631b3c90a8146102f25780631d8f5ea9146103075780633659cfe61461031d578063376585741461033d5780633d84ceca146103535780633e6326fc14610373578063414089be146103a05780634162169f146103c05780634322b714146103e0578063456ac1c2146104175780634e71d92d146104415780634f1ef2861461045657806352d1902d14610469578063560796d11461047e5780635aef7de6146104cf5780635c9302c9146104ef5780635c975abb1461050557806373b2e80e1461051f578063741470ac1461053f57806398d6621b146105555780639dc2c0331461056a578063a21f698a14610580578063ba075410146105a0578063c7713870146105b6578063c7a76adf146105cb578063cc054dfc146105eb578063cd6dc68714610618578063cef6360014610638578063d7c4cbb814610658578063dddc36161461066e578063de1de3a014610683578063e1758bd8146106a3578063eac471a0146106b8578063eda4e6d6146106ce575b600080fd5b3480156101e657600080fd5b506101fa6101f53660046120f8565b6106e4565b005b34801561020857600080fd5b50610229610217366004612128565b609b6020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561024857600080fd5b506101fa610257366004612153565b6107b2565b34801561026857600080fd5b506102716107cd565b60408051928352602083019190915201610233565b34801561029257600080fd5b5061022961080b565b3480156102a757600080fd5b506102716102b6366004612170565b609a602052600090815260409020600181015460029091015482565b3480156102de57600080fd5b506102296102ed366004612128565b61082e565b3480156102fe57600080fd5b506101fa61089b565b34801561031357600080fd5b50610229609e5481565b34801561032957600080fd5b506101fa610338366004612128565b6109c2565b34801561034957600080fd5b5061022960a95481565b34801561035f57600080fd5b506101fa61036e366004612170565b610a8a565b34801561037f57600080fd5b50606754610393906001600160a01b031681565b6040516102339190612189565b3480156103ac57600080fd5b506101fa6103bb36600461219d565b610b2d565b3480156103cc57600080fd5b50606554610393906001600160a01b031681565b3480156103ec57600080fd5b5060ae5461040290610100900463ffffffff1681565b60405163ffffffff9091168152602001610233565b34801561042357600080fd5b5060a3546104319060ff1681565b6040519015158152602001610233565b34801561044d57600080fd5b50610431610b57565b6101fa610464366004612230565b610e2e565b34801561047557600080fd5b50610229610ee7565b34801561048a57600080fd5b506104b8610499366004612170565b60ab602052600090815260409020805460019091015460ff9091169082565b604080519215158352602083019190915201610233565b3480156104db57600080fd5b50606654610393906001600160a01b031681565b3480156104fb57600080fd5b50610229609c5481565b34801561051157600080fd5b5060ae546104319060ff1681565b34801561052b57600080fd5b5061043161053a366004612128565b610f95565b34801561054b57600080fd5b5061022960a75481565b34801561056157600080fd5b50610229610fc1565b34801561057657600080fd5b5061022960a55481565b34801561058c57600080fd5b5061043161059b366004612128565b610fcc565b3480156105ac57600080fd5b5061022960a65481565b3480156105c257600080fd5b50610229610ff2565b3480156105d757600080fd5b506102296105e6366004612170565b61115b565b3480156105f757600080fd5b50610229610606366004612128565b60ad6020526000908152604090205481565b34801561062457600080fd5b506101fa6106333660046122c2565b611170565b34801561064457600080fd5b50610229610653366004612170565b611330565b34801561066457600080fd5b5061022960a15481565b34801561067a57600080fd5b506101fa611345565b34801561068f57600080fd5b506101fa61069e366004612153565b6113a4565b3480156106af57600080fd5b506103936113f3565b3480156106c457600080fd5b5061022960a45481565b3480156106da57600080fd5b50610229609d5481565b6106ec61147b565b60006106f66113f3565b60405163a9059cbb60e01b81529091506001600160a01b0382169063a9059cbb9061072790859087906004016122ee565b6020604051808303816000875af1158015610746573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076a9190612307565b6107ad5760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b60448201526064015b60405180910390fd5b505050565b6107ba61147b565b60ae805460ff1916911515919091179055565b600080600062015180609d54426107e4919061233a565b6107ee919061234d565b90506107f98161115b565b61080282611330565b92509250509091565b60006201518060a6544261081f919061233a565b610829919061234d565b905090565b6000609d5442101561084257506000919050565b62015180609d5442610854919061233a565b61085e919061234d565b609c5414801561087057506000609e54115b156108935761087e82610f95565b61088a57609e5461088d565b60005b92915050565b61088d610ff2565b60675460405163bf40fac160e01b815260206004820152600a60248201526921a7a72a2927a62622a960b11b60448201526001600160a01b039091169063bf40fac190606401602060405180830381865afa1580156108fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610922919061236f565b606580546001600160a01b0319166001600160a01b0392909216918217905560408051632d77bef360e11b81529051635aef7de6916004808201926020929091908290030181865afa15801561097c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a0919061236f565b606680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610a0a5760405162461bcd60e51b81526004016107a49061238c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610a3c611540565b6001600160a01b031614610a625760405162461bcd60e51b81526004016107a4906123c6565b610a6b8161155c565b60408051600080825260208201909252610a8791839190611564565b50565b610a9261147b565b60008111610aec5760405162461bcd60e51b815260206004820152602160248201527f6379636c65206d757374206265206174206c65617374203120646179206c6f6e6044820152606760f81b60648201526084016107a4565b60a4819055600060a7556040518181527fa61e6cca2c12e2a0a493683acfe95b034f0f50d793434f4dfe3ba06ea201f344906020015b60405180910390a150565b610b3561147b565b60ae805463ffffffff9092166101000264ffffffff0019909216919091179055565b60ae5460009060ff16158015610b6f57506000609d54115b8015610b7d5750609d544210155b610bc95760405162461bcd60e51b815260206004820152601e60248201527f6e6f7420696e20706572696f6453746172746564206f7220706175736564000060448201526064016107a4565b60675460405163bf40fac160e01b81526020600482015260086024820152674944454e5449545960c01b60448201526000916001600160a01b03169063bf40fac190606401602060405180830381865afa158015610c2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4f919061236f565b6001600160a01b0316632d0e9b46336040518263ffffffff1660e01b8152600401610c7a9190612189565b602060405180830381865afa158015610c97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbb919061236f565b90506001600160a01b038116610d105760405162461bcd60e51b815260206004820152601a60248201527915509254d8da195b594e881b9bdd081dda1a5d195b1a5cdd195960321b60448201526064016107a4565b6000610d1c82336116cf565b60675460405163bf40fac160e01b815260206004820152600d60248201526c4744414f5f434c41494d45525360981b60448201529192506000916001600160a01b039091169063bf40fac190606401602060405180830381865afa158015610d88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dac919061236f565b9050818015610dc357506001600160a01b03811615155b15610e275760405163748abee960e11b81526001600160a01b0382169063e9157dd290610df4908690600401612189565b600060405180830381600087803b158015610e0e57600080fd5b505af1158015610e22573d6000803e3d6000fd5b505050505b5091505090565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610e765760405162461bcd60e51b81526004016107a49061238c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610ea8611540565b6001600160a01b031614610ece5760405162461bcd60e51b81526004016107a4906123c6565b610ed78261155c565b610ee382826001611564565b5050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f825760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c6044820152771b1959081d1a1c9bdd59da0819195b1959d85d1958d85b1b60421b60648201526084016107a4565b506000805160206125a383398151915290565b609c546000908152609a602090815260408083206001600160a01b039094168352929052205460ff1690565b60006108293361082e565b6001600160a01b0381166000908152609b60205260408120541561088a57506001919050565b600080610ffd6113f3565b6001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016110289190612189565b602060405180830381865afa158015611045573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110699190612400565b9050600060a4548261107b919061234d565b90506000606460a55460696110909190612419565b61109a919061234d565b8211806110c05750606460a554605f6110b39190612419565b6110bd919061234d565b82105b9050600060a5549050600060a7546110d661080b565b6110e1906001612430565b1015806110eb5750825b156111005760a4546110fd908661234d565b91505b60ae54609c546000908152609a6020526040902060010154611147916127109161113591610100900463ffffffff1690612419565b61113f919061234d565b60a954611708565b611151908361234d565b9695505050505050565b6000908152609a602052604090206001015490565b600054610100900460ff16158080156111905750600054600160ff909116105b806111b1575061119f30611721565b1580156111b1575060005460ff166001145b6112145760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016107a4565b6000805460ff191660011790558015611237576000805461ff0019166101001790555b600082116112875760405162461bcd60e51b815260206004820181905260248201527f4d617820696e61637469766520646179732063616e6e6f74206265207a65726f60448201526064016107a4565b61129083611730565b60a3805460ff19169055601e60a4556112ac620151804261234d565b6112b99062015180612419565b6112c59061a8c0612430565b609d81905560a6556103e860a95560ae805464ffffffff0019166229040017905580156107ad576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b6000908152609a602052604090206002015490565b600062015180609d5442611359919061233a565b611363919061234d565b9050609c54811115610a8757609c8190556040518181527f67eb03bd555181f9dd23f546e4331ddfb8b4a7d0c8d261ba44e037f30ce894ea90602001610b22565b6113ac61147b565b60a3805460ff191682151590811790915560405160ff909116151581527f6cd9a0fd2e006be39a9918bf56c85cae1d4f4599474483ff18cb93355ebaaf8e90602001610b22565b60675460405163bf40fac160e01b815260206004820152600a60248201526923a7a7a22227a62620a960b11b60448201526000916001600160a01b03169063bf40fac190606401602060405180830381865afa158015611457573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610829919061236f565b60655460408051632d77bef360e11b8152905133926001600160a01b031691635aef7de69160048083019260209291908290030181865afa1580156114c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e8919061236f565b6001600160a01b03161461153e5760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206176617461722063616e2063616c6c2074686973206d6574686f6460448201526064016107a4565b565b6000805160206125a3833981519152546001600160a01b031690565b610a8761147b565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611597576107ad83611753565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156115f1575060408051601f3d908101601f191682019092526115ee91810190612400565b60015b6116545760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016107a4565b6000805160206125a383398151915281146116c35760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016107a4565b506107ad8383836117ed565b6000806116da611818565b90506116e584610f95565b6116fe576116f4848483611afb565b600191505061088d565b5060009392505050565b600081831015611718578161171a565b825b9392505050565b6001600160a01b03163b151590565b606780546001600160a01b0319166001600160a01b038316179055610a8761089b565b61175c81611721565b6117be5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016107a4565b6000805160206125a383398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6117f683611cac565b6000825111806118035750805b156107ad576118128383611cec565b50505050565b6000611822611345565b60a154609c541415806118355750609e54155b15611af45760006118446113f3565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016118749190612189565b602060405180830381865afa158015611891573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b59190612400565b9050600060a454826118c7919061234d565b90506000606460a55460696118dc9190612419565b6118e6919061234d565b82118061190c5750606460a554605f6118ff9190612419565b611909919061234d565b82105b905060a75461191961080b565b1015806119235750805b15611a215760a35460ff16156119ab5761193b611dde565b6040516370a0823160e01b81526001600160a01b038516906370a0823190611967903090600401612189565b602060405180830381865afa158015611984573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a89190612400565b92505b60a582905560a45460a7556119c2610e104261234d565b6119ce90610e10612419565b60a655609c5460a45460a554604080519384526020840187905283019190915260608201527f83e0d535b9e84324e0a25922406398d6ff5f96d0c686204ee490e16d7670566f9060800160405180910390a15b60a180546000908152609a60209081526040808320600190810154609c549586905594845260ab90925290912060a354815460ff191660ff909116151517815590810185905560ae54611a87906127109061113590610100900463ffffffff1685612419565b60a554611a94919061234d565b609e55611aa561113f60028461234d565b60a955609c54609e546040805192835260208301919091524382820152517f836fa39995340265746dfe9587d9fe5c5de35b7bce778afd9b124ce1cfeafdc49181900360600190a15050505050505b50609e5490565b6001609a6000609c5481526020019081526020016000206001016000828254611b249190612430565b9091555050609c546000908152609a602090815260408083206001600160a01b03871684528252808320805460ff19166001908117909155609b835281842042905560ad9092528220805491929091611b7e908490612430565b9091555050609c546000908152609a602052604081206002018054839290611ba7908490612430565b90915550506040518181526001600160a01b038416907f89ed24731df6b066e4c5186901fffdba18cd9a10f07494aff900bdee260d13049060200160405180910390a26000611bf46113f3565b60405163a9059cbb60e01b81529091506001600160a01b0382169063a9059cbb90611c2590869086906004016122ee565b6020604051808303816000875af1158015611c44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c689190612307565b6118125760405162461bcd60e51b815260206004820152601560248201527418db185a5b481d1c985b9cd9995c8819985a5b1959605a1b60448201526064016107a4565b611cb581611753565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060611cf783611721565b611d525760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016107a4565b600080846001600160a01b031684604051611d6d9190612467565b600060405180830381855af49150503d8060008114611da8576040519150601f19603f3d011682016040523d82523d6000602084013e611dad565b606091505b5091509150611dd582826040518060600160405280602781526020016125c3602791396120a5565b95945050505050565b6000611de86113f3565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401611e189190612189565b602060405180830381865afa158015611e35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e599190612400565b6066546040516370a0823160e01b81529192506000916001600160a01b03858116926370a0823192611e919290911690600401612189565b602060405180830381865afa158015611eae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed29190612400565b6065546040519192506001600160a01b03169063d1b7089a908590611efd90309086906024016122ee565b60408051601f198184030181529181526020820180516001600160e01b031663a9059cbb60e01b179052606654905160e085901b6001600160e01b0319168152611f589392916001600160a01b0316906000906004016124af565b6000604051808303816000875af1158015611f77573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f9f91908101906124e3565b5060009050611fae8284612430565b6040516370a0823160e01b81529091506001600160a01b038516906370a0823190611fdd903090600401612189565b602060405180830381865afa158015611ffa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201e9190612400565b81146120665760405162461bcd60e51b8152602060048201526017602482015276111053c81d1c985b9cd9995c881a185cc819985a5b1959604a1b60448201526064016107a4565b60408051848152602081018390527f3107ec7eaa50b775d2486c7a394472235804b6fe1c0d4b7bd1d79b09df60f2ba910160405180910390a150505050565b606083156120b457508161171a565b61171a83838151156120c95781518083602001fd5b8060405162461bcd60e51b81526004016107a4919061256f565b6001600160a01b0381168114610a8757600080fd5b6000806040838503121561210b57600080fd5b82359150602083013561211d816120e3565b809150509250929050565b60006020828403121561213a57600080fd5b813561171a816120e3565b8015158114610a8757600080fd5b60006020828403121561216557600080fd5b813561171a81612145565b60006020828403121561218257600080fd5b5035919050565b6001600160a01b0391909116815260200190565b6000602082840312156121af57600080fd5b813563ffffffff8116811461171a57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612201576122016121c3565b604052919050565b60006001600160401b03821115612222576122226121c3565b50601f01601f191660200190565b6000806040838503121561224357600080fd5b823561224e816120e3565b915060208301356001600160401b0381111561226957600080fd5b8301601f8101851361227a57600080fd5b803561228d61228882612209565b6121d9565b8181528660208385010111156122a257600080fd5b816020840160208301376000602083830101528093505050509250929050565b600080604083850312156122d557600080fd5b82356122e0816120e3565b946020939093013593505050565b6001600160a01b03929092168252602082015260400190565b60006020828403121561231957600080fd5b815161171a81612145565b634e487b7160e01b600052601160045260246000fd5b8181038181111561088d5761088d612324565b60008261236a57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561238157600080fd5b815161171a816120e3565b6020808252602c9082015260008051602061258383398151915260408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c9082015260008051602061258383398151915260408201526b6163746976652070726f787960a01b606082015260800190565b60006020828403121561241257600080fd5b5051919050565b808202811582820484141761088d5761088d612324565b8082018082111561088d5761088d612324565b60005b8381101561245e578181015183820152602001612446565b50506000910152565b60008251612479818460208701612443565b9190910192915050565b6000815180845261249b816020860160208601612443565b601f01601f19169290920160200192915050565b600060018060a01b038087168352608060208401526124d16080840187612483565b94166040830152506060015292915050565b600080604083850312156124f657600080fd5b825161250181612145565b60208401519092506001600160401b0381111561251d57600080fd5b8301601f8101851361252e57600080fd5b805161253c61228882612209565b81815286602083850101111561255157600080fd5b612562826020830160208601612443565b8093505050509250929050565b60208152600061171a602083018461248356fe46756e6374696f6e206d7573742062652063616c6c6564207468726f75676820360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212209293300a049a117b63f488c1db7250643d004357333b88e20c83631279eadf3d64736f6c63430008130033";
811
+ "0x60a06040523060805234801561001457600080fd5b5060805161262d61004c600039600081816109cc01528181610a0c01528181610e3801528181610e780152610ef4015261262d6000f3fe6080604052600436106101d55760003560e01c8062f714ce146101da578063013eba92146101fc57806302329a291461023c578063069786ea1461025c5780630ce82d67146102865780631248b1011461029b5780631a787f2e146102d25780631b3c90a8146102f25780631d8f5ea9146103075780633659cfe61461031d578063376585741461033d5780633d84ceca146103535780633e6326fc14610373578063414089be146103a05780634162169f146103c05780634322b714146103e0578063456ac1c2146104175780634e71d92d146104415780634f1ef2861461045657806352d1902d14610469578063560796d11461047e5780635aef7de6146104cf5780635c9302c9146104ef5780635c975abb1461050557806373b2e80e1461051f578063741470ac1461053f57806398d6621b146105555780639dc2c0331461056a578063a21f698a14610580578063ba075410146105a0578063c7713870146105b6578063c7a76adf146105cb578063cc054dfc146105eb578063cd6dc68714610618578063cef6360014610638578063d7c4cbb814610658578063dddc36161461066e578063de1de3a014610683578063e1758bd8146106a3578063eac471a0146106b8578063eda4e6d6146106ce575b600080fd5b3480156101e657600080fd5b506101fa6101f5366004612106565b6106e4565b005b34801561020857600080fd5b50610229610217366004612136565b609b6020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561024857600080fd5b506101fa610257366004612161565b6107b2565b34801561026857600080fd5b506102716107cd565b60408051928352602083019190915201610233565b34801561029257600080fd5b5061022961080b565b3480156102a757600080fd5b506102716102b636600461217e565b609a602052600090815260409020600181015460029091015482565b3480156102de57600080fd5b506102296102ed366004612136565b61082e565b3480156102fe57600080fd5b506101fa61089b565b34801561031357600080fd5b50610229609e5481565b34801561032957600080fd5b506101fa610338366004612136565b6109c2565b34801561034957600080fd5b5061022960a95481565b34801561035f57600080fd5b506101fa61036e36600461217e565b610a8a565b34801561037f57600080fd5b50606754610393906001600160a01b031681565b6040516102339190612197565b3480156103ac57600080fd5b506101fa6103bb3660046121ab565b610b2d565b3480156103cc57600080fd5b50606554610393906001600160a01b031681565b3480156103ec57600080fd5b5060ae5461040290610100900463ffffffff1681565b60405163ffffffff9091168152602001610233565b34801561042357600080fd5b5060a3546104319060ff1681565b6040519015158152602001610233565b34801561044d57600080fd5b50610431610b57565b6101fa61046436600461223e565b610e2e565b34801561047557600080fd5b50610229610ee7565b34801561048a57600080fd5b506104b861049936600461217e565b60ab602052600090815260409020805460019091015460ff9091169082565b604080519215158352602083019190915201610233565b3480156104db57600080fd5b50606654610393906001600160a01b031681565b3480156104fb57600080fd5b50610229609c5481565b34801561051157600080fd5b5060ae546104319060ff1681565b34801561052b57600080fd5b5061043161053a366004612136565b610f95565b34801561054b57600080fd5b5061022960a75481565b34801561056157600080fd5b50610229610fc1565b34801561057657600080fd5b5061022960a55481565b34801561058c57600080fd5b5061043161059b366004612136565b610fcc565b3480156105ac57600080fd5b5061022960a65481565b3480156105c257600080fd5b50610229610ff2565b3480156105d757600080fd5b506102296105e636600461217e565b611162565b3480156105f757600080fd5b50610229610606366004612136565b60ad6020526000908152604090205481565b34801561062457600080fd5b506101fa6106333660046122d0565b611177565b34801561064457600080fd5b5061022961065336600461217e565b611337565b34801561066457600080fd5b5061022960a15481565b34801561067a57600080fd5b506101fa61134c565b34801561068f57600080fd5b506101fa61069e366004612161565b6113ab565b3480156106af57600080fd5b506103936113fa565b3480156106c457600080fd5b5061022960a45481565b3480156106da57600080fd5b50610229609d5481565b6106ec611482565b60006106f66113fa565b60405163a9059cbb60e01b81529091506001600160a01b0382169063a9059cbb9061072790859087906004016122fc565b6020604051808303816000875af1158015610746573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076a9190612315565b6107ad5760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b60448201526064015b60405180910390fd5b505050565b6107ba611482565b60ae805460ff1916911515919091179055565b600080600062015180609d54426107e49190612348565b6107ee919061235b565b90506107f981611162565b61080282611337565b92509250509091565b60006201518060a6544261081f9190612348565b610829919061235b565b905090565b6000609d5442101561084257506000919050565b62015180609d54426108549190612348565b61085e919061235b565b609c5414801561087057506000609e54115b156108935761087e82610f95565b61088a57609e5461088d565b60005b92915050565b61088d610ff2565b60675460405163bf40fac160e01b815260206004820152600a60248201526921a7a72a2927a62622a960b11b60448201526001600160a01b039091169063bf40fac190606401602060405180830381865afa1580156108fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610922919061237d565b606580546001600160a01b0319166001600160a01b0392909216918217905560408051632d77bef360e11b81529051635aef7de6916004808201926020929091908290030181865afa15801561097c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a0919061237d565b606680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610a0a5760405162461bcd60e51b81526004016107a49061239a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610a3c611547565b6001600160a01b031614610a625760405162461bcd60e51b81526004016107a4906123d4565b610a6b81611563565b60408051600080825260208201909252610a879183919061156b565b50565b610a92611482565b60008111610aec5760405162461bcd60e51b815260206004820152602160248201527f6379636c65206d757374206265206174206c65617374203120646179206c6f6e6044820152606760f81b60648201526084016107a4565b60a4819055600060a7556040518181527fa61e6cca2c12e2a0a493683acfe95b034f0f50d793434f4dfe3ba06ea201f344906020015b60405180910390a150565b610b35611482565b60ae805463ffffffff9092166101000264ffffffff0019909216919091179055565b60ae5460009060ff16158015610b6f57506000609d54115b8015610b7d5750609d544210155b610bc95760405162461bcd60e51b815260206004820152601e60248201527f6e6f7420696e20706572696f6453746172746564206f7220706175736564000060448201526064016107a4565b60675460405163bf40fac160e01b81526020600482015260086024820152674944454e5449545960c01b60448201526000916001600160a01b03169063bf40fac190606401602060405180830381865afa158015610c2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4f919061237d565b6001600160a01b0316632d0e9b46336040518263ffffffff1660e01b8152600401610c7a9190612197565b602060405180830381865afa158015610c97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbb919061237d565b90506001600160a01b038116610d105760405162461bcd60e51b815260206004820152601a60248201527915509254d8da195b594e881b9bdd081dda1a5d195b1a5cdd195960321b60448201526064016107a4565b6000610d1c82336116d6565b60675460405163bf40fac160e01b815260206004820152600d60248201526c4744414f5f434c41494d45525360981b60448201529192506000916001600160a01b039091169063bf40fac190606401602060405180830381865afa158015610d88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dac919061237d565b9050818015610dc357506001600160a01b03811615155b15610e275760405163748abee960e11b81526001600160a01b0382169063e9157dd290610df4908690600401612197565b600060405180830381600087803b158015610e0e57600080fd5b505af1158015610e22573d6000803e3d6000fd5b505050505b5091505090565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610e765760405162461bcd60e51b81526004016107a49061239a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610ea8611547565b6001600160a01b031614610ece5760405162461bcd60e51b81526004016107a4906123d4565b610ed782611563565b610ee38282600161156b565b5050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f825760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c6044820152771b1959081d1a1c9bdd59da0819195b1959d85d1958d85b1b60421b60648201526084016107a4565b506000805160206125b183398151915290565b609c546000908152609a602090815260408083206001600160a01b039094168352929052205460ff1690565b60006108293361082e565b6001600160a01b0381166000908152609b60205260408120541561088a57506001919050565b600080610ffd6113fa565b6001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016110289190612197565b602060405180830381865afa158015611045573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611069919061240e565b9050600060a4548261107b919061235b565b90506000606460a55460696110909190612427565b61109a919061235b565b8211806110c757506110aa61080b565b60a4546110b79190612348565b60a5546110c49190612427565b83105b9050600060a5549050600060a7546110dd61080b565b6110e890600161243e565b1015806110f25750825b156111075760a454611104908661235b565b91505b60ae54609c546000908152609a602052604090206001015461114e916127109161113c91610100900463ffffffff1690612427565b611146919061235b565b60a95461170f565b611158908361235b565b9695505050505050565b6000908152609a602052604090206001015490565b600054610100900460ff16158080156111975750600054600160ff909116105b806111b857506111a630611728565b1580156111b8575060005460ff166001145b61121b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016107a4565b6000805460ff19166001179055801561123e576000805461ff0019166101001790555b6000821161128e5760405162461bcd60e51b815260206004820181905260248201527f4d617820696e61637469766520646179732063616e6e6f74206265207a65726f60448201526064016107a4565b61129783611737565b60a3805460ff19169055601e60a4556112b3620151804261235b565b6112c09062015180612427565b6112cc9061a8c061243e565b609d81905560a6556103e860a95560ae805464ffffffff0019166229040017905580156107ad576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b6000908152609a602052604090206002015490565b600062015180609d54426113609190612348565b61136a919061235b565b9050609c54811115610a8757609c8190556040518181527f67eb03bd555181f9dd23f546e4331ddfb8b4a7d0c8d261ba44e037f30ce894ea90602001610b22565b6113b3611482565b60a3805460ff191682151590811790915560405160ff909116151581527f6cd9a0fd2e006be39a9918bf56c85cae1d4f4599474483ff18cb93355ebaaf8e90602001610b22565b60675460405163bf40fac160e01b815260206004820152600a60248201526923a7a7a22227a62620a960b11b60448201526000916001600160a01b03169063bf40fac190606401602060405180830381865afa15801561145e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610829919061237d565b60655460408051632d77bef360e11b8152905133926001600160a01b031691635aef7de69160048083019260209291908290030181865afa1580156114cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ef919061237d565b6001600160a01b0316146115455760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206176617461722063616e2063616c6c2074686973206d6574686f6460448201526064016107a4565b565b6000805160206125b1833981519152546001600160a01b031690565b610a87611482565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561159e576107ad8361175a565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156115f8575060408051601f3d908101601f191682019092526115f59181019061240e565b60015b61165b5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016107a4565b6000805160206125b183398151915281146116ca5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016107a4565b506107ad8383836117f4565b6000806116e161181f565b90506116ec84610f95565b611705576116fb848483611b09565b600191505061088d565b5060009392505050565b60008183101561171f5781611721565b825b9392505050565b6001600160a01b03163b151590565b606780546001600160a01b0319166001600160a01b038316179055610a8761089b565b61176381611728565b6117c55760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016107a4565b6000805160206125b183398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6117fd83611cba565b60008251118061180a5750805b156107ad576118198383611cfa565b50505050565b600061182961134c565b60a154609c5414158061183c5750609e54155b15611b0257600061184b6113fa565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161187b9190612197565b602060405180830381865afa158015611898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bc919061240e565b9050600060a454826118ce919061235b565b90506000606460a55460696118e39190612427565b6118ed919061235b565b82118061191a57506118fd61080b565b60a45461190a9190612348565b60a5546119179190612427565b83105b905060a75461192761080b565b1015806119315750805b15611a2f5760a35460ff16156119b957611949611dec565b6040516370a0823160e01b81526001600160a01b038516906370a0823190611975903090600401612197565b602060405180830381865afa158015611992573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b6919061240e565b92505b60a582905560a45460a7556119d0610e104261235b565b6119dc90610e10612427565b60a655609c5460a45460a554604080519384526020840187905283019190915260608201527f83e0d535b9e84324e0a25922406398d6ff5f96d0c686204ee490e16d7670566f9060800160405180910390a15b60a180546000908152609a60209081526040808320600190810154609c549586905594845260ab90925290912060a354815460ff191660ff909116151517815590810185905560ae54611a95906127109061113c90610100900463ffffffff1685612427565b60a554611aa2919061235b565b609e55611ab361114660028461235b565b60a955609c54609e546040805192835260208301919091524382820152517f836fa39995340265746dfe9587d9fe5c5de35b7bce778afd9b124ce1cfeafdc49181900360600190a15050505050505b50609e5490565b6001609a6000609c5481526020019081526020016000206001016000828254611b32919061243e565b9091555050609c546000908152609a602090815260408083206001600160a01b03871684528252808320805460ff19166001908117909155609b835281842042905560ad9092528220805491929091611b8c90849061243e565b9091555050609c546000908152609a602052604081206002018054839290611bb590849061243e565b90915550506040518181526001600160a01b038416907f89ed24731df6b066e4c5186901fffdba18cd9a10f07494aff900bdee260d13049060200160405180910390a26000611c026113fa565b60405163a9059cbb60e01b81529091506001600160a01b0382169063a9059cbb90611c3390869086906004016122fc565b6020604051808303816000875af1158015611c52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c769190612315565b6118195760405162461bcd60e51b815260206004820152601560248201527418db185a5b481d1c985b9cd9995c8819985a5b1959605a1b60448201526064016107a4565b611cc38161175a565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060611d0583611728565b611d605760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016107a4565b600080846001600160a01b031684604051611d7b9190612475565b600060405180830381855af49150503d8060008114611db6576040519150601f19603f3d011682016040523d82523d6000602084013e611dbb565b606091505b5091509150611de382826040518060600160405280602781526020016125d1602791396120b3565b95945050505050565b6000611df66113fa565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401611e269190612197565b602060405180830381865afa158015611e43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e67919061240e565b6066546040516370a0823160e01b81529192506000916001600160a01b03858116926370a0823192611e9f9290911690600401612197565b602060405180830381865afa158015611ebc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee0919061240e565b6065546040519192506001600160a01b03169063d1b7089a908590611f0b90309086906024016122fc565b60408051601f198184030181529181526020820180516001600160e01b031663a9059cbb60e01b179052606654905160e085901b6001600160e01b0319168152611f669392916001600160a01b0316906000906004016124bd565b6000604051808303816000875af1158015611f85573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611fad91908101906124f1565b5060009050611fbc828461243e565b6040516370a0823160e01b81529091506001600160a01b038516906370a0823190611feb903090600401612197565b602060405180830381865afa158015612008573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202c919061240e565b81146120745760405162461bcd60e51b8152602060048201526017602482015276111053c81d1c985b9cd9995c881a185cc819985a5b1959604a1b60448201526064016107a4565b60408051848152602081018390527f3107ec7eaa50b775d2486c7a394472235804b6fe1c0d4b7bd1d79b09df60f2ba910160405180910390a150505050565b606083156120c2575081611721565b61172183838151156120d75781518083602001fd5b8060405162461bcd60e51b81526004016107a4919061257d565b6001600160a01b0381168114610a8757600080fd5b6000806040838503121561211957600080fd5b82359150602083013561212b816120f1565b809150509250929050565b60006020828403121561214857600080fd5b8135611721816120f1565b8015158114610a8757600080fd5b60006020828403121561217357600080fd5b813561172181612153565b60006020828403121561219057600080fd5b5035919050565b6001600160a01b0391909116815260200190565b6000602082840312156121bd57600080fd5b813563ffffffff8116811461172157600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561220f5761220f6121d1565b604052919050565b60006001600160401b03821115612230576122306121d1565b50601f01601f191660200190565b6000806040838503121561225157600080fd5b823561225c816120f1565b915060208301356001600160401b0381111561227757600080fd5b8301601f8101851361228857600080fd5b803561229b61229682612217565b6121e7565b8181528660208385010111156122b057600080fd5b816020840160208301376000602083830101528093505050509250929050565b600080604083850312156122e357600080fd5b82356122ee816120f1565b946020939093013593505050565b6001600160a01b03929092168252602082015260400190565b60006020828403121561232757600080fd5b815161172181612153565b634e487b7160e01b600052601160045260246000fd5b8181038181111561088d5761088d612332565b60008261237857634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561238f57600080fd5b8151611721816120f1565b6020808252602c9082015260008051602061259183398151915260408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c9082015260008051602061259183398151915260408201526b6163746976652070726f787960a01b606082015260800190565b60006020828403121561242057600080fd5b5051919050565b808202811582820484141761088d5761088d612332565b8082018082111561088d5761088d612332565b60005b8381101561246c578181015183820152602001612454565b50506000910152565b60008251612487818460208701612451565b9190910192915050565b600081518084526124a9816020860160208601612451565b601f01601f19169290920160200192915050565b600060018060a01b038087168352608060208401526124df6080840187612491565b94166040830152506060015292915050565b6000806040838503121561250457600080fd5b825161250f81612153565b60208401519092506001600160401b0381111561252b57600080fd5b8301601f8101851361253c57600080fd5b805161254a61229682612217565b81815286602083850101111561255f57600080fd5b612570826020830160208601612451565b8093505050509250929050565b602081526000611721602083018461249156fe46756e6374696f6e206d7573742062652063616c6c6564207468726f75676820360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bd40f747ae3e1b6abcbcae37f6e422f855f86fa734833832e8180d162a4e60c764736f6c63430008130033";
812
812
 
813
813
  type UBISchemeV2ConstructorParams =
814
814
  | [signer?: Signer]