@gooddollar/goodprotocol 2.0.21 → 2.0.22-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 (222) hide show
  1. package/artifacts/abis/ISuperToken.min.json +1 -1
  2. package/artifacts/abis/SuperGoodDollar.min.json +1 -1
  3. package/artifacts/abis/SuperToken.min.json +1 -1
  4. package/artifacts/contracts/DAOStackInterfaces.sol/Avatar.dbg.json +1 -1
  5. package/artifacts/contracts/DAOStackInterfaces.sol/Controller.dbg.json +1 -1
  6. package/artifacts/contracts/DAOStackInterfaces.sol/GlobalConstraintInterface.dbg.json +1 -1
  7. package/artifacts/contracts/DAOStackInterfaces.sol/IntVoteInterface.dbg.json +1 -1
  8. package/artifacts/contracts/DAOStackInterfaces.sol/ReputationInterface.dbg.json +1 -1
  9. package/artifacts/contracts/DAOStackInterfaces.sol/SchemeRegistrar.dbg.json +1 -1
  10. package/artifacts/contracts/Interfaces.sol/AggregatorV3Interface.dbg.json +1 -1
  11. package/artifacts/contracts/Interfaces.sol/ERC20.dbg.json +1 -1
  12. package/artifacts/contracts/Interfaces.sol/IAaveIncentivesController.dbg.json +1 -1
  13. package/artifacts/contracts/Interfaces.sol/IAdminWallet.dbg.json +1 -1
  14. package/artifacts/contracts/Interfaces.sol/IDonationStaking.dbg.json +1 -1
  15. package/artifacts/contracts/Interfaces.sol/IERC2917.dbg.json +1 -1
  16. package/artifacts/contracts/Interfaces.sol/IFirstClaimPool.dbg.json +1 -1
  17. package/artifacts/contracts/Interfaces.sol/IGoodDollar.dbg.json +1 -1
  18. package/artifacts/contracts/Interfaces.sol/IGoodStaking.dbg.json +1 -1
  19. package/artifacts/contracts/Interfaces.sol/IHasRouter.dbg.json +1 -1
  20. package/artifacts/contracts/Interfaces.sol/IIdentity.dbg.json +1 -1
  21. package/artifacts/contracts/Interfaces.sol/IIdentityV2.dbg.json +1 -1
  22. package/artifacts/contracts/Interfaces.sol/ILendingPool.dbg.json +1 -1
  23. package/artifacts/contracts/Interfaces.sol/IMultichainRouter.dbg.json +1 -1
  24. package/artifacts/contracts/Interfaces.sol/INameService.dbg.json +1 -1
  25. package/artifacts/contracts/Interfaces.sol/IUBIScheme.dbg.json +1 -1
  26. package/artifacts/contracts/Interfaces.sol/ProxyAdmin.dbg.json +1 -1
  27. package/artifacts/contracts/Interfaces.sol/Reserve.dbg.json +1 -1
  28. package/artifacts/contracts/Interfaces.sol/Staking.dbg.json +1 -1
  29. package/artifacts/contracts/Interfaces.sol/Uniswap.dbg.json +1 -1
  30. package/artifacts/contracts/Interfaces.sol/UniswapFactory.dbg.json +1 -1
  31. package/artifacts/contracts/Interfaces.sol/UniswapPair.dbg.json +1 -1
  32. package/artifacts/contracts/Interfaces.sol/cERC20.dbg.json +1 -1
  33. package/artifacts/contracts/fuseFaucet/Faucet.sol/Faucet.dbg.json +1 -1
  34. package/artifacts/contracts/fuseFaucet/FuseFaucet.sol/FuseFaucet.dbg.json +1 -1
  35. package/artifacts/contracts/fuseFaucet/FuseFaucetV2.sol/FuseFaucetV2.dbg.json +1 -1
  36. package/artifacts/contracts/governance/ClaimersDistribution.sol/ClaimersDistribution.dbg.json +1 -1
  37. package/artifacts/contracts/governance/CompoundVotingMachine.sol/CompoundVotingMachine.dbg.json +1 -1
  38. package/artifacts/contracts/governance/GReputation.sol/GReputation.dbg.json +1 -1
  39. package/artifacts/contracts/governance/GoodDollarStaking.sol/GoodDollarStaking.dbg.json +1 -1
  40. package/artifacts/contracts/governance/GoodDollarStaking.sol/IGovernanceStaking.dbg.json +1 -1
  41. package/artifacts/contracts/governance/GoodDollarStaking.sol/IStakingUpgrade.dbg.json +1 -1
  42. package/artifacts/contracts/governance/GoodDollarStaking.sol/RewardsMinter.dbg.json +1 -1
  43. package/artifacts/contracts/governance/GovernanceStaking.sol/GovernanceStaking.dbg.json +1 -1
  44. package/artifacts/contracts/governance/MultiBaseGovernanceShareField.sol/MultiBaseGovernanceShareField.dbg.json +1 -1
  45. package/artifacts/contracts/governance/Reputation.sol/Reputation.dbg.json +1 -1
  46. package/artifacts/contracts/governance/StakersDistribution.sol/StakersDistribution.dbg.json +1 -1
  47. package/artifacts/contracts/identity/IdentityV2.sol/IdentityV2.dbg.json +1 -1
  48. package/artifacts/contracts/invite/InvitesFuseV2.sol/InvitesFuseV2.dbg.json +1 -1
  49. package/artifacts/contracts/invite/InvitesV1.sol/InvitesV1.dbg.json +1 -1
  50. package/artifacts/contracts/invite/InvitesV2.sol/InvitesV2.dbg.json +1 -1
  51. package/artifacts/contracts/mocks/AaveMock.sol/AaveMock.dbg.json +1 -1
  52. package/artifacts/contracts/mocks/AaveUSDMockOracle.sol/AaveUSDMockOracle.dbg.json +1 -1
  53. package/artifacts/contracts/mocks/BatUSDMockOracle.sol/BatUSDMockOracle.dbg.json +1 -1
  54. package/artifacts/contracts/mocks/CompUsdMockOracle.sol/CompUSDMockOracle.dbg.json +1 -1
  55. package/artifacts/contracts/mocks/DAIMock.sol/DAIMock.dbg.json +1 -1
  56. package/artifacts/contracts/mocks/DaiEthPriceMockOracle.sol/DaiEthPriceMockOracle.dbg.json +1 -1
  57. package/artifacts/contracts/mocks/DecimalsMock.sol/DecimalsMock.dbg.json +1 -1
  58. package/artifacts/contracts/mocks/DistributionBridgeMock.sol/DistributionBridgeMock.dbg.json +1 -1
  59. package/artifacts/contracts/mocks/DistributionHelperTest.sol/DistributionHelperTest.dbg.json +1 -1
  60. package/artifacts/contracts/mocks/DistributionHelperTest.sol/DistributionHelperTestHelper.dbg.json +1 -1
  61. package/artifacts/contracts/mocks/EthUSDMockOracle.sol/EthUSDMockOracle.dbg.json +1 -1
  62. package/artifacts/contracts/mocks/FeesFormularMock.sol/FeesFormulaMock.dbg.json +1 -1
  63. package/artifacts/contracts/mocks/GasPriceMockOracle.sol/GasPriceMockOracle.dbg.json +1 -1
  64. package/artifacts/contracts/mocks/GoodCompoundStakingTest.sol/GoodCompoundStakingTest.dbg.json +1 -1
  65. package/artifacts/contracts/mocks/GoodDollarStakingMock.sol/GoodDollarStakingMock.dbg.json +1 -1
  66. package/artifacts/contracts/mocks/GoodFundManagerTest.sol/GoodFundManagerTest.dbg.json +1 -1
  67. package/artifacts/contracts/mocks/IdentityMock.sol/IdentityMock.dbg.json +1 -1
  68. package/artifacts/contracts/mocks/IncentiveControllerMock.sol/IncentiveControllerMock.dbg.json +1 -1
  69. package/artifacts/contracts/mocks/LendingPoolMock.sol/LendingPoolMock.dbg.json +1 -1
  70. package/artifacts/contracts/mocks/MultichainRouterMock.sol/IWrapper.dbg.json +1 -1
  71. package/artifacts/contracts/mocks/MultichainRouterMock.sol/MultichainRouterMock.dbg.json +1 -1
  72. package/artifacts/contracts/mocks/OverMintTester.sol/IGoodDollarStakingTest.dbg.json +1 -1
  73. package/artifacts/contracts/mocks/OverMintTester.sol/OverMintTester.dbg.json +1 -1
  74. package/artifacts/contracts/mocks/OverMintTesterRegularStake.sol/OverMintTesterRegularStake.dbg.json +1 -1
  75. package/artifacts/contracts/mocks/PayableMock.sol/PayableMock.dbg.json +1 -1
  76. package/artifacts/contracts/mocks/SixteenDecimalsTokenMock.sol/SixteenDecimalsTokenMock.dbg.json +1 -1
  77. package/artifacts/contracts/mocks/StakingMockFixedAPY.sol/StakingMockFixedAPY.dbg.json +1 -1
  78. package/artifacts/contracts/mocks/SwapHelperTest.sol/SwapHelperTest.dbg.json +1 -1
  79. package/artifacts/contracts/mocks/TwentyDecimalsTokenMock.sol/TwentyDecimalsTokenMock.dbg.json +1 -1
  80. package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock.dbg.json +1 -1
  81. package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock2.dbg.json +1 -1
  82. package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock3.dbg.json +1 -1
  83. package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock4.dbg.json +1 -1
  84. package/artifacts/contracts/mocks/UsdcMock.sol/USDCMock.dbg.json +1 -1
  85. package/artifacts/contracts/mocks/cBATMock.sol/cBATMock.dbg.json +1 -1
  86. package/artifacts/contracts/mocks/cDAILowWorthMock.sol/cDAILowWorthMock.dbg.json +1 -1
  87. package/artifacts/contracts/mocks/cDAIMock.sol/cDAIMock.dbg.json +1 -1
  88. package/artifacts/contracts/mocks/cDAINonMintableMock.sol/cDAINonMintableMock.dbg.json +1 -1
  89. package/artifacts/contracts/mocks/cDecimalsMock.sol/cDecimalsMock.dbg.json +1 -1
  90. package/artifacts/contracts/mocks/cSDTMock.sol/cSDTMock.dbg.json +1 -1
  91. package/artifacts/contracts/mocks/cUSDCMock.sol/cUSDCMock.dbg.json +1 -1
  92. package/artifacts/contracts/reserve/DistributionHelper.sol/DistributionHelper.dbg.json +1 -1
  93. package/artifacts/contracts/reserve/ExchangeHelper.sol/ExchangeHelper.dbg.json +1 -1
  94. package/artifacts/contracts/reserve/GoodMarketMaker.sol/GoodMarketMaker.dbg.json +1 -1
  95. package/artifacts/contracts/reserve/GoodReserveCDai.sol/ContributionCalc.dbg.json +1 -1
  96. package/artifacts/contracts/reserve/GoodReserveCDai.sol/GoodReserveCDai.dbg.json +1 -1
  97. package/artifacts/contracts/staking/BaseShareField.sol/BaseShareField.dbg.json +1 -1
  98. package/artifacts/contracts/staking/BaseShareFieldV2.sol/BaseShareFieldV2.dbg.json +1 -1
  99. package/artifacts/contracts/staking/DonationsStaking.sol/DonationsStaking.dbg.json +1 -1
  100. package/artifacts/contracts/staking/FuseStakingV3.sol/FuseStakingV3.dbg.json +1 -1
  101. package/artifacts/contracts/staking/FuseStakingV3.sol/IConsensus.dbg.json +1 -1
  102. package/artifacts/contracts/staking/FuseStakingV3.sol/PegSwap.dbg.json +1 -1
  103. package/artifacts/contracts/staking/GoodFundManager.sol/GoodFundManager.dbg.json +1 -1
  104. package/artifacts/contracts/staking/SimpleStaking.sol/SimpleStaking.dbg.json +1 -1
  105. package/artifacts/contracts/staking/SimpleStakingV2.sol/SimpleStakingV2.dbg.json +1 -1
  106. package/artifacts/contracts/staking/UniswapV2SwapHelper.sol/UniswapV2SwapHelper.dbg.json +1 -1
  107. package/artifacts/contracts/staking/aave/AaveStakingFactory.sol/AaveStakingFactory.dbg.json +1 -1
  108. package/artifacts/contracts/staking/aave/GoodAaveStaking.sol/GoodAaveStaking.dbg.json +1 -1
  109. package/artifacts/contracts/staking/aave/GoodAaveStakingV2.sol/GoodAaveStakingV2.dbg.json +1 -1
  110. package/artifacts/contracts/staking/compound/CompoundStakingFactory.sol/CompoundStakingFactory.dbg.json +1 -1
  111. package/artifacts/contracts/staking/compound/GoodCompoundStaking.sol/GoodCompoundStaking.dbg.json +1 -1
  112. package/artifacts/contracts/staking/compound/GoodCompoundStakingV2.sol/GoodCompoundStakingV2.dbg.json +1 -1
  113. package/artifacts/contracts/staking/utils/Math64X64.sol/Math64x64.dbg.json +1 -1
  114. package/artifacts/contracts/staking/utils/StakingRewardsFixedAPY.sol/StakingRewardsFixedAPY.dbg.json +1 -1
  115. package/artifacts/contracts/token/ERC20PresetMinterPauserUpgradeable.sol/ERC20PresetMinterPauserUpgradeable.dbg.json +1 -1
  116. package/artifacts/contracts/token/ERC677.sol/ERC677.dbg.json +1 -1
  117. package/artifacts/contracts/token/ERC677.sol/ERC677Receiver.dbg.json +1 -1
  118. package/artifacts/contracts/token/GoodDollar.sol/GoodDollar.dbg.json +1 -1
  119. package/artifacts/contracts/token/IFeesFormula.sol/IFeesFormula.dbg.json +1 -1
  120. package/artifacts/contracts/token/MultichainFeeFormula.sol/MultichainFeeFormula.dbg.json +1 -1
  121. package/artifacts/contracts/token/superfluid/ERC20Permit.sol/ERC20Permit.dbg.json +1 -1
  122. package/artifacts/contracts/token/superfluid/ERC20Permit.sol/SelfApprove.dbg.json +1 -1
  123. package/artifacts/contracts/token/superfluid/ISuperGoodDollar.sol/IGoodDollarCustom.dbg.json +1 -1
  124. package/artifacts/contracts/token/superfluid/ISuperGoodDollar.sol/ISuperGoodDollar.dbg.json +1 -1
  125. package/artifacts/contracts/token/superfluid/ISuperToken.sol/ISuperToken.dbg.json +1 -1
  126. package/artifacts/contracts/token/superfluid/ISuperToken.sol/ISuperToken.json +5 -0
  127. package/artifacts/contracts/token/superfluid/SuperGoodDollar.sol/SuperGoodDollar.dbg.json +1 -1
  128. package/artifacts/contracts/token/superfluid/SuperGoodDollar.sol/SuperGoodDollar.json +25 -2
  129. package/artifacts/contracts/token/superfluid/SuperToken.sol/SuperToken.dbg.json +1 -1
  130. package/artifacts/contracts/token/superfluid/SuperToken.sol/SuperToken.json +7 -2
  131. package/artifacts/contracts/token/superfluid/SuperfluidToken.sol/SuperfluidToken.dbg.json +1 -1
  132. package/artifacts/contracts/token/superfluid/UUPSProxiable.sol/UUPSProxiable.dbg.json +1 -1
  133. package/artifacts/contracts/token/superfluid/UUPSProxy.sol/Proxy.dbg.json +1 -1
  134. package/artifacts/contracts/token/superfluid/UUPSProxy.sol/UUPSProxy.dbg.json +1 -1
  135. package/artifacts/contracts/token/superfluid/UUPSProxy.sol/UUPSUtils.dbg.json +1 -1
  136. package/artifacts/contracts/ubi/UBIScheme.sol/UBIScheme.dbg.json +1 -1
  137. package/artifacts/contracts/ubi/UBISchemeV2.sol/UBISchemeV2.dbg.json +1 -1
  138. package/artifacts/contracts/utils/AdminWallet.sol/AdminWallet.dbg.json +1 -1
  139. package/artifacts/contracts/utils/AdminWalletFuse.sol/AdminWalletFuse.dbg.json +1 -1
  140. package/artifacts/contracts/utils/BancorFormula.sol/BancorFormula.dbg.json +1 -1
  141. package/artifacts/contracts/utils/BulkProof.sol/BulkProof.dbg.json +1 -1
  142. package/artifacts/contracts/utils/BuyAndBridgeHelper.sol/BuyAndBridgeHelper.dbg.json +1 -1
  143. package/artifacts/contracts/utils/BuyGDClone.sol/BuyGDClone.dbg.json +1 -1
  144. package/artifacts/contracts/utils/BuyGDClone.sol/BuyGDCloneFactory.dbg.json +1 -1
  145. package/artifacts/contracts/utils/BuyGDClone.sol/DonateGDClone.dbg.json +1 -1
  146. package/artifacts/contracts/utils/BuyGDClone.sol/IQuoterV2.dbg.json +1 -1
  147. package/artifacts/contracts/utils/BuyGDClone.sol/ISwapRouter.dbg.json +1 -1
  148. package/artifacts/contracts/utils/DAOContract.sol/DAOContract.dbg.json +1 -1
  149. package/artifacts/contracts/utils/DAOUpgradeableContract.sol/DAOUpgradeableContract.dbg.json +1 -1
  150. package/artifacts/contracts/utils/DSMath.sol/DSMath.dbg.json +1 -1
  151. package/artifacts/contracts/utils/DataTypes.sol/DataTypes.dbg.json +1 -1
  152. package/artifacts/contracts/utils/GDFaucet.sol/GDFaucet.dbg.json +1 -1
  153. package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/GoodDollarMintBurnWrapper.dbg.json +1 -1
  154. package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/IRouter.dbg.json +1 -1
  155. package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/PausableControl.dbg.json +1 -1
  156. package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/TokenOperation.dbg.json +1 -1
  157. package/artifacts/contracts/utils/IdentityFix.sol/IdentityFix.dbg.json +1 -1
  158. package/artifacts/contracts/utils/MultiCall.sol/Multicall.dbg.json +1 -1
  159. package/artifacts/contracts/utils/MultichainBridgeHelper.sol/MultichainBridgeHelper.dbg.json +1 -1
  160. package/artifacts/contracts/utils/NameService.sol/NameService.dbg.json +1 -1
  161. package/artifacts/contracts/utils/OneTimePayments.sol/OneTimePayments.dbg.json +1 -1
  162. package/artifacts/contracts/utils/OneTimePaymentsV2.sol/OneTimePaymentsV2.dbg.json +1 -1
  163. package/artifacts/contracts/utils/ProtocolUpgrade.sol/OldMarketMaker.dbg.json +1 -1
  164. package/artifacts/contracts/utils/ProtocolUpgrade.sol/ProtocolUpgrade.dbg.json +1 -1
  165. package/artifacts/contracts/utils/ProtocolUpgradeFuse.sol/ProtocolUpgradeFuse.dbg.json +1 -1
  166. package/artifacts/contracts/utils/ProtocolUpgradeFuseRecover.sol/ProtocolUpgradeFuseRecover.dbg.json +1 -1
  167. package/artifacts/contracts/utils/ProtocolUpgradeRecover.sol/ProtocolUpgradeRecover.dbg.json +1 -1
  168. package/artifacts/contracts/utils/ProxyFactory1967.sol/ERC1967Proxy.dbg.json +1 -1
  169. package/artifacts/contracts/utils/ProxyFactory1967.sol/ProxyFactory1967.dbg.json +1 -1
  170. package/artifacts/contracts/utils/ReputationTestHelper.sol/ReputationTestHelper.dbg.json +1 -1
  171. package/contracts/token/superfluid/ISuperToken.sol +1 -0
  172. package/contracts/token/superfluid/SuperGoodDollar.sol +11 -2
  173. package/contracts/token/superfluid/SuperToken.sol +8 -0
  174. package/dist/artifacts/contracts/token/superfluid/SuperGoodDollar.sol/SuperGoodDollar.json +25 -2
  175. package/hardhat.config.ts +1 -1
  176. package/package.json +4 -3
  177. package/scripts/blockchainTestSetup.sh +1 -1
  178. package/test/faucet/Faucet.test.ts +63 -19
  179. package/test/faucet/FuseFaucet.test.ts +43 -14
  180. package/test/governance/ClaimersDistribution.test.ts +3 -3
  181. package/test/governance/CompoundVotingMachine.castvote.test.ts +3 -6
  182. package/test/governance/CompoundVotingMachine.crossblockchain.ts +2 -2
  183. package/test/governance/CompoundVotingMachine.daoscheme.ts +1 -1
  184. package/test/governance/CompoundVotingMachine.guardian.test.ts +4 -4
  185. package/test/governance/CompoundVotingMachine.propose.test.ts +8 -8
  186. package/test/governance/CompoundVotingMachine.state.test.ts +4 -4
  187. package/test/governance/GReputation.test.ts +6 -6
  188. package/test/governance/GoodDollarStaking.gd.test.ts +44 -71
  189. package/test/governance/GoodDollarStaking.good.test.ts +52 -73
  190. package/test/governance/GovernanceStaking.test.ts +1 -1
  191. package/test/governance/Reputation.test.ts +2 -2
  192. package/test/helpers.ts +1 -1
  193. package/test/identity/IdentityV2.test.ts +12 -12
  194. package/test/invite/InvitesV1.test.ts +6 -6
  195. package/test/invite/InvitesV2.test.ts +272 -81
  196. package/test/reserve/DistributionHelper.test.ts +232 -139
  197. package/test/reserve/GoodMarketMaker.test.ts +17 -17
  198. package/test/reserve/GoodReserveCDai.cap.test.ts +4 -4
  199. package/test/reserve/GoodReserveCDai.distribution.test.ts +64 -42
  200. package/test/reserve/GoodReserveCDai.gdx.test.ts +1 -1
  201. package/test/reserve/GoodReserveCDai.pause.test.ts +8 -8
  202. package/test/reserve/GoodReserveCDai.test.ts +307 -101
  203. package/test/reserve/GoodReserveCDai.uniswap.test.ts +1 -1
  204. package/test/staking/DonationsStaking.test.ts +2 -2
  205. package/test/staking/FuseStaking.test.ts +3 -3
  206. package/test/staking/GoodAaveStakingFactory.test.ts +2 -2
  207. package/test/staking/StakingRewards.test.ts +913 -320
  208. package/test/staking/StakingRewardsFixedAPY.test.ts +62 -66
  209. package/test/token/CeloGasToken.test.ts +2 -2
  210. package/test/token/GoodDollar.test.ts +5 -5
  211. package/test/token/SuperGoodDollar.test.ts +17 -13
  212. package/test/ubi/UBIScheme.test.ts +1 -1
  213. package/test/utils/AdminWallet.test.ts +10 -10
  214. package/test/utils/BuyAndBridgeHelper.test.ts +33 -9
  215. package/test/utils/GoodDollarMintBurnWrapper.test.ts +265 -113
  216. package/test/utils/NameService.test.ts +1 -1
  217. package/test/utils/ProxyFactory.test.ts +2 -2
  218. package/types/contracts/token/superfluid/SuperGoodDollar.ts +26 -0
  219. package/types/factories/contracts/token/superfluid/ISuperToken__factory.ts +5 -0
  220. package/types/factories/contracts/token/superfluid/SuperGoodDollar__factory.ts +24 -1
  221. package/types/factories/contracts/token/superfluid/SuperToken__factory.ts +6 -1
  222. package/yarn.lock +635 -253
