@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.
- package/artifacts/abis/ISuperToken.min.json +1 -1
- package/artifacts/abis/SuperGoodDollar.min.json +1 -1
- package/artifacts/abis/SuperToken.min.json +1 -1
- package/artifacts/contracts/DAOStackInterfaces.sol/Avatar.dbg.json +1 -1
- package/artifacts/contracts/DAOStackInterfaces.sol/Controller.dbg.json +1 -1
- package/artifacts/contracts/DAOStackInterfaces.sol/GlobalConstraintInterface.dbg.json +1 -1
- package/artifacts/contracts/DAOStackInterfaces.sol/IntVoteInterface.dbg.json +1 -1
- package/artifacts/contracts/DAOStackInterfaces.sol/ReputationInterface.dbg.json +1 -1
- package/artifacts/contracts/DAOStackInterfaces.sol/SchemeRegistrar.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/AggregatorV3Interface.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/ERC20.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/IAaveIncentivesController.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/IAdminWallet.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/IDonationStaking.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/IERC2917.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/IFirstClaimPool.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/IGoodDollar.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/IGoodStaking.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/IHasRouter.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/IIdentity.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/IIdentityV2.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/ILendingPool.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/IMultichainRouter.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/INameService.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/IUBIScheme.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/ProxyAdmin.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/Reserve.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/Staking.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/Uniswap.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/UniswapFactory.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/UniswapPair.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/cERC20.dbg.json +1 -1
- package/artifacts/contracts/fuseFaucet/Faucet.sol/Faucet.dbg.json +1 -1
- package/artifacts/contracts/fuseFaucet/FuseFaucet.sol/FuseFaucet.dbg.json +1 -1
- package/artifacts/contracts/fuseFaucet/FuseFaucetV2.sol/FuseFaucetV2.dbg.json +1 -1
- package/artifacts/contracts/governance/ClaimersDistribution.sol/ClaimersDistribution.dbg.json +1 -1
- package/artifacts/contracts/governance/CompoundVotingMachine.sol/CompoundVotingMachine.dbg.json +1 -1
- package/artifacts/contracts/governance/GReputation.sol/GReputation.dbg.json +1 -1
- package/artifacts/contracts/governance/GoodDollarStaking.sol/GoodDollarStaking.dbg.json +1 -1
- package/artifacts/contracts/governance/GoodDollarStaking.sol/IGovernanceStaking.dbg.json +1 -1
- package/artifacts/contracts/governance/GoodDollarStaking.sol/IStakingUpgrade.dbg.json +1 -1
- package/artifacts/contracts/governance/GoodDollarStaking.sol/RewardsMinter.dbg.json +1 -1
- package/artifacts/contracts/governance/GovernanceStaking.sol/GovernanceStaking.dbg.json +1 -1
- package/artifacts/contracts/governance/MultiBaseGovernanceShareField.sol/MultiBaseGovernanceShareField.dbg.json +1 -1
- package/artifacts/contracts/governance/Reputation.sol/Reputation.dbg.json +1 -1
- package/artifacts/contracts/governance/StakersDistribution.sol/StakersDistribution.dbg.json +1 -1
- package/artifacts/contracts/identity/IdentityV2.sol/IdentityV2.dbg.json +1 -1
- package/artifacts/contracts/invite/InvitesFuseV2.sol/InvitesFuseV2.dbg.json +1 -1
- package/artifacts/contracts/invite/InvitesV1.sol/InvitesV1.dbg.json +1 -1
- package/artifacts/contracts/invite/InvitesV2.sol/InvitesV2.dbg.json +1 -1
- package/artifacts/contracts/mocks/AaveMock.sol/AaveMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/AaveUSDMockOracle.sol/AaveUSDMockOracle.dbg.json +1 -1
- package/artifacts/contracts/mocks/BatUSDMockOracle.sol/BatUSDMockOracle.dbg.json +1 -1
- package/artifacts/contracts/mocks/CompUsdMockOracle.sol/CompUSDMockOracle.dbg.json +1 -1
- package/artifacts/contracts/mocks/DAIMock.sol/DAIMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/DaiEthPriceMockOracle.sol/DaiEthPriceMockOracle.dbg.json +1 -1
- package/artifacts/contracts/mocks/DecimalsMock.sol/DecimalsMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/DistributionBridgeMock.sol/DistributionBridgeMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/DistributionHelperTest.sol/DistributionHelperTest.dbg.json +1 -1
- package/artifacts/contracts/mocks/DistributionHelperTest.sol/DistributionHelperTestHelper.dbg.json +1 -1
- package/artifacts/contracts/mocks/EthUSDMockOracle.sol/EthUSDMockOracle.dbg.json +1 -1
- package/artifacts/contracts/mocks/FeesFormularMock.sol/FeesFormulaMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/GasPriceMockOracle.sol/GasPriceMockOracle.dbg.json +1 -1
- package/artifacts/contracts/mocks/GoodCompoundStakingTest.sol/GoodCompoundStakingTest.dbg.json +1 -1
- package/artifacts/contracts/mocks/GoodDollarStakingMock.sol/GoodDollarStakingMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/GoodFundManagerTest.sol/GoodFundManagerTest.dbg.json +1 -1
- package/artifacts/contracts/mocks/IdentityMock.sol/IdentityMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/IncentiveControllerMock.sol/IncentiveControllerMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/LendingPoolMock.sol/LendingPoolMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/MultichainRouterMock.sol/IWrapper.dbg.json +1 -1
- package/artifacts/contracts/mocks/MultichainRouterMock.sol/MultichainRouterMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/OverMintTester.sol/IGoodDollarStakingTest.dbg.json +1 -1
- package/artifacts/contracts/mocks/OverMintTester.sol/OverMintTester.dbg.json +1 -1
- package/artifacts/contracts/mocks/OverMintTesterRegularStake.sol/OverMintTesterRegularStake.dbg.json +1 -1
- package/artifacts/contracts/mocks/PayableMock.sol/PayableMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/SixteenDecimalsTokenMock.sol/SixteenDecimalsTokenMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/StakingMockFixedAPY.sol/StakingMockFixedAPY.dbg.json +1 -1
- package/artifacts/contracts/mocks/SwapHelperTest.sol/SwapHelperTest.dbg.json +1 -1
- package/artifacts/contracts/mocks/TwentyDecimalsTokenMock.sol/TwentyDecimalsTokenMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock2.dbg.json +1 -1
- package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock3.dbg.json +1 -1
- package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock4.dbg.json +1 -1
- package/artifacts/contracts/mocks/UsdcMock.sol/USDCMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/cBATMock.sol/cBATMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/cDAILowWorthMock.sol/cDAILowWorthMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/cDAIMock.sol/cDAIMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/cDAINonMintableMock.sol/cDAINonMintableMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/cDecimalsMock.sol/cDecimalsMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/cSDTMock.sol/cSDTMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/cUSDCMock.sol/cUSDCMock.dbg.json +1 -1
- package/artifacts/contracts/reserve/DistributionHelper.sol/DistributionHelper.dbg.json +1 -1
- package/artifacts/contracts/reserve/ExchangeHelper.sol/ExchangeHelper.dbg.json +1 -1
- package/artifacts/contracts/reserve/GoodMarketMaker.sol/GoodMarketMaker.dbg.json +1 -1
- package/artifacts/contracts/reserve/GoodReserveCDai.sol/ContributionCalc.dbg.json +1 -1
- package/artifacts/contracts/reserve/GoodReserveCDai.sol/GoodReserveCDai.dbg.json +1 -1
- package/artifacts/contracts/staking/BaseShareField.sol/BaseShareField.dbg.json +1 -1
- package/artifacts/contracts/staking/BaseShareFieldV2.sol/BaseShareFieldV2.dbg.json +1 -1
- package/artifacts/contracts/staking/DonationsStaking.sol/DonationsStaking.dbg.json +1 -1
- package/artifacts/contracts/staking/FuseStakingV3.sol/FuseStakingV3.dbg.json +1 -1
- package/artifacts/contracts/staking/FuseStakingV3.sol/IConsensus.dbg.json +1 -1
- package/artifacts/contracts/staking/FuseStakingV3.sol/PegSwap.dbg.json +1 -1
- package/artifacts/contracts/staking/GoodFundManager.sol/GoodFundManager.dbg.json +1 -1
- package/artifacts/contracts/staking/SimpleStaking.sol/SimpleStaking.dbg.json +1 -1
- package/artifacts/contracts/staking/SimpleStakingV2.sol/SimpleStakingV2.dbg.json +1 -1
- package/artifacts/contracts/staking/UniswapV2SwapHelper.sol/UniswapV2SwapHelper.dbg.json +1 -1
- package/artifacts/contracts/staking/aave/AaveStakingFactory.sol/AaveStakingFactory.dbg.json +1 -1
- package/artifacts/contracts/staking/aave/GoodAaveStaking.sol/GoodAaveStaking.dbg.json +1 -1
- package/artifacts/contracts/staking/aave/GoodAaveStakingV2.sol/GoodAaveStakingV2.dbg.json +1 -1
- package/artifacts/contracts/staking/compound/CompoundStakingFactory.sol/CompoundStakingFactory.dbg.json +1 -1
- package/artifacts/contracts/staking/compound/GoodCompoundStaking.sol/GoodCompoundStaking.dbg.json +1 -1
- package/artifacts/contracts/staking/compound/GoodCompoundStakingV2.sol/GoodCompoundStakingV2.dbg.json +1 -1
- package/artifacts/contracts/staking/utils/Math64X64.sol/Math64x64.dbg.json +1 -1
- package/artifacts/contracts/staking/utils/StakingRewardsFixedAPY.sol/StakingRewardsFixedAPY.dbg.json +1 -1
- package/artifacts/contracts/token/ERC20PresetMinterPauserUpgradeable.sol/ERC20PresetMinterPauserUpgradeable.dbg.json +1 -1
- package/artifacts/contracts/token/ERC677.sol/ERC677.dbg.json +1 -1
- package/artifacts/contracts/token/ERC677.sol/ERC677Receiver.dbg.json +1 -1
- package/artifacts/contracts/token/GoodDollar.sol/GoodDollar.dbg.json +1 -1
- package/artifacts/contracts/token/IFeesFormula.sol/IFeesFormula.dbg.json +1 -1
- package/artifacts/contracts/token/MultichainFeeFormula.sol/MultichainFeeFormula.dbg.json +1 -1
- package/artifacts/contracts/token/superfluid/ERC20Permit.sol/ERC20Permit.dbg.json +1 -1
- package/artifacts/contracts/token/superfluid/ERC20Permit.sol/SelfApprove.dbg.json +1 -1
- package/artifacts/contracts/token/superfluid/ISuperGoodDollar.sol/IGoodDollarCustom.dbg.json +1 -1
- package/artifacts/contracts/token/superfluid/ISuperGoodDollar.sol/ISuperGoodDollar.dbg.json +1 -1
- package/artifacts/contracts/token/superfluid/ISuperToken.sol/ISuperToken.dbg.json +1 -1
- package/artifacts/contracts/token/superfluid/ISuperToken.sol/ISuperToken.json +5 -0
- package/artifacts/contracts/token/superfluid/SuperGoodDollar.sol/SuperGoodDollar.dbg.json +1 -1
- package/artifacts/contracts/token/superfluid/SuperGoodDollar.sol/SuperGoodDollar.json +25 -2
- package/artifacts/contracts/token/superfluid/SuperToken.sol/SuperToken.dbg.json +1 -1
- package/artifacts/contracts/token/superfluid/SuperToken.sol/SuperToken.json +7 -2
- package/artifacts/contracts/token/superfluid/SuperfluidToken.sol/SuperfluidToken.dbg.json +1 -1
- package/artifacts/contracts/token/superfluid/UUPSProxiable.sol/UUPSProxiable.dbg.json +1 -1
- package/artifacts/contracts/token/superfluid/UUPSProxy.sol/Proxy.dbg.json +1 -1
- package/artifacts/contracts/token/superfluid/UUPSProxy.sol/UUPSProxy.dbg.json +1 -1
- package/artifacts/contracts/token/superfluid/UUPSProxy.sol/UUPSUtils.dbg.json +1 -1
- package/artifacts/contracts/ubi/UBIScheme.sol/UBIScheme.dbg.json +1 -1
- package/artifacts/contracts/ubi/UBISchemeV2.sol/UBISchemeV2.dbg.json +1 -1
- package/artifacts/contracts/utils/AdminWallet.sol/AdminWallet.dbg.json +1 -1
- package/artifacts/contracts/utils/AdminWalletFuse.sol/AdminWalletFuse.dbg.json +1 -1
- package/artifacts/contracts/utils/BancorFormula.sol/BancorFormula.dbg.json +1 -1
- package/artifacts/contracts/utils/BulkProof.sol/BulkProof.dbg.json +1 -1
- package/artifacts/contracts/utils/BuyAndBridgeHelper.sol/BuyAndBridgeHelper.dbg.json +1 -1
- package/artifacts/contracts/utils/BuyGDClone.sol/BuyGDClone.dbg.json +1 -1
- package/artifacts/contracts/utils/BuyGDClone.sol/BuyGDCloneFactory.dbg.json +1 -1
- package/artifacts/contracts/utils/BuyGDClone.sol/DonateGDClone.dbg.json +1 -1
- package/artifacts/contracts/utils/BuyGDClone.sol/IQuoterV2.dbg.json +1 -1
- package/artifacts/contracts/utils/BuyGDClone.sol/ISwapRouter.dbg.json +1 -1
- package/artifacts/contracts/utils/DAOContract.sol/DAOContract.dbg.json +1 -1
- package/artifacts/contracts/utils/DAOUpgradeableContract.sol/DAOUpgradeableContract.dbg.json +1 -1
- package/artifacts/contracts/utils/DSMath.sol/DSMath.dbg.json +1 -1
- package/artifacts/contracts/utils/DataTypes.sol/DataTypes.dbg.json +1 -1
- package/artifacts/contracts/utils/GDFaucet.sol/GDFaucet.dbg.json +1 -1
- package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/GoodDollarMintBurnWrapper.dbg.json +1 -1
- package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/IRouter.dbg.json +1 -1
- package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/PausableControl.dbg.json +1 -1
- package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/TokenOperation.dbg.json +1 -1
- package/artifacts/contracts/utils/IdentityFix.sol/IdentityFix.dbg.json +1 -1
- package/artifacts/contracts/utils/MultiCall.sol/Multicall.dbg.json +1 -1
- package/artifacts/contracts/utils/MultichainBridgeHelper.sol/MultichainBridgeHelper.dbg.json +1 -1
- package/artifacts/contracts/utils/NameService.sol/NameService.dbg.json +1 -1
- package/artifacts/contracts/utils/OneTimePayments.sol/OneTimePayments.dbg.json +1 -1
- package/artifacts/contracts/utils/OneTimePaymentsV2.sol/OneTimePaymentsV2.dbg.json +1 -1
- package/artifacts/contracts/utils/ProtocolUpgrade.sol/OldMarketMaker.dbg.json +1 -1
- package/artifacts/contracts/utils/ProtocolUpgrade.sol/ProtocolUpgrade.dbg.json +1 -1
- package/artifacts/contracts/utils/ProtocolUpgradeFuse.sol/ProtocolUpgradeFuse.dbg.json +1 -1
- package/artifacts/contracts/utils/ProtocolUpgradeFuseRecover.sol/ProtocolUpgradeFuseRecover.dbg.json +1 -1
- package/artifacts/contracts/utils/ProtocolUpgradeRecover.sol/ProtocolUpgradeRecover.dbg.json +1 -1
- package/artifacts/contracts/utils/ProxyFactory1967.sol/ERC1967Proxy.dbg.json +1 -1
- package/artifacts/contracts/utils/ProxyFactory1967.sol/ProxyFactory1967.dbg.json +1 -1
- package/artifacts/contracts/utils/ReputationTestHelper.sol/ReputationTestHelper.dbg.json +1 -1
- package/contracts/token/superfluid/ISuperToken.sol +1 -0
- package/contracts/token/superfluid/SuperGoodDollar.sol +11 -2
- package/contracts/token/superfluid/SuperToken.sol +8 -0
- package/dist/artifacts/contracts/token/superfluid/SuperGoodDollar.sol/SuperGoodDollar.json +25 -2
- package/hardhat.config.ts +1 -1
- package/package.json +4 -3
- package/scripts/blockchainTestSetup.sh +1 -1
- package/test/faucet/Faucet.test.ts +63 -19
- package/test/faucet/FuseFaucet.test.ts +43 -14
- package/test/governance/ClaimersDistribution.test.ts +3 -3
- package/test/governance/CompoundVotingMachine.castvote.test.ts +3 -6
- package/test/governance/CompoundVotingMachine.crossblockchain.ts +2 -2
- package/test/governance/CompoundVotingMachine.daoscheme.ts +1 -1
- package/test/governance/CompoundVotingMachine.guardian.test.ts +4 -4
- package/test/governance/CompoundVotingMachine.propose.test.ts +8 -8
- package/test/governance/CompoundVotingMachine.state.test.ts +4 -4
- package/test/governance/GReputation.test.ts +6 -6
- package/test/governance/GoodDollarStaking.gd.test.ts +44 -71
- package/test/governance/GoodDollarStaking.good.test.ts +52 -73
- package/test/governance/GovernanceStaking.test.ts +1 -1
- package/test/governance/Reputation.test.ts +2 -2
- package/test/helpers.ts +1 -1
- package/test/identity/IdentityV2.test.ts +12 -12
- package/test/invite/InvitesV1.test.ts +6 -6
- package/test/invite/InvitesV2.test.ts +272 -81
- package/test/reserve/DistributionHelper.test.ts +232 -139
- package/test/reserve/GoodMarketMaker.test.ts +17 -17
- package/test/reserve/GoodReserveCDai.cap.test.ts +4 -4
- package/test/reserve/GoodReserveCDai.distribution.test.ts +64 -42
- package/test/reserve/GoodReserveCDai.gdx.test.ts +1 -1
- package/test/reserve/GoodReserveCDai.pause.test.ts +8 -8
- package/test/reserve/GoodReserveCDai.test.ts +307 -101
- package/test/reserve/GoodReserveCDai.uniswap.test.ts +1 -1
- package/test/staking/DonationsStaking.test.ts +2 -2
- package/test/staking/FuseStaking.test.ts +3 -3
- package/test/staking/GoodAaveStakingFactory.test.ts +2 -2
- package/test/staking/StakingRewards.test.ts +913 -320
- package/test/staking/StakingRewardsFixedAPY.test.ts +62 -66
- package/test/token/CeloGasToken.test.ts +2 -2
- package/test/token/GoodDollar.test.ts +5 -5
- package/test/token/SuperGoodDollar.test.ts +17 -13
- package/test/ubi/UBIScheme.test.ts +1 -1
- package/test/utils/AdminWallet.test.ts +10 -10
- package/test/utils/BuyAndBridgeHelper.test.ts +33 -9
- package/test/utils/GoodDollarMintBurnWrapper.test.ts +265 -113
- package/test/utils/NameService.test.ts +1 -1
- package/test/utils/ProxyFactory.test.ts +2 -2
- package/types/contracts/token/superfluid/SuperGoodDollar.ts +26 -0
- package/types/factories/contracts/token/superfluid/ISuperToken__factory.ts +5 -0
- package/types/factories/contracts/token/superfluid/SuperGoodDollar__factory.ts +24 -1
- package/types/factories/contracts/token/superfluid/SuperToken__factory.ts +6 -1
- package/yarn.lock +635 -253
|
@@ -1,7 +1,13 @@
|
|
|
1
|
-
import { ethers,
|
|
1
|
+
import { ethers, upgrades } from "hardhat";
|
|
2
2
|
import { loadFixture } from "@nomicfoundation/hardhat-network-helpers";
|
|
3
3
|
import { expect } from "chai";
|
|
4
|
-
import {
|
|
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
|
-
[
|
|
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 (
|
|
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
|
-
|
|
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
|
|
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(
|
|
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(
|
|
102
|
-
|
|
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(
|
|
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 (
|
|
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
|
-
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
209
|
+
const { wrapper } = await loadFixture(fixture);
|
|
171
210
|
|
|
172
|
-
expect(
|
|
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
|
|
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
|
|
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(
|
|
189
|
-
await expect(wrapper.connect(wrapperAdmin).setUpdateFrequency(0)).to.not
|
|
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
|
|
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
|
|
242
|
+
const { wrapper } = await loadFixture(fixture);
|
|
197
243
|
|
|
198
|
-
await expect(
|
|
244
|
+
await expect(
|
|
245
|
+
wrapper.unpause(await wrapper.PAUSE_ALL_ROLE())
|
|
246
|
+
).to.be.revertedWith(/role/);
|
|
199
247
|
|
|
200
|
-
await expect(
|
|
201
|
-
|
|
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(
|
|
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
|
|
262
|
+
const { wrapper } = await loadFixture(fixture);
|
|
209
263
|
|
|
210
|
-
await expect(
|
|
264
|
+
await expect(
|
|
265
|
+
wrapper.unpause(await wrapper.PAUSE_ALL_ROLE())
|
|
266
|
+
).to.be.revertedWith(/role/);
|
|
211
267
|
|
|
212
|
-
await expect(
|
|
268
|
+
await expect(
|
|
269
|
+
wrapper.connect(wrapperAdmin).pause(await wrapper.PAUSE_BURN_ROLE())
|
|
270
|
+
).to.not.reverted;
|
|
213
271
|
|
|
214
|
-
await expect(
|
|
272
|
+
await expect(
|
|
273
|
+
wrapper.connect(wrapperAdmin).pause(await wrapper.PAUSE_ALL_ROLE())
|
|
274
|
+
).to.not.reverted;
|
|
215
275
|
|
|
216
|
-
await expect(
|
|
276
|
+
await expect(
|
|
277
|
+
wrapper.connect(guardian).unpause(await wrapper.PAUSE_ALL_ROLE())
|
|
278
|
+
).to.not.reverted;
|
|
217
279
|
|
|
218
|
-
await expect(
|
|
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(
|
|
221
|
-
|
|
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
|
|
293
|
+
const { wrapper } = await loadFixture(fixture);
|
|
226
294
|
|
|
227
|
-
await expect(wrapper.mint(founder.address, 1000)).to.revertedWith(
|
|
228
|
-
await expect(wrapper.connect(minter).mint(signers[0].address, 1000)).to.not
|
|
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
|
|
302
|
+
const { wrapper } = await loadFixture(fixture);
|
|
234
303
|
|
|
235
|
-
await expect(
|
|
304
|
+
await expect(
|
|
305
|
+
wrapper.connect(guardian).pause(await wrapper.PAUSE_MINT_ROLE())
|
|
306
|
+
).to.not.reverted;
|
|
236
307
|
|
|
237
|
-
await expect(
|
|
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
|
|
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
|
|
326
|
+
const { wrapper } = await loadFixture(fixture);
|
|
254
327
|
|
|
255
|
-
await expect(
|
|
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
|
|
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(
|
|
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
|
|
349
|
+
const { wrapper } = await loadFixture(fixture);
|
|
273
350
|
|
|
274
|
-
await wrapper
|
|
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
|
|
356
|
+
await wrapper
|
|
357
|
+
.connect(minterUncapped)
|
|
358
|
+
.mint(signers[0].address, 10000000000);
|
|
278
359
|
|
|
279
|
-
await expect(
|
|
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
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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
|
|
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
|
|
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(
|
|
340
|
-
|
|
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
|
|
436
|
+
const { wrapper } = await loadFixture(fixture);
|
|
347
437
|
|
|
348
|
-
await expect(
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
481
|
+
const { wrapper } = await loadFixture(fixture);
|
|
386
482
|
|
|
387
|
-
await wrapper
|
|
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
|
|
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
|
|
500
|
+
const { wrapper } = await loadFixture(fixture);
|
|
402
501
|
|
|
403
|
-
await wrapper
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
589
|
+
const { wrapper } = await loadFixture(fixture);
|
|
488
590
|
|
|
489
591
|
let minterInfo = await wrapper.minterSupply(rewarder.address);
|
|
490
592
|
|
|
491
|
-
await wrapper
|
|
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(
|
|
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
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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
|
|
655
|
+
const { wrapper } = await loadFixture(fixture);
|
|
543
656
|
|
|
544
657
|
const minterInfo = await wrapper.minterSupply(rewarder.address);
|
|
545
|
-
await wrapper
|
|
658
|
+
await wrapper
|
|
659
|
+
.connect(rewarder)
|
|
660
|
+
.sendOrMint(signers[0].address, minterInfo.dailyCapIn);
|
|
546
661
|
|
|
547
|
-
const tx = await (
|
|
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
|
|
676
|
+
const { wrapper } = await loadFixture(fixture);
|
|
558
677
|
|
|
559
|
-
await expect(
|
|
678
|
+
await expect(
|
|
679
|
+
wrapper.setMinterCaps(minter.address, 0, 0, 0, 0, 0, 0)
|
|
680
|
+
).to.be.revertedWith(/role/);
|
|
560
681
|
|
|
561
|
-
await expect(
|
|
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(
|
|
573
|
-
|
|
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
|
|
706
|
+
const { wrapper } = await loadFixture(fixture);
|
|
578
707
|
|
|
579
|
-
await expect(wrapper.setTotalMintCap(0)).to.be.revertedWith(
|
|
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
|
|
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(
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
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
|
|
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(
|
|
773
|
+
ethers.utils.defaultAbiCoder.encode(
|
|
774
|
+
["address", "uint"],
|
|
775
|
+
[minter.address, 0]
|
|
776
|
+
)
|
|
629
777
|
)
|
|
630
|
-
).revertedWith(
|
|
778
|
+
).revertedWith(/chainId/);
|
|
631
779
|
});
|
|
632
780
|
|
|
633
781
|
it("should not mint or sendOrMint to self", async () => {
|
|
634
|
-
const { wrapper } = await
|
|
782
|
+
const { wrapper } = await loadFixture(fixture);
|
|
635
783
|
|
|
636
|
-
await expect(wrapper.connect(minter).mint(wrapper.address, 1)).revertedWith(
|
|
637
|
-
|
|
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
|
});
|