@gooddollar/goodprotocol 1.0.30-beta.2 → 1.0.31-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/artifacts/abis/DistributionHelper.min.json +1 -1
  2. package/artifacts/abis/DistributionHelperTest.min.json +1 -1
  3. package/artifacts/abis/DistributionHelperTestHelper.min.json +1 -1
  4. package/artifacts/abis/FuseStakingV3.min.json +1 -1
  5. package/artifacts/abis/GoodReserveCDai.min.json +1 -1
  6. package/artifacts/contracts/DAOStackInterfaces.sol/Avatar.dbg.json +1 -1
  7. package/artifacts/contracts/DAOStackInterfaces.sol/Controller.dbg.json +1 -1
  8. package/artifacts/contracts/DAOStackInterfaces.sol/GlobalConstraintInterface.dbg.json +1 -1
  9. package/artifacts/contracts/DAOStackInterfaces.sol/IntVoteInterface.dbg.json +1 -1
  10. package/artifacts/contracts/DAOStackInterfaces.sol/ReputationInterface.dbg.json +1 -1
  11. package/artifacts/contracts/DAOStackInterfaces.sol/SchemeRegistrar.dbg.json +1 -1
  12. package/artifacts/contracts/Interfaces.sol/AggregatorV3Interface.dbg.json +1 -1
  13. package/artifacts/contracts/Interfaces.sol/ERC20.dbg.json +1 -1
  14. package/artifacts/contracts/Interfaces.sol/IAaveIncentivesController.dbg.json +1 -1
  15. package/artifacts/contracts/Interfaces.sol/IAdminWallet.dbg.json +1 -1
  16. package/artifacts/contracts/Interfaces.sol/IDonationStaking.dbg.json +1 -1
  17. package/artifacts/contracts/Interfaces.sol/IERC2917.dbg.json +1 -1
  18. package/artifacts/contracts/Interfaces.sol/IFirstClaimPool.dbg.json +1 -1
  19. package/artifacts/contracts/Interfaces.sol/IGoodDollar.dbg.json +1 -1
  20. package/artifacts/contracts/Interfaces.sol/IGoodStaking.dbg.json +1 -1
  21. package/artifacts/contracts/Interfaces.sol/IHasRouter.dbg.json +1 -1
  22. package/artifacts/contracts/Interfaces.sol/IIdentity.dbg.json +1 -1
  23. package/artifacts/contracts/Interfaces.sol/ILendingPool.dbg.json +1 -1
  24. package/artifacts/contracts/Interfaces.sol/IMultichainRouter.dbg.json +1 -1
  25. package/artifacts/contracts/Interfaces.sol/INameService.dbg.json +1 -1
  26. package/artifacts/contracts/Interfaces.sol/IUBIScheme.dbg.json +1 -1
  27. package/artifacts/contracts/Interfaces.sol/ProxyAdmin.dbg.json +1 -1
  28. package/artifacts/contracts/Interfaces.sol/Reserve.dbg.json +1 -1
  29. package/artifacts/contracts/Interfaces.sol/Staking.dbg.json +1 -1
  30. package/artifacts/contracts/Interfaces.sol/Uniswap.dbg.json +1 -1
  31. package/artifacts/contracts/Interfaces.sol/UniswapFactory.dbg.json +1 -1
  32. package/artifacts/contracts/Interfaces.sol/UniswapPair.dbg.json +1 -1
  33. package/artifacts/contracts/Interfaces.sol/cERC20.dbg.json +1 -1
  34. package/artifacts/contracts/fuseFaucet/FuseFaucet.sol/FuseFaucet.dbg.json +1 -1
  35. package/artifacts/contracts/governance/ClaimersDistribution.sol/ClaimersDistribution.dbg.json +1 -1
  36. package/artifacts/contracts/governance/CompoundVotingMachine.sol/CompoundVotingMachine.dbg.json +1 -1
  37. package/artifacts/contracts/governance/GReputation.sol/GReputation.dbg.json +1 -1
  38. package/artifacts/contracts/governance/GoodDollarStaking.sol/GoodDollarStaking.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/governance/StakersDistribution.sol/StakersDistribution.json +2 -2
  45. package/artifacts/contracts/invite/InvitesV1.sol/InvitesV1.dbg.json +1 -1
  46. package/artifacts/contracts/mocks/AaveMock.sol/AaveMock.dbg.json +1 -1
  47. package/artifacts/contracts/mocks/DAIMock.sol/DAIMock.dbg.json +1 -1
  48. package/artifacts/contracts/mocks/DecimalsMock.sol/DecimalsMock.dbg.json +1 -1
  49. package/artifacts/contracts/mocks/DistributionBridgeMock.sol/DistributionBridgeMock.dbg.json +1 -1
  50. package/artifacts/contracts/mocks/DistributionHelperTest.sol/DistributionHelperTest.dbg.json +1 -1
  51. package/artifacts/contracts/mocks/DistributionHelperTest.sol/DistributionHelperTest.json +9 -2
  52. package/artifacts/contracts/mocks/DistributionHelperTest.sol/DistributionHelperTestHelper.dbg.json +1 -1
  53. package/artifacts/contracts/mocks/DistributionHelperTest.sol/DistributionHelperTestHelper.json +9 -2
  54. package/artifacts/contracts/mocks/GoodCompoundStakingTest.sol/GoodCompoundStakingTest.dbg.json +1 -1
  55. package/artifacts/contracts/mocks/GoodCompoundStakingTest.sol/GoodCompoundStakingTest.json +2 -2
  56. package/artifacts/contracts/mocks/GoodDollarStakingMock.sol/GoodDollarStakingMock.dbg.json +1 -1
  57. package/artifacts/contracts/mocks/GoodFundManagerTest.sol/GoodFundManagerTest.dbg.json +1 -1
  58. package/artifacts/contracts/mocks/GoodFundManagerTest.sol/GoodFundManagerTest.json +2 -2
  59. package/artifacts/contracts/mocks/IncentiveControllerMock.sol/IncentiveControllerMock.dbg.json +1 -1
  60. package/artifacts/contracts/mocks/LendingPoolMock.sol/LendingPoolMock.dbg.json +1 -1
  61. package/artifacts/contracts/mocks/MultichainRouterMock.sol/IWrapper.dbg.json +1 -1
  62. package/artifacts/contracts/mocks/MultichainRouterMock.sol/MultichainRouterMock.dbg.json +1 -1
  63. package/artifacts/contracts/mocks/OverMintTester.sol/IGoodDollarStakingTest.dbg.json +1 -1
  64. package/artifacts/contracts/mocks/OverMintTester.sol/OverMintTester.dbg.json +1 -1
  65. package/artifacts/contracts/mocks/OverMintTesterRegularStake.sol/OverMintTesterRegularStake.dbg.json +1 -1
  66. package/artifacts/contracts/mocks/OverMintTesterRegularStake.sol/OverMintTesterRegularStake.json +2 -2
  67. package/artifacts/contracts/mocks/SixteenDecimalsTokenMock.sol/SixteenDecimalsTokenMock.dbg.json +1 -1
  68. package/artifacts/contracts/mocks/StakingMockFixedAPY.sol/StakingMockFixedAPY.dbg.json +1 -1
  69. package/artifacts/contracts/mocks/SwapHelperTest.sol/SwapHelperTest.dbg.json +1 -1
  70. package/artifacts/contracts/mocks/TwentyDecimalsTokenMock.sol/TwentyDecimalsTokenMock.dbg.json +1 -1
  71. package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock.dbg.json +1 -1
  72. package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock2.dbg.json +1 -1
  73. package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock3.dbg.json +1 -1
  74. package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock4.dbg.json +1 -1
  75. package/artifacts/contracts/mocks/UsdcMock.sol/USDCMock.dbg.json +1 -1
  76. package/artifacts/contracts/mocks/cBATMock.sol/cBATMock.dbg.json +1 -1
  77. package/artifacts/contracts/mocks/cDAILowWorthMock.sol/cDAILowWorthMock.dbg.json +1 -1
  78. package/artifacts/contracts/mocks/cDAIMock.sol/cDAIMock.dbg.json +1 -1
  79. package/artifacts/contracts/mocks/cDAINonMintableMock.sol/cDAINonMintableMock.dbg.json +1 -1
  80. package/artifacts/contracts/mocks/cDecimalsMock.sol/cDecimalsMock.dbg.json +1 -1
  81. package/artifacts/contracts/mocks/cSDTMock.sol/cSDTMock.dbg.json +1 -1
  82. package/artifacts/contracts/mocks/cUSDCMock.sol/cUSDCMock.dbg.json +1 -1
  83. package/artifacts/contracts/reserve/DistributionHelper.sol/DistributionHelper.dbg.json +1 -1
  84. package/artifacts/contracts/reserve/DistributionHelper.sol/DistributionHelper.json +9 -2
  85. package/artifacts/contracts/reserve/ExchangeHelper.sol/ExchangeHelper.dbg.json +1 -1
  86. package/artifacts/contracts/reserve/ExchangeHelper.sol/ExchangeHelper.json +2 -2
  87. package/artifacts/contracts/reserve/GoodMarketMaker.sol/GoodMarketMaker.dbg.json +1 -1
  88. package/artifacts/contracts/reserve/GoodReserveCDai.sol/ContributionCalc.dbg.json +1 -1
  89. package/artifacts/contracts/reserve/GoodReserveCDai.sol/GoodReserveCDai.dbg.json +1 -1
  90. package/artifacts/contracts/reserve/GoodReserveCDai.sol/GoodReserveCDai.json +8 -2
  91. package/artifacts/contracts/staking/BaseShareField.sol/BaseShareField.dbg.json +1 -1
  92. package/artifacts/contracts/staking/BaseShareFieldV2.sol/BaseShareFieldV2.dbg.json +1 -1
  93. package/artifacts/contracts/staking/DonationsStaking.sol/DonationsStaking.dbg.json +1 -1
  94. package/artifacts/contracts/staking/DonationsStaking.sol/DonationsStaking.json +2 -2
  95. package/artifacts/contracts/staking/FuseStakingV3.sol/FuseStakingV3.dbg.json +1 -1
  96. package/artifacts/contracts/staking/FuseStakingV3.sol/FuseStakingV3.json +31 -83
  97. package/artifacts/contracts/staking/FuseStakingV3.sol/IConsensus.dbg.json +1 -1
  98. package/artifacts/contracts/staking/FuseStakingV3.sol/PegSwap.dbg.json +1 -1
  99. package/artifacts/contracts/staking/GoodFundManager.sol/GoodFundManager.dbg.json +1 -1
  100. package/artifacts/contracts/staking/GoodFundManager.sol/GoodFundManager.json +2 -2
  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/AaveStakingFactory.sol/AaveStakingFactory.json +2 -2
  106. package/artifacts/contracts/staking/aave/GoodAaveStaking.sol/GoodAaveStaking.dbg.json +1 -1
  107. package/artifacts/contracts/staking/aave/GoodAaveStaking.sol/GoodAaveStaking.json +2 -2
  108. package/artifacts/contracts/staking/aave/GoodAaveStakingV2.sol/GoodAaveStakingV2.dbg.json +1 -1
  109. package/artifacts/contracts/staking/aave/GoodAaveStakingV2.sol/GoodAaveStakingV2.json +2 -2
  110. package/artifacts/contracts/staking/compound/CompoundStakingFactory.sol/CompoundStakingFactory.dbg.json +1 -1
  111. package/artifacts/contracts/staking/compound/CompoundStakingFactory.sol/CompoundStakingFactory.json +2 -2
  112. package/artifacts/contracts/staking/compound/GoodCompoundStaking.sol/GoodCompoundStaking.dbg.json +1 -1
  113. package/artifacts/contracts/staking/compound/GoodCompoundStaking.sol/GoodCompoundStaking.json +2 -2
  114. package/artifacts/contracts/staking/compound/GoodCompoundStakingV2.sol/GoodCompoundStakingV2.dbg.json +1 -1
  115. package/artifacts/contracts/staking/compound/GoodCompoundStakingV2.sol/GoodCompoundStakingV2.json +2 -2
  116. package/artifacts/contracts/staking/utils/Math64X64.sol/Math64x64.dbg.json +1 -1
  117. package/artifacts/contracts/staking/utils/StakingRewardsFixedAPY.sol/StakingRewardsFixedAPY.dbg.json +1 -1
  118. package/artifacts/contracts/ubi/UBIScheme.sol/UBIScheme.dbg.json +1 -1
  119. package/artifacts/contracts/utils/AdminWallet.sol/AdminWallet.dbg.json +1 -1
  120. package/artifacts/contracts/utils/BancorFormula.sol/BancorFormula.dbg.json +1 -1
  121. package/artifacts/contracts/utils/BulkProof.sol/BulkProof.dbg.json +1 -1
  122. package/artifacts/contracts/utils/BulkProof.sol/BulkProof.json +2 -2
  123. package/artifacts/contracts/utils/DAOContract.sol/DAOContract.dbg.json +1 -1
  124. package/artifacts/contracts/utils/DAOUpgradeableContract.sol/DAOUpgradeableContract.dbg.json +1 -1
  125. package/artifacts/contracts/utils/DSMath.sol/DSMath.dbg.json +1 -1
  126. package/artifacts/contracts/utils/DataTypes.sol/DataTypes.dbg.json +1 -1
  127. package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/GoodDollarMintBurnWrapper.dbg.json +1 -1
  128. package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/IRouter.dbg.json +1 -1
  129. package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/PausableControl.dbg.json +1 -1
  130. package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/TokenOperation.dbg.json +1 -1
  131. package/artifacts/contracts/utils/MultichainBridgeHelper.sol/MultichainBridgeHelper.dbg.json +1 -1
  132. package/artifacts/contracts/utils/NameService.sol/NameService.dbg.json +1 -1
  133. package/artifacts/contracts/utils/ProtocolUpgrade.sol/OldMarketMaker.dbg.json +1 -1
  134. package/artifacts/contracts/utils/ProtocolUpgrade.sol/ProtocolUpgrade.dbg.json +1 -1
  135. package/artifacts/contracts/utils/ProtocolUpgradeFuse.sol/ProtocolUpgradeFuse.dbg.json +1 -1
  136. package/artifacts/contracts/utils/ProtocolUpgradeFuseRecover.sol/ProtocolUpgradeFuseRecover.dbg.json +1 -1
  137. package/artifacts/contracts/utils/ProtocolUpgradeRecover.sol/ProtocolUpgradeRecover.dbg.json +1 -1
  138. package/artifacts/contracts/utils/ProxyFactory1967.sol/ERC1967Proxy.dbg.json +1 -1
  139. package/artifacts/contracts/utils/ProxyFactory1967.sol/ProxyFactory1967.dbg.json +1 -1
  140. package/artifacts/contracts/utils/ReputationTestHelper.sol/ReputationTestHelper.dbg.json +1 -1
  141. package/contracts/reserve/DistributionHelper.sol +4 -0
  142. package/contracts/reserve/GoodReserveCDai.sol +14 -4
  143. package/contracts/staking/FuseStakingV3.sol +42 -112
  144. package/contracts/staking/GoodFundManager.sol +2 -2
  145. package/hardhat.config.ts +31 -3
  146. package/package.json +10 -5
  147. package/releases/deployment.json +47 -5
  148. package/scripts/analytics/activeWalletsStats.ts +4 -0
  149. package/scripts/analytics/gdinflow.ts +3 -0
  150. package/scripts/analytics/p2pTxs.ts +582 -0
  151. package/scripts/analytics/tokenInOutStats.ts +3 -1
  152. package/scripts/deployGnosisSafe.ts +21 -21
  153. package/scripts/gdx/gdxAirdropCalculation.ts +1 -1
  154. package/scripts/multichain-deploy/helpers.ts +141 -5
  155. package/scripts/multichain-deploy/v3-fix.ts +120 -0
  156. package/scripts/multichain-deploy/v3-upgrade.ts +219 -0
  157. package/scripts/staking/stakersGdRewardsCalculation.ts +57 -46
  158. package/test/staking/FuseStaking.test.ts +2 -4
  159. package/test/staking/StakingRewards.test.ts +13 -16
  160. package/types/DistributionHelper.ts +27 -0
  161. package/types/DistributionHelperTest.ts +27 -0
  162. package/types/DistributionHelperTestHelper.ts +27 -0
  163. package/types/FuseStakingV3.ts +66 -208
  164. package/types/GoodReserveCDai.ts +12 -6
  165. package/types/factories/AaveStakingFactory__factory.ts +1 -1
  166. package/types/factories/CompoundStakingFactory__factory.ts +1 -1
  167. package/types/factories/DistributionHelperTestHelper__factory.ts +8 -1
  168. package/types/factories/DistributionHelperTest__factory.ts +8 -1
  169. package/types/factories/DistributionHelper__factory.ts +8 -1
  170. package/types/factories/DonationsStaking__factory.ts +1 -1
  171. package/types/factories/ExchangeHelper__factory.ts +1 -1
  172. package/types/factories/FuseStakingV3__factory.ts +30 -82
  173. package/types/factories/GoodAaveStakingV2__factory.ts +1 -1
  174. package/types/factories/GoodAaveStaking__factory.ts +1 -1
  175. package/types/factories/GoodCompoundStakingTest__factory.ts +1 -1
  176. package/types/factories/GoodCompoundStakingV2__factory.ts +1 -1
  177. package/types/factories/GoodCompoundStaking__factory.ts +1 -1
  178. package/types/factories/GoodFundManagerTest__factory.ts +1 -1
  179. package/types/factories/GoodFundManager__factory.ts +1 -1
  180. package/types/factories/GoodReserveCDai__factory.ts +7 -1
  181. package/types/factories/OverMintTesterRegularStake__factory.ts +1 -1
  182. package/types/factories/StakersDistribution__factory.ts +1 -1
  183. package/yarn.lock +1114 -550
