@gooddollar/goodprotocol 2.0.13 → 2.0.14
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/DistributionBridgeMock.min.json +1 -1
- package/artifacts/abis/DistributionHelper.min.json +1 -1
- package/artifacts/abis/DistributionHelperTest.min.json +1 -1
- package/artifacts/abis/DistributionHelperTestHelper.min.json +1 -1
- package/artifacts/abis/GasPriceMockOracle.min.json +1 -1
- package/artifacts/abis/GoodCompoundStakingTest.min.json +1 -1
- package/artifacts/abis/GoodReserveCDai.min.json +1 -1
- package/artifacts/abis/IFeesFormula.min.json +1 -1
- package/artifacts/abis/ISuperGoodDollar.min.json +1 -1
- package/artifacts/abis/ISuperToken.min.json +1 -0
- package/artifacts/abis/MultichainFeeFormula.min.json +1 -0
- package/artifacts/abis/SuperGoodDollar.min.json +1 -1
- package/artifacts/abis/SuperToken.min.json +1 -1
- package/artifacts/abis/UBIScheme.min.json +1 -1
- package/artifacts/abis/UBISchemeV2.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/Faucet.sol/Faucet.json +2 -2
- package/artifacts/contracts/fuseFaucet/FuseFaucet.sol/FuseFaucet.dbg.json +1 -1
- package/artifacts/contracts/fuseFaucet/FuseFaucet.sol/FuseFaucet.json +2 -2
- package/artifacts/contracts/fuseFaucet/FuseFaucetV2.sol/FuseFaucetV2.dbg.json +1 -1
- package/artifacts/contracts/fuseFaucet/FuseFaucetV2.sol/FuseFaucetV2.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 +1 -1
- package/artifacts/contracts/governance/GoodDollarStaking.sol/GoodDollarStaking.json +2 -2
- 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/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/identity/IdentityV2.sol/IdentityV2.dbg.json +1 -1
- package/artifacts/contracts/identity/IdentityV2.sol/IdentityV2.json +2 -2
- package/artifacts/contracts/invite/InvitesFuseV2.sol/InvitesFuseV2.dbg.json +1 -1
- package/artifacts/contracts/invite/InvitesFuseV2.sol/InvitesFuseV2.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/invite/InvitesV2.sol/InvitesV2.dbg.json +1 -1
- package/artifacts/contracts/invite/InvitesV2.sol/InvitesV2.json +2 -2
- package/artifacts/contracts/mocks/AaveMock.sol/AaveMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/AaveMock.sol/AaveMock.json +2 -2
- package/artifacts/contracts/mocks/AaveUSDMockOracle.sol/AaveUSDMockOracle.dbg.json +1 -1
- package/artifacts/contracts/mocks/AaveUSDMockOracle.sol/AaveUSDMockOracle.json +2 -2
- package/artifacts/contracts/mocks/BatUSDMockOracle.sol/BatUSDMockOracle.dbg.json +1 -1
- package/artifacts/contracts/mocks/BatUSDMockOracle.sol/BatUSDMockOracle.json +2 -2
- package/artifacts/contracts/mocks/CompUsdMockOracle.sol/CompUSDMockOracle.dbg.json +1 -1
- package/artifacts/contracts/mocks/CompUsdMockOracle.sol/CompUSDMockOracle.json +2 -2
- package/artifacts/contracts/mocks/DAIMock.sol/DAIMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/DAIMock.sol/DAIMock.json +2 -2
- package/artifacts/contracts/mocks/DaiEthPriceMockOracle.sol/DaiEthPriceMockOracle.dbg.json +1 -1
- package/artifacts/contracts/mocks/DaiEthPriceMockOracle.sol/DaiEthPriceMockOracle.json +2 -2
- package/artifacts/contracts/mocks/DecimalsMock.sol/DecimalsMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/DecimalsMock.sol/DecimalsMock.json +2 -2
- package/artifacts/contracts/mocks/DistributionBridgeMock.sol/DistributionBridgeMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/DistributionBridgeMock.sol/DistributionBridgeMock.json +122 -17
- package/artifacts/contracts/mocks/DistributionHelperTest.sol/DistributionHelperTest.dbg.json +1 -1
- package/artifacts/contracts/mocks/DistributionHelperTest.sol/DistributionHelperTest.json +242 -17
- package/artifacts/contracts/mocks/DistributionHelperTest.sol/DistributionHelperTestHelper.dbg.json +1 -1
- package/artifacts/contracts/mocks/DistributionHelperTest.sol/DistributionHelperTestHelper.json +256 -18
- package/artifacts/contracts/mocks/EthUSDMockOracle.sol/EthUSDMockOracle.dbg.json +1 -1
- package/artifacts/contracts/mocks/EthUSDMockOracle.sol/EthUSDMockOracle.json +2 -2
- package/artifacts/contracts/mocks/FeesFormularMock.sol/FeesFormulaMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/FeesFormularMock.sol/FeesFormulaMock.json +2 -2
- package/artifacts/contracts/mocks/GasPriceMockOracle.sol/GasPriceMockOracle.dbg.json +1 -1
- package/artifacts/contracts/mocks/GasPriceMockOracle.sol/GasPriceMockOracle.json +15 -2
- package/artifacts/contracts/mocks/GoodCompoundStakingTest.sol/GoodCompoundStakingTest.dbg.json +1 -1
- package/artifacts/contracts/mocks/GoodCompoundStakingTest.sol/GoodCompoundStakingTest.json +6 -6
- package/artifacts/contracts/mocks/GoodDollarStakingMock.sol/GoodDollarStakingMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/GoodDollarStakingMock.sol/GoodDollarStakingMock.json +2 -2
- 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/IdentityMock.sol/IdentityMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/IdentityMock.sol/IdentityMock.json +2 -2
- package/artifacts/contracts/mocks/IncentiveControllerMock.sol/IncentiveControllerMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/IncentiveControllerMock.sol/IncentiveControllerMock.json +2 -2
- package/artifacts/contracts/mocks/LendingPoolMock.sol/LendingPoolMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/LendingPoolMock.sol/LendingPoolMock.json +2 -2
- 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/MultichainRouterMock.sol/MultichainRouterMock.json +2 -2
- 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/OverMintTester.sol/OverMintTester.json +2 -2
- 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/PayableMock.sol/PayableMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/PayableMock.sol/PayableMock.json +2 -2
- package/artifacts/contracts/mocks/SixteenDecimalsTokenMock.sol/SixteenDecimalsTokenMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/SixteenDecimalsTokenMock.sol/SixteenDecimalsTokenMock.json +2 -2
- package/artifacts/contracts/mocks/StakingMockFixedAPY.sol/StakingMockFixedAPY.dbg.json +1 -1
- package/artifacts/contracts/mocks/StakingMockFixedAPY.sol/StakingMockFixedAPY.json +2 -2
- 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/TwentyDecimalsTokenMock.sol/TwentyDecimalsTokenMock.json +2 -2
- 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/UsdcMock.sol/USDCMock.json +2 -2
- package/artifacts/contracts/mocks/cBATMock.sol/cBATMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/cBATMock.sol/cBATMock.json +2 -2
- package/artifacts/contracts/mocks/cDAILowWorthMock.sol/cDAILowWorthMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/cDAILowWorthMock.sol/cDAILowWorthMock.json +2 -2
- package/artifacts/contracts/mocks/cDAIMock.sol/cDAIMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/cDAIMock.sol/cDAIMock.json +2 -2
- package/artifacts/contracts/mocks/cDAINonMintableMock.sol/cDAINonMintableMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/cDAINonMintableMock.sol/cDAINonMintableMock.json +2 -2
- package/artifacts/contracts/mocks/cDecimalsMock.sol/cDecimalsMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/cDecimalsMock.sol/cDecimalsMock.json +2 -2
- package/artifacts/contracts/mocks/cSDTMock.sol/cSDTMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/cSDTMock.sol/cSDTMock.json +2 -2
- package/artifacts/contracts/mocks/cUSDCMock.sol/cUSDCMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/cUSDCMock.sol/cUSDCMock.json +2 -2
- package/artifacts/contracts/reserve/DistributionHelper.sol/DistributionHelper.dbg.json +1 -1
- package/artifacts/contracts/reserve/DistributionHelper.sol/DistributionHelper.json +242 -17
- 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 +45 -19
- 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 +1 -1
- package/artifacts/contracts/staking/utils/Math64X64.sol/Math64x64.json +2 -2
- 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/ERC20PresetMinterPauserUpgradeable.sol/ERC20PresetMinterPauserUpgradeable.json +2 -2
- 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/GoodDollar.sol/GoodDollar.json +2 -2
- package/artifacts/contracts/token/IFeesFormula.sol/IFeesFormula.dbg.json +4 -0
- package/artifacts/contracts/token/{FeesFormula.sol → IFeesFormula.sol}/IFeesFormula.json +1 -1
- package/artifacts/contracts/token/MultichainFeeFormula.sol/MultichainFeeFormula.dbg.json +4 -0
- package/artifacts/contracts/token/MultichainFeeFormula.sol/MultichainFeeFormula.json +58 -0
- 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/ISuperGoodDollar.sol/ISuperGoodDollar.json +159 -5
- package/artifacts/contracts/token/superfluid/ISuperToken.sol/ISuperToken.dbg.json +4 -0
- package/artifacts/contracts/token/superfluid/ISuperToken.sol/ISuperToken.json +1609 -0
- package/artifacts/contracts/token/superfluid/SuperGoodDollar.sol/SuperGoodDollar.dbg.json +1 -1
- package/artifacts/contracts/token/superfluid/SuperGoodDollar.sol/SuperGoodDollar.json +233 -190
- package/artifacts/contracts/token/superfluid/SuperToken.sol/SuperToken.dbg.json +1 -1
- package/artifacts/contracts/token/superfluid/SuperToken.sol/SuperToken.json +198 -193
- 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/UUPSProxy.json +2 -2
- package/artifacts/contracts/token/superfluid/UUPSProxy.sol/UUPSUtils.dbg.json +1 -1
- package/artifacts/contracts/token/superfluid/UUPSProxy.sol/UUPSUtils.json +2 -2
- package/artifacts/contracts/ubi/UBIScheme.sol/UBIScheme.dbg.json +1 -1
- package/artifacts/contracts/ubi/UBIScheme.sol/UBIScheme.json +20 -2
- package/artifacts/contracts/ubi/UBISchemeV2.sol/UBISchemeV2.dbg.json +1 -1
- package/artifacts/contracts/ubi/UBISchemeV2.sol/UBISchemeV2.json +20 -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/AdminWalletFuse.sol/AdminWalletFuse.dbg.json +1 -1
- package/artifacts/contracts/utils/AdminWalletFuse.sol/AdminWalletFuse.json +2 -2
- package/artifacts/contracts/utils/BancorFormula.sol/BancorFormula.dbg.json +1 -1
- package/artifacts/contracts/utils/BancorFormula.sol/BancorFormula.json +2 -2
- package/artifacts/contracts/utils/BulkProof.sol/BulkProof.dbg.json +1 -1
- package/artifacts/contracts/utils/BulkProof.sol/BulkProof.json +2 -2
- package/artifacts/contracts/utils/BuyAndBridgeHelper.sol/BuyAndBridgeHelper.dbg.json +1 -1
- package/artifacts/contracts/utils/BuyAndBridgeHelper.sol/BuyAndBridgeHelper.json +2 -2
- package/artifacts/contracts/utils/BuyGDClone.sol/BuyGDClone.dbg.json +1 -1
- package/artifacts/contracts/utils/BuyGDClone.sol/BuyGDClone.json +2 -2
- package/artifacts/contracts/utils/BuyGDClone.sol/BuyGDCloneFactory.dbg.json +1 -1
- package/artifacts/contracts/utils/BuyGDClone.sol/BuyGDCloneFactory.json +2 -2
- 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/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/DSMath.sol/DSMath.json +2 -2
- package/artifacts/contracts/utils/DataTypes.sol/DataTypes.dbg.json +1 -1
- package/artifacts/contracts/utils/DataTypes.sol/DataTypes.json +2 -2
- package/artifacts/contracts/utils/GDFaucet.sol/GDFaucet.dbg.json +1 -1
- package/artifacts/contracts/utils/GDFaucet.sol/GDFaucet.json +2 -2
- package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/GoodDollarMintBurnWrapper.dbg.json +1 -1
- package/artifacts/contracts/utils/GoodDollarMintBurnWrapper.sol/GoodDollarMintBurnWrapper.json +2 -2
- 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/GoodDollarMintBurnWrapper.sol/TokenOperation.json +2 -2
- package/artifacts/contracts/utils/IdentityFix.sol/IdentityFix.dbg.json +1 -1
- package/artifacts/contracts/utils/IdentityFix.sol/IdentityFix.json +2 -2
- package/artifacts/contracts/utils/MultiCall.sol/Multicall.dbg.json +1 -1
- package/artifacts/contracts/utils/MultiCall.sol/Multicall.json +2 -2
- package/artifacts/contracts/utils/MultichainBridgeHelper.sol/MultichainBridgeHelper.dbg.json +1 -1
- package/artifacts/contracts/utils/MultichainBridgeHelper.sol/MultichainBridgeHelper.json +2 -2
- package/artifacts/contracts/utils/NameService.sol/NameService.dbg.json +1 -1
- package/artifacts/contracts/utils/NameService.sol/NameService.json +2 -2
- package/artifacts/contracts/utils/OneTimePayments.sol/OneTimePayments.dbg.json +1 -1
- package/artifacts/contracts/utils/OneTimePayments.sol/OneTimePayments.json +2 -2
- package/artifacts/contracts/utils/OneTimePaymentsV2.sol/OneTimePaymentsV2.dbg.json +1 -1
- package/artifacts/contracts/utils/OneTimePaymentsV2.sol/OneTimePaymentsV2.json +2 -2
- 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/ERC1967Proxy.json +2 -2
- package/artifacts/contracts/utils/ProxyFactory1967.sol/ProxyFactory1967.dbg.json +1 -1
- package/artifacts/contracts/utils/ProxyFactory1967.sol/ProxyFactory1967.json +2 -2
- package/artifacts/contracts/utils/ReputationTestHelper.sol/ReputationTestHelper.dbg.json +1 -1
- package/artifacts/contracts/utils/ReputationTestHelper.sol/ReputationTestHelper.json +2 -2
- package/contracts/invite/InvitesFuseV2.sol +3 -2
- package/contracts/mocks/DistributionBridgeMock.sol +42 -15
- package/contracts/mocks/DistributionHelperTest.sol +6 -2
- package/contracts/mocks/FeesFormularMock.sol +14 -14
- package/contracts/mocks/GasPriceMockOracle.sol +7 -1
- package/contracts/reserve/DistributionHelper.sol +147 -23
- package/contracts/reserve/GoodReserveCDai.sol +39 -47
- package/contracts/staking/GoodFundManager.sol +18 -37
- package/contracts/token/GoodDollar.sol +11 -16
- package/contracts/token/MultichainFeeFormula.sol +34 -0
- package/contracts/token/superfluid/ConstantFlowNFTs.sol +3 -0
- package/contracts/token/superfluid/ISuperGoodDollar.sol +4 -5
- package/contracts/token/superfluid/ISuperToken.sol +464 -0
- package/contracts/token/superfluid/SuperGoodDollar.sol +408 -376
- package/contracts/token/superfluid/SuperToken.sol +144 -144
- package/contracts/ubi/UBIScheme.sol +9 -5
- package/contracts/ubi/UBISchemeV2.sol +6 -0
- package/contracts/utils/AdminWallet.sol +2 -1
- package/contracts/utils/AdminWalletFuse.sol +2 -1
- package/contracts/utils/BuyAndBridgeHelper.sol +13 -13
- package/contracts/utils/MultiCall.sol +8 -10
- package/dist/artifacts/contracts/identity/IdentityV2.sol/IdentityV2.json +2 -2
- package/dist/artifacts/contracts/token/superfluid/SuperGoodDollar.sol/SuperGoodDollar.json +233 -190
- package/dist/artifacts/contracts/token/superfluid/UUPSProxy.sol/UUPSProxy.json +2 -2
- package/dist/artifacts/contracts/utils/ProxyFactory1967.sol/ERC1967Proxy.json +2 -2
- package/hardhat.config.ts +46 -15
- package/package.json +7 -7
- package/releases/deploy-settings.json +3 -1
- package/releases/deployment.json +6 -2
- package/scripts/analytics/faucetStats.ts +19 -15
- package/scripts/fv.ts +305 -0
- package/scripts/multichain-deploy/1_basicdao-deploy.ts +18 -9
- package/scripts/multichain-deploy/helpers.ts +204 -64
- package/scripts/proposals/gip-15.ts +427 -0
- package/scripts/upgrades/multichain-formula-upgrade.ts +140 -0
- package/scripts/upgrades/restoreFunds.ts +91 -0
- package/scripts/upgrades/superfluid-nft-celo-gas-token.ts +159 -0
- package/scripts/utils.ts +15 -0
- package/test/helpers.ts +73 -10
- package/test/reserve/DistributionHelper.test.ts +183 -218
- package/test/reserve/GoodReserveCDai.distribution.test.ts +21 -144
- package/test/reserve/GoodReserveCDai.test.ts +98 -302
- package/test/staking/StakingRewards.test.ts +324 -936
- package/test/token/CeloGasToken.test.ts +108 -0
- package/test/token/SuperGoodDollar.test.ts +15 -6
- package/test/utils/AdminWallet.test.ts +97 -38
- package/test/utils/BuyAndBridgeHelper.test.ts +9 -33
- package/truffle-config.js +24 -6
- package/types/ConstantInflowNFT.ts +969 -0
- package/types/ConstantOutflowNFT.ts +1031 -0
- package/types/DistributionBridgeMock.ts +203 -70
- package/types/DistributionHelper.ts +325 -30
- package/types/DistributionHelperTest.ts +325 -30
- package/types/DistributionHelperTestHelper.ts +355 -35
- package/types/FlowNFTBase.ts +887 -0
- package/types/GasPriceMockOracle.ts +29 -0
- package/types/GoodReserveCDai.ts +79 -20
- package/types/IConstantFlowAgreementV1.ts +1391 -0
- package/types/IConstantInflowNFT.ts +772 -0
- package/types/IConstantOutflowNFT.ts +834 -0
- package/types/IERC721.ts +487 -0
- package/types/IERC721Metadata.ts +538 -0
- package/types/IFlowNFTBase.ts +711 -0
- package/types/IInstantDistributionAgreementV1.ts +1183 -0
- package/types/ILayerZeroFeeEstimator.ts +136 -0
- package/types/IMessagePassingBridge.ts +774 -0
- package/types/ISETH.ts +2668 -0
- package/types/ISETHCustom.ts +161 -0
- package/types/ISuperGoodDollar.ts +277 -25
- package/types/ISuperToken.ts +202 -346
- package/types/ISuperfluid.ts +7 -2
- package/types/ISuperfluidGovernance.ts +40 -5
- package/types/MultichainFeeFormula.ts +130 -0
- package/types/SuperGoodDollar.ts +383 -349
- package/types/SuperToken.ts +319 -344
- package/types/UBIScheme.ts +36 -0
- package/types/UBISchemeV2.ts +36 -0
- package/types/factories/AaveMock__factory.ts +1 -1
- package/types/factories/AaveStakingFactory__factory.ts +1 -1
- package/types/factories/AaveUSDMockOracle__factory.ts +1 -1
- package/types/factories/AdminWalletFuse__factory.ts +1 -1
- package/types/factories/AdminWallet__factory.ts +1 -1
- package/types/factories/BancorFormula__factory.ts +1 -1
- package/types/factories/BaseShareFieldV2__factory.ts +1 -1
- package/types/factories/BaseShareField__factory.ts +1 -1
- package/types/factories/BatUSDMockOracle__factory.ts +1 -1
- package/types/factories/BuyAndBridgeHelper__factory.ts +1 -1
- package/types/factories/BuyGDCloneFactory__factory.ts +1 -1
- package/types/factories/BuyGDClone__factory.ts +1 -1
- package/types/factories/CBATMock__factory.ts +1 -1
- package/types/factories/CDAILowWorthMock__factory.ts +1 -1
- package/types/factories/CDAIMock__factory.ts +1 -1
- package/types/factories/CDAINonMintableMock__factory.ts +1 -1
- package/types/factories/CDecimalsMock__factory.ts +1 -1
- package/types/factories/CSDTMock__factory.ts +1 -1
- package/types/factories/CUSDCMock__factory.ts +1 -1
- package/types/factories/ClaimersDistribution__factory.ts +1 -1
- package/types/factories/CompUSDMockOracle__factory.ts +1 -1
- package/types/factories/CompoundStakingFactory__factory.ts +1 -1
- package/types/factories/CompoundVotingMachine__factory.ts +1 -1
- package/types/factories/ConstantInflowNFT__factory.ts +758 -0
- package/types/factories/ConstantOutflowNFT__factory.ts +817 -0
- package/types/factories/DAIMock__factory.ts +1 -1
- package/types/factories/DAOContract__factory.ts +1 -1
- package/types/factories/DAOUpgradeableContract__factory.ts +1 -1
- package/types/factories/DaiEthPriceMockOracle__factory.ts +1 -1
- package/types/factories/DecimalsMock__factory.ts +1 -1
- package/types/factories/DistributionBridgeMock__factory.ts +121 -16
- package/types/factories/DistributionHelperTestHelper__factory.ts +255 -17
- package/types/factories/DistributionHelperTest__factory.ts +241 -16
- package/types/factories/DistributionHelper__factory.ts +241 -16
- package/types/factories/DonationsStaking__factory.ts +1 -1
- package/types/factories/ERC1967Proxy__factory.ts +1 -1
- package/types/factories/ERC20PresetMinterPauserUpgradeable__factory.ts +1 -1
- package/types/factories/ERC20Upgradeable__factory.ts +1 -1
- package/types/factories/EthUSDMockOracle__factory.ts +1 -1
- package/types/factories/EventsEmitter__factory.ts +1 -1
- package/types/factories/ExchangeHelper__factory.ts +1 -1
- package/types/factories/Faucet__factory.ts +1 -1
- package/types/factories/FeesFormulaMock__factory.ts +1 -1
- package/types/factories/FlowNFTBase__factory.ts +642 -0
- package/types/factories/FuseFaucetV2__factory.ts +1 -1
- package/types/factories/FuseFaucet__factory.ts +1 -1
- package/types/factories/FuseStakingV3__factory.ts +1 -1
- package/types/factories/GDFaucet__factory.ts +1 -1
- package/types/factories/GReputation__factory.ts +1 -1
- package/types/factories/GasPriceMockOracle__factory.ts +14 -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 +1 -1
- package/types/factories/GoodDollarStakingMock__factory.ts +1 -1
- package/types/factories/GoodDollarStaking__factory.ts +1 -1
- package/types/factories/GoodDollar__factory.ts +1 -1
- 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 +44 -18
- package/types/factories/GovernanceStaking__factory.ts +1 -1
- package/types/factories/IConstantFlowAgreementV1__factory.ts +1064 -0
- package/types/factories/IConstantInflowNFT__factory.ts +551 -0
- package/types/factories/IConstantOutflowNFT__factory.ts +614 -0
- package/types/factories/IERC721Metadata__factory.ts +356 -0
- package/types/factories/IERC721__factory.ts +308 -0
- package/types/factories/IFlowNFTBase__factory.ts +512 -0
- package/types/factories/IInstantDistributionAgreementV1__factory.ts +1015 -0
- package/types/factories/ILayerZeroFeeEstimator__factory.ts +79 -0
- package/types/factories/IMessagePassingBridge__factory.ts +446 -0
- package/types/factories/ISETHCustom__factory.ts +56 -0
- package/types/factories/ISETH__factory.ts +1866 -0
- package/types/factories/ISuperGoodDollar__factory.ts +159 -5
- package/types/factories/ISuperTokenFactory__factory.ts +5 -0
- package/types/factories/ISuperToken__factory.ts +130 -191
- package/types/factories/ISuperfluidGovernance__factory.ts +23 -5
- package/types/factories/ISuperfluid__factory.ts +10 -0
- package/types/factories/IdentityFix__factory.ts +1 -1
- package/types/factories/IdentityMock__factory.ts +1 -1
- package/types/factories/IdentityV2__factory.ts +1 -1
- package/types/factories/IncentiveControllerMock__factory.ts +1 -1
- package/types/factories/InvitesFuseV2__factory.ts +1 -1
- package/types/factories/InvitesV1__factory.ts +1 -1
- package/types/factories/InvitesV2__factory.ts +1 -1
- package/types/factories/LendingPoolMock__factory.ts +1 -1
- package/types/factories/Multicall__factory.ts +1 -1
- package/types/factories/MultichainBridgeHelper__factory.ts +1 -1
- package/types/factories/MultichainFeeFormula__factory.ts +113 -0
- package/types/factories/MultichainRouterMock__factory.ts +1 -1
- package/types/factories/NameService__factory.ts +1 -1
- package/types/factories/OneTimePaymentsV2__factory.ts +1 -1
- package/types/factories/OneTimePayments__factory.ts +1 -1
- package/types/factories/OverMintTesterRegularStake__factory.ts +1 -1
- package/types/factories/OverMintTester__factory.ts +1 -1
- package/types/factories/PayableMock__factory.ts +1 -1
- 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/ProxyFactory1967__factory.ts +1 -1
- package/types/factories/ReputationTestHelper__factory.ts +1 -1
- package/types/factories/Reputation__factory.ts +1 -1
- package/types/factories/SixteenDecimalsTokenMock__factory.ts +1 -1
- package/types/factories/StakersDistribution__factory.ts +1 -1
- package/types/factories/StakingMockFixedAPY__factory.ts +1 -1
- package/types/factories/SuperGoodDollar__factory.ts +230 -187
- package/types/factories/SuperToken__factory.ts +197 -192
- package/types/factories/SwapHelperTest__factory.ts +1 -1
- package/types/factories/TwentyDecimalsTokenMock__factory.ts +1 -1
- package/types/factories/UBISchemeV2__factory.ts +19 -1
- package/types/factories/UBIScheme__factory.ts +19 -1
- package/types/factories/USDCMock__factory.ts +1 -1
- package/types/factories/UUPSProxy__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 +166 -4
- package/types/index.ts +34 -4
- package/yarn.lock +1288 -719
- package/artifacts/contracts/token/FeesFormula.sol/IFeesFormula.dbg.json +0 -4
- /package/contracts/token/{FeesFormula.sol → IFeesFormula.sol} +0 -0
|
@@ -58,14 +58,8 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
58
58
|
nameService = ns;
|
|
59
59
|
runAsAvatarOnly = raao;
|
|
60
60
|
await setDAOAddress("UNISWAP_ROUTER", signers[0].address);
|
|
61
|
-
const exchangeHelperFactory = await ethers.getContractFactory(
|
|
62
|
-
|
|
63
|
-
);
|
|
64
|
-
exchangeHelper = await upgrades.deployProxy(
|
|
65
|
-
exchangeHelperFactory,
|
|
66
|
-
[nameService.address],
|
|
67
|
-
{ kind: "uups" }
|
|
68
|
-
);
|
|
61
|
+
const exchangeHelperFactory = await ethers.getContractFactory("ExchangeHelper");
|
|
62
|
+
exchangeHelper = await upgrades.deployProxy(exchangeHelperFactory, [nameService.address], { kind: "uups" });
|
|
69
63
|
await exchangeHelper.setAddresses();
|
|
70
64
|
await setDAOAddress("EXCHANGE_HELPER", exchangeHelper.address);
|
|
71
65
|
console.log("deployed dao", {
|
|
@@ -165,17 +159,11 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
165
159
|
|
|
166
160
|
await increaseTime(24 * 60 * 60); //required for reserve ratio advance
|
|
167
161
|
const er = await cDAI.exchangeRateStored();
|
|
168
|
-
const daiAmount = ethers.utils
|
|
169
|
-
.parseEther("0.1")
|
|
170
|
-
.mul(BN.from("10").pow(10))
|
|
171
|
-
.mul(er)
|
|
172
|
-
.div(BN.from("10").pow(28));
|
|
162
|
+
const daiAmount = ethers.utils.parseEther("0.1").mul(BN.from("10").pow(10)).mul(er).div(BN.from("10").pow(28));
|
|
173
163
|
|
|
174
164
|
await dai["mint(address,uint256)"](goodReserve.address, daiAmount);
|
|
175
|
-
const tx = await (
|
|
176
|
-
|
|
177
|
-
).wait();
|
|
178
|
-
const gdBalanceFund = await goodDollar.balanceOf(founder.address);
|
|
165
|
+
const tx = await (await goodReserve.mintUBI(daiAmount, 0, cDAI.address)).wait();
|
|
166
|
+
const gdBalanceFund = await goodDollar.balanceOf(await goodReserve.distributionHelper());
|
|
179
167
|
const gdPriceAfter = await goodReserve["currentPrice()"]();
|
|
180
168
|
reserveToken = await marketMaker.reserveTokens(cDAI.address);
|
|
181
169
|
let reserveBalanceAfter = reserveToken.reserveSupply;
|
|
@@ -183,32 +171,20 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
183
171
|
let rrAfter = reserveToken.reserveRatio;
|
|
184
172
|
// expected that minted token will be added to the previous supply
|
|
185
173
|
const mintEvent = tx.events.find(_ => _.event === "UBIMinted");
|
|
186
|
-
console.log(
|
|
187
|
-
gdPriceBefore.toNumber(),
|
|
188
|
-
supplyAfter.toNumber(),
|
|
189
|
-
supplyBefore.toNumber()
|
|
190
|
-
);
|
|
174
|
+
console.log(gdPriceBefore.toNumber(), supplyAfter.toNumber(), supplyBefore.toNumber());
|
|
191
175
|
expect(supplyAfter).to.be.equal(
|
|
192
|
-
mintEvent.args.gdInterestMinted
|
|
193
|
-
.add(mintEvent.args.gdExpansionMinted)
|
|
194
|
-
.add(supplyBefore)
|
|
176
|
+
mintEvent.args.gdInterestMinted.add(mintEvent.args.gdExpansionMinted).add(supplyBefore)
|
|
195
177
|
);
|
|
196
178
|
// expected that the new reserve balance will include
|
|
197
179
|
// the new 1e18 cdai which transferred
|
|
198
|
-
expect(reserveBalanceAfter).to.be.equal(
|
|
199
|
-
reserveBalanceBefore.add(BN.from("10").pow(17))
|
|
200
|
-
);
|
|
180
|
+
expect(reserveBalanceAfter).to.be.equal(reserveBalanceBefore.add(BN.from("10").pow(17)));
|
|
201
181
|
// the new reserve ratio should be effected from the mintExpansion by:
|
|
202
182
|
// the daily change that was set up in the constructor (999388834642296)
|
|
203
183
|
// requires the time advance simulation above
|
|
204
184
|
expect(rrAfter.toString()).to.be.equal("999388");
|
|
205
185
|
// the price should be the same
|
|
206
186
|
expect(gdPriceAfter).to.be.equal(gdPriceBefore);
|
|
207
|
-
expect(gdBalanceFund).to.be.equal(
|
|
208
|
-
mintEvent.args.gdInterestMinted
|
|
209
|
-
.add(mintEvent.args.gdExpansionMinted)
|
|
210
|
-
.toString()
|
|
211
|
-
);
|
|
187
|
+
expect(gdBalanceFund).to.be.equal(mintEvent.args.gdInterestMinted.add(mintEvent.args.gdExpansionMinted).toString());
|
|
212
188
|
});
|
|
213
189
|
|
|
214
190
|
it("should not mint UBI if the reserve is not cDAI", async () => {
|
|
@@ -224,10 +200,7 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
224
200
|
it("should be able to buy gd with DAI", async () => {
|
|
225
201
|
let daiAmount = ethers.utils.parseEther("100");
|
|
226
202
|
const cdaiRateStored = await cDAI.exchangeRateStored();
|
|
227
|
-
let amount = daiAmount
|
|
228
|
-
.div(BigNumber.from(10).pow(10))
|
|
229
|
-
.mul(BigNumber.from(10).pow(28))
|
|
230
|
-
.div(cdaiRateStored);
|
|
203
|
+
let amount = daiAmount.div(BigNumber.from(10).pow(10)).mul(BigNumber.from(10).pow(28)).div(cdaiRateStored);
|
|
231
204
|
await dai["mint(uint256)"](daiAmount);
|
|
232
205
|
await dai.approve(exchangeHelper.address, daiAmount);
|
|
233
206
|
expect(await nameService.getAddress("DAI")).to.be.equal(dai.address);
|
|
@@ -240,9 +213,7 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
240
213
|
const cDAIBalanceReserveBefore = await cDAI.balanceOf(goodReserve.address);
|
|
241
214
|
const priceBefore = await goodReserve["currentPrice()"]();
|
|
242
215
|
|
|
243
|
-
let transaction = await (
|
|
244
|
-
await exchangeHelper.buy([dai.address], daiAmount, 0, 0, NULL_ADDRESS)
|
|
245
|
-
).wait();
|
|
216
|
+
let transaction = await (await exchangeHelper.buy([dai.address], daiAmount, 0, 0, NULL_ADDRESS)).wait();
|
|
246
217
|
reserveToken = await marketMaker.reserveTokens(cDAI.address);
|
|
247
218
|
let reserveBalanceAfter = reserveToken.reserveSupply;
|
|
248
219
|
let supplyAfter = reserveToken.gdSupply;
|
|
@@ -251,21 +222,14 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
251
222
|
const daiBalanceAfter = await dai.balanceOf(founder.address);
|
|
252
223
|
const cDAIBalanceReserveAfter = await cDAI.balanceOf(goodReserve.address);
|
|
253
224
|
const priceAfter = await goodReserve["currentPrice()"]();
|
|
254
|
-
expect(
|
|
255
|
-
|
|
256
|
-
).to.be.equal(
|
|
257
|
-
expect(
|
|
258
|
-
reserveBalanceAfter.sub(reserveBalanceBefore).toString()
|
|
259
|
-
).to.be.equal(amount.toString());
|
|
260
|
-
expect(supplyAfter.sub(supplyBefore).toString()).to.be.equal(
|
|
261
|
-
gdBalanceAfter.sub(gdBalanceBefore).toString()
|
|
262
|
-
);
|
|
225
|
+
expect((cDAIBalanceReserveAfter - cDAIBalanceReserveBefore).toString()).to.be.equal(amount.toString());
|
|
226
|
+
expect(reserveBalanceAfter.sub(reserveBalanceBefore).toString()).to.be.equal(amount.toString());
|
|
227
|
+
expect(supplyAfter.sub(supplyBefore).toString()).to.be.equal(gdBalanceAfter.sub(gdBalanceBefore).toString());
|
|
263
228
|
expect(rrAfter.toString()).to.be.equal(rrBefore.toString());
|
|
264
229
|
expect(gdBalanceAfter.gt(gdBalanceBefore)).to.be.true;
|
|
265
230
|
expect(daiBalanceBefore.gt(daiBalanceAfter)).to.be.true;
|
|
266
231
|
expect(priceAfter.toString()).to.be.equal(priceBefore.toString());
|
|
267
|
-
expect(transaction.events.find(_ => _.event === "TokenPurchased")).to.be.not
|
|
268
|
-
.empty;
|
|
232
|
+
expect(transaction.events.find(_ => _.event === "TokenPurchased")).to.be.not.empty;
|
|
269
233
|
});
|
|
270
234
|
|
|
271
235
|
it("should be able to buy gd with cDAI through buy", async () => {
|
|
@@ -282,9 +246,7 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
282
246
|
const cDAIBalanceReserveBefore = await cDAI.balanceOf(goodReserve.address);
|
|
283
247
|
const priceBefore = await goodReserve["currentPrice()"]();
|
|
284
248
|
await cDAI.approve(exchangeHelper.address, amount);
|
|
285
|
-
let transaction = await (
|
|
286
|
-
await exchangeHelper.buy([cDAI.address], amount, 0, 0, NULL_ADDRESS)
|
|
287
|
-
).wait();
|
|
249
|
+
let transaction = await (await exchangeHelper.buy([cDAI.address], amount, 0, 0, NULL_ADDRESS)).wait();
|
|
288
250
|
reserveToken = await marketMaker.reserveTokens(cDAI.address);
|
|
289
251
|
let reserveBalanceAfter = reserveToken.reserveSupply;
|
|
290
252
|
let supplyAfter = reserveToken.gdSupply;
|
|
@@ -293,21 +255,14 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
293
255
|
const cDAIBalanceAfter = await cDAI.balanceOf(founder.address);
|
|
294
256
|
const cDAIBalanceReserveAfter = await cDAI.balanceOf(goodReserve.address);
|
|
295
257
|
const priceAfter = await goodReserve["currentPrice()"]();
|
|
296
|
-
expect(
|
|
297
|
-
|
|
298
|
-
).to.be.equal(
|
|
299
|
-
expect(
|
|
300
|
-
reserveBalanceAfter.sub(reserveBalanceBefore).toString()
|
|
301
|
-
).to.be.equal(amount.toString());
|
|
302
|
-
expect(supplyAfter.sub(supplyBefore).toString()).to.be.equal(
|
|
303
|
-
gdBalanceAfter.sub(gdBalanceBefore).toString()
|
|
304
|
-
);
|
|
258
|
+
expect((cDAIBalanceReserveAfter - cDAIBalanceReserveBefore).toString()).to.be.equal(amount.toString());
|
|
259
|
+
expect(reserveBalanceAfter.sub(reserveBalanceBefore).toString()).to.be.equal(amount.toString());
|
|
260
|
+
expect(supplyAfter.sub(supplyBefore).toString()).to.be.equal(gdBalanceAfter.sub(gdBalanceBefore).toString());
|
|
305
261
|
expect(rrAfter.toString()).to.be.equal(rrBefore.toString());
|
|
306
262
|
expect(gdBalanceAfter.gt(gdBalanceBefore)).to.be.true;
|
|
307
263
|
expect(cDAIBalanceBefore.gt(cDAIBalanceAfter)).to.be.true;
|
|
308
264
|
expect(priceAfter.toString()).to.be.equal(priceBefore.toString());
|
|
309
|
-
expect(transaction.events.find(_ => _.event === "TokenPurchased")).to.be.not
|
|
310
|
-
.empty;
|
|
265
|
+
expect(transaction.events.find(_ => _.event === "TokenPurchased")).to.be.not.empty;
|
|
311
266
|
});
|
|
312
267
|
|
|
313
268
|
it("should be able to buy gd with cDAI", async () => {
|
|
@@ -324,9 +279,7 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
324
279
|
const cDAIBalanceReserveBefore = await cDAI.balanceOf(goodReserve.address);
|
|
325
280
|
const priceBefore = await goodReserve["currentPrice()"]();
|
|
326
281
|
await cDAI.approve(exchangeHelper.address, amount);
|
|
327
|
-
let transaction = await (
|
|
328
|
-
await exchangeHelper.buy([cDAI.address], amount, 0, 0, NULL_ADDRESS)
|
|
329
|
-
).wait();
|
|
282
|
+
let transaction = await (await exchangeHelper.buy([cDAI.address], amount, 0, 0, NULL_ADDRESS)).wait();
|
|
330
283
|
reserveToken = await marketMaker.reserveTokens(cDAI.address);
|
|
331
284
|
let reserveBalanceAfter = reserveToken.reserveSupply;
|
|
332
285
|
let supplyAfter = reserveToken.gdSupply;
|
|
@@ -335,21 +288,14 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
335
288
|
const cDAIBalanceAfter = await cDAI.balanceOf(founder.address);
|
|
336
289
|
const cDAIBalanceReserveAfter = await cDAI.balanceOf(goodReserve.address);
|
|
337
290
|
const priceAfter = await goodReserve["currentPrice()"]();
|
|
338
|
-
expect(
|
|
339
|
-
|
|
340
|
-
).to.be.equal(
|
|
341
|
-
expect(
|
|
342
|
-
reserveBalanceAfter.sub(reserveBalanceBefore).toString()
|
|
343
|
-
).to.be.equal(amount.toString());
|
|
344
|
-
expect(supplyAfter.sub(supplyBefore).toString()).to.be.equal(
|
|
345
|
-
gdBalanceAfter.sub(gdBalanceBefore).toString()
|
|
346
|
-
);
|
|
291
|
+
expect((cDAIBalanceReserveAfter - cDAIBalanceReserveBefore).toString()).to.be.equal(amount.toString());
|
|
292
|
+
expect(reserveBalanceAfter.sub(reserveBalanceBefore).toString()).to.be.equal(amount.toString());
|
|
293
|
+
expect(supplyAfter.sub(supplyBefore).toString()).to.be.equal(gdBalanceAfter.sub(gdBalanceBefore).toString());
|
|
347
294
|
expect(rrAfter.toString()).to.be.equal(rrBefore.toString());
|
|
348
295
|
expect(gdBalanceAfter.gt(gdBalanceBefore)).to.be.true;
|
|
349
296
|
expect(cDAIBalanceBefore.gt(cDAIBalanceAfter)).to.be.true;
|
|
350
297
|
expect(priceAfter.toString()).to.be.equal(priceBefore.toString());
|
|
351
|
-
expect(transaction.events.find(_ => _.event === "TokenPurchased")).to.be.not
|
|
352
|
-
.empty;
|
|
298
|
+
expect(transaction.events.find(_ => _.event === "TokenPurchased")).to.be.not.empty;
|
|
353
299
|
});
|
|
354
300
|
|
|
355
301
|
it("should be able to buy gd with cDAI with generic amount of cdai tokens", async () => {
|
|
@@ -365,27 +311,18 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
365
311
|
const gdBalanceBefore = await goodDollar.balanceOf(founder.address);
|
|
366
312
|
const cDAIBalanceReserveBefore = await cDAI.balanceOf(goodReserve.address);
|
|
367
313
|
await cDAI.approve(exchangeHelper.address, amount);
|
|
368
|
-
let transaction = await (
|
|
369
|
-
await exchangeHelper.buy([cDAI.address], amount, 0, 0, NULL_ADDRESS)
|
|
370
|
-
).wait();
|
|
314
|
+
let transaction = await (await exchangeHelper.buy([cDAI.address], amount, 0, 0, NULL_ADDRESS)).wait();
|
|
371
315
|
reserveToken = await marketMaker.reserveTokens(cDAI.address);
|
|
372
316
|
let reserveBalanceAfter = reserveToken.reserveSupply;
|
|
373
317
|
let supplyAfter = reserveToken.gdSupply;
|
|
374
318
|
const gdBalanceAfter = await goodDollar.balanceOf(founder.address);
|
|
375
319
|
const cDAIBalanceReserveAfter = await cDAI.balanceOf(goodReserve.address);
|
|
376
320
|
// actual cdai balance
|
|
377
|
-
expect(
|
|
378
|
-
cDAIBalanceReserveAfter.sub(cDAIBalanceReserveBefore).toString()
|
|
379
|
-
).to.be.equal(amount.toString());
|
|
321
|
+
expect(cDAIBalanceReserveAfter.sub(cDAIBalanceReserveBefore).toString()).to.be.equal(amount.toString());
|
|
380
322
|
// cdai balance according to the market maker
|
|
381
|
-
expect(
|
|
382
|
-
|
|
383
|
-
).to.be.
|
|
384
|
-
expect(supplyAfter.sub(supplyBefore).toString()).to.be.equal(
|
|
385
|
-
gdBalanceAfter.sub(gdBalanceBefore).toString()
|
|
386
|
-
);
|
|
387
|
-
expect(transaction.events.find(_ => _.event === "TokenPurchased")).to.be.not
|
|
388
|
-
.empty;
|
|
323
|
+
expect(reserveBalanceAfter.sub(reserveBalanceBefore).toString()).to.be.equal(amount.toString());
|
|
324
|
+
expect(supplyAfter.sub(supplyBefore).toString()).to.be.equal(gdBalanceAfter.sub(gdBalanceBefore).toString());
|
|
325
|
+
expect(transaction.events.find(_ => _.event === "TokenPurchased")).to.be.not.empty;
|
|
389
326
|
});
|
|
390
327
|
|
|
391
328
|
it("should be able to buy gd with other non initialized tokens beside cDAI", async () => {
|
|
@@ -399,9 +336,7 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
399
336
|
it("should not be able to buy gd without cDAI allowance", async () => {
|
|
400
337
|
let amount = 1e8;
|
|
401
338
|
await cDAI.approve(exchangeHelper.address, "0");
|
|
402
|
-
let error = await exchangeHelper
|
|
403
|
-
.buy([cDAI.address], amount, 0, 0, NULL_ADDRESS)
|
|
404
|
-
.catch(e => e);
|
|
339
|
+
let error = await exchangeHelper.buy([cDAI.address], amount, 0, 0, NULL_ADDRESS).catch(e => e);
|
|
405
340
|
expect(error.message).to.have.string("ERC20: insufficient allowance");
|
|
406
341
|
});
|
|
407
342
|
|
|
@@ -412,20 +347,14 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
412
347
|
await cDAI.approve(exchangeHelper.address, amount);
|
|
413
348
|
const gdBalanceBefore = await goodDollar.balanceOf(founder.address);
|
|
414
349
|
const cDAIBalanceBefore = await cDAI.balanceOf(founder.address);
|
|
415
|
-
let error = await exchangeHelper
|
|
416
|
-
.buy([cDAI.address], amount, 0, 0, NULL_ADDRESS)
|
|
417
|
-
.catch(e => e);
|
|
350
|
+
let error = await exchangeHelper.buy([cDAI.address], amount, 0, 0, NULL_ADDRESS).catch(e => e);
|
|
418
351
|
const gdBalanceAfter = await goodDollar.balanceOf(founder.address);
|
|
419
352
|
const cDAIBalanceAfter = await cDAI.balanceOf(founder.address);
|
|
420
353
|
expect(error.message).not.to.be.empty;
|
|
421
354
|
expect(gdBalanceAfter.toString()).to.be.equal(gdBalanceBefore.toString());
|
|
422
|
-
expect(cDAIBalanceAfter.toString()).to.be.equal(
|
|
423
|
-
cDAIBalanceBefore.toString()
|
|
424
|
-
);
|
|
355
|
+
expect(cDAIBalanceAfter.toString()).to.be.equal(cDAIBalanceBefore.toString());
|
|
425
356
|
|
|
426
|
-
await cDAI
|
|
427
|
-
.connect(staker)
|
|
428
|
-
.transfer(founder.address, cDAIBalanceBeforeTransfer.toString());
|
|
357
|
+
await cDAI.connect(staker).transfer(founder.address, cDAIBalanceBeforeTransfer.toString());
|
|
429
358
|
});
|
|
430
359
|
|
|
431
360
|
it("should not be able to buy gd when the minimum return is higher than the actual return", async () => {
|
|
@@ -433,18 +362,12 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
433
362
|
await cDAI.approve(exchangeHelper.address, amount);
|
|
434
363
|
const gdBalanceBefore = await goodDollar.balanceOf(founder.address);
|
|
435
364
|
const cDAIBalanceBefore = await cDAI.balanceOf(founder.address);
|
|
436
|
-
let error = await exchangeHelper
|
|
437
|
-
.buy([cDAI.address], amount, 2000000, 0, NULL_ADDRESS)
|
|
438
|
-
.catch(e => e);
|
|
365
|
+
let error = await exchangeHelper.buy([cDAI.address], amount, 2000000, 0, NULL_ADDRESS).catch(e => e);
|
|
439
366
|
const gdBalanceAfter = await goodDollar.balanceOf(founder.address);
|
|
440
367
|
const cDAIBalanceAfter = await cDAI.balanceOf(founder.address);
|
|
441
|
-
expect(error.message).to.have.string(
|
|
442
|
-
"GD return must be above the minReturn"
|
|
443
|
-
);
|
|
368
|
+
expect(error.message).to.have.string("GD return must be above the minReturn");
|
|
444
369
|
expect(gdBalanceAfter.toString()).to.be.equal(gdBalanceBefore.toString());
|
|
445
|
-
expect(cDAIBalanceAfter.toString()).to.be.equal(
|
|
446
|
-
cDAIBalanceBefore.toString()
|
|
447
|
-
);
|
|
370
|
+
expect(cDAIBalanceAfter.toString()).to.be.equal(cDAIBalanceBefore.toString());
|
|
448
371
|
});
|
|
449
372
|
|
|
450
373
|
it("should be able to sell gd to cDAI without contribution", async () => {
|
|
@@ -457,9 +380,7 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
457
380
|
const cDAIBalanceBefore = await cDAI.balanceOf(founder.address);
|
|
458
381
|
const cDAIBalanceReserveBefore = await cDAI.balanceOf(goodReserve.address);
|
|
459
382
|
await goodDollar.approve(exchangeHelper.address, amount);
|
|
460
|
-
let transaction = await (
|
|
461
|
-
await exchangeHelper.sell([cDAI.address], amount, 0, 0, NULL_ADDRESS)
|
|
462
|
-
).wait();
|
|
383
|
+
let transaction = await (await exchangeHelper.sell([cDAI.address], amount, 0, 0, NULL_ADDRESS)).wait();
|
|
463
384
|
reserveToken = await marketMaker.reserveTokens(cDAI.address);
|
|
464
385
|
let reserveBalanceAfter = reserveToken.reserveSupply;
|
|
465
386
|
let supplyAfter = reserveToken.gdSupply;
|
|
@@ -468,10 +389,7 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
468
389
|
const cDAIBalanceReserveAfter = await cDAI.balanceOf(goodReserve.address);
|
|
469
390
|
// according to the initialization settings reserve ratio is 100%. the calculation is:
|
|
470
391
|
// Return = _reserveBalance * (1 - (1 - _sellAmount / _supply) ^ (1000000 / _reserveRatio))
|
|
471
|
-
const bancor = await ethers.getContractAt(
|
|
472
|
-
"BancorFormula",
|
|
473
|
-
await marketMaker.getBancor()
|
|
474
|
-
);
|
|
392
|
+
const bancor = await ethers.getContractAt("BancorFormula", await marketMaker.getBancor());
|
|
475
393
|
const expectedReturn = await bancor.calculateSaleReturn(
|
|
476
394
|
supplyBefore.toString(),
|
|
477
395
|
reserveBalanceBefore.toString(),
|
|
@@ -479,18 +397,13 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
479
397
|
amount
|
|
480
398
|
);
|
|
481
399
|
expect(cDAIBalanceAfter - cDAIBalanceBefore).to.be.equal(expectedReturn);
|
|
482
|
-
expect(cDAIBalanceReserveBefore - cDAIBalanceReserveAfter).to.be.equal(
|
|
483
|
-
|
|
484
|
-
);
|
|
485
|
-
expect(reserveBalanceBefore.sub(reserveBalanceAfter)).to.be.equal(
|
|
486
|
-
expectedReturn
|
|
487
|
-
);
|
|
400
|
+
expect(cDAIBalanceReserveBefore - cDAIBalanceReserveAfter).to.be.equal(expectedReturn);
|
|
401
|
+
expect(reserveBalanceBefore.sub(reserveBalanceAfter)).to.be.equal(expectedReturn);
|
|
488
402
|
// 1e4 gd sold (burn from the supply)
|
|
489
403
|
expect(supplyBefore.sub(supplyAfter)).to.be.equal(amount);
|
|
490
404
|
expect(gdBalanceBefore.gt(gdBalanceAfter)).to.be.true;
|
|
491
405
|
expect(cDAIBalanceAfter.gt(cDAIBalanceBefore)).to.be.true;
|
|
492
|
-
expect(transaction.events.find(_ => _.event === "TokenSold")).to.be.not
|
|
493
|
-
.empty;
|
|
406
|
+
expect(transaction.events.find(_ => _.event === "TokenSold")).to.be.not.empty;
|
|
494
407
|
});
|
|
495
408
|
|
|
496
409
|
it("should be able to sell gd to cDAI without contribution through sell function", async () => {
|
|
@@ -503,9 +416,7 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
503
416
|
const cDAIBalanceBefore = await cDAI.balanceOf(founder.address);
|
|
504
417
|
const cDAIBalanceReserveBefore = await cDAI.balanceOf(goodReserve.address);
|
|
505
418
|
await goodDollar.approve(exchangeHelper.address, amount);
|
|
506
|
-
let transaction = await (
|
|
507
|
-
await exchangeHelper.sell([cDAI.address], amount, 0, 0, NULL_ADDRESS)
|
|
508
|
-
).wait();
|
|
419
|
+
let transaction = await (await exchangeHelper.sell([cDAI.address], amount, 0, 0, NULL_ADDRESS)).wait();
|
|
509
420
|
reserveToken = await marketMaker.reserveTokens(cDAI.address);
|
|
510
421
|
let reserveBalanceAfter = reserveToken.reserveSupply;
|
|
511
422
|
let supplyAfter = reserveToken.gdSupply;
|
|
@@ -514,10 +425,7 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
514
425
|
const cDAIBalanceReserveAfter = await cDAI.balanceOf(goodReserve.address);
|
|
515
426
|
// according to the initialization settings reserve ratio is 100%. the calculation is:
|
|
516
427
|
// Return = _reserveBalance * (1 - (1 - _sellAmount / _supply) ^ (1000000 / _reserveRatio))
|
|
517
|
-
const bancor = await ethers.getContractAt(
|
|
518
|
-
"BancorFormula",
|
|
519
|
-
await marketMaker.getBancor()
|
|
520
|
-
);
|
|
428
|
+
const bancor = await ethers.getContractAt("BancorFormula", await marketMaker.getBancor());
|
|
521
429
|
const expectedReturn = await bancor.calculateSaleReturn(
|
|
522
430
|
supplyBefore.toString(),
|
|
523
431
|
reserveBalanceBefore.toString(),
|
|
@@ -525,18 +433,13 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
525
433
|
amount
|
|
526
434
|
);
|
|
527
435
|
expect(cDAIBalanceAfter - cDAIBalanceBefore).to.be.equal(expectedReturn);
|
|
528
|
-
expect(cDAIBalanceReserveBefore - cDAIBalanceReserveAfter).to.be.equal(
|
|
529
|
-
|
|
530
|
-
);
|
|
531
|
-
expect(reserveBalanceBefore.sub(reserveBalanceAfter)).to.be.equal(
|
|
532
|
-
expectedReturn
|
|
533
|
-
);
|
|
436
|
+
expect(cDAIBalanceReserveBefore - cDAIBalanceReserveAfter).to.be.equal(expectedReturn);
|
|
437
|
+
expect(reserveBalanceBefore.sub(reserveBalanceAfter)).to.be.equal(expectedReturn);
|
|
534
438
|
// 1e4 gd sold (burn from the supply)
|
|
535
439
|
expect(supplyBefore.sub(supplyAfter)).to.be.equal(amount);
|
|
536
440
|
expect(gdBalanceBefore.gt(gdBalanceAfter)).to.be.true;
|
|
537
441
|
expect(cDAIBalanceAfter.gt(cDAIBalanceBefore)).to.be.true;
|
|
538
|
-
expect(transaction.events.find(_ => _.event === "TokenSold")).to.be.not
|
|
539
|
-
.empty;
|
|
442
|
+
expect(transaction.events.find(_ => _.event === "TokenSold")).to.be.not.empty;
|
|
540
443
|
});
|
|
541
444
|
|
|
542
445
|
it("should be able to sell gd to DAI without contribution through sell function", async () => {
|
|
@@ -549,9 +452,7 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
549
452
|
const daiBalanceBefore = await dai.balanceOf(founder.address);
|
|
550
453
|
const cDAIBalanceReserveBefore = await cDAI.balanceOf(goodReserve.address);
|
|
551
454
|
await goodDollar.approve(exchangeHelper.address, amount);
|
|
552
|
-
let transaction = await (
|
|
553
|
-
await exchangeHelper.sell([dai.address], amount, 0, 0, NULL_ADDRESS)
|
|
554
|
-
).wait();
|
|
455
|
+
let transaction = await (await exchangeHelper.sell([dai.address], amount, 0, 0, NULL_ADDRESS)).wait();
|
|
555
456
|
reserveToken = await marketMaker.reserveTokens(cDAI.address);
|
|
556
457
|
let reserveBalanceAfter = reserveToken.reserveSupply;
|
|
557
458
|
let supplyAfter = reserveToken.gdSupply;
|
|
@@ -560,10 +461,7 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
560
461
|
const cDAIBalanceReserveAfter = await cDAI.balanceOf(goodReserve.address);
|
|
561
462
|
// according to the initialization settings reserve ratio is 100%. the calculation is:
|
|
562
463
|
// Return = _reserveBalance * (1 - (1 - _sellAmount / _supply) ^ (1000000 / _reserveRatio))
|
|
563
|
-
const bancor = await ethers.getContractAt(
|
|
564
|
-
"BancorFormula",
|
|
565
|
-
await marketMaker.getBancor()
|
|
566
|
-
);
|
|
464
|
+
const bancor = await ethers.getContractAt("BancorFormula", await marketMaker.getBancor());
|
|
567
465
|
const expectedReturn = await bancor.calculateSaleReturn(
|
|
568
466
|
supplyBefore.toString(),
|
|
569
467
|
reserveBalanceBefore.toString(),
|
|
@@ -582,26 +480,15 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
582
480
|
//expect(supplyBefore.sub(supplyAfter)).to.be.equal(amount);
|
|
583
481
|
//expect(gdBalanceBefore.gt(gdBalanceAfter)).to.be.true;
|
|
584
482
|
expect(daiBalanceAfter.gt(daiBalanceBefore)).to.be.true;
|
|
585
|
-
expect(transaction.events.find(_ => _.event === "TokenSold")).to.be.not
|
|
586
|
-
.empty;
|
|
483
|
+
expect(transaction.events.find(_ => _.event === "TokenSold")).to.be.not.empty;
|
|
587
484
|
});
|
|
588
485
|
|
|
589
486
|
it("should set sell contribution ratio by avatar", async () => {
|
|
590
487
|
let nom = ethers.utils.parseUnits("2", 14);
|
|
591
488
|
let denom = ethers.utils.parseUnits("1", 15);
|
|
592
|
-
let ccFactory = await ethers.getContractFactory(
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
);
|
|
596
|
-
let encodedCall = ccFactory.interface.encodeFunctionData(
|
|
597
|
-
"setContributionRatio",
|
|
598
|
-
[nom, denom]
|
|
599
|
-
);
|
|
600
|
-
const ctrl = await ethers.getContractAt(
|
|
601
|
-
"Controller",
|
|
602
|
-
controller,
|
|
603
|
-
schemeMock
|
|
604
|
-
);
|
|
489
|
+
let ccFactory = await ethers.getContractFactory(ContributionCalculation.abi, ContributionCalculation.bytecode);
|
|
490
|
+
let encodedCall = ccFactory.interface.encodeFunctionData("setContributionRatio", [nom, denom]);
|
|
491
|
+
const ctrl = await ethers.getContractAt("Controller", controller, schemeMock);
|
|
605
492
|
|
|
606
493
|
await ctrl.genericCall(contribution.address, encodedCall, avatar, 0);
|
|
607
494
|
const newRatio = await contribution.sellContributionRatio();
|
|
@@ -609,9 +496,7 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
609
496
|
});
|
|
610
497
|
|
|
611
498
|
it("should not be able to set the sell contribution ratio if not avatar", async () => {
|
|
612
|
-
let error = await contribution
|
|
613
|
-
.setContributionRatio(2e14, 1e15)
|
|
614
|
-
.catch(e => e);
|
|
499
|
+
let error = await contribution.setContributionRatio(2e14, 1e15).catch(e => e);
|
|
615
500
|
expect(error.message).to.have.string("only Avatar can call this method");
|
|
616
501
|
});
|
|
617
502
|
|
|
@@ -712,9 +597,7 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
712
597
|
|
|
713
598
|
await goodDollar.connect(staker).approve(exchangeHelper.address, amount);
|
|
714
599
|
let transaction = await (
|
|
715
|
-
await exchangeHelper
|
|
716
|
-
.connect(staker)
|
|
717
|
-
.sell([cDAI.address], amount, 0, 0, NULL_ADDRESS)
|
|
600
|
+
await exchangeHelper.connect(staker).sell([cDAI.address], amount, 0, 0, NULL_ADDRESS)
|
|
718
601
|
).wait();
|
|
719
602
|
reserveToken = await marketMaker.reserveTokens(cDAI.address);
|
|
720
603
|
let reserveBalanceAfter = reserveToken.reserveSupply;
|
|
@@ -724,25 +607,18 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
724
607
|
const cDAIBalanceAfter = await cDAI.balanceOf(staker.address);
|
|
725
608
|
const cDAIBalanceReserveAfter = await cDAI.balanceOf(goodReserve.address);
|
|
726
609
|
const priceAfter = await goodReserve["currentPrice()"]();
|
|
727
|
-
expect(cDAIBalanceAfter.sub(cDAIBalanceBefore)).to.be.equal(
|
|
728
|
-
expectedReturn,
|
|
729
|
-
"seller return mismatch"
|
|
730
|
-
);
|
|
610
|
+
expect(cDAIBalanceAfter.sub(cDAIBalanceBefore)).to.be.equal(expectedReturn, "seller return mismatch");
|
|
731
611
|
expect(cDAIBalanceReserveBefore.sub(cDAIBalanceReserveAfter)).to.be.equal(
|
|
732
612
|
expectedReturn,
|
|
733
613
|
"reserve balance mismatch"
|
|
734
614
|
);
|
|
735
|
-
expect(reserveBalanceBefore.sub(reserveBalanceAfter)).to.be.equal(
|
|
736
|
-
expectedReturn,
|
|
737
|
-
"reserve token data mismatch"
|
|
738
|
-
);
|
|
615
|
+
expect(reserveBalanceBefore.sub(reserveBalanceAfter)).to.be.equal(expectedReturn, "reserve token data mismatch");
|
|
739
616
|
expect(supplyBefore.sub(supplyAfter)).to.be.equal(amount);
|
|
740
617
|
expect(rrAfter.toString()).to.be.equal(rrBefore.toString());
|
|
741
618
|
expect(gdBalanceBefore.gt(gdBalanceAfter)).to.be.true;
|
|
742
619
|
expect(cDAIBalanceAfter.gt(cDAIBalanceBefore)).to.be.true;
|
|
743
620
|
expect(priceAfter.toString()).to.be.equal(priceBefore.toString());
|
|
744
|
-
expect(transaction.events.find(_ => _.event === "TokenSold")).to.be.not
|
|
745
|
-
.empty;
|
|
621
|
+
expect(transaction.events.find(_ => _.event === "TokenSold")).to.be.not.empty;
|
|
746
622
|
});
|
|
747
623
|
|
|
748
624
|
it("should able to sell gd to DAI or cDAI token", async () => {
|
|
@@ -758,43 +634,30 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
758
634
|
await goodDollar.approve(exchangeHelper.address, "0");
|
|
759
635
|
const gdBalanceBefore = await goodDollar.balanceOf(founder.address);
|
|
760
636
|
const cDAIBalanceBefore = await cDAI.balanceOf(founder.address);
|
|
761
|
-
let error = await exchangeHelper
|
|
762
|
-
.sell([cDAI.address], amount, 0, 0, NULL_ADDRESS)
|
|
763
|
-
.catch(e => e);
|
|
637
|
+
let error = await exchangeHelper.sell([cDAI.address], amount, 0, 0, NULL_ADDRESS).catch(e => e);
|
|
764
638
|
const gdBalanceAfter = await goodDollar.balanceOf(founder.address);
|
|
765
639
|
const cDAIBalanceAfter = await cDAI.balanceOf(founder.address);
|
|
766
640
|
expect(error.message).not.to.be.empty;
|
|
767
641
|
expect(gdBalanceAfter.toString()).to.be.equal(gdBalanceBefore.toString());
|
|
768
|
-
expect(cDAIBalanceAfter.toString()).to.be.equal(
|
|
769
|
-
cDAIBalanceBefore.toString()
|
|
770
|
-
);
|
|
642
|
+
expect(cDAIBalanceAfter.toString()).to.be.equal(cDAIBalanceBefore.toString());
|
|
771
643
|
});
|
|
772
644
|
|
|
773
645
|
it("should not be able to sell gd without enough gd funds", async () => {
|
|
774
646
|
let amount = 1e4;
|
|
775
647
|
const gdBalanceBeforeTransfer = await goodDollar.balanceOf(founder.address);
|
|
776
648
|
//reset gd holdings
|
|
777
|
-
await goodDollar.transfer(
|
|
778
|
-
staker.address,
|
|
779
|
-
gdBalanceBeforeTransfer.toString()
|
|
780
|
-
);
|
|
649
|
+
await goodDollar.transfer(staker.address, gdBalanceBeforeTransfer.toString());
|
|
781
650
|
await goodDollar.approve(exchangeHelper.address, amount);
|
|
782
651
|
const gdBalanceBefore = await goodDollar.balanceOf(founder.address);
|
|
783
652
|
const cDAIBalanceBefore = await cDAI.balanceOf(founder.address);
|
|
784
|
-
let error = await exchangeHelper
|
|
785
|
-
.sell([cDAI.address], amount, 0, 0, NULL_ADDRESS)
|
|
786
|
-
.catch(e => e);
|
|
653
|
+
let error = await exchangeHelper.sell([cDAI.address], amount, 0, 0, NULL_ADDRESS).catch(e => e);
|
|
787
654
|
const gdBalanceAfter = await goodDollar.balanceOf(founder.address);
|
|
788
655
|
const cDAIBalanceAfter = await cDAI.balanceOf(founder.address);
|
|
789
656
|
expect(error.message).not.to.be.empty;
|
|
790
657
|
expect(gdBalanceAfter.toString()).to.be.equal(gdBalanceBefore.toString());
|
|
791
|
-
expect(cDAIBalanceAfter.toString()).to.be.equal(
|
|
792
|
-
cDAIBalanceBefore.toString()
|
|
793
|
-
);
|
|
658
|
+
expect(cDAIBalanceAfter.toString()).to.be.equal(cDAIBalanceBefore.toString());
|
|
794
659
|
//restore gd holdings
|
|
795
|
-
await goodDollar
|
|
796
|
-
.connect(staker)
|
|
797
|
-
.transfer(founder.address, gdBalanceBeforeTransfer.toString());
|
|
660
|
+
await goodDollar.connect(staker).transfer(founder.address, gdBalanceBeforeTransfer.toString());
|
|
798
661
|
});
|
|
799
662
|
|
|
800
663
|
it("should not be able to sell gd when the minimum return is higher than the actual return", async () => {
|
|
@@ -802,18 +665,12 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
802
665
|
await goodDollar.approve(exchangeHelper.address, amount);
|
|
803
666
|
const gdBalanceBefore = await goodDollar.balanceOf(founder.address);
|
|
804
667
|
const cDAIBalanceBefore = await cDAI.balanceOf(founder.address);
|
|
805
|
-
let error = await exchangeHelper
|
|
806
|
-
.sell([cDAI.address], amount, 2000000, 0, NULL_ADDRESS)
|
|
807
|
-
.catch(e => e);
|
|
668
|
+
let error = await exchangeHelper.sell([cDAI.address], amount, 2000000, 0, NULL_ADDRESS).catch(e => e);
|
|
808
669
|
const gdBalanceAfter = await goodDollar.balanceOf(founder.address);
|
|
809
670
|
const cDAIBalanceAfter = await cDAI.balanceOf(founder.address);
|
|
810
|
-
expect(error.message).to.have.string(
|
|
811
|
-
"Token return must be above the minReturn"
|
|
812
|
-
);
|
|
671
|
+
expect(error.message).to.have.string("Token return must be above the minReturn");
|
|
813
672
|
expect(gdBalanceAfter.toString()).to.be.equal(gdBalanceBefore.toString());
|
|
814
|
-
expect(cDAIBalanceAfter.toString()).to.be.equal(
|
|
815
|
-
cDAIBalanceBefore.toString()
|
|
816
|
-
);
|
|
673
|
+
expect(cDAIBalanceAfter.toString()).to.be.equal(cDAIBalanceBefore.toString());
|
|
817
674
|
});
|
|
818
675
|
|
|
819
676
|
it("should return an error if non avatar account is trying to execute recover", async () => {
|
|
@@ -822,23 +679,14 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
822
679
|
});
|
|
823
680
|
|
|
824
681
|
it("should transfer funds when execute recover of token which the reserve has some balance", async () => {
|
|
825
|
-
await dai["mint(address,uint256)"](
|
|
826
|
-
goodReserve.address,
|
|
827
|
-
ethers.utils.parseEther("100")
|
|
828
|
-
);
|
|
682
|
+
await dai["mint(address,uint256)"](goodReserve.address, ethers.utils.parseEther("100"));
|
|
829
683
|
|
|
830
684
|
let reserveBalance = await dai.balanceOf(goodReserve.address);
|
|
831
685
|
const reserveFactory = await ethers.getContractFactory("GoodReserveCDai");
|
|
832
686
|
|
|
833
|
-
let encodedCall = reserveFactory.interface.encodeFunctionData("recover", [
|
|
834
|
-
dai.address
|
|
835
|
-
]);
|
|
687
|
+
let encodedCall = reserveFactory.interface.encodeFunctionData("recover", [dai.address]);
|
|
836
688
|
|
|
837
|
-
const ctrl = await ethers.getContractAt(
|
|
838
|
-
"Controller",
|
|
839
|
-
controller,
|
|
840
|
-
schemeMock
|
|
841
|
-
);
|
|
689
|
+
const ctrl = await ethers.getContractAt("Controller", controller, schemeMock);
|
|
842
690
|
await ctrl.genericCall(goodReserve.address, encodedCall, avatar, 0);
|
|
843
691
|
let recoveredBalance = await dai.balanceOf(avatar);
|
|
844
692
|
expect(recoveredBalance).to.be.equal(reserveBalance);
|
|
@@ -863,9 +711,7 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
863
711
|
reserveToken = await marketMaker.reserveTokens(cDAI.address);
|
|
864
712
|
let reserveBalanceAfter = reserveToken.reserveSupply;
|
|
865
713
|
const cDAIBalanceReserveAfter = await cDAI.balanceOf(goodReserve.address);
|
|
866
|
-
expect(cDAIBalanceReserveAfter.sub(cDAIBalanceReserveBefore)).to.be.equal(
|
|
867
|
-
amount.toString()
|
|
868
|
-
);
|
|
714
|
+
expect(cDAIBalanceReserveAfter.sub(cDAIBalanceReserveBefore)).to.be.equal(amount.toString());
|
|
869
715
|
expect(reserveBalanceAfter.sub(reserveBalanceBefore)).to.be.equal(amount);
|
|
870
716
|
});
|
|
871
717
|
it("should be able to buy gd with cDAI directly through reserve", async () => {
|
|
@@ -894,15 +740,11 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
894
740
|
});
|
|
895
741
|
it("should not be able to sell gd through reserve when there is no enough allowance", async () => {
|
|
896
742
|
await goodDollar.approve(goodReserve.address, "0");
|
|
897
|
-
const tx = await goodReserve
|
|
898
|
-
.sell("100", 0, founder.address, staker.address)
|
|
899
|
-
.catch(e => e);
|
|
743
|
+
const tx = await goodReserve.sell("100", 0, founder.address, staker.address).catch(e => e);
|
|
900
744
|
expect(tx.message).to.be.not.empty;
|
|
901
745
|
});
|
|
902
746
|
it("seller parameter should not matter if caller is not exchange helper", async () => {
|
|
903
|
-
const stakerGDBalanceBeforeSell = await goodDollar.balanceOf(
|
|
904
|
-
staker.address
|
|
905
|
-
);
|
|
747
|
+
const stakerGDBalanceBeforeSell = await goodDollar.balanceOf(staker.address);
|
|
906
748
|
await goodDollar.approve(goodReserve.address, "100");
|
|
907
749
|
await goodReserve.sell("100", 0, founder.address, staker.address);
|
|
908
750
|
const stakerGDBalanceAfterSell = await goodDollar.balanceOf(staker.address);
|
|
@@ -948,9 +790,7 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
948
790
|
const cDAIBalanceReserveBefore = await cDAI.balanceOf(goodReserve.address);
|
|
949
791
|
await goodDollar.connect(staker).approve(exchangeHelper.address, amount);
|
|
950
792
|
const transaction = await (
|
|
951
|
-
await exchangeHelper
|
|
952
|
-
.connect(staker)
|
|
953
|
-
.sell([cDAI.address], amount, 0, 0, NULL_ADDRESS)
|
|
793
|
+
await exchangeHelper.connect(staker).sell([cDAI.address], amount, 0, 0, NULL_ADDRESS)
|
|
954
794
|
).wait();
|
|
955
795
|
|
|
956
796
|
const cDAIBalanceAfter = await cDAI.balanceOf(staker.address);
|
|
@@ -962,16 +802,12 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
962
802
|
// the contribution ratio is 20%
|
|
963
803
|
let expected =
|
|
964
804
|
parseInt(reserveBalance.toString()) *
|
|
965
|
-
(1 -
|
|
966
|
-
(1 - amount.toNumber() / parseInt(supply.toString())) **
|
|
967
|
-
(1000000 / reserveToken.reserveRatio));
|
|
805
|
+
(1 - (1 - amount.toNumber() / parseInt(supply.toString())) ** (1000000 / reserveToken.reserveRatio));
|
|
968
806
|
|
|
969
807
|
expected = Math.ceil((0.8 * expected) / 100) * 100; //deduct 20% contribution, allow 5 points precission mismatch (due to bancor pow estimation?), match solidity no floating point
|
|
970
808
|
//expected = Math.floor(0.8 * expected);
|
|
971
809
|
expect(cDAIBalanceAfter.sub(cDAIBalanceBefore)).to.be.equal(expected);
|
|
972
|
-
expect(cDAIBalanceReserveBefore.sub(cDAIBalanceReserveAfter)).to.be.equal(
|
|
973
|
-
expected
|
|
974
|
-
);
|
|
810
|
+
expect(cDAIBalanceReserveBefore.sub(cDAIBalanceReserveAfter)).to.be.equal(expected);
|
|
975
811
|
});
|
|
976
812
|
|
|
977
813
|
it("should be able to buy gd with cDAI for some other address through buy", async () => {
|
|
@@ -988,9 +824,7 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
988
824
|
const cDAIBalanceReserveBefore = await cDAI.balanceOf(goodReserve.address);
|
|
989
825
|
const priceBefore = await goodReserve["currentPrice()"]();
|
|
990
826
|
await cDAI.approve(exchangeHelper.address, amount);
|
|
991
|
-
let transaction = await (
|
|
992
|
-
await exchangeHelper.buy([cDAI.address], amount, 0, 0, staker.address)
|
|
993
|
-
).wait();
|
|
827
|
+
let transaction = await (await exchangeHelper.buy([cDAI.address], amount, 0, 0, staker.address)).wait();
|
|
994
828
|
reserveToken = await marketMaker.reserveTokens(cDAI.address);
|
|
995
829
|
let reserveBalanceAfter = reserveToken.reserveSupply;
|
|
996
830
|
let supplyAfter = reserveToken.gdSupply;
|
|
@@ -999,21 +833,14 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
999
833
|
const cDAIBalanceAfter = await cDAI.balanceOf(founder.address);
|
|
1000
834
|
const cDAIBalanceReserveAfter = await cDAI.balanceOf(goodReserve.address);
|
|
1001
835
|
const priceAfter = await goodReserve["currentPrice()"]();
|
|
1002
|
-
expect(
|
|
1003
|
-
|
|
1004
|
-
).to.be.equal(
|
|
1005
|
-
expect(
|
|
1006
|
-
reserveBalanceAfter.sub(reserveBalanceBefore).toString()
|
|
1007
|
-
).to.be.equal(amount.toString());
|
|
1008
|
-
expect(supplyAfter.sub(supplyBefore).toString()).to.be.equal(
|
|
1009
|
-
gdBalanceAfter.sub(gdBalanceBefore).toString()
|
|
1010
|
-
);
|
|
836
|
+
expect((cDAIBalanceReserveAfter - cDAIBalanceReserveBefore).toString()).to.be.equal(amount.toString());
|
|
837
|
+
expect(reserveBalanceAfter.sub(reserveBalanceBefore).toString()).to.be.equal(amount.toString());
|
|
838
|
+
expect(supplyAfter.sub(supplyBefore).toString()).to.be.equal(gdBalanceAfter.sub(gdBalanceBefore).toString());
|
|
1011
839
|
expect(rrAfter.toString()).to.be.equal(rrBefore.toString());
|
|
1012
840
|
expect(gdBalanceAfter.gt(gdBalanceBefore)).to.be.true;
|
|
1013
841
|
expect(cDAIBalanceBefore.gt(cDAIBalanceAfter)).to.be.true;
|
|
1014
842
|
expect(priceAfter.toString()).to.be.equal(priceBefore.toString());
|
|
1015
|
-
expect(transaction.events.find(_ => _.event === "TokenPurchased")).to.be.not
|
|
1016
|
-
.empty;
|
|
843
|
+
expect(transaction.events.find(_ => _.event === "TokenPurchased")).to.be.not.empty;
|
|
1017
844
|
});
|
|
1018
845
|
|
|
1019
846
|
it("should be able to sell gd to cDAI without contribution through sell function for some other address", async () => {
|
|
@@ -1026,9 +853,7 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
1026
853
|
const cDAIBalanceBefore = await cDAI.balanceOf(staker.address);
|
|
1027
854
|
const cDAIBalanceReserveBefore = await cDAI.balanceOf(goodReserve.address);
|
|
1028
855
|
await goodDollar.approve(exchangeHelper.address, amount);
|
|
1029
|
-
let transaction = await (
|
|
1030
|
-
await exchangeHelper.sell([cDAI.address], amount, 0, 0, staker.address)
|
|
1031
|
-
).wait();
|
|
856
|
+
let transaction = await (await exchangeHelper.sell([cDAI.address], amount, 0, 0, staker.address)).wait();
|
|
1032
857
|
reserveToken = await marketMaker.reserveTokens(cDAI.address);
|
|
1033
858
|
let reserveBalanceAfter = reserveToken.reserveSupply;
|
|
1034
859
|
let supplyAfter = reserveToken.gdSupply;
|
|
@@ -1037,10 +862,7 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
1037
862
|
const cDAIBalanceReserveAfter = await cDAI.balanceOf(goodReserve.address);
|
|
1038
863
|
// according to the initialization settings reserve ratio is 100%. the calculation is:
|
|
1039
864
|
// Return = _reserveBalance * (1 - (1 - _sellAmount / _supply) ^ (1000000 / _reserveRatio))
|
|
1040
|
-
const bancor = await ethers.getContractAt(
|
|
1041
|
-
"BancorFormula",
|
|
1042
|
-
await marketMaker.getBancor()
|
|
1043
|
-
);
|
|
865
|
+
const bancor = await ethers.getContractAt("BancorFormula", await marketMaker.getBancor());
|
|
1044
866
|
const expectedReturn = await bancor.calculateSaleReturn(
|
|
1045
867
|
supplyBefore.toString(),
|
|
1046
868
|
reserveBalanceBefore.toString(),
|
|
@@ -1048,18 +870,13 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
1048
870
|
amount
|
|
1049
871
|
);
|
|
1050
872
|
expect(cDAIBalanceAfter - cDAIBalanceBefore).to.be.equal(expectedReturn);
|
|
1051
|
-
expect(cDAIBalanceReserveBefore - cDAIBalanceReserveAfter).to.be.equal(
|
|
1052
|
-
|
|
1053
|
-
);
|
|
1054
|
-
expect(reserveBalanceBefore.sub(reserveBalanceAfter)).to.be.equal(
|
|
1055
|
-
expectedReturn
|
|
1056
|
-
);
|
|
873
|
+
expect(cDAIBalanceReserveBefore - cDAIBalanceReserveAfter).to.be.equal(expectedReturn);
|
|
874
|
+
expect(reserveBalanceBefore.sub(reserveBalanceAfter)).to.be.equal(expectedReturn);
|
|
1057
875
|
// 1e4 gd sold (burn from the supply)
|
|
1058
876
|
expect(supplyBefore.sub(supplyAfter)).to.be.equal(amount);
|
|
1059
877
|
expect(gdBalanceBefore.gt(gdBalanceAfter)).to.be.true;
|
|
1060
878
|
expect(cDAIBalanceAfter.gt(cDAIBalanceBefore)).to.be.true;
|
|
1061
|
-
expect(transaction.events.find(_ => _.event === "TokenSold")).to.be.not
|
|
1062
|
-
.empty;
|
|
879
|
+
expect(transaction.events.find(_ => _.event === "TokenSold")).to.be.not.empty;
|
|
1063
880
|
});
|
|
1064
881
|
|
|
1065
882
|
it("should be able to retain the precision when selling a low quantity of tokens", async () => {
|
|
@@ -1086,57 +903,36 @@ describe("GoodReserve - staking with cDAI mocks", () => {
|
|
|
1086
903
|
|
|
1087
904
|
let encodedCall = reserveFactory.interface.encodeFunctionData("end");
|
|
1088
905
|
|
|
1089
|
-
const ctrl = await ethers.getContractAt(
|
|
1090
|
-
"Controller",
|
|
1091
|
-
controller,
|
|
1092
|
-
schemeMock
|
|
1093
|
-
);
|
|
906
|
+
const ctrl = await ethers.getContractAt("Controller", controller, schemeMock);
|
|
1094
907
|
|
|
1095
|
-
const tx = await (
|
|
1096
|
-
await ctrl.genericCall(goodReserve.address, encodedCall, avatar, 0)
|
|
1097
|
-
).wait();
|
|
908
|
+
const tx = await (await ctrl.genericCall(goodReserve.address, encodedCall, avatar, 0)).wait();
|
|
1098
909
|
|
|
1099
910
|
let avatarBalanceAfter = await cDAI.balanceOf(avatar);
|
|
1100
911
|
let reserveBalanceAfter = await cDAI.balanceOf(goodReserve.address);
|
|
1101
912
|
|
|
1102
|
-
expect(avatarBalanceAfter.sub(avatarBalanceBefore)).to.be.equal(
|
|
1103
|
-
reserveBalanceBefore
|
|
1104
|
-
);
|
|
913
|
+
expect(avatarBalanceAfter.sub(avatarBalanceBefore)).to.be.equal(reserveBalanceBefore);
|
|
1105
914
|
expect(reserveBalanceAfter.toString()).to.be.equal("0");
|
|
1106
915
|
expect(await goodDollar.isMinter(goodReserve.address)).to.be.false;
|
|
1107
916
|
expect(await goodDollar.isMinter(avatar)).to.be.true;
|
|
1108
917
|
});
|
|
1109
918
|
|
|
1110
919
|
it("should set reserve ratio daily expansion by avatar", async () => {
|
|
1111
|
-
let currentReserveRatioDailyExpansion =
|
|
1112
|
-
await marketMaker.reserveRatioDailyExpansion();
|
|
920
|
+
let currentReserveRatioDailyExpansion = await marketMaker.reserveRatioDailyExpansion();
|
|
1113
921
|
console.log(currentReserveRatioDailyExpansion.toString());
|
|
1114
922
|
|
|
1115
|
-
await runAsAvatarOnly(
|
|
1116
|
-
goodReserve,
|
|
1117
|
-
"setReserveRatioDailyExpansion(uint256,uint256)",
|
|
1118
|
-
1,
|
|
1119
|
-
1e15
|
|
1120
|
-
);
|
|
923
|
+
await runAsAvatarOnly(goodReserve, "setReserveRatioDailyExpansion(uint256,uint256)", 1, 1e15);
|
|
1121
924
|
|
|
1122
|
-
let newReserveRatioDailyExpansion =
|
|
1123
|
-
await marketMaker.reserveRatioDailyExpansion();
|
|
925
|
+
let newReserveRatioDailyExpansion = await marketMaker.reserveRatioDailyExpansion();
|
|
1124
926
|
console.log(newReserveRatioDailyExpansion.toString());
|
|
1125
927
|
|
|
1126
|
-
expect(newReserveRatioDailyExpansion).to.not.equal(
|
|
1127
|
-
currentReserveRatioDailyExpansion
|
|
1128
|
-
);
|
|
928
|
+
expect(newReserveRatioDailyExpansion).to.not.equal(currentReserveRatioDailyExpansion);
|
|
1129
929
|
expect(newReserveRatioDailyExpansion).to.be.equal(BN.from("1000000000000"));
|
|
1130
930
|
|
|
1131
|
-
const encodedCall = goodReserve.interface.encodeFunctionData(
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
);
|
|
1135
|
-
const ctrl = await ethers.getContractAt(
|
|
1136
|
-
"Controller",
|
|
1137
|
-
controller,
|
|
1138
|
-
schemeMock
|
|
1139
|
-
);
|
|
931
|
+
const encodedCall = goodReserve.interface.encodeFunctionData("setReserveRatioDailyExpansion", [
|
|
932
|
+
BN.from(currentReserveRatioDailyExpansion).div(1e12),
|
|
933
|
+
1e15
|
|
934
|
+
]);
|
|
935
|
+
const ctrl = await ethers.getContractAt("Controller", controller, schemeMock);
|
|
1140
936
|
await ctrl.genericCall(goodReserve.address, encodedCall, avatar, 0);
|
|
1141
937
|
});
|
|
1142
938
|
});
|