@@ -1,7 +1,13 @@
1
- import { ethers, waffle, upgrades } from "hardhat";
1
+ import { ethers, upgrades } from "hardhat";
2
2
  import { loadFixture } from "@nomicfoundation/hardhat-network-helpers";
3
3
  import { expect } from "chai";
4
- import { GoodReserveCDai, GoodDollarMintBurnWrapper, ERC20, IGoodDollar, MultichainRouterMock } from "../../types";
4
+ import {
5
+ GoodReserveCDai,
6
+ GoodDollarMintBurnWrapper,
7
+ ERC20,
8
+ IGoodDollar,
9
+ MultichainRouterMock
10
+ } from "../../types";
5
11
  import { createDAO, increaseTime } from "../helpers";
6
12
  import { FormatTypes } from "@ethersproject/abi";
7
13
 
@@ -32,7 +38,16 @@ describe("GoodDollarMintBurnWrapper", () => {
32
38
  controller;
33
39
 
34
40
  before(async () => {
35
- [founder, wrapperAdmin, minter, rewarder, guardian, minterUncapped, router, ...signers] = await ethers.getSigners();
41
+ [
42
+ founder,
43
+ wrapperAdmin,
44
+ minter,
45
+ rewarder,
46
+ guardian,
47
+ minterUncapped,
48
+ router,
49
+ ...signers
50
+ ] = await ethers.getSigners();
36
51
 
37
52
  let {
38
53
  controller: ctrl,
@@ -70,14 +85,11 @@ describe("GoodDollarMintBurnWrapper", () => {
70
85
  goodReserve = reserve as GoodReserveCDai;
71
86
  });
72
87
 
73
- const fixture = async (wallets, provider) => {
74
- wallets = provider.getWallets();
75
-
76
- const gf = await ethers.getContractFactory("GoodDollarMintBurnWrapper");
88
+ const fixture = async () => {
77
89
  const ictrl = await ethers.getContractAt(
78
90
  "Controller",
79
91
  controller,
80
- wallets[wallets.length - 1] //has scheme permissions set by createDAO()
92
+ signers[signers.length - 1] //has scheme permissions set by createDAO()
81
93
  );
82
94
 
83
95
  const wrapper = (await upgrades.deployProxy(
@@ -88,33 +100,57 @@ describe("GoodDollarMintBurnWrapper", () => {
88
100
  }
89
101
  )) as GoodDollarMintBurnWrapper;
90
102
 
91
- await wrapper.connect(wrapperAdmin).grantRole(await wrapper.GUARDIAN_ROLE(), guardian.address);
103
+ await wrapper
104
+ .connect(wrapperAdmin)
105
+ .grantRole(await wrapper.GUARDIAN_ROLE(), guardian.address);
92
106
 
93
107
  await goodDollar.mint(controller, 10000000); //so bps limit is significant
94
108
 
95
109
  await wrapper
96
110
  .connect(wrapperAdmin)
97
- .addMinter(router.address, MINTER_CAP, MINTER_TX_MAX, REWARD_BPS, MINTER_CAP, MINTER_TX_MAX, REWARD_BPS, false);
111
+ .addMinter(
112
+ router.address,
113
+ MINTER_CAP,
114
+ MINTER_TX_MAX,
115
+ REWARD_BPS,
116
+ MINTER_CAP,
117
+ MINTER_TX_MAX,
118
+ REWARD_BPS,
119
+ false
120
+ );
98
121
 
99
122
  await wrapper
100
123
  .connect(wrapperAdmin)
101
- .addMinter(minter.address, MINTER_CAP, MINTER_TX_MAX, REWARD_BPS, MINTER_CAP, MINTER_TX_MAX, REWARD_BPS, false);
102
- await wrapper.connect(wrapperAdmin).addMinter(rewarder.address, 0, 0, REWARD_BPS, 0, 0, 0, true);
124
+ .addMinter(
125
+ minter.address,
126
+ MINTER_CAP,
127
+ MINTER_TX_MAX,
128
+ REWARD_BPS,
129
+ MINTER_CAP,
130
+ MINTER_TX_MAX,
131
+ REWARD_BPS,
132
+ false
133
+ );
134
+ await wrapper
135
+ .connect(wrapperAdmin)
136
+ .addMinter(rewarder.address, 0, 0, REWARD_BPS, 0, 0, 0, true);
103
137
 
104
- await ictrl.registerScheme(wrapper.address, ethers.constants.HashZero, "0x00000001", avatar);
138
+ await ictrl.registerScheme(
139
+ wrapper.address,
140
+ ethers.constants.HashZero,
141
+ "0x00000001",
142
+ avatar
143
+ );
105
144
  return { wrapper };
106
145
  };
107
146
 
108
- const fixture_withMultichain = async (wallets, provider) => {
109
- wallets = provider.getWallets();
110
-
111
- const gf = await ethers.getContractFactory("GoodDollarMintBurnWrapper");
147
+ const fixture_withMultichain = async () => {
112
148
  const rf = await ethers.getContractFactory("MultichainRouterMock");
113
149
 
114
150
  const ictrl = await ethers.getContractAt(
115
151
  "Controller",
116
152
  controller,
117
- wallets[wallets.length - 1] //has scheme permissions set by createDAO()
153
+ signers[signers.length - 1]
118
154
  );
119
155
 
120
156
  const wrapper = (await upgrades.deployProxy(
@@ -125,7 +161,9 @@ describe("GoodDollarMintBurnWrapper", () => {
125
161
  }
126
162
  )) as GoodDollarMintBurnWrapper;
127
163
 
128
- const multiChainRouter = (await rf.deploy(wrapper.address)) as MultichainRouterMock;
164
+ const multiChainRouter = (await rf.deploy(
165
+ wrapper.address
166
+ )) as MultichainRouterMock;
129
167
 
130
168
  await wrapper
131
169
  .connect(wrapperAdmin)
@@ -160,20 +198,26 @@ describe("GoodDollarMintBurnWrapper", () => {
160
198
  });
161
199
 
162
200
  it("should have avatar as default admin ", async () => {
163
- const { wrapper } = await waffle.loadFixture(fixture);
201
+ const { wrapper } = await loadFixture(fixture);
164
202
 
165
203
  expect(await wrapper.owner()).to.equal(avatar);
166
- expect(await wrapper.hasRole(await wrapper.DEFAULT_ADMIN_ROLE(), avatar)).to.be.true;
204
+ expect(await wrapper.hasRole(await wrapper.DEFAULT_ADMIN_ROLE(), avatar)).to
205
+ .be.true;
167
206
  });
168
207
 
169
208
  it("should have admin from params as default admin ", async () => {
170
- const { wrapper } = await waffle.loadFixture(fixture);
209
+ const { wrapper } = await loadFixture(fixture);
171
210
 
172
- expect(await wrapper.hasRole(await wrapper.DEFAULT_ADMIN_ROLE(), wrapperAdmin.address)).to.be.true;
211
+ expect(
212
+ await wrapper.hasRole(
213
+ await wrapper.DEFAULT_ADMIN_ROLE(),
214
+ wrapperAdmin.address
215
+ )
216
+ ).to.be.true;
173
217
  });
174
218
 
175
219
  it("should have erc20 token info", async () => {
176
- const { wrapper } = await waffle.loadFixture(fixture);
220
+ const { wrapper } = await loadFixture(fixture);
177
221
 
178
222
  expect(await wrapper.decimals()).to.equal(await goodDollar.decimals());
179
223
  expect(await wrapper.name()).to.equal("GoodDollar");
@@ -181,64 +225,93 @@ describe("GoodDollarMintBurnWrapper", () => {
181
225
  });
182
226
 
183
227
  it("should update updateFrequency only by admin or guardian role", async () => {
184
- const { wrapper } = await waffle.loadFixture(fixture);
228
+ const { wrapper } = await loadFixture(fixture);
185
229
 
186
230
  expect(await wrapper.updateFrequency()).to.equal(60 * 60 * 24 * 7); //default 90 days;
187
231
 
188
- await expect(wrapper.setUpdateFrequency(0)).to.be.revertedWith("role");
189
- await expect(wrapper.connect(wrapperAdmin).setUpdateFrequency(0)).to.not.reverted;
232
+ await expect(wrapper.setUpdateFrequency(0)).to.be.revertedWith(/role/);
233
+ await expect(wrapper.connect(wrapperAdmin).setUpdateFrequency(0)).to.not
234
+ .reverted;
190
235
  expect(await wrapper.updateFrequency()).to.equal(0);
191
- await expect(wrapper.connect(guardian).setUpdateFrequency(1)).to.not.reverted;
236
+ await expect(wrapper.connect(guardian).setUpdateFrequency(1)).to.not
237
+ .reverted;
192
238
  expect(await wrapper.updateFrequency()).to.equal(1);
193
239
  });
194
240
 
195
241
  it("should be able to pause roles only by admin or guardian role", async () => {
196
- const { wrapper } = await waffle.loadFixture(fixture);
242
+ const { wrapper } = await loadFixture(fixture);
197
243
 
198
- await expect(wrapper.unpause(await wrapper.PAUSE_ALL_ROLE())).to.be.revertedWith("role");
244
+ await expect(
245
+ wrapper.unpause(await wrapper.PAUSE_ALL_ROLE())
246
+ ).to.be.revertedWith(/role/);
199
247
 
200
- await expect(wrapper.connect(wrapperAdmin).pause(await wrapper.PAUSE_BURN_ROLE())).to.not.reverted;
201
- await expect(wrapper.connect(guardian).pause(await wrapper.PAUSE_ALL_ROLE())).to.not.reverted;
248
+ await expect(
249
+ wrapper.connect(wrapperAdmin).pause(await wrapper.PAUSE_BURN_ROLE())
250
+ ).to.not.reverted;
251
+ await expect(
252
+ wrapper.connect(guardian).pause(await wrapper.PAUSE_ALL_ROLE())
253
+ ).to.not.reverted;
202
254
 
203
- expect(await wrapper.paused(await wrapper.PAUSE_BURN_ROLE())).to.equal(true);
255
+ expect(await wrapper.paused(await wrapper.PAUSE_BURN_ROLE())).to.equal(
256
+ true
257
+ );
204
258
  expect(await wrapper.paused(await wrapper.PAUSE_ALL_ROLE())).to.equal(true);
205
259
  });
206
260
 
207
261
  it("should be able to unpause roles only by admin or guardian role", async () => {
208
- const { wrapper } = await waffle.loadFixture(fixture);
262
+ const { wrapper } = await loadFixture(fixture);
209
263
 
210
- await expect(wrapper.unpause(await wrapper.PAUSE_ALL_ROLE())).to.be.revertedWith("role");
264
+ await expect(
265
+ wrapper.unpause(await wrapper.PAUSE_ALL_ROLE())
266
+ ).to.be.revertedWith(/role/);
211
267
 
212
- await expect(wrapper.connect(wrapperAdmin).pause(await wrapper.PAUSE_BURN_ROLE())).to.not.reverted;
268
+ await expect(
269
+ wrapper.connect(wrapperAdmin).pause(await wrapper.PAUSE_BURN_ROLE())
270
+ ).to.not.reverted;
213
271
 
214
- await expect(wrapper.connect(wrapperAdmin).pause(await wrapper.PAUSE_ALL_ROLE())).to.not.reverted;
272
+ await expect(
273
+ wrapper.connect(wrapperAdmin).pause(await wrapper.PAUSE_ALL_ROLE())
274
+ ).to.not.reverted;
215
275
 
216
- await expect(wrapper.connect(guardian).unpause(await wrapper.PAUSE_ALL_ROLE())).to.not.reverted;
276
+ await expect(
277
+ wrapper.connect(guardian).unpause(await wrapper.PAUSE_ALL_ROLE())
278
+ ).to.not.reverted;
217
279
 
218
- await expect(wrapper.connect(wrapperAdmin).unpause(await wrapper.PAUSE_BURN_ROLE())).to.not.reverted;
280
+ await expect(
281
+ wrapper.connect(wrapperAdmin).unpause(await wrapper.PAUSE_BURN_ROLE())
282
+ ).to.not.reverted;
219
283
 
220
- expect(await wrapper.paused(await wrapper.PAUSE_BURN_ROLE())).to.equal(false);
221
- expect(await wrapper.paused(await wrapper.PAUSE_ALL_ROLE())).to.equal(false);
284
+ expect(await wrapper.paused(await wrapper.PAUSE_BURN_ROLE())).to.equal(
285
+ false
286
+ );
287
+ expect(await wrapper.paused(await wrapper.PAUSE_ALL_ROLE())).to.equal(
288
+ false
289
+ );
222
290
  });
223
291
 
224
292
  it("should be able to mint only by minter role", async () => {
225
- const { wrapper } = await waffle.loadFixture(fixture);
293
+ const { wrapper } = await loadFixture(fixture);
226
294
 
227
- await expect(wrapper.mint(founder.address, 1000)).to.revertedWith("role");
228
- await expect(wrapper.connect(minter).mint(signers[0].address, 1000)).to.not.reverted;
295
+ await expect(wrapper.mint(founder.address, 1000)).to.revertedWith(/role/);
296
+ await expect(wrapper.connect(minter).mint(signers[0].address, 1000)).to.not
297
+ .reverted;
229
298
  expect(await goodDollar.balanceOf(signers[0].address)).to.equal(1000);
230
299
  });
231
300
 
232
301
  it("should not be able to mint when minter is paused", async () => {
233
- const { wrapper } = await waffle.loadFixture(fixture);
302
+ const { wrapper } = await loadFixture(fixture);
234
303
 
235
- await expect(wrapper.connect(guardian).pause(await wrapper.PAUSE_MINT_ROLE())).to.not.reverted;
304
+ await expect(
305
+ wrapper.connect(guardian).pause(await wrapper.PAUSE_MINT_ROLE())
306
+ ).to.not.reverted;
236
307
 
237
- await expect(wrapper.connect(minter).mint(signers[0].address, 1000)).revertedWith("pause");
308
+ await expect(
309
+ wrapper.connect(minter).mint(signers[0].address, 1000)
310
+ ).revertedWith(/pause/);
238
311
  });
239
312
 
240
313
  it("should not be able to mint when passed daily cap", async () => {
241
- const { wrapper } = await waffle.loadFixture(fixture);
314
+ const { wrapper } = await loadFixture(fixture);
242
315
 
243
316
  try {
244
317
  while (true) {
@@ -250,13 +323,15 @@ describe("GoodDollarMintBurnWrapper", () => {
250
323
  });
251
324
 
252
325
  it("should not be able to mint when passed tx cap", async () => {
253
- const { wrapper } = await waffle.loadFixture(fixture);
326
+ const { wrapper } = await loadFixture(fixture);
254
327
 
255
- await expect(wrapper.connect(minter).mint(signers[0].address, MINTER_TX_MAX + 1)).revertedWith("max");
328
+ await expect(
329
+ wrapper.connect(minter).mint(signers[0].address, MINTER_TX_MAX + 1)
330
+ ).revertedWith(/max/);
256
331
  });
257
332
 
258
333
  it("should not be able to mint when passed minter cap", async () => {
259
- const { wrapper } = await waffle.loadFixture(fixture);
334
+ const { wrapper } = await loadFixture(fixture);
260
335
 
261
336
  for (let i = 0; i < MINTER_CAP / MINTER_TX_MAX; i++) {
262
337
  if (i % 3 === 0) {
@@ -265,22 +340,30 @@ describe("GoodDollarMintBurnWrapper", () => {
265
340
  await wrapper.connect(minter).mint(signers[0].address, MINTER_TX_MAX);
266
341
  }
267
342
 
268
- await expect(wrapper.connect(minter).mint(signers[0].address, MINTER_TX_MAX)).revertedWith("minter cap");
343
+ await expect(
344
+ wrapper.connect(minter).mint(signers[0].address, MINTER_TX_MAX)
345
+ ).revertedWith(/minter cap/);
269
346
  });
270
347
 
271
348
  xit("should not be able to mint when passed global cap", async () => {
272
- const { wrapper } = await waffle.loadFixture(fixture);
349
+ const { wrapper } = await loadFixture(fixture);
273
350
 
274
- await wrapper.connect(wrapperAdmin).addMinter(minterUncapped.address, 0, 10000000000, 0, 0, 0, 0, false);
351
+ await wrapper
352
+ .connect(wrapperAdmin)
353
+ .addMinter(minterUncapped.address, 0, 10000000000, 0, 0, 0, 0, false);
275
354
 
276
355
  for (let i = 0; i < 100000000000 / 10000000000; i++)
277
- await wrapper.connect(minterUncapped).mint(signers[0].address, 10000000000);
356
+ await wrapper
357
+ .connect(minterUncapped)
358
+ .mint(signers[0].address, 10000000000);
278
359
 
279
- await expect(wrapper.connect(minterUncapped).mint(signers[0].address, 10000000000)).revertedWith("total mint");
360
+ await expect(
361
+ wrapper.connect(minterUncapped).mint(signers[0].address, 10000000000)
362
+ ).revertedWith(/total mint/);
280
363
  });
281
364
 
282
365
  it("should not be able to burn when passed daily cap", async () => {
283
- const { wrapper } = await waffle.loadFixture(fixture);
366
+ const { wrapper } = await loadFixture(fixture);
284
367
  await goodDollar.mint(signers[0].address, 100000000);
285
368
  await goodDollar.connect(signers[0]).approve(wrapper.address, 100000000);
286
369
  try {
@@ -293,15 +376,17 @@ describe("GoodDollarMintBurnWrapper", () => {
293
376
  });
294
377
 
295
378
  it("should not be able to burn when passed tx cap", async () => {
296
- const { wrapper } = await waffle.loadFixture(fixture);
379
+ const { wrapper } = await loadFixture(fixture);
297
380
 
298
381
  await goodDollar.mint(signers[0].address, 100000000);
299
382
  await goodDollar.connect(signers[0]).approve(wrapper.address, 100000000);
300
- await expect(wrapper.connect(router).burn(signers[0].address, MINTER_TX_MAX + 1)).revertedWith("max");
383
+ await expect(
384
+ wrapper.connect(router).burn(signers[0].address, MINTER_TX_MAX + 1)
385
+ ).revertedWith(/max/);
301
386
  });
302
387
 
303
388
  it("should not be able to burn when passed minter cap", async () => {
304
- const { wrapper } = await waffle.loadFixture(fixture);
389
+ const { wrapper } = await loadFixture(fixture);
305
390
  await goodDollar.mint(signers[0].address, 100000000);
306
391
  await goodDollar.connect(signers[0]).approve(wrapper.address, 100000000);
307
392
 
@@ -312,11 +397,13 @@ describe("GoodDollarMintBurnWrapper", () => {
312
397
  await wrapper.connect(router).burn(signers[0].address, MINTER_TX_MAX);
313
398
  }
314
399
 
315
- await expect(wrapper.connect(router).burn(signers[0].address, MINTER_TX_MAX)).revertedWith("minter cap");
400
+ await expect(
401
+ wrapper.connect(router).burn(signers[0].address, MINTER_TX_MAX)
402
+ ).revertedWith(/minter cap/);
316
403
  });
317
404
 
318
405
  it("should update stats after mint", async () => {
319
- const { wrapper } = await waffle.loadFixture(fixture);
406
+ const { wrapper } = await loadFixture(fixture);
320
407
 
321
408
  await wrapper.connect(minter).mint(signers[0].address, 1000);
322
409
 
@@ -333,32 +420,40 @@ describe("GoodDollarMintBurnWrapper", () => {
333
420
  });
334
421
 
335
422
  it("should be able to burn only by minter role", async () => {
336
- const { wrapper } = await waffle.loadFixture(fixture);
423
+ const { wrapper } = await loadFixture(fixture);
337
424
  await goodDollar.mint(founder.address, 1000);
338
425
  await goodDollar.connect(founder).approve(wrapper.address, 1000);
339
- await expect(wrapper.connect(guardian).burn(founder.address, 1000)).to.revertedWith("role");
340
- await expect(wrapper.connect(router).burn(founder.address, 1000)).to.not.reverted;
426
+ await expect(
427
+ wrapper.connect(guardian).burn(founder.address, 1000)
428
+ ).to.revertedWith(/role/);
429
+ await expect(wrapper.connect(router).burn(founder.address, 1000)).to.not
430
+ .reverted;
341
431
 
342
432
  expect(await goodDollar.balanceOf(founder.address)).to.equal(0);
343
433
  });
344
434
 
345
435
  it("should not be able to burn when router is paused", async () => {
346
- const { wrapper } = await waffle.loadFixture(fixture);
436
+ const { wrapper } = await loadFixture(fixture);
347
437
 
348
- await expect(wrapper.connect(guardian).pause(await wrapper.PAUSE_ROUTER_ROLE())).to.not.reverted;
438
+ await expect(
439
+ wrapper.connect(guardian).pause(await wrapper.PAUSE_ROUTER_ROLE())
440
+ ).to.not.reverted;
349
441
 
350
442
  await goodDollar.mint(founder.address, 1000);
351
443
  await goodDollar.connect(founder).approve(wrapper.address, 1000);
352
444
 
353
- await expect(wrapper.connect(router).burn(founder.address, 1000)).revertedWith("pause");
445
+ await expect(
446
+ wrapper.connect(router).burn(founder.address, 1000)
447
+ ).revertedWith(/pause/);
354
448
  });
355
449
 
356
450
  it("should not update stats after burn when not minted yet", async () => {
357
- const { wrapper } = await waffle.loadFixture(fixture);
451
+ const { wrapper } = await loadFixture(fixture);
358
452
 
359
453
  await goodDollar.mint(founder.address, 1000);
360
454
  await goodDollar.connect(founder).approve(wrapper.address, 1000);
361
- await expect(wrapper.connect(router).burn(founder.address, 1000)).to.not.reverted;
455
+ await expect(wrapper.connect(router).burn(founder.address, 1000)).to.not
456
+ .reverted;
362
457
 
363
458
  expect(await wrapper.totalMinted()).eq(0);
364
459
 
@@ -367,13 +462,14 @@ describe("GoodDollarMintBurnWrapper", () => {
367
462
  });
368
463
 
369
464
  it("should update global stats when minter!=burner after burn when already minted", async () => {
370
- const { wrapper } = await waffle.loadFixture(fixture);
465
+ const { wrapper } = await loadFixture(fixture);
371
466
 
372
467
  await wrapper.connect(minter).mint(signers[0].address, 1000);
373
468
 
374
469
  await goodDollar.mint(founder.address, 500);
375
470
  await goodDollar.connect(founder).approve(wrapper.address, 500);
376
- await expect(wrapper.connect(router).burn(founder.address, 500)).to.not.reverted;
471
+ await expect(wrapper.connect(router).burn(founder.address, 500)).to.not
472
+ .reverted;
377
473
 
378
474
  expect(await wrapper.totalMinted()).eq(500);
379
475
 
@@ -382,14 +478,17 @@ describe("GoodDollarMintBurnWrapper", () => {
382
478
  });
383
479
 
384
480
  it("should update both global and minter stats when minter==burner after burn when already minted", async () => {
385
- const { wrapper } = await waffle.loadFixture(fixture);
481
+ const { wrapper } = await loadFixture(fixture);
386
482
 
387
- await wrapper.connect(wrapperAdmin).grantRole(await wrapper.ROUTER_ROLE(), minter.address);
483
+ await wrapper
484
+ .connect(wrapperAdmin)
485
+ .grantRole(await wrapper.ROUTER_ROLE(), minter.address);
388
486
  await wrapper.connect(minter).mint(signers[0].address, 1000);
389
487
 
390
488
  await goodDollar.mint(founder.address, 500);
391
489
  await goodDollar.connect(founder).approve(wrapper.address, 500);
392
- await expect(wrapper.connect(minter).burn(founder.address, 500)).to.not.reverted;
490
+ await expect(wrapper.connect(minter).burn(founder.address, 500)).to.not
491
+ .reverted;
393
492
 
394
493
  expect(await wrapper.totalMinted()).eq(500);
395
494
 
@@ -398,14 +497,17 @@ describe("GoodDollarMintBurnWrapper", () => {
398
497
  });
399
498
 
400
499
  it("should reset minter total when burn amount > total", async () => {
401
- const { wrapper } = await waffle.loadFixture(fixture);
500
+ const { wrapper } = await loadFixture(fixture);
402
501
 
403
- await wrapper.connect(wrapperAdmin).grantRole(await wrapper.ROUTER_ROLE(), minter.address);
502
+ await wrapper
503
+ .connect(wrapperAdmin)
504
+ .grantRole(await wrapper.ROUTER_ROLE(), minter.address);
404
505
  await wrapper.connect(minter).mint(signers[0].address, 1000);
405
506
 
406
507
  await goodDollar.mint(founder.address, 2000);
407
508
  await goodDollar.connect(founder).approve(wrapper.address, 2000);
408
- await expect(wrapper.connect(minter).burn(founder.address, 2000)).to.not.reverted;
509
+ await expect(wrapper.connect(minter).burn(founder.address, 2000)).to.not
510
+ .reverted;
409
511
 
410
512
  expect(await wrapper.totalMinted()).eq(0);
411
513
 
@@ -414,7 +516,7 @@ describe("GoodDollarMintBurnWrapper", () => {
414
516
  });
415
517
 
416
518
  it("should update mint stats after sendOrMint", async () => {
417
- const { wrapper } = await waffle.loadFixture(fixture);
519
+ const { wrapper } = await loadFixture(fixture);
418
520
 
419
521
  await wrapper.connect(rewarder).sendOrMint(signers[0].address, 1000);
420
522
  const minterInfo = await wrapper.minterSupply(rewarder.address);
@@ -429,7 +531,7 @@ describe("GoodDollarMintBurnWrapper", () => {
429
531
  });
430
532
 
431
533
  it("should not update mint stats after sendOrMint when wrapper has G$ balance", async () => {
432
- const { wrapper } = await waffle.loadFixture(fixture);
534
+ const { wrapper } = await loadFixture(fixture);
433
535
 
434
536
  await goodDollar.mint(wrapper.address, 1000);
435
537
 
@@ -446,7 +548,7 @@ describe("GoodDollarMintBurnWrapper", () => {
446
548
  });
447
549
 
448
550
  it("should perform send and mint when having partial balance for sendOrMint", async () => {
449
- const { wrapper } = await waffle.loadFixture(fixture);
551
+ const { wrapper } = await loadFixture(fixture);
450
552
 
451
553
  await goodDollar.mint(wrapper.address, 500);
452
554
 
@@ -464,7 +566,7 @@ describe("GoodDollarMintBurnWrapper", () => {
464
566
  });
465
567
 
466
568
  it("should reduce debt in sendOrMint", async () => {
467
- const { wrapper } = await waffle.loadFixture(fixture);
569
+ const { wrapper } = await loadFixture(fixture);
468
570
 
469
571
  await wrapper.connect(rewarder).sendOrMint(signers[0].address, 200); //200 debt
470
572
  const minterInfo = await wrapper.minterSupply(rewarder.address);
@@ -484,15 +586,19 @@ describe("GoodDollarMintBurnWrapper", () => {
484
586
  });
485
587
 
486
588
  it("should mint just partial amount if daily limit passed in sendOrMint", async () => {
487
- const { wrapper } = await waffle.loadFixture(fixture);
589
+ const { wrapper } = await loadFixture(fixture);
488
590
 
489
591
  let minterInfo = await wrapper.minterSupply(rewarder.address);
490
592
 
491
- await wrapper.connect(rewarder).sendOrMint(signers[0].address, minterInfo.dailyCapIn.add(1000));
593
+ await wrapper
594
+ .connect(rewarder)
595
+ .sendOrMint(signers[0].address, minterInfo.dailyCapIn.add(1000));
492
596
 
493
597
  minterInfo = await wrapper.minterSupply(rewarder.address);
494
598
 
495
- expect(await goodDollar.balanceOf(signers[0].address)).to.eq(minterInfo.dailyCapIn);
599
+ expect(await goodDollar.balanceOf(signers[0].address)).to.eq(
600
+ minterInfo.dailyCapIn
601
+ );
496
602
  expect(minterInfo.totalIn).eq(minterInfo.dailyCapIn);
497
603
  expect(minterInfo.totalRewards).eq(minterInfo.dailyCapIn);
498
604
  expect(minterInfo.mintedToday).eq(minterInfo.dailyCapIn);
@@ -502,7 +608,7 @@ describe("GoodDollarMintBurnWrapper", () => {
502
608
  });
503
609
 
504
610
  it("should reset rewarder and minter mintedToday after day passed", async () => {
505
- const { wrapper } = await waffle.loadFixture(fixture);
611
+ const { wrapper } = await loadFixture(fixture);
506
612
 
507
613
  await wrapper.connect(rewarder).sendOrMint(signers[0].address, "1000");
508
614
 
@@ -510,9 +616,12 @@ describe("GoodDollarMintBurnWrapper", () => {
510
616
 
511
617
  await increaseTime(60 * 60 * 24);
512
618
 
513
- await expect(wrapper.connect(rewarder).sendOrMint(signers[0].address, "1001")).to.not.reverted;
619
+ await expect(
620
+ wrapper.connect(rewarder).sendOrMint(signers[0].address, "1001")
621
+ ).to.not.reverted;
514
622
 
515
- await expect(wrapper.connect(minter).mint(signers[0].address, "1001")).to.not.reverted;
623
+ await expect(wrapper.connect(minter).mint(signers[0].address, "1001")).to
624
+ .not.reverted;
516
625
 
517
626
  expect(await goodDollar.balanceOf(signers[0].address)).to.eq("4002");
518
627
  const minterInfo = await wrapper.minterSupply(rewarder.address);
@@ -521,7 +630,7 @@ describe("GoodDollarMintBurnWrapper", () => {
521
630
  });
522
631
 
523
632
  it("should update rewarder daily limit after updateFrequency days passed", async () => {
524
- const { wrapper } = await waffle.loadFixture(fixture);
633
+ const { wrapper } = await loadFixture(fixture);
525
634
 
526
635
  await goodDollar.mint(controller, 100000000000);
527
636
  const totalSupplyBeforeMint = await goodDollar.totalSupply();
@@ -530,21 +639,31 @@ describe("GoodDollarMintBurnWrapper", () => {
530
639
  const frequency = await wrapper.updateFrequency();
531
640
  await increaseTime(frequency.toNumber());
532
641
 
533
- await wrapper.connect(rewarder).sendOrMint(signers[0].address, minterInfo.dailyCapIn.add(1000));
642
+ await wrapper
643
+ .connect(rewarder)
644
+ .sendOrMint(signers[0].address, minterInfo.dailyCapIn.add(1000));
534
645
 
535
646
  let minterInfoAfter = await wrapper.minterSupply(rewarder.address);
536
647
 
537
648
  expect(minterInfoAfter.dailyCapIn).gt(minterInfo.dailyCapIn);
538
- expect(minterInfoAfter.dailyCapIn).eq(totalSupplyBeforeMint.mul(REWARD_BPS).div(10000)); //we doubled the G$ supply so bps relative to supply should be double now
649
+ expect(minterInfoAfter.dailyCapIn).eq(
650
+ totalSupplyBeforeMint.mul(REWARD_BPS).div(10000)
651
+ ); //we doubled the G$ supply so bps relative to supply should be double now
539
652
  });
540
653
 
541
654
  it("should not mint but not revert when rewarder passes daily limit", async () => {
542
- const { wrapper } = await waffle.loadFixture(fixture);
655
+ const { wrapper } = await loadFixture(fixture);
543
656
 
544
657
  const minterInfo = await wrapper.minterSupply(rewarder.address);
545
- await wrapper.connect(rewarder).sendOrMint(signers[0].address, minterInfo.dailyCapIn);
658
+ await wrapper
659
+ .connect(rewarder)
660
+ .sendOrMint(signers[0].address, minterInfo.dailyCapIn);
546
661
 
547
- const tx = await (await wrapper.connect(rewarder).sendOrMint(signers[1].address, minterInfo.dailyCapIn)).wait();
662
+ const tx = await (
663
+ await wrapper
664
+ .connect(rewarder)
665
+ .sendOrMint(signers[1].address, minterInfo.dailyCapIn)
666
+ ).wait();
548
667
 
549
668
  const sendOrMintEvent = tx.events.find(_ => _.event === "SendOrMint");
550
669
 
@@ -554,11 +673,17 @@ describe("GoodDollarMintBurnWrapper", () => {
554
673
  });
555
674
 
556
675
  it("should allow guardian to update minter limits and rewarder daily limit", async () => {
557
- const { wrapper } = await waffle.loadFixture(fixture);
676
+ const { wrapper } = await loadFixture(fixture);
558
677
 
559
- await expect(wrapper.setMinterCaps(minter.address, 0, 0, 0, 0, 0, 0)).to.be.revertedWith("role");
678
+ await expect(
679
+ wrapper.setMinterCaps(minter.address, 0, 0, 0, 0, 0, 0)
680
+ ).to.be.revertedWith(/role/);
560
681
 
561
- await expect(wrapper.connect(guardian).setMinterCaps(minter.address, 0, 0, 50, 0, 0, 60)).to.not.reverted;
682
+ await expect(
683
+ wrapper
684
+ .connect(guardian)
685
+ .setMinterCaps(minter.address, 0, 0, 50, 0, 0, 60)
686
+ ).to.not.reverted;
562
687
 
563
688
  const minterInfo = await wrapper.minterSupply(minter.address);
564
689
  const minterOutLimits = await wrapper.minterOutLimits(minter.address);
@@ -569,14 +694,18 @@ describe("GoodDollarMintBurnWrapper", () => {
569
694
  expect(minterOutLimits.capOut).to.eq(0);
570
695
  expect(minterOutLimits.maxOut).to.eq(0);
571
696
  expect(minterOutLimits.bpsPerDayOut).to.eq(60);
572
- expect(minterInfo.dailyCapIn).eq((await goodDollar.totalSupply()).mul(50).div(10000));
573
- expect(minterOutLimits.dailyCapOut).eq((await goodDollar.totalSupply()).mul(60).div(10000));
697
+ expect(minterInfo.dailyCapIn).eq(
698
+ (await goodDollar.totalSupply()).mul(50).div(10000)
699
+ );
700
+ expect(minterOutLimits.dailyCapOut).eq(
701
+ (await goodDollar.totalSupply()).mul(60).div(10000)
702
+ );
574
703
  });
575
704
 
576
705
  xit("should allow guardian to update totalMintCap", async () => {
577
- const { wrapper } = await waffle.loadFixture(fixture);
706
+ const { wrapper } = await loadFixture(fixture);
578
707
 
579
- await expect(wrapper.setTotalMintCap(0)).to.be.revertedWith("role");
708
+ await expect(wrapper.setTotalMintCap(0)).to.be.revertedWith(/role/);
580
709
 
581
710
  await expect(wrapper.connect(guardian).setTotalMintCap(0)).to.not.reverted;
582
711
 
@@ -584,56 +713,79 @@ describe("GoodDollarMintBurnWrapper", () => {
584
713
  });
585
714
 
586
715
  it("should support transferAndCall for multichain bridge transfer", async () => {
587
- const { wrapper, multiChainRouter } = await waffle.loadFixture(fixture_withMultichain);
716
+ const { wrapper, multiChainRouter } = await loadFixture(
717
+ fixture_withMultichain
718
+ );
588
719
 
589
720
  await goodDollar.mint(founder.address, 100000);
590
721
  await goodDollar.transferAndCall(
591
722
  wrapper.address,
592
723
  100000,
593
- ethers.utils.defaultAbiCoder.encode(["address", "uint256"], [minter.address, "4220"])
724
+ ethers.utils.defaultAbiCoder.encode(
725
+ ["address", "uint256"],
726
+ [minter.address, "4220"]
727
+ )
594
728
  );
595
729
 
596
730
  expect(await goodDollar.balanceOf(founder.address)).to.eq(0); //verify burn happened
597
731
  expect(await goodDollar.balanceOf(wrapper.address)).to.eq(0); //verify burn happened
598
- const events = await multiChainRouter.queryFilter(multiChainRouter.filters.AnySwap());
732
+ const events = await multiChainRouter.queryFilter(
733
+ multiChainRouter.filters.AnySwap()
734
+ );
599
735
  expect(events[0].args.recipient).to.equal(minter.address);
600
736
  expect(events[0].args.chainId).to.equal(4220);
601
737
  });
602
738
 
603
739
  it("should default to sender as recipient on transferAndCall if recipient=0", async () => {
604
- const { wrapper, multiChainRouter } = await waffle.loadFixture(fixture_withMultichain);
740
+ const { wrapper, multiChainRouter } = await loadFixture(
741
+ fixture_withMultichain
742
+ );
605
743
 
606
744
  await goodDollar.mint(founder.address, 100000);
607
745
  await goodDollar.transferAndCall(
608
746
  wrapper.address,
609
747
  100000,
610
- ethers.utils.defaultAbiCoder.encode(["address", "uint256"], [ethers.constants.AddressZero, "4220"])
748
+ ethers.utils.defaultAbiCoder.encode(
749
+ ["address", "uint256"],
750
+ [ethers.constants.AddressZero, "4220"]
751
+ )
611
752
  );
612
753
 
613
754
  expect(await goodDollar.balanceOf(founder.address)).to.eq(0); //verify burn happened
614
755
  expect(await goodDollar.balanceOf(wrapper.address)).to.eq(0); //verify burn happened
615
- const events = await multiChainRouter.queryFilter(multiChainRouter.filters.AnySwap());
756
+ const events = await multiChainRouter.queryFilter(
757
+ multiChainRouter.filters.AnySwap()
758
+ );
616
759
  expect(events[0].args.recipient).to.equal(founder.address);
617
760
  expect(events[0].args.chainId).to.equal(4220);
618
761
  });
619
762
 
620
763
  it("should fail transferAndCall for multichain if no chainid", async () => {
621
- const { wrapper, multiChainRouter } = await waffle.loadFixture(fixture_withMultichain);
764
+ const { wrapper, multiChainRouter } = await loadFixture(
765
+ fixture_withMultichain
766
+ );
622
767
 
623
768
  await goodDollar.mint(founder.address, 100000);
624
769
  await expect(
625
770
  goodDollar.transferAndCall(
626
771
  wrapper.address,
627
772
  100000,
628
- ethers.utils.defaultAbiCoder.encode(["address", "uint"], [minter.address, 0])
773
+ ethers.utils.defaultAbiCoder.encode(
774
+ ["address", "uint"],
775
+ [minter.address, 0]
776
+ )
629
777
  )
630
- ).revertedWith("chainId");
778
+ ).revertedWith(/chainId/);
631
779
  });
632
780
 
633
781
  it("should not mint or sendOrMint to self", async () => {
634
- const { wrapper } = await waffle.loadFixture(fixture);
782
+ const { wrapper } = await loadFixture(fixture);
635
783
 
636
- await expect(wrapper.connect(minter).mint(wrapper.address, 1)).revertedWith("self");
637
- await expect(wrapper.connect(rewarder).sendOrMint(wrapper.address, 1)).revertedWith("self");
784
+ await expect(wrapper.connect(minter).mint(wrapper.address, 1)).revertedWith(
785
+ /self/
786
+ );
787
+ await expect(
788
+ wrapper.connect(rewarder).sendOrMint(wrapper.address, 1)
789
+ ).revertedWith(/self/);
638
790
  });
639
791
  });