@@ -1,14 +1,20 @@
1
1
  import { Contract, ContractFactory, Signer } from "ethers";
2
2
  import { network, ethers, upgrades, run } from "hardhat";
3
- import { Contract } from "ethers";
3
+ import * as safeethers from "ethers";
4
4
  import { TransactionResponse } from "@ethersproject/providers";
5
+ import Safe from "@gnosis.pm/safe-core-sdk";
6
+ import EthersAdapter from "@gnosis.pm/safe-ethers-lib";
7
+ import { MetaTransactionData } from "@gnosis.pm/safe-core-sdk-types";
8
+ import SafeClient from "@gnosis.pm/safe-service-client";
9
+
5
10
  import dao from "../../releases/deployment.json";
6
11
 
7
- const networkName = network.name;
12
+ const networkName =
13
+ network.name === "localhost" ? "production-mainnet" : network.name;
8
14
  let totalGas = 0;
9
15
  const gasUsage = {};
10
16
  const GAS_SETTINGS = { gasLimit: 5000000 };
11
- let release: { [key: string]: any } = dao[network.name];
17
+ let release: { [key: string]: any } = dao[networkName];
12
18
 
13
19
  export const printDeploy = async (
14
20
  c: Contract | TransactionResponse
@@ -42,7 +48,7 @@ export const deployDeterministic = async (
42
48
  ) => {
43
49
  try {
44
50
  let proxyFactory;
45
- if (network.name.startsWith("develop")) {
51
+ if (networkName.startsWith("develop")) {
46
52
  proxyFactory = await (
47
53
  await ethers.getContractFactory("ProxyFactory1967")
48
54
  ).deploy();
@@ -152,10 +158,140 @@ export const executeViaGuardian = async (
152
158
  .sendTransaction({ to: contract, data: encoded })
153
159
  .then(printDeploy);
154
160
  } else {
155
- console.log("executing genericCall:", sigHash, encoded);
161
+ const simulationResult = await ctrl.callStatic.genericCall(
162
+ contract,
163
+ encoded,
164
+ release.Avatar,
165
+ ethValues[i],
166
+ { from: await guardian.getAddress() }
167
+ );
168
+ console.log("executing genericCall:", {
169
+ sigHash,
170
+ encoded,
171
+ simulationResult
172
+ });
156
173
  await ctrl
157
174
  .genericCall(contract, encoded, release.Avatar, ethValues[i])
158
175
  .then(printDeploy);
159
176
  }
160
177
  }
161
178
  };
179
+
180
+ export const executeViaSafe = async (
181
+ contracts,
182
+ ethValues,
183
+ functionSigs,
184
+ functionInputs,
185
+ safeAddress: string,
186
+ safeSigner: Signer,
187
+ txServiceUrl = "https://safe-transaction-mainnet.safe.global"
188
+ ) => {
189
+ const ethAdapter = new EthersAdapter({
190
+ ethers: safeethers,
191
+ signerOrProvider: safeSigner
192
+ });
193
+
194
+ const safeService = new SafeClient({
195
+ txServiceUrl,
196
+ ethAdapter
197
+ });
198
+
199
+ const safeSdk = await Safe.create({ ethAdapter, safeAddress });
200
+
201
+ let release: { [key: string]: any } = dao[networkName];
202
+ const ctrl = await ethers.getContractAt(
203
+ "Controller",
204
+ release.Controller,
205
+ null
206
+ );
207
+
208
+ const safeTransactionData: MetaTransactionData[] = [];
209
+
210
+ for (let i = 0; i < contracts.length; i++) {
211
+ const contract = contracts[i];
212
+
213
+ const sigHash = ethers.utils
214
+ .keccak256(ethers.utils.toUtf8Bytes(functionSigs[i]))
215
+ .slice(0, 10);
216
+ const encoded = ethers.utils.solidityPack(
217
+ ["bytes4", "bytes"],
218
+ [sigHash, functionInputs[i]]
219
+ );
220
+ console.log(
221
+ "creating tx:",
222
+ contracts[i],
223
+ functionSigs[i],
224
+ functionInputs[i],
225
+ encoded
226
+ );
227
+ if (contract === ctrl.address) {
228
+ const simulationResult = await ctrl.callStatic[functionSigs[i]](
229
+ ...functionInputs[i],
230
+ { from: safeAddress, value: ethValues[i] }
231
+ );
232
+ console.log("executing controller call:", {
233
+ sigHash,
234
+ encoded,
235
+ simulationResult
236
+ });
237
+ safeTransactionData.push({
238
+ to: ctrl.address,
239
+ value: ethValues[i],
240
+ data: encoded
241
+ });
242
+ } else {
243
+ console.log("executing genericCall:", {
244
+ sigHash,
245
+ encoded,
246
+ contract,
247
+ avatar: release.Avatar,
248
+ value: ethValues[i]
249
+ });
250
+ const simulationResult = await ctrl.callStatic.genericCall(
251
+ contract,
252
+ encoded,
253
+ release.Avatar,
254
+ ethValues[i],
255
+ { from: safeAddress }
256
+ );
257
+ console.log("executing genericCall:", {
258
+ sigHash,
259
+ simulationResult
260
+ });
261
+ const genericEncode = ctrl.interface.encodeFunctionData("genericCall", [
262
+ contract,
263
+ encoded,
264
+ release.Avatar,
265
+ ethValues[i]
266
+ ]);
267
+ safeTransactionData.push({
268
+ to: ctrl.address,
269
+ value: ethValues[i],
270
+ data: genericEncode
271
+ });
272
+ }
273
+ }
274
+
275
+ const safeTransaction = await safeSdk.createTransaction({
276
+ safeTransactionData
277
+ });
278
+
279
+ const safeTxHash = await safeSdk.getTransactionHash(safeTransaction);
280
+ const signedHash = await safeSdk.signTransactionHash(safeTxHash);
281
+
282
+ const senderAddress = await safeSigner.getAddress();
283
+ console.log("propose safe transaction", {
284
+ safeAddress,
285
+ safeTransactionData: safeTransaction.data,
286
+ safeTxHash,
287
+ senderSignature: signedHash,
288
+ senderAddress
289
+ });
290
+ await safeService.proposeTransaction({
291
+ safeAddress,
292
+ safeTransactionData: safeTransaction.data,
293
+ safeTxHash,
294
+ senderSignature: signedHash.data,
295
+ senderAddress
296
+ });
297
+ };
@@ -0,0 +1,120 @@
1
+ /***
2
+ * This script will deploy a fixed goodfundmanager that doenst disable staking contracts if rewards=0
3
+ * It will also then re submit the staking contracts
4
+ */
5
+
6
+ import { network, ethers } from "hardhat";
7
+
8
+ import {
9
+ executeViaGuardian,
10
+ executeViaSafe
11
+ } from "../multichain-deploy/helpers";
12
+
13
+ import releaser from "../releaser";
14
+ import dao from "../../releases/deployment.json";
15
+ const { name: networkName } = network;
16
+
17
+ export const deployMainnet = async () => {
18
+ let [root, ...signers] = await ethers.getSigners();
19
+
20
+ let executionMethod = networkName === "localhost" ? "guardians" : "safe";
21
+
22
+ const networkKey =
23
+ networkName === "localhost" ? "production-mainnet" : networkName;
24
+ let release: { [key: string]: any } = dao[networkKey];
25
+
26
+ let safeOwner = new ethers.Wallet(
27
+ process.env.SAFEOWNER_PRIVATE_KEY || ethers.constants.HashZero,
28
+ ethers.provider
29
+ );
30
+
31
+ //test with guardians safe on hardhat mainnet fork
32
+ if (network.name === "localhost") {
33
+ root = await ethers.getImpersonatedSigner(
34
+ "0xE0c5daa7CC6F88d29505f702a53bb5E67600e7Ec"
35
+ );
36
+ await signers[0].sendTransaction({
37
+ to: root.address,
38
+ value: ethers.constants.WeiPerEther
39
+ });
40
+ }
41
+
42
+ console.log("got signers:", {
43
+ networkName,
44
+ networkKey,
45
+ root: root.address,
46
+ safeOwner: safeOwner.address,
47
+ balance: await ethers.provider
48
+ .getBalance(root.address)
49
+ .then(_ => _.toString())
50
+ });
51
+
52
+ console.log("deploying goodfundmanager implementation");
53
+ const gfmImpl = await (
54
+ await ethers.getContractFactory("GoodFundManager")
55
+ ).deploy();
56
+
57
+ const proposalContracts = [
58
+ release.GoodFundManager, //Fundmanager -> upgrade to new version
59
+ release.GoodFundManager, //Fundmanager -> set staking rewards compound to 0
60
+ release.GoodFundManager //Fundmanager -> set staking rewards aave to 0
61
+ ];
62
+
63
+ const proposalEthValues = proposalContracts.map(_ => 0);
64
+
65
+ const proposalFunctionSignatures = [
66
+ "upgradeTo(address)",
67
+ "setStakingReward(uint32,address,uint32,uint32,bool)",
68
+ "setStakingReward(uint32,address,uint32,uint32,bool)"
69
+ ];
70
+
71
+ const proposalFunctionInputs = [
72
+ ethers.utils.defaultAbiCoder.encode(["address"], [gfmImpl.address]), //upgradeTo(address)
73
+ ethers.utils.defaultAbiCoder.encode(
74
+ ["uint32", "address", "uint32", "uint32", "bool"],
75
+ [
76
+ "0",
77
+ "0x7b7246c78e2f900d17646ff0cb2ec47d6ba10754",
78
+ "14338692",
79
+ "4294967295",
80
+ false
81
+ ]
82
+ ), //setstakingrewards to 0
83
+ ethers.utils.defaultAbiCoder.encode(
84
+ ["uint32", "address", "uint32", "uint32", "bool"],
85
+ [
86
+ "0",
87
+ "0x3ff2d8eb2573819a9ef7167d2ba6fd6d31b17f4f",
88
+ "14338692",
89
+ "4294967295",
90
+ false
91
+ ]
92
+ ) //setstakingrewards to 0
93
+ ];
94
+
95
+ if (executionMethod === "safe") {
96
+ return executeViaSafe(
97
+ proposalContracts,
98
+ proposalEthValues,
99
+ proposalFunctionSignatures,
100
+ proposalFunctionInputs,
101
+ networkName === "localhost"
102
+ ? "0xE0c5daa7CC6F88d29505f702a53bb5E67600e7Ec"
103
+ : release.GuardiansSafe,
104
+ safeOwner
105
+ );
106
+ } else {
107
+ return executeViaGuardian(
108
+ proposalContracts,
109
+ proposalEthValues,
110
+ proposalFunctionSignatures,
111
+ proposalFunctionInputs,
112
+ root
113
+ );
114
+ }
115
+ };
116
+
117
+ export const main = async () => {
118
+ await deployMainnet().catch(console.log);
119
+ };
120
+ if (process.argv[1].includes("v3-fix")) main();
@@ -0,0 +1,219 @@
1
+ /***
2
+ * This script will deploy a reserve upgrade and the DistributionHelper so that some of the expansion can be allocated
3
+ * for non-ubi purposes
4
+ * Upgrade process:
5
+ * mainnet:
6
+ * - deploy reserve
7
+ * - deploy distributionHelper
8
+ * - create proposal that:
9
+ * - upgrades the reserve
10
+ * - sets the distributionHelper at reserve with the agreed bps
11
+ * - add to the distributionHelper the contracts addresses to receive part of the UBI
12
+ */
13
+
14
+ import { network, ethers } from "hardhat";
15
+
16
+ import {
17
+ deployDeterministic,
18
+ printDeploy,
19
+ executeViaGuardian,
20
+ executeViaSafe
21
+ } from "../multichain-deploy/helpers";
22
+
23
+ import releaser from "../releaser";
24
+ import dao from "../../releases/deployment.json";
25
+ import {
26
+ CompoundVotingMachine,
27
+ DistributionHelper,
28
+ Controller,
29
+ NameService
30
+ } from "../../types";
31
+ const { name: networkName } = network;
32
+
33
+ export const deployMainnet = async () => {
34
+ let [root, ...signers] = await ethers.getSigners();
35
+
36
+ let executionMethod = "safe";
37
+ let communitySafe = "0x5Eb5f5fE13d1D5e6440DbD5913412299Bc5B5564";
38
+
39
+ const networkKey =
40
+ networkName === "localhost" ? "production-mainnet" : networkName;
41
+ let release: { [key: string]: any } = dao[networkKey];
42
+
43
+ let safeOwner = new ethers.Wallet(
44
+ process.env.SAFEOWNER_PRIVATE_KEY || ethers.constants.HashZero,
45
+ ethers.provider
46
+ );
47
+ //test with guardians safe on hardhat mainnet fork
48
+ if (network.name === "localhost") {
49
+ root = await ethers.getImpersonatedSigner(
50
+ "0xE0c5daa7CC6F88d29505f702a53bb5E67600e7Ec"
51
+ );
52
+ await signers[0].sendTransaction({
53
+ to: root.address,
54
+ value: ethers.constants.WeiPerEther
55
+ });
56
+ }
57
+
58
+ console.log("got signers:", {
59
+ networkName,
60
+ networkKey,
61
+ root: root.address,
62
+ safeOwner: safeOwner.address,
63
+ balance: await ethers.provider
64
+ .getBalance(root.address)
65
+ .then(_ => _.toString())
66
+ });
67
+
68
+ console.log("deploying reserve implementation");
69
+ const reserveImpl = await (
70
+ await ethers.getContractFactory("GoodReserveCDai")
71
+ ).deploy();
72
+
73
+ console.log("deploying DistributionHelper");
74
+
75
+ let DHelper: DistributionHelper;
76
+ if (!release.DistributionHelper) {
77
+ DHelper = (await deployDeterministic(
78
+ {
79
+ name: "DistributionHelper",
80
+ salt: "DistributionHelper",
81
+ isUpgradeable: true
82
+ },
83
+ [release.NameService]
84
+ ).then(printDeploy)) as DistributionHelper;
85
+
86
+ let torelease = {
87
+ DistributionHelper: DHelper.address
88
+ };
89
+
90
+ await releaser(torelease, networkName, "deployment", false);
91
+ } else {
92
+ DHelper = (await ethers.getContractAt(
93
+ "DistributionHelper",
94
+ release.DistributionHelper
95
+ )) as DistributionHelper;
96
+ }
97
+ DHelper;
98
+
99
+ const ns = (await ethers.getContractAt(
100
+ "NameService",
101
+ release.NameService
102
+ )) as NameService;
103
+
104
+ const proposalContracts = [
105
+ ns.address, //nameservice add DistributionHelper,MultiChainRouter,MultiChain AnyGoodDollar,
106
+ DHelper.address, //update addresses from nameservice
107
+ DHelper.address, //distribution helper -> add fuse community pool as recipient with 100%
108
+ release.GoodReserveCDai, //upgradeTo
109
+ release.GoodReserveCDai, //Reserve -> set distribution helper + non ubi bps
110
+ release.GoodReserveCDai, //Reserve -> set new decline rate
111
+ release.GoodFundManager, //Fundmanager -> set staking rewards compound to 0
112
+ release.GoodFundManager //Fundmanager -> set staking rewards aave to 0
113
+ ];
114
+
115
+ const proposalEthValues = proposalContracts.map(_ => 0);
116
+
117
+ const proposalFunctionSignatures = [
118
+ "setAddresses(bytes32[],address[])",
119
+ "updateAddresses()",
120
+ "addOrUpdateRecipient((uint32,uint32,address,uint8))",
121
+ "upgradeTo(address)",
122
+ "setDistributionHelper(address,uint32)",
123
+ "setReserveRatioDailyExpansion(uint256,uint256)",
124
+ "setStakingReward(uint32,address,uint32,uint32,bool)",
125
+ "setStakingReward(uint32,address,uint32,uint32,bool)"
126
+ ];
127
+
128
+ const proposalFunctionInputs = [
129
+ ethers.utils.defaultAbiCoder.encode(
130
+ ["bytes32[]", "address[]"],
131
+ [
132
+ [
133
+ ethers.utils.keccak256(
134
+ ethers.utils.toUtf8Bytes("DISTRIBUTION_HELPER")
135
+ ),
136
+ ethers.utils.keccak256(ethers.utils.toUtf8Bytes("MULTICHAIN_ROUTER")),
137
+ ethers.utils.keccak256(
138
+ ethers.utils.toUtf8Bytes("MULTICHAIN_ANYGOODDOLLAR")
139
+ )
140
+ ],
141
+ [DHelper.address, release.MultichainRouter, release.AnyGoodDollar]
142
+ ]
143
+ ), //setAddresses(bytes32[],address[])"
144
+ ethers.utils.defaultAbiCoder.encode([], []), //updateAddresses()
145
+ ethers.utils.defaultAbiCoder.encode(
146
+ ["uint32", "uint32", "address", "uint8"],
147
+ [
148
+ 10000, //100% bps
149
+ 122, //chainid
150
+ communitySafe, //recipient address,
151
+ 0 //recipient type via fuse bridge
152
+ ]
153
+ ), //addOrUpdateRecipient((uint32,uint32,address,uint8))
154
+ ethers.utils.defaultAbiCoder.encode(["address"], [reserveImpl.address]), //upgradeTo(address)
155
+ ethers.utils.defaultAbiCoder.encode(
156
+ ["address", "uint32"],
157
+ [DHelper.address, 1000]
158
+ ), //setDistributionHelper(address,uint32)
159
+ ethers.utils.defaultAbiCoder.encode(
160
+ ["uint256", "uint256"],
161
+ ["999554841771249", "1000000000000000"] //15% a year
162
+ ), //setReserveRatioDailyExpansion(uint,uint)
163
+ ethers.utils.defaultAbiCoder.encode(
164
+ ["uint32", "address", "uint32", "uint32", "bool"],
165
+ [
166
+ "0",
167
+ "0x7b7246c78e2f900d17646ff0cb2ec47d6ba10754",
168
+ "14338692",
169
+ "4294967295",
170
+ false
171
+ ]
172
+ ), //setstakingrewards to 0
173
+ ethers.utils.defaultAbiCoder.encode(
174
+ ["uint32", "address", "uint32", "uint32", "bool"],
175
+ [
176
+ "0",
177
+ "0x3ff2d8eb2573819a9ef7167d2ba6fd6d31b17f4f",
178
+ "14338692",
179
+ "4294967295",
180
+ false
181
+ ]
182
+ ) //setstakingrewards to 0
183
+ ];
184
+
185
+ //make sure rewards accumulated before we set them to 0
186
+ const staking = await ethers.getContractAt(
187
+ "SimpleStakingV2",
188
+ "0x7b7246c78e2f900d17646ff0cb2ec47d6ba10754"
189
+ );
190
+ (await staking.withdrawRewards()).wait();
191
+ staking.attach("0x3ff2d8eb2573819a9ef7167d2ba6fd6d31b17f4f");
192
+ (await staking.withdrawRewards()).wait();
193
+
194
+ if (executionMethod === "safe") {
195
+ return executeViaSafe(
196
+ proposalContracts,
197
+ proposalEthValues,
198
+ proposalFunctionSignatures,
199
+ proposalFunctionInputs,
200
+ networkName === "localhost"
201
+ ? "0xE0c5daa7CC6F88d29505f702a53bb5E67600e7Ec"
202
+ : release.GuardiansSafe,
203
+ safeOwner
204
+ );
205
+ } else {
206
+ return executeViaGuardian(
207
+ proposalContracts,
208
+ proposalEthValues,
209
+ proposalFunctionSignatures,
210
+ proposalFunctionInputs,
211
+ root
212
+ );
213
+ }
214
+ };
215
+
216
+ export const main = async () => {
217
+ await deployMainnet().catch(console.log);
218
+ };
219
+ if (process.argv[1].includes("v3-upgrade")) main();
@@ -2,52 +2,63 @@ import { range, chunk } from "lodash";
2
2
  import fs from "fs";
3
3
  import stakingContracts from "../../releases/deployment.json";
4
4
  import { ethers as Ethers } from "hardhat";
5
- import { BigNumber } from "ethereum-waffle/node_modules/ethers";
5
+ import { BigNumber } from "ethers";
6
6
 
7
- const ZERO = BigNumber.from("0");
7
+ const ZERO = BigNumber.from("0");
8
8
 
9
9
  export const sumStakersGdRewards = (ethers: typeof Ethers) => {
10
-
11
- const getStakersGdRewards = async (stakersToGdRewards = {}) => {
12
- const provider = new ethers.providers.InfuraProvider();
13
-
14
- let goodFundManager = await ethers.getContractAt("GoodFundManager",stakingContracts["production-mainnet-bug"].GoodFundManager);
15
- goodFundManager = goodFundManager.connect(provider);
16
- const filter = goodFundManager.filters.StakingRewardMinted();
17
-
18
- const step = 100000;
19
- const ETH_START_BLOCK = 14291923;
20
- const ETH_END_BLOCK = await provider.getBlockNumber();
21
- const blocks = range(ETH_START_BLOCK, ETH_END_BLOCK, step);
22
-
23
- for (let blockChunk of chunk(blocks, 10)) {
24
- const processedChunks = blockChunk.map(async bc => {
25
- const stakingRewardsEvents = await goodFundManager
26
- .queryFilter(filter, bc, Math.min(bc + step - 1, ETH_END_BLOCK))
27
- .catch(e => {
28
- console.log("block transfer logs failed retrying...", bc);
29
- return goodFundManager.queryFilter(
30
- filter, bc, Math.min(bc + step - 1, ETH_END_BLOCK));
31
- });
32
-
33
- const stakingRewardsEventsMapped = stakingRewardsEvents.map(async log => {
34
- const initBalance = stakersToGdRewards[log.args.staker] || ZERO;
35
- stakersToGdRewards[log.args.staker] = initBalance.add(log.args.gdReward);
36
- // console.log(`TransactionHash:\t${log.transactionHash}`);
37
- // console.log(`Staking contract:\t${log.args.stakingContract}`);
38
- // console.log(`Previous Balance:\t${initBalance.toString()} for address ${log.args.staker}`);
39
- // console.log(`Addition:\t\t${log.args.gdReward.toString()} for address ${log.args.staker}`);
40
- // console.log(`New Balance:\t\t${stakersToGdRewards[log.args.staker].toString()} for address ${log.args.staker}\n`);
41
- });
42
- await Promise.all([...stakingRewardsEventsMapped]);
43
- });
44
- await Promise.all(processedChunks);
45
- }
46
-
47
- console.log(`All stakers minted rewards:\n`);
48
- Object.entries(stakersToGdRewards).forEach(a => { console.log(`${a[0].toString()}:${BigNumber.from(a[1]).toString()}\n`)});
49
- // fs.writeFileSync("scripts/staking/stakersToGdRewards.json", JSON.stringify(stakersToGdRewards))
50
- };
51
-
52
- return { getStakersGdRewards};
53
- }
10
+ const getStakersGdRewards = async (stakersToGdRewards = {}) => {
11
+ const provider = new ethers.providers.InfuraProvider();
12
+
13
+ let goodFundManager = await ethers.getContractAt(
14
+ "GoodFundManager",
15
+ stakingContracts["production-mainnet-bug"].GoodFundManager
16
+ );
17
+ goodFundManager = goodFundManager.connect(provider);
18
+ const filter = goodFundManager.filters.StakingRewardMinted();
19
+
20
+ const step = 100000;
21
+ const ETH_START_BLOCK = 14291923;
22
+ const ETH_END_BLOCK = await provider.getBlockNumber();
23
+ const blocks = range(ETH_START_BLOCK, ETH_END_BLOCK, step);
24
+
25
+ for (let blockChunk of chunk(blocks, 10)) {
26
+ const processedChunks = blockChunk.map(async bc => {
27
+ const stakingRewardsEvents = await goodFundManager
28
+ .queryFilter(filter, bc, Math.min(bc + step - 1, ETH_END_BLOCK))
29
+ .catch(e => {
30
+ console.log("block transfer logs failed retrying...", bc);
31
+ return goodFundManager.queryFilter(
32
+ filter,
33
+ bc,
34
+ Math.min(bc + step - 1, ETH_END_BLOCK)
35
+ );
36
+ });
37
+
38
+ const stakingRewardsEventsMapped = stakingRewardsEvents.map(
39
+ async log => {
40
+ const initBalance = stakersToGdRewards[log.args.staker] || ZERO;
41
+ stakersToGdRewards[log.args.staker] = initBalance.add(
42
+ log.args.gdReward
43
+ );
44
+ // console.log(`TransactionHash:\t${log.transactionHash}`);
45
+ // console.log(`Staking contract:\t${log.args.stakingContract}`);
46
+ // console.log(`Previous Balance:\t${initBalance.toString()} for address ${log.args.staker}`);
47
+ // console.log(`Addition:\t\t${log.args.gdReward.toString()} for address ${log.args.staker}`);
48
+ // console.log(`New Balance:\t\t${stakersToGdRewards[log.args.staker].toString()} for address ${log.args.staker}\n`);
49
+ }
50
+ );
51
+ await Promise.all([...stakingRewardsEventsMapped]);
52
+ });
53
+ await Promise.all(processedChunks);
54
+ }
55
+
56
+ console.log(`All stakers minted rewards:\n`);
57
+ Object.entries(stakersToGdRewards).forEach(a => {
58
+ console.log(`${a[0].toString()}:${BigNumber.from(a[1]).toString()}\n`);
59
+ });
60
+ // fs.writeFileSync("scripts/staking/stakersToGdRewards.json", JSON.stringify(stakersToGdRewards))
61
+ };
62
+
63
+ return { getStakersGdRewards };
64
+ };
@@ -71,10 +71,8 @@ describe("FuseStakingV3", () => {
71
71
  await ethers.getContractFactory("FuseStakingV3")
72
72
  ).deploy()) as FuseStakingV3;
73
73
 
74
- await staking.initialize();
75
- await staking.upgrade0();
76
- await staking.upgrade1(NULL_ADDRESS, ubiMock.address, uniswap.address);
77
- await staking.upgrade2();
74
+ await staking.initialize(uniswap.address, NULL_ADDRESS);
75
+ await staking.setUBIScheme(ubiMock.address);
78
76
  });
79
77
 
80
78
  it("should have owner", async () => {