@gooddollar/goodprotocol 1.0.28 → 1.0.29-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/artifacts/abis/BulkProof.min.json +1 -1
- package/artifacts/abis/DistributionBridgeMock.min.json +1 -0
- package/artifacts/abis/DistributionHelper.min.json +1 -0
- package/artifacts/abis/DistributionHelperTest.min.json +1 -0
- package/artifacts/abis/DistributionHelperTestHelper.min.json +1 -0
- package/artifacts/abis/ERC20.min.json +1 -1
- package/artifacts/abis/GoodDollarMintBurnWrapper.min.json +1 -0
- package/artifacts/abis/GoodDollarStaking.min.json +1 -0
- package/artifacts/abis/GoodDollarStakingMock.min.json +1 -0
- package/artifacts/abis/GoodReserveCDai.min.json +1 -1
- package/artifacts/abis/IERC2917.min.json +1 -1
- package/artifacts/abis/IGoodDollarStakingTest.min.json +1 -0
- package/artifacts/abis/IMultichainRouter.min.json +1 -0
- package/artifacts/abis/IRouter.min.json +1 -0
- package/artifacts/abis/IWrapper.min.json +1 -0
- package/artifacts/abis/Math64x64.min.json +1 -0
- package/artifacts/abis/MultichainBridgeHelper.min.json +1 -0
- package/artifacts/abis/MultichainRouterMock.min.json +1 -0
- package/artifacts/abis/OverMintTester.min.json +1 -1
- package/artifacts/abis/PausableControl.min.json +1 -0
- package/artifacts/abis/RewardsMinter.min.json +1 -0
- package/artifacts/abis/StakingMockFixedAPY.min.json +1 -0
- package/artifacts/abis/StakingRewardsFixedAPY.min.json +1 -0
- package/artifacts/abis/TokenOperation.min.json +1 -0
- package/artifacts/abis/cERC20.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/ERC20.json +13 -0
- 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/IERC2917.json +13 -0
- 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/ILendingPool.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/IMultichainRouter.dbg.json +4 -0
- package/artifacts/contracts/Interfaces.sol/IMultichainRouter.json +67 -0
- 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/Interfaces.sol/cERC20.json +13 -0
- package/artifacts/contracts/fuseFaucet/FuseFaucet.sol/FuseFaucet.dbg.json +1 -1
- package/artifacts/contracts/fuseFaucet/FuseFaucet.sol/FuseFaucet.json +2 -2
- package/artifacts/contracts/governance/ClaimersDistribution.sol/ClaimersDistribution.dbg.json +1 -1
- package/artifacts/contracts/governance/ClaimersDistribution.sol/ClaimersDistribution.json +2 -2
- package/artifacts/contracts/governance/CompoundVotingMachine.sol/CompoundVotingMachine.dbg.json +1 -1
- package/artifacts/contracts/governance/CompoundVotingMachine.sol/CompoundVotingMachine.json +2 -2
- package/artifacts/contracts/governance/GReputation.sol/GReputation.dbg.json +1 -1
- package/artifacts/contracts/governance/GReputation.sol/GReputation.json +2 -2
- package/artifacts/contracts/governance/GoodDollarStaking.sol/GoodDollarStaking.dbg.json +4 -0
- package/artifacts/contracts/governance/GoodDollarStaking.sol/GoodDollarStaking.json +1322 -0
- package/artifacts/contracts/governance/GoodDollarStaking.sol/RewardsMinter.dbg.json +4 -0
- package/artifacts/contracts/governance/GoodDollarStaking.sol/RewardsMinter.json +35 -0
- package/artifacts/contracts/governance/GovernanceStaking.sol/GovernanceStaking.dbg.json +1 -1
- package/artifacts/contracts/governance/GovernanceStaking.sol/GovernanceStaking.json +2 -2
- 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/Reputation.sol/Reputation.json +2 -2
- package/artifacts/contracts/governance/StakersDistribution.sol/StakersDistribution.dbg.json +1 -1
- package/artifacts/contracts/governance/StakersDistribution.sol/StakersDistribution.json +2 -2
- package/artifacts/contracts/invite/InvitesV1.sol/InvitesV1.dbg.json +1 -1
- package/artifacts/contracts/invite/InvitesV1.sol/InvitesV1.json +2 -2
- package/artifacts/contracts/mocks/AaveMock.sol/AaveMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/DAIMock.sol/DAIMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/DecimalsMock.sol/DecimalsMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/DistributionBridgeMock.sol/DistributionBridgeMock.dbg.json +4 -0
- package/artifacts/contracts/mocks/DistributionBridgeMock.sol/DistributionBridgeMock.json +152 -0
- package/artifacts/contracts/mocks/DistributionHelperTest.sol/DistributionHelperTest.dbg.json +4 -0
- package/artifacts/contracts/mocks/DistributionHelperTest.sol/DistributionHelperTest.json +662 -0
- package/artifacts/contracts/mocks/DistributionHelperTest.sol/DistributionHelperTestHelper.dbg.json +4 -0
- package/artifacts/contracts/mocks/DistributionHelperTest.sol/DistributionHelperTestHelper.json +680 -0
- package/artifacts/contracts/mocks/GoodCompoundStakingTest.sol/GoodCompoundStakingTest.dbg.json +1 -1
- package/artifacts/contracts/mocks/GoodCompoundStakingTest.sol/GoodCompoundStakingTest.json +2 -2
- package/artifacts/contracts/mocks/GoodDollarStakingMock.sol/GoodDollarStakingMock.dbg.json +4 -0
- package/artifacts/contracts/mocks/GoodDollarStakingMock.sol/GoodDollarStakingMock.json +1322 -0
- package/artifacts/contracts/mocks/GoodFundManagerTest.sol/GoodFundManagerTest.dbg.json +1 -1
- package/artifacts/contracts/mocks/GoodFundManagerTest.sol/GoodFundManagerTest.json +2 -2
- 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 +4 -0
- package/artifacts/contracts/mocks/MultichainRouterMock.sol/IWrapper.json +59 -0
- package/artifacts/contracts/mocks/MultichainRouterMock.sol/MultichainRouterMock.dbg.json +4 -0
- package/artifacts/contracts/mocks/MultichainRouterMock.sol/MultichainRouterMock.json +81 -0
- package/artifacts/contracts/mocks/OverMintTester.sol/IGoodDollarStakingTest.dbg.json +4 -0
- package/artifacts/contracts/mocks/OverMintTester.sol/IGoodDollarStakingTest.json +49 -0
- package/artifacts/contracts/mocks/OverMintTester.sol/OverMintTester.dbg.json +1 -1
- package/artifacts/contracts/mocks/OverMintTester.sol/OverMintTester.json +4 -4
- package/artifacts/contracts/mocks/OverMintTesterRegularStake.sol/OverMintTesterRegularStake.dbg.json +1 -1
- package/artifacts/contracts/mocks/OverMintTesterRegularStake.sol/OverMintTesterRegularStake.json +2 -2
- package/artifacts/contracts/mocks/SixteenDecimalsTokenMock.sol/SixteenDecimalsTokenMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/StakingMockFixedAPY.sol/StakingMockFixedAPY.dbg.json +4 -0
- package/artifacts/contracts/mocks/StakingMockFixedAPY.sol/StakingMockFixedAPY.json +682 -0
- package/artifacts/contracts/mocks/SwapHelperTest.sol/SwapHelperTest.dbg.json +1 -1
- package/artifacts/contracts/mocks/SwapHelperTest.sol/SwapHelperTest.json +2 -2
- 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/UpgradableMock.json +2 -2
- package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock2.dbg.json +1 -1
- package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock2.json +2 -2
- package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock3.dbg.json +1 -1
- package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock3.json +2 -2
- package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock4.dbg.json +1 -1
- package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock4.json +2 -2
- 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 +4 -0
- package/artifacts/contracts/reserve/DistributionHelper.sol/DistributionHelper.json +662 -0
- package/artifacts/contracts/reserve/ExchangeHelper.sol/ExchangeHelper.dbg.json +1 -1
- package/artifacts/contracts/reserve/ExchangeHelper.sol/ExchangeHelper.json +2 -2
- package/artifacts/contracts/reserve/GoodMarketMaker.sol/GoodMarketMaker.dbg.json +1 -1
- package/artifacts/contracts/reserve/GoodMarketMaker.sol/GoodMarketMaker.json +2 -2
- 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/reserve/GoodReserveCDai.sol/GoodReserveCDai.json +75 -35
- package/artifacts/contracts/staking/BaseShareField.sol/BaseShareField.dbg.json +1 -1
- package/artifacts/contracts/staking/BaseShareField.sol/BaseShareField.json +2 -2
- package/artifacts/contracts/staking/BaseShareFieldV2.sol/BaseShareFieldV2.dbg.json +1 -1
- package/artifacts/contracts/staking/BaseShareFieldV2.sol/BaseShareFieldV2.json +2 -2
- package/artifacts/contracts/staking/DonationsStaking.sol/DonationsStaking.dbg.json +1 -1
- package/artifacts/contracts/staking/DonationsStaking.sol/DonationsStaking.json +2 -2
- package/artifacts/contracts/staking/FuseStakingV3.sol/FuseStakingV3.dbg.json +1 -1
- package/artifacts/contracts/staking/FuseStakingV3.sol/FuseStakingV3.json +2 -2
- 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/GoodFundManager.sol/GoodFundManager.json +2 -2
- 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/UniswapV2SwapHelper.sol/UniswapV2SwapHelper.json +2 -2
- package/artifacts/contracts/staking/aave/AaveStakingFactory.sol/AaveStakingFactory.dbg.json +1 -1
- package/artifacts/contracts/staking/aave/AaveStakingFactory.sol/AaveStakingFactory.json +2 -2
- package/artifacts/contracts/staking/aave/GoodAaveStaking.sol/GoodAaveStaking.dbg.json +1 -1
- package/artifacts/contracts/staking/aave/GoodAaveStaking.sol/GoodAaveStaking.json +2 -2
- package/artifacts/contracts/staking/aave/GoodAaveStakingV2.sol/GoodAaveStakingV2.dbg.json +1 -1
- package/artifacts/contracts/staking/aave/GoodAaveStakingV2.sol/GoodAaveStakingV2.json +2 -2
- package/artifacts/contracts/staking/compound/CompoundStakingFactory.sol/CompoundStakingFactory.dbg.json +1 -1
- package/artifacts/contracts/staking/compound/CompoundStakingFactory.sol/CompoundStakingFactory.json +2 -2
- package/artifacts/contracts/staking/compound/GoodCompoundStaking.sol/GoodCompoundStaking.dbg.json +1 -1
- package/artifacts/contracts/staking/compound/GoodCompoundStaking.sol/GoodCompoundStaking.json +2 -2
- package/artifacts/contracts/staking/compound/GoodCompoundStakingV2.sol/GoodCompoundStakingV2.dbg.json +1 -1
- package/artifacts/contracts/staking/compound/GoodCompoundStakingV2.sol/GoodCompoundStakingV2.json +2 -2
- package/artifacts/contracts/staking/utils/Math64X64.sol/Math64x64.dbg.json +4 -0
- package/artifacts/contracts/staking/utils/Math64X64.sol/Math64x64.json +10 -0
- package/artifacts/contracts/staking/utils/StakingRewardsFixedAPY.sol/StakingRewardsFixedAPY.dbg.json +4 -0
- package/artifacts/contracts/staking/utils/StakingRewardsFixedAPY.sol/StakingRewardsFixedAPY.json +268 -0
- package/artifacts/contracts/ubi/UBIScheme.sol/UBIScheme.dbg.json +1 -1
- package/artifacts/contracts/ubi/UBIScheme.sol/UBIScheme.json +2 -2
- package/artifacts/contracts/utils/AdminWallet.sol/AdminWallet.dbg.json +1 -1
- package/artifacts/contracts/utils/AdminWallet.sol/AdminWallet.json +2 -2
- 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/BulkProof.sol/BulkProof.json +3 -34
- package/artifacts/contracts/utils/DAOContract.sol/DAOContract.dbg.json +1 -1
- package/artifacts/contracts/utils/DAOContract.sol/DAOContract.json +2 -2
- package/artifacts/contracts/utils/DAOUpgradeableContract.sol/DAOUpgradeableContract.dbg.json +1 -1
- package/artifacts/contracts/utils/DAOUpgradeableContract.sol/DAOUpgradeableContract.json +2 -2
- 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/GoodDollarMintBurnWrapper.sol/GoodDollarMintBurnWrapper.dbg.json +4 -0
- package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/GoodDollarMintBurnWrapper.json +1263 -0
- package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/IRouter.dbg.json +4 -0
- package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/IRouter.json +59 -0
- package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/PausableControl.dbg.json +4 -0
- package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/PausableControl.json +69 -0
- package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/TokenOperation.dbg.json +4 -0
- package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/TokenOperation.json +10 -0
- package/artifacts/contracts/utils/MultichainBridgeHelper.sol/MultichainBridgeHelper.dbg.json +4 -0
- package/artifacts/contracts/utils/MultichainBridgeHelper.sol/MultichainBridgeHelper.json +79 -0
- package/artifacts/contracts/utils/NameService.sol/NameService.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/ProtocolUpgrade.sol/ProtocolUpgrade.json +2 -2
- package/artifacts/contracts/utils/ProtocolUpgradeFuse.sol/ProtocolUpgradeFuse.dbg.json +1 -1
- package/artifacts/contracts/utils/ProtocolUpgradeFuse.sol/ProtocolUpgradeFuse.json +2 -2
- package/artifacts/contracts/utils/ProtocolUpgradeFuseRecover.sol/ProtocolUpgradeFuseRecover.dbg.json +1 -1
- package/artifacts/contracts/utils/ProtocolUpgradeFuseRecover.sol/ProtocolUpgradeFuseRecover.json +2 -2
- package/artifacts/contracts/utils/ProtocolUpgradeRecover.sol/ProtocolUpgradeRecover.dbg.json +1 -1
- package/artifacts/contracts/utils/ProtocolUpgradeRecover.sol/ProtocolUpgradeRecover.json +2 -2
- 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/artifacts/contracts/utils/ReputationTestHelper.sol/ReputationTestHelper.json +2 -2
- package/contracts/Interfaces.sol +20 -0
- package/contracts/governance/GoodDollarStaking.sol +510 -0
- package/contracts/governance/MultiBaseGovernanceShareField.sol +1 -0
- package/contracts/mocks/DistributionBridgeMock.sol +50 -0
- package/contracts/mocks/DistributionHelperTest.sol +22 -0
- package/contracts/mocks/GoodDollarStakingMock.sol +24 -0
- package/contracts/mocks/MultichainRouterMock.sol +38 -0
- package/contracts/mocks/OverMintTester.sol +39 -25
- package/contracts/mocks/StakingMockFixedAPY.sol +78 -0
- package/contracts/reserve/DistributionHelper.sol +142 -0
- package/contracts/reserve/GoodReserveCDai.sol +95 -41
- package/contracts/staking/utils/Math64X64.sol +268 -0
- package/contracts/staking/utils/StakingRewardsFixedAPY.sol +336 -0
- package/contracts/utils/BulkProof.sol +10 -10
- package/contracts/utils/GoodDollarMintBurnWrapper.sol +638 -0
- package/contracts/utils/MultichainBridgeHelper.sol +39 -0
- package/hardhat.config.ts +5 -3
- package/package.json +7 -4
- package/patches/@openzeppelin+hardhat-upgrades+1.7.0.patch.depracate +67 -0
- package/releases/deployment.json +10 -3
- package/releases/olddao.json +1 -1
- package/scripts/analytics/activeUsersCount.ts +65 -0
- package/scripts/analytics/activeWalletsStats.ts +150 -0
- package/scripts/analytics/claimIncidentStats.ts +117 -0
- package/scripts/analytics/faucetStats.ts +103 -0
- package/scripts/analytics/goodHolders.ts +50 -0
- package/scripts/{misc → analytics}/goodgiveback.ts +0 -0
- package/scripts/governance/airdropCalculation.ts +1 -0
- package/scripts/multichain-deploy/basicdao-deploy.ts +20 -5
- package/scripts/multichain-deploy/gdSavings-deploy.ts +232 -0
- package/scripts/multichain-deploy/helpers.ts +73 -8
- package/scripts/multichain-deploy/multichainWrapper-deploy.ts +56 -0
- package/scripts/multichain-deploy/nonubiDistribution-deploy.ts +170 -0
- package/scripts/voltageswaps.ts +47 -0
- package/test/governance/ClaimersDistribution.test.ts +1 -1
- package/test/governance/GoodDollarStaking.gd.test.ts +559 -0
- package/test/governance/GoodDollarStaking.good.test.ts +998 -0
- package/test/governance/GovernanceStaking.test.ts +43 -0
- package/test/helpers.ts +9 -12
- package/test/reserve/DistributionHelper.test.ts +394 -0
- package/test/reserve/GoodReserveCDai.distribution.test.ts +296 -0
- package/test/reserve/GoodReserveCDai.gdx.test.ts +21 -16
- package/test/reserve/GoodReserveCDai.pause.test.ts +116 -0
- package/test/staking/StakingRewardsFixedAPY.test.ts +900 -0
- package/test/utils/AdminWallet.test.ts +35 -6
- package/test/utils/GoodDollarMintBurnWrapper.test.ts +796 -0
- package/tsconfig.json +4 -9
- package/types/AccessControl.ts +361 -0
- package/types/CERC20.ts +25 -0
- package/types/DistributionBridgeMock.ts +251 -0
- package/types/DistributionHelper.ts +908 -0
- package/types/DistributionHelperTest.ts +909 -0
- package/types/DistributionHelperTestHelper.ts +945 -0
- package/types/ERC165.ts +104 -0
- package/types/ERC20.ts +101 -49
- package/types/GoodDollarMintBurnWrapper.ts +1806 -0
- package/types/GoodDollarStaking.ts +1855 -0
- package/types/GoodDollarStakingMock.ts +1855 -0
- package/types/GoodReserveCDai.ts +90 -55
- package/types/IAccessControl.ts +306 -0
- package/types/IERC165.ts +104 -0
- package/types/IERC20.ts +300 -0
- package/types/IERC20Metadata.ts +339 -0
- package/types/IERC2917.ts +25 -0
- package/types/IGoodDollarStakingTest.ts +160 -0
- package/types/IMultichainRouter.ts +166 -0
- package/types/IRouter.ts +143 -0
- package/types/IWrapper.ts +143 -0
- package/types/MultichainBridgeHelper.ts +170 -0
- package/types/MultichainRouterMock.ts +141 -0
- package/types/Pausable.ts +103 -0
- package/types/PausableControl.ts +125 -0
- package/types/{BulkProof.ts → RewardsMinter.ts} +24 -28
- package/types/StakingMockFixedAPY.ts +995 -0
- package/types/StakingRewardsFixedAPY.ts +428 -0
- package/types/factories/AaveStakingFactory__factory.ts +1 -1
- package/types/factories/AccessControl__factory.ts +227 -0
- package/types/factories/AdminWallet__factory.ts +1 -1
- package/types/factories/BaseShareFieldV2__factory.ts +1 -1
- package/types/factories/BaseShareField__factory.ts +1 -1
- package/types/factories/CERC20__factory.ts +13 -0
- package/types/factories/ClaimersDistribution__factory.ts +1 -1
- package/types/factories/CompoundStakingFactory__factory.ts +1 -1
- package/types/factories/CompoundVotingMachine__factory.ts +1 -1
- package/types/factories/DAOContract__factory.ts +1 -1
- package/types/factories/DAOUpgradeableContract__factory.ts +1 -1
- package/types/factories/DistributionBridgeMock__factory.ts +207 -0
- package/types/factories/DistributionHelperTestHelper__factory.ts +737 -0
- package/types/factories/DistributionHelperTest__factory.ts +717 -0
- package/types/factories/DistributionHelper__factory.ts +713 -0
- package/types/factories/DonationsStaking__factory.ts +1 -1
- package/types/factories/ERC165__factory.ts +39 -0
- package/types/factories/ERC20__factory.ts +13 -0
- package/types/factories/ExchangeHelper__factory.ts +1 -1
- package/types/factories/FuseFaucet__factory.ts +1 -1
- package/types/factories/FuseStakingV3__factory.ts +1 -1
- package/types/factories/GReputation__factory.ts +1 -1
- package/types/factories/GoodAaveStakingV2__factory.ts +1 -1
- package/types/factories/GoodAaveStaking__factory.ts +1 -1
- package/types/factories/GoodCompoundStakingTest__factory.ts +1 -1
- package/types/factories/GoodCompoundStakingV2__factory.ts +1 -1
- package/types/factories/GoodCompoundStaking__factory.ts +1 -1
- package/types/factories/GoodDollarMintBurnWrapper__factory.ts +1318 -0
- package/types/factories/GoodDollarStakingMock__factory.ts +1404 -0
- package/types/factories/GoodDollarStaking__factory.ts +1400 -0
- package/types/factories/GoodFundManagerTest__factory.ts +1 -1
- package/types/factories/GoodFundManager__factory.ts +1 -1
- package/types/factories/GoodMarketMaker__factory.ts +1 -1
- package/types/factories/GoodReserveCDai__factory.ts +74 -34
- package/types/factories/GovernanceStaking__factory.ts +1 -1
- package/types/factories/IAccessControl__factory.ts +198 -0
- package/types/factories/IERC165__factory.ts +42 -0
- package/types/factories/IERC20Metadata__factory.ts +248 -0
- package/types/factories/IERC20__factory.ts +203 -0
- package/types/factories/IERC2917__factory.ts +13 -0
- package/types/factories/IGoodDollarStakingTest__factory.ts +68 -0
- package/types/factories/IMultichainRouter__factory.ts +82 -0
- package/types/factories/IRouter__factory.ts +71 -0
- package/types/factories/IWrapper__factory.ts +71 -0
- package/types/factories/InvitesV1__factory.ts +1 -1
- package/types/factories/MultichainBridgeHelper__factory.ts +134 -0
- package/types/factories/MultichainRouterMock__factory.ts +141 -0
- package/types/factories/OverMintTesterRegularStake__factory.ts +1 -1
- package/types/factories/OverMintTester__factory.ts +3 -3
- package/types/factories/PausableControl__factory.ts +84 -0
- package/types/factories/Pausable__factory.ts +62 -0
- package/types/factories/ProtocolUpgradeFuseRecover__factory.ts +1 -1
- package/types/factories/ProtocolUpgradeFuse__factory.ts +1 -1
- package/types/factories/ProtocolUpgradeRecover__factory.ts +1 -1
- package/types/factories/ProtocolUpgrade__factory.ts +1 -1
- package/types/factories/ReputationTestHelper__factory.ts +1 -1
- package/types/factories/Reputation__factory.ts +1 -1
- package/types/factories/RewardsMinter__factory.ts +47 -0
- package/types/factories/StakersDistribution__factory.ts +1 -1
- package/types/factories/StakingMockFixedAPY__factory.ts +745 -0
- package/types/factories/StakingRewardsFixedAPY__factory.ts +287 -0
- package/types/factories/SwapHelperTest__factory.ts +1 -1
- package/types/factories/UBIScheme__factory.ts +1 -1
- package/types/factories/UniswapV2SwapHelper__factory.ts +1 -1
- package/types/factories/UpgradableMock2__factory.ts +1 -1
- package/types/factories/UpgradableMock3__factory.ts +1 -1
- package/types/factories/UpgradableMock4__factory.ts +1 -1
- package/types/factories/UpgradableMock__factory.ts +1 -1
- package/types/hardhat.d.ts +225 -9
- package/types/index.ts +50 -4
- package/yarn.lock +180 -104
- package/types/factories/BulkProof__factory.ts +0 -89
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import { ethers, waffle } from "hardhat";
|
|
2
|
+
import { expect } from "chai";
|
|
3
|
+
import { GoodReserveCDai, DistributionHelper } from "../../types";
|
|
4
|
+
import { createDAO, increaseTime } from "../helpers";
|
|
5
|
+
import { Contract } from "ethers";
|
|
6
|
+
import { FormatTypes } from "@ethersproject/abi";
|
|
7
|
+
|
|
8
|
+
const BN = ethers.BigNumber;
|
|
9
|
+
export const NULL_ADDRESS = ethers.constants.AddressZero;
|
|
10
|
+
export const BLOCK_INTERVAL = 1;
|
|
11
|
+
|
|
12
|
+
describe("GoodReserve - Distribution Helper", () => {
|
|
13
|
+
let goodReserve: GoodReserveCDai;
|
|
14
|
+
let goodDollar: Contract,
|
|
15
|
+
genericCall,
|
|
16
|
+
avatar,
|
|
17
|
+
founder,
|
|
18
|
+
signers,
|
|
19
|
+
setDAOAddress,
|
|
20
|
+
nameService,
|
|
21
|
+
cDai;
|
|
22
|
+
|
|
23
|
+
before(async () => {
|
|
24
|
+
[founder, ...signers] = await ethers.getSigners();
|
|
25
|
+
|
|
26
|
+
let {
|
|
27
|
+
controller: ctrl,
|
|
28
|
+
avatar: av,
|
|
29
|
+
gd,
|
|
30
|
+
identity,
|
|
31
|
+
setDAOAddress: sda,
|
|
32
|
+
setSchemes,
|
|
33
|
+
reserve,
|
|
34
|
+
cdaiAddress,
|
|
35
|
+
genericCall: gc,
|
|
36
|
+
nameService: ns
|
|
37
|
+
} = await createDAO();
|
|
38
|
+
|
|
39
|
+
nameService = ns;
|
|
40
|
+
genericCall = gc;
|
|
41
|
+
cDai = cdaiAddress;
|
|
42
|
+
avatar = av;
|
|
43
|
+
setDAOAddress = sda;
|
|
44
|
+
|
|
45
|
+
console.log("deployed dao", {
|
|
46
|
+
founder: founder.address,
|
|
47
|
+
gd,
|
|
48
|
+
identity,
|
|
49
|
+
avatar
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
goodDollar = await ethers.getContractAt("IGoodDollar", gd);
|
|
53
|
+
|
|
54
|
+
console.log("deployed contribution, deploying reserve...", {
|
|
55
|
+
founder: founder.address
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
goodReserve = reserve as GoodReserveCDai;
|
|
59
|
+
|
|
60
|
+
console.log("setting permissions...");
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
const fixture = async (wallets, provider) => {
|
|
64
|
+
const df = await ethers.getContractFactory("DistributionHelper");
|
|
65
|
+
wallets = provider.getWallets();
|
|
66
|
+
const distHelper = (await waffle.deployContract(wallets[0], {
|
|
67
|
+
abi: JSON.parse(df.interface.format(FormatTypes.json) as string) as any[],
|
|
68
|
+
bytecode: df.bytecode
|
|
69
|
+
})) as DistributionHelper;
|
|
70
|
+
|
|
71
|
+
return { distHelper };
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const deployed_fixture = async (wallets, provider) => {
|
|
75
|
+
const df = await ethers.getContractFactory("DistributionHelper");
|
|
76
|
+
wallets = provider.getWallets();
|
|
77
|
+
const distHelper = (await waffle.deployContract(wallets[0], {
|
|
78
|
+
abi: JSON.parse(df.interface.format(FormatTypes.json) as string) as any[],
|
|
79
|
+
bytecode: df.bytecode
|
|
80
|
+
})) as DistributionHelper;
|
|
81
|
+
|
|
82
|
+
await distHelper.initialize(nameService.address);
|
|
83
|
+
|
|
84
|
+
const encodedCall = goodReserve.interface.encodeFunctionData(
|
|
85
|
+
"setDistributionHelper",
|
|
86
|
+
[distHelper.address, 1000]
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
await genericCall(goodReserve.address, encodedCall, avatar.address, 0);
|
|
90
|
+
|
|
91
|
+
return { distHelper };
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
const deployed_revert_fixture = async (wallets, provider) => {
|
|
95
|
+
const df = await ethers.getContractFactory("DistributionHelperTest");
|
|
96
|
+
wallets = provider.getWallets();
|
|
97
|
+
const distHelper = (await waffle.deployContract(wallets[0], {
|
|
98
|
+
abi: JSON.parse(df.interface.format(FormatTypes.json) as string) as any[],
|
|
99
|
+
bytecode: df.bytecode
|
|
100
|
+
})) as DistributionHelper;
|
|
101
|
+
|
|
102
|
+
await distHelper.initialize(nameService.address);
|
|
103
|
+
|
|
104
|
+
const encodedCall = goodReserve.interface.encodeFunctionData(
|
|
105
|
+
"setDistributionHelper",
|
|
106
|
+
[distHelper.address, 1000]
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
await genericCall(goodReserve.address, encodedCall, avatar.address, 0);
|
|
110
|
+
|
|
111
|
+
return { distHelper };
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
it("should allow avatar to set distribution helper target", async () => {
|
|
115
|
+
const { distHelper } = await waffle.loadFixture(fixture);
|
|
116
|
+
const encodedCall = goodReserve.interface.encodeFunctionData(
|
|
117
|
+
"setDistributionHelper",
|
|
118
|
+
[distHelper.address, 1000]
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
await genericCall(goodReserve.address, encodedCall, avatar.address, 0);
|
|
122
|
+
|
|
123
|
+
expect(await goodReserve.distributionHelper()).to.equal(distHelper.address);
|
|
124
|
+
expect(await goodReserve.nonUbiBps()).to.equal(1000);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it("should not allow to call setDistributionHelper", async () => {
|
|
128
|
+
const { distHelper } = await waffle.loadFixture(fixture);
|
|
129
|
+
await expect(
|
|
130
|
+
goodReserve.setDistributionHelper(distHelper.address, 1000)
|
|
131
|
+
).to.be.revertedWith("avatar");
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
it("should send UBI to distribution contract", async () => {
|
|
135
|
+
const { distHelper } = await waffle.loadFixture(deployed_fixture);
|
|
136
|
+
|
|
137
|
+
await increaseTime(60 * 60 * 24 * 365); //required for reserve ratio advance
|
|
138
|
+
await setDAOAddress("FUND_MANAGER", founder.address); //required so we can call mintUBI
|
|
139
|
+
|
|
140
|
+
let tx = await (
|
|
141
|
+
await goodReserve.connect(founder).mintUBI(0, 0, cDai)
|
|
142
|
+
).wait();
|
|
143
|
+
|
|
144
|
+
const nonUbiMintedEvent = tx.events.find(_ => _.event === "NonUBIMinted");
|
|
145
|
+
const ubiMintedEvent = tx.events.find(_ => _.event === "UBIMinted");
|
|
146
|
+
|
|
147
|
+
//verify amount transfered
|
|
148
|
+
expect(nonUbiMintedEvent.args.amountMinted).gt(0);
|
|
149
|
+
expect(nonUbiMintedEvent.args.amountMinted).to.equal(
|
|
150
|
+
await goodDollar.balanceOf(distHelper.address)
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
expect(
|
|
154
|
+
nonUbiMintedEvent.args.amountMinted.add(
|
|
155
|
+
ubiMintedEvent.args.gdUbiTransferred
|
|
156
|
+
)
|
|
157
|
+
).to.equal(ubiMintedEvent.args.gdExpansionMinted);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
it("should distribute according to 10% nonUbiBps", async () => {
|
|
161
|
+
let { distHelper } = await waffle.loadFixture(deployed_fixture);
|
|
162
|
+
|
|
163
|
+
await increaseTime(60 * 60 * 24 * 365); //required for reserve ratio advance
|
|
164
|
+
await setDAOAddress("FUND_MANAGER", founder.address); //required so we can call mintUBI
|
|
165
|
+
|
|
166
|
+
let tx = await (
|
|
167
|
+
await goodReserve.connect(founder).mintUBI(0, 0, cDai)
|
|
168
|
+
).wait();
|
|
169
|
+
|
|
170
|
+
const nonUbiMintedEvent = tx.events.find(_ => _.event === "NonUBIMinted");
|
|
171
|
+
const ubiMintedEvent = tx.events.find(_ => _.event === "UBIMinted");
|
|
172
|
+
|
|
173
|
+
//verify 10%
|
|
174
|
+
expect(nonUbiMintedEvent.args.amountMinted).gt(0);
|
|
175
|
+
expect(nonUbiMintedEvent.args.amountMinted).to.equal(
|
|
176
|
+
ubiMintedEvent.args.gdExpansionMinted.mul(1000).div(10000)
|
|
177
|
+
);
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
it("should distribute according to 25% nonUbiBps", async () => {
|
|
181
|
+
let { distHelper } = await waffle.loadFixture(deployed_fixture);
|
|
182
|
+
|
|
183
|
+
const encodedCall = goodReserve.interface.encodeFunctionData(
|
|
184
|
+
"setDistributionHelper",
|
|
185
|
+
[distHelper.address, 2500]
|
|
186
|
+
);
|
|
187
|
+
|
|
188
|
+
await genericCall(goodReserve.address, encodedCall, avatar.address, 0);
|
|
189
|
+
|
|
190
|
+
await increaseTime(60 * 60 * 24 * 365); //required for reserve ratio advance
|
|
191
|
+
await setDAOAddress("FUND_MANAGER", founder.address); //required so we can call mintUBI
|
|
192
|
+
|
|
193
|
+
let tx = await (
|
|
194
|
+
await goodReserve.connect(founder).mintUBI(0, 0, cDai)
|
|
195
|
+
).wait();
|
|
196
|
+
|
|
197
|
+
const nonUbiMintedEvent = tx.events.find(_ => _.event === "NonUBIMinted");
|
|
198
|
+
const ubiMintedEvent = tx.events.find(_ => _.event === "UBIMinted");
|
|
199
|
+
|
|
200
|
+
//verify 10%
|
|
201
|
+
expect(nonUbiMintedEvent.args.amountMinted).gt(0);
|
|
202
|
+
expect(nonUbiMintedEvent.args.amountMinted).to.equal(
|
|
203
|
+
ubiMintedEvent.args.gdExpansionMinted.mul(2500).div(10000)
|
|
204
|
+
);
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
it("should distribute even when DistributionHelper onDistribution reverts", async () => {
|
|
208
|
+
let { distHelper } = await waffle.loadFixture(deployed_revert_fixture); //using DistributionHelperTest which reverts
|
|
209
|
+
|
|
210
|
+
await increaseTime(60 * 60 * 24 * 365); //required for reserve ratio advance
|
|
211
|
+
await setDAOAddress("FUND_MANAGER", founder.address); //required so we can call mintUBI
|
|
212
|
+
|
|
213
|
+
let tx = await (
|
|
214
|
+
await goodReserve.connect(founder).mintUBI(0, 0, cDai)
|
|
215
|
+
).wait();
|
|
216
|
+
|
|
217
|
+
const nonUbiMintedEvent = tx.events.find(_ => _.event === "NonUBIMinted");
|
|
218
|
+
const ubiMintedEvent = tx.events.find(_ => _.event === "UBIMinted");
|
|
219
|
+
|
|
220
|
+
const topic = distHelper.filters.Distribution().topics[0];
|
|
221
|
+
const distributionEvent = tx.events.find(_ =>
|
|
222
|
+
_.topics.includes(topic as string)
|
|
223
|
+
);
|
|
224
|
+
|
|
225
|
+
//verify onDistribution didnt happen
|
|
226
|
+
expect(distributionEvent).to.be.undefined;
|
|
227
|
+
|
|
228
|
+
//verify 10%
|
|
229
|
+
expect(nonUbiMintedEvent.args.amountMinted).gt(0);
|
|
230
|
+
expect(nonUbiMintedEvent.args.amountMinted).to.equal(
|
|
231
|
+
ubiMintedEvent.args.gdExpansionMinted.mul(1000).div(10000)
|
|
232
|
+
);
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
it("should trigger onDistribution of DistributionHelper", async () => {
|
|
236
|
+
let { distHelper } = await waffle.loadFixture(deployed_fixture); //using DistributionHelperTest which reverts
|
|
237
|
+
|
|
238
|
+
await increaseTime(60 * 60 * 24 * 365); //required for reserve ratio advance
|
|
239
|
+
await setDAOAddress("FUND_MANAGER", founder.address); //required so we can call mintUBI
|
|
240
|
+
|
|
241
|
+
let tx = await (
|
|
242
|
+
await goodReserve.connect(founder).mintUBI(0, 0, cDai)
|
|
243
|
+
).wait();
|
|
244
|
+
|
|
245
|
+
const topic = distHelper.filters.Distribution().topics[0];
|
|
246
|
+
const distributionEvent = tx.events.find(_ =>
|
|
247
|
+
_.topics.includes(topic as string)
|
|
248
|
+
);
|
|
249
|
+
|
|
250
|
+
expect(distributionEvent).not.empty;
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
it("should not try to distribute UBI if bps=0", async () => {
|
|
254
|
+
let { distHelper } = await waffle.loadFixture(deployed_fixture);
|
|
255
|
+
|
|
256
|
+
await increaseTime(60 * 60 * 24 * 365); //required for reserve ratio advance
|
|
257
|
+
await setDAOAddress("FUND_MANAGER", founder.address); //required so we can call mintUBI
|
|
258
|
+
|
|
259
|
+
const encodedCall = goodReserve.interface.encodeFunctionData(
|
|
260
|
+
"setDistributionHelper",
|
|
261
|
+
[distHelper.address, 0]
|
|
262
|
+
);
|
|
263
|
+
|
|
264
|
+
await genericCall(goodReserve.address, encodedCall, avatar.address, 0);
|
|
265
|
+
|
|
266
|
+
let tx = await (
|
|
267
|
+
await goodReserve.connect(founder).mintUBI(0, 0, cDai)
|
|
268
|
+
).wait();
|
|
269
|
+
|
|
270
|
+
const nonUbiMintedEvent = tx.events.find(_ => _.event === "NonUBIMinted");
|
|
271
|
+
|
|
272
|
+
expect(nonUbiMintedEvent).to.be.undefined;
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
it("should not try to distribute UBI if distributionhelper is null", async () => {
|
|
276
|
+
let { distHelper } = await waffle.loadFixture(deployed_fixture); //using DistributionHelperTest which reverts
|
|
277
|
+
|
|
278
|
+
await increaseTime(60 * 60 * 24 * 365); //required for reserve ratio advance
|
|
279
|
+
await setDAOAddress("FUND_MANAGER", founder.address); //required so we can call mintUBI
|
|
280
|
+
|
|
281
|
+
const encodedCall = goodReserve.interface.encodeFunctionData(
|
|
282
|
+
"setDistributionHelper",
|
|
283
|
+
[ethers.constants.AddressZero, 1000]
|
|
284
|
+
);
|
|
285
|
+
|
|
286
|
+
await genericCall(goodReserve.address, encodedCall, avatar.address, 0);
|
|
287
|
+
|
|
288
|
+
let tx = await (
|
|
289
|
+
await goodReserve.connect(founder).mintUBI(0, 0, cDai)
|
|
290
|
+
).wait();
|
|
291
|
+
|
|
292
|
+
const nonUbiMintedEvent = tx.events.find(_ => _.event === "NonUBIMinted");
|
|
293
|
+
|
|
294
|
+
expect(nonUbiMintedEvent).to.be.undefined;
|
|
295
|
+
});
|
|
296
|
+
});
|
|
@@ -8,7 +8,7 @@ import { createDAO, increaseTime, advanceBlocks } from "../helpers";
|
|
|
8
8
|
import ContributionCalculation from "@gooddollar/goodcontracts/stakingModel/build/contracts/ContributionCalculation.json";
|
|
9
9
|
|
|
10
10
|
const BN = ethers.BigNumber;
|
|
11
|
-
const RANDOM_GDX_MERKLEROOT1 =
|
|
11
|
+
const RANDOM_GDX_MERKLEROOT1 =
|
|
12
12
|
"0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
|
|
13
13
|
export const NULL_ADDRESS = ethers.constants.AddressZero;
|
|
14
14
|
export const BLOCK_INTERVAL = 1;
|
|
@@ -61,14 +61,14 @@ describe("GDX Token", () => {
|
|
|
61
61
|
goodReserve = reserve as GoodReserveCDai;
|
|
62
62
|
genericCall = gn;
|
|
63
63
|
runAsAvatarOnly = raao;
|
|
64
|
-
|
|
64
|
+
|
|
65
65
|
console.log("deployed dao", {
|
|
66
66
|
founder: founder.address,
|
|
67
67
|
gd,
|
|
68
68
|
identity,
|
|
69
69
|
controller,
|
|
70
70
|
avatar,
|
|
71
|
-
goodReserve: goodReserve.address
|
|
71
|
+
goodReserve: goodReserve.address
|
|
72
72
|
});
|
|
73
73
|
|
|
74
74
|
goodDollar = await ethers.getContractAt("IGoodDollar", gd);
|
|
@@ -82,7 +82,7 @@ describe("GDX Token", () => {
|
|
|
82
82
|
const reserveFactory = await ethers.getContractFactory("GoodReserveCDai");
|
|
83
83
|
|
|
84
84
|
console.log("deployed contribution, deploying reserve...", {
|
|
85
|
-
founder: founder.address
|
|
85
|
+
founder: founder.address
|
|
86
86
|
});
|
|
87
87
|
|
|
88
88
|
console.log("setting permissions...");
|
|
@@ -184,7 +184,7 @@ describe("GDX Token", () => {
|
|
|
184
184
|
await goodReserve.sell(amount, 0, NULL_ADDRESS, NULL_ADDRESS)
|
|
185
185
|
).wait();
|
|
186
186
|
|
|
187
|
-
const event = transaction.events.find(
|
|
187
|
+
const event = transaction.events.find(_ => _.event === "TokenSold");
|
|
188
188
|
expect(event.args.contributionAmount).to.equal(0);
|
|
189
189
|
});
|
|
190
190
|
it("GDX should be 2 decimals", async () => {
|
|
@@ -203,7 +203,7 @@ describe("GDX Token", () => {
|
|
|
203
203
|
.sell(amount, 0, founder.address, NULL_ADDRESS)
|
|
204
204
|
).wait();
|
|
205
205
|
|
|
206
|
-
const event = transaction.events.find(
|
|
206
|
+
const event = transaction.events.find(_ => _.event === "TokenSold");
|
|
207
207
|
const gdxAfter = await goodReserve["balanceOf(address)"](staker.address);
|
|
208
208
|
|
|
209
209
|
expect(gdxAfter).to.equal(0, "gdx not burned");
|
|
@@ -221,7 +221,7 @@ describe("GDX Token", () => {
|
|
|
221
221
|
await goodReserve.sell(amount, 0, NULL_ADDRESS, NULL_ADDRESS)
|
|
222
222
|
).wait();
|
|
223
223
|
|
|
224
|
-
const event = transaction.events.find(
|
|
224
|
+
const event = transaction.events.find(_ => _.event === "TokenSold");
|
|
225
225
|
const gdxAfter = await goodReserve["balanceOf(address)"](founder.address);
|
|
226
226
|
|
|
227
227
|
expect(gdxAfter).to.equal(0, "gdx not burned");
|
|
@@ -236,7 +236,7 @@ describe("GDX Token", () => {
|
|
|
236
236
|
let reserve = (await rFactory.deploy()) as GoodReserveCDai;
|
|
237
237
|
const airdropBytes = ethers.utils.defaultAbiCoder.encode(
|
|
238
238
|
["address[]", "uint256[]"],
|
|
239
|
-
[signers.map(
|
|
239
|
+
[signers.map(_ => _.address), signers.map(_ => 1000)]
|
|
240
240
|
);
|
|
241
241
|
|
|
242
242
|
await reserve["initialize(address,bytes32)"](
|
|
@@ -256,11 +256,16 @@ describe("GDX Token", () => {
|
|
|
256
256
|
);
|
|
257
257
|
});
|
|
258
258
|
|
|
259
|
-
|
|
260
|
-
await runAsAvatarOnly(
|
|
259
|
+
xit("should set GDX airdrop by avatar", async () => {
|
|
260
|
+
await runAsAvatarOnly(
|
|
261
|
+
goodReserve,
|
|
262
|
+
"setGDXAirdrop(bytes32)",
|
|
263
|
+
RANDOM_GDX_MERKLEROOT1
|
|
264
|
+
);
|
|
261
265
|
expect(await goodReserve.gdxAirdrop()).to.equal(RANDOM_GDX_MERKLEROOT1);
|
|
262
|
-
|
|
263
|
-
const originalGDXAirdrop =
|
|
266
|
+
|
|
267
|
+
const originalGDXAirdrop =
|
|
268
|
+
"0x26ef809f3f845395c0bc66ce1eea85146516cb99afd030e2085b13e79514e94c";
|
|
264
269
|
const encodedCall = goodReserve.interface.encodeFunctionData(
|
|
265
270
|
"setGDXAirdrop",
|
|
266
271
|
[originalGDXAirdrop]
|
|
@@ -269,7 +274,7 @@ describe("GDX Token", () => {
|
|
|
269
274
|
});
|
|
270
275
|
|
|
271
276
|
//check sample proof generated by gdxAirdropCalculation.ts script
|
|
272
|
-
|
|
277
|
+
xit("should be able to claim gdx", async () => {
|
|
273
278
|
await goodReserve.claimGDX(
|
|
274
279
|
"0x0EeBBbbf6f97e73dd1d59e4F17666B36Ea12dD85",
|
|
275
280
|
1436983746,
|
|
@@ -279,7 +284,7 @@ describe("GDX Token", () => {
|
|
|
279
284
|
"0xf0db8914b45ce55ea25be091e1fe4d897db4cff19e1b1680c37061a30a95c102",
|
|
280
285
|
"0xc6e2cbda2531c708550b3856fc208355b184483e19ad6d8877a541c441ad3fef",
|
|
281
286
|
"0x355c34cc000364d5a1cebe4835197936bc5966e3e8ac116a8fa20a8d2714f7c5",
|
|
282
|
-
"0xd515f7a623c1a18396a6aececcdcae32818b64faa0f536103b3a32e8c5ae7643"
|
|
287
|
+
"0xd515f7a623c1a18396a6aececcdcae32818b64faa0f536103b3a32e8c5ae7643"
|
|
283
288
|
]
|
|
284
289
|
);
|
|
285
290
|
expect(
|
|
@@ -294,7 +299,7 @@ describe("GDX Token", () => {
|
|
|
294
299
|
).to.be.true;
|
|
295
300
|
});
|
|
296
301
|
|
|
297
|
-
|
|
302
|
+
xit("should not be able to claim gdx twice", async () => {
|
|
298
303
|
const tx = goodReserve.claimGDX(
|
|
299
304
|
"0x0EeBBbbf6f97e73dd1d59e4F17666B36Ea12dD85",
|
|
300
305
|
1436983746,
|
|
@@ -304,7 +309,7 @@ describe("GDX Token", () => {
|
|
|
304
309
|
"0xf0db8914b45ce55ea25be091e1fe4d897db4cff19e1b1680c37061a30a95c102",
|
|
305
310
|
"0xc6e2cbda2531c708550b3856fc208355b184483e19ad6d8877a541c441ad3fef",
|
|
306
311
|
"0x355c34cc000364d5a1cebe4835197936bc5966e3e8ac116a8fa20a8d2714f7c5",
|
|
307
|
-
"0xd515f7a623c1a18396a6aececcdcae32818b64faa0f536103b3a32e8c5ae7643"
|
|
312
|
+
"0xd515f7a623c1a18396a6aececcdcae32818b64faa0f536103b3a32e8c5ae7643"
|
|
308
313
|
]
|
|
309
314
|
);
|
|
310
315
|
await expect(tx).to.be.revertedWith("already claimed gdx");
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { ethers, waffle } from "hardhat";
|
|
2
|
+
import { expect } from "chai";
|
|
3
|
+
import { GoodReserveCDai, DistributionHelper } from "../../types";
|
|
4
|
+
import { createDAO, increaseTime } from "../helpers";
|
|
5
|
+
import { Contract } from "ethers";
|
|
6
|
+
import { FormatTypes } from "@ethersproject/abi";
|
|
7
|
+
|
|
8
|
+
const BN = ethers.BigNumber;
|
|
9
|
+
export const NULL_ADDRESS = ethers.constants.AddressZero;
|
|
10
|
+
export const BLOCK_INTERVAL = 1;
|
|
11
|
+
|
|
12
|
+
describe("GoodReserve - Distribution Helper", () => {
|
|
13
|
+
let goodReserve: GoodReserveCDai;
|
|
14
|
+
let goodDollar: Contract,
|
|
15
|
+
genericCall,
|
|
16
|
+
avatar,
|
|
17
|
+
founder,
|
|
18
|
+
signers,
|
|
19
|
+
dai,
|
|
20
|
+
cDAI,
|
|
21
|
+
setDAOAddress;
|
|
22
|
+
|
|
23
|
+
before(async () => {
|
|
24
|
+
[founder, ...signers] = await ethers.getSigners();
|
|
25
|
+
|
|
26
|
+
let {
|
|
27
|
+
controller: ctrl,
|
|
28
|
+
avatar: av,
|
|
29
|
+
gd,
|
|
30
|
+
identity,
|
|
31
|
+
setDAOAddress: sda,
|
|
32
|
+
setSchemes,
|
|
33
|
+
reserve,
|
|
34
|
+
daiAddress,
|
|
35
|
+
cdaiAddress,
|
|
36
|
+
genericCall: gc
|
|
37
|
+
} = await createDAO();
|
|
38
|
+
|
|
39
|
+
dai = await ethers.getContractAt("DAIMock", daiAddress);
|
|
40
|
+
cDAI = await ethers.getContractAt("cDAIMock", cdaiAddress);
|
|
41
|
+
|
|
42
|
+
genericCall = gc;
|
|
43
|
+
avatar = av;
|
|
44
|
+
setDAOAddress = sda;
|
|
45
|
+
|
|
46
|
+
console.log("deployed dao", {
|
|
47
|
+
founder: founder.address,
|
|
48
|
+
gd,
|
|
49
|
+
identity,
|
|
50
|
+
avatar
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
goodDollar = await ethers.getContractAt("IGoodDollar", gd);
|
|
54
|
+
|
|
55
|
+
console.log("deployed contribution, deploying reserve...", {
|
|
56
|
+
founder: founder.address
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
goodReserve = reserve as GoodReserveCDai;
|
|
60
|
+
|
|
61
|
+
console.log("setting permissions...");
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
const fixture = async (wallets, provider) => {
|
|
65
|
+
let encodedCall = goodReserve.interface.encodeFunctionData("grantRole", [
|
|
66
|
+
await goodReserve.PAUSER_ROLE(),
|
|
67
|
+
avatar
|
|
68
|
+
]);
|
|
69
|
+
await genericCall(goodReserve.address, encodedCall);
|
|
70
|
+
|
|
71
|
+
encodedCall = goodReserve.interface.encodeFunctionData("pause");
|
|
72
|
+
await genericCall(goodReserve.address, encodedCall);
|
|
73
|
+
|
|
74
|
+
return { goodReserve };
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
it("should allow avatar to unpause", async () => {
|
|
78
|
+
const { goodReserve } = await waffle.loadFixture(fixture);
|
|
79
|
+
const encodedCall = goodReserve.interface.encodeFunctionData("unpause");
|
|
80
|
+
|
|
81
|
+
expect(await goodReserve.paused()).to.equal(true);
|
|
82
|
+
await genericCall(goodReserve.address, encodedCall);
|
|
83
|
+
|
|
84
|
+
expect(await goodReserve.paused()).to.equal(false);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it("should not be able to buy when paused", async () => {
|
|
88
|
+
let amount = 1e8;
|
|
89
|
+
const { goodReserve } = await waffle.loadFixture(fixture);
|
|
90
|
+
await dai["mint(uint256)"](ethers.utils.parseEther("100"));
|
|
91
|
+
await dai.approve(cDAI.address, ethers.utils.parseEther("100"));
|
|
92
|
+
await cDAI["mint(uint256)"](ethers.utils.parseEther("100"));
|
|
93
|
+
await cDAI.approve(goodReserve.address, ethers.utils.parseEther("10"));
|
|
94
|
+
await expect(goodReserve.buy(amount, 0, founder.address)).revertedWith(
|
|
95
|
+
"paused"
|
|
96
|
+
);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it("should not be able to sell when paused", async () => {
|
|
100
|
+
const { goodReserve } = await waffle.loadFixture(fixture);
|
|
101
|
+
await expect(
|
|
102
|
+
goodReserve.sell(1, 0, founder.address, founder.address)
|
|
103
|
+
).revertedWith("paused");
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it("should not be able to mint when paused", async () => {
|
|
107
|
+
const { goodReserve } = await waffle.loadFixture(fixture);
|
|
108
|
+
await setDAOAddress("FUND_MANAGER", founder.address);
|
|
109
|
+
|
|
110
|
+
await expect(
|
|
111
|
+
goodReserve
|
|
112
|
+
.connect(founder)
|
|
113
|
+
.mintRewardFromRR(cDAI.address, founder.address, 1000)
|
|
114
|
+
).revertedWith("paused"); //10000 cdai wei is 1G$
|
|
115
|
+
});
|
|
116
|
+
});